1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef API_3D_UTIL_RENDER_UTIL_H
17 #define API_3D_UTIL_RENDER_UTIL_H
18 
19 #include <3d/namespace.h>
20 #include <3d/render/render_data_defines_3d.h>
21 #include <render/nodecontext/intf_render_node_graph_manager.h>
22 
23 CORE3D_BEGIN_NAMESPACE()
24 struct RenderCamera;
25 struct RenderScene;
26 /** @ingroup group_util_irenderutil
27  * @{
28  */
29 /** Interface for helper class to to create 3D rendering related objects etc.
30  */
31 class IRenderUtil {
32 public:
33     /** Create camera render node graph desc.
34      * Camera ids are combined to render node names with render scene name.
35      * If multiple ECS are used the render scene data store name needs to be unique.
36      * @param renderScene Render camera.
37      * @param renderCamera Render camera.
38      * @param flags Reserved for later use.
39      * @return RenderNodeGraphDesc for a given render camera.
40      */
41     virtual RENDER_NS::RenderNodeGraphDesc GetRenderNodeGraphDesc(
42         const RenderScene& renderScene, const RenderCamera& renderCamera, const uint32_t flags) const = 0;
43 
44     /* Camera render node graph descs */
45     struct CameraRenderNodeGraphDescs {
46         /* Camera render node graph desc */
47         RENDER_NS::RenderNodeGraphDesc camera;
48         /* Camera based post process render node graph desc */
49         RENDER_NS::RenderNodeGraphDesc postProcess;
50         /* Multi-view camera count */
51         uint32_t multiViewCameraCount { 0U };
52         /* Multi-view camera post processes */
53         RENDER_NS::RenderNodeGraphDesc
54             multiViewCameraPostProcesses[RenderSceneDataConstants::MAX_MULTI_VIEW_LAYER_CAMERA_COUNT];
55     };
56     /** Create camera render node graph descs. (Create desc for camera and post process if any)
57      * Camera ids are combined to render node names with render scene name.
58      * If multiple ECS are used the render scene data store name needs to be unique.
59      * @param renderScene Render camera.
60      * @param renderCamera Render camera.
61      * @param flags Reserved for later use.
62      * @return RenderNodeGraphDescs for a given render camera.
63      */
64     virtual CameraRenderNodeGraphDescs GetRenderNodeGraphDescs(
65         const RenderScene& renderScene, const RenderCamera& renderCamera, const uint32_t flags) const = 0;
66 
67     /** Create camera render node graph descs. (Create desc for camera and post process if any)
68      * Camera ids are combined to render node names with render scene name.
69      * If multiple ECS are used the render scene data store name needs to be unique.
70      * Processes multi-view cameras
71      * @param renderScene Render camera.
72      * @param renderCamera Render camera.
73      * @param flags Reserved for later use.
74      * @param multiviewCameras when multi-view enabled in main camera.
75      * @return RenderNodeGraphDescs for a given render camera.
76      */
77     virtual CameraRenderNodeGraphDescs GetRenderNodeGraphDescs(const RenderScene& renderScene,
78         const RenderCamera& renderCamera, const uint32_t flags,
79         const BASE_NS::array_view<const RenderCamera> multiviewCameras) const = 0;
80 
81     /** Create scene render node graph desc. Render scene naming will be used for uniqueness.
82      * @param renderScene Render scene.
83      * @param flags Reserved for later use.
84      * @return RenderNodeGraphDesc for a given render scene.
85      */
86     virtual RENDER_NS::RenderNodeGraphDesc GetRenderNodeGraphDesc(
87         const RenderScene& renderScene, const uint32_t flags) const = 0;
88 
89     /** Create scene render node graph desc. Render scene naming will be used for uniqueness.
90      * @param renderScene Render scene.
91      * @param rngFile Custom rng file which will be patched with scene ids.
92      * @param flags Reserved for later use.
93      * @return RenderNodeGraphDesc for a given render scene.
94      */
95     virtual RENDER_NS::RenderNodeGraphDesc GetRenderNodeGraphDesc(
96         const RenderScene& renderScene, const BASE_NS::string& rngFile, const uint32_t flags) const = 0;
97 
98 protected:
99     IRenderUtil() = default;
100     virtual ~IRenderUtil() = default;
101 };
102 /** @} */
103 CORE3D_END_NAMESPACE()
104 
105 #endif // API_3D_UTIL_RENDER_UTIL_H
106