• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_RENDER_IRENDER_NODE_SCENE_UTIL_H
17 #define API_3D_RENDER_IRENDER_NODE_SCENE_UTIL_H
18 
19 #include <cstdint>
20 
21 #include <3d/render/render_data_defines_3d.h>
22 #include <base/containers/array_view.h>
23 #include <base/containers/vector.h>
24 #include <render/device/pipeline_state_desc.h>
25 #include <render/render_data_structures.h>
26 
27 RENDER_BEGIN_NAMESPACE()
28 class IRenderNodeUtil;
29 class IRenderNodeContextManager;
30 RENDER_END_NAMESPACE()
31 
32 CORE3D_BEGIN_NAMESPACE()
33 class IRenderDataStoreDefaultMaterial;
34 class IRenderDataStoreDefaultCamera;
35 
36 struct SceneRenderDataStores {
37     // render data store scene name can be used as prefix for 3D scene resource names
38     BASE_NS::fixed_string<RENDER_NS::RenderDataConstants::MAX_DEFAULT_NAME_LENGTH> dataStoreNameScene;
39     BASE_NS::fixed_string<RENDER_NS::RenderDataConstants::MAX_DEFAULT_NAME_LENGTH> dataStoreNameMaterial;
40     BASE_NS::fixed_string<RENDER_NS::RenderDataConstants::MAX_DEFAULT_NAME_LENGTH> dataStoreNameCamera;
41     BASE_NS::fixed_string<RENDER_NS::RenderDataConstants::MAX_DEFAULT_NAME_LENGTH> dataStoreNameLight;
42     BASE_NS::fixed_string<RENDER_NS::RenderDataConstants::MAX_DEFAULT_NAME_LENGTH> dataStoreNameMorph;
43 
44     BASE_NS::fixed_string<RENDER_NS::RenderDataConstants::MAX_DEFAULT_NAME_LENGTH> dataStoreNamePrefix;
45 };
46 
47 struct SceneBufferHandles {
48     /* Camera buffer handle */
49     RENDER_NS::RenderHandle camera;
50     /* Material buffer handle */
51     RENDER_NS::RenderHandle material;
52     /* Material transforms buffer handle */
53     RENDER_NS::RenderHandle materialTransform;
54     /* Material custom buffer handle */
55     RENDER_NS::RenderHandle materialCustom;
56     /* Mesh buffer handle */
57     RENDER_NS::RenderHandle mesh;
58     /* Skin joint buffer handle */
59     RENDER_NS::RenderHandle skinJoint;
60 };
61 
62 struct SceneCameraBufferHandles {
63     /* Environment buffer handle */
64     RENDER_NS::RenderHandle environment;
65     /* Fog buffer handle */
66     RENDER_NS::RenderHandle fog;
67     /* General data buffer handle */
68     RENDER_NS::RenderHandle generalData;
69     /* Post process buffer handle */
70     RENDER_NS::RenderHandle postProcess;
71     /* Light buffer handle */
72     RENDER_NS::RenderHandle light;
73     /* Light cluster buffer handle */
74     RENDER_NS::RenderHandle lightCluster;
75 };
76 
77 struct SceneCameraImageHandles {
78     /* Camera radiance cubemap handle */
79     RENDER_NS::RenderHandle radianceCubemap;
80 };
81 
82 /**
83 IRenderNodeSceneUtil.
84 Helper class with scene util functions.
85 */
86 class IRenderNodeSceneUtil : public CORE_NS::IInterface {
87 public:
88     static constexpr BASE_NS::Uid UID { "78b61c97-6ccc-4f1d-aa27-af3cb63cff6d" };
89 
90     /** Render slot info for render mesh fetching.
91      */
92     struct RenderSlotInfo {
93         /** Render slot id */
94         uint32_t id { ~0u };
95         /** Sort type */
96         RENDER_NS::RenderSlotSortType sortType { RENDER_NS::RenderSlotSortType::NONE };
97         /** Cull type */
98         RENDER_NS::RenderSlotCullType cullType { RENDER_NS::RenderSlotCullType::NONE };
99         /** One can discard render meshes by material flags
100          * (e.g. RENDER_MATERIAL_COMPLEX_BIT or RENDER_MATERIAL_BASIC_BIT)  */
101         RenderMaterialFlags materialDiscardFlags { 0u };
102     };
103 
104     /** Get render data store names mathing the given scene render data store.
105      * @param renderNodeContextMgr The node's context manager.
106      * @param sceneDataStoreName Name of the scene render data store or empty if default data store is used.
107      * @return Collection of data store names.
108      */
109     virtual SceneRenderDataStores GetSceneRenderDataStores(
110         const RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, BASE_NS::string_view sceneDataStoreName) = 0;
111 
112     /** Fills viewport description matching the given camera.
113      * @param camera Render camera whos resolution and viewport are used.
114      * @return Viewport description.
115      */
116     virtual RENDER_NS::ViewportDesc CreateViewportFromCamera(const RenderCamera& camera) = 0;
117 
118     /** Fills scissor description matching the given camera.
119      * @param camera Render camera whos resolution and scissor are used.
120      * @return Scissor description.
121      */
122     virtual RENDER_NS::ScissorDesc CreateScissorFromCamera(const RenderCamera& camera) = 0;
123 
124     /** Updates the render pass using the given camera.
125      * NOTE: per frame camera update (does not fetch GpuImageDesc for render area evaluation)
126      * @param camera Render camera whos resolution, targets, etc. are used.
127      * @param renderPass Render pass to update.
128      */
129     virtual void UpdateRenderPassFromCamera(const RenderCamera& camera, RENDER_NS::RenderPass& renderPass) = 0;
130 
131     /** Updates the render pass using the given camera.
132      * NOTE: uses RenderCamera based clears (ignores render node graph loaded renderpass clear setup)
133      * Legacy support for named camera with a flag.
134      * @param camera Render camera whos resolution, targets, etc. are used.
135      * @param isNamedCamera Legacy support is only taken into account when this is true.
136      * @param renderPass Render pass to update.
137      */
138     virtual void UpdateRenderPassFromCustomCamera(
139         const RenderCamera& camera, bool isNamedCamera, RENDER_NS::RenderPass& renderPass) = 0;
140 
141     /** Clears the given slot submesh indices and resizes it based on the slot materials.
142      * @param dataStoreCamera Current data store for cameras.
143      * @param dataStoreMaterial Current data store for materials.
144      * @param cameraIndex Index of the camera in dataStoreCamera.
145      * @param renderSlotInfo for render slot related submesh processing.
146      * @param refSubmeshIndices Render slot submesh indices to update.
147      */
148     virtual void GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera& dataStoreCamera,
149         const IRenderDataStoreDefaultMaterial& dataStoreMaterial, uint32_t cameraIndex,
150         const RenderSlotInfo& renderSlotInfo, BASE_NS::vector<SlotSubmeshIndex>& refSubmeshIndices) = 0;
151 
152     /** Clears the given slot submesh indices and resizes it based on the slot materials.
153      * @param dataStoreCamera Current data store for cameras.
154      * @param dataStoreMaterial Current data store for materials.
155      * @param cameraIndex Index of the camera in dataStoreCamera.
156      * @param addCameraIndices Indices of the additional cameras used for visibility check with culling.
157      * @param renderSlotInfo for render slot related submesh processing.
158      * @param refSubmeshIndices Render slot submesh indices to update.
159      */
160     virtual void GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera& dataStoreCamera,
161         const IRenderDataStoreDefaultMaterial& dataStoreMaterial, const uint32_t cameraIndex,
162         const BASE_NS::array_view<const uint32_t> addCameraIndices,
163         const IRenderNodeSceneUtil::RenderSlotInfo& renderSlotInfo,
164         BASE_NS::vector<SlotSubmeshIndex>& refSubmeshIndices) = 0;
165 
166     /** Get scene uniform buffers.
167      * @param sceneName Name of the current scene.
168      */
169     virtual SceneBufferHandles GetSceneBufferHandles(
170         RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName) = 0;
171 
172     /** Get camera uniform buffers.
173      * @param sceneName Name of the current scene.
174      * @param cameraName Name of the current camera.
175      */
176     virtual SceneCameraBufferHandles GetSceneCameraBufferHandles(
177         RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName,
178         const BASE_NS::string_view cameraName) = 0;
179 
180     /** Get camera images.
181      * @param sceneName Name of the current scene.
182      * @param cameraName Name of the current camera.
183      * @param camera Render camera.
184      */
185     virtual SceneCameraImageHandles GetSceneCameraImageHandles(
186         RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName,
187         const BASE_NS::string_view cameraName, const RenderCamera& camera) = 0;
188 
189 protected:
190     IRenderNodeSceneUtil() = default;
191     virtual ~IRenderNodeSceneUtil() = default;
192 };
193 
GetName(const IRenderNodeSceneUtil *)194 inline constexpr BASE_NS::string_view GetName(const IRenderNodeSceneUtil*)
195 {
196     return "IRenderNodeSceneUtil";
197 }
198 CORE3D_END_NAMESPACE()
199 
200 #endif // API_3D_RENDER_IRENDER_NODE_SCENE_UTIL_H
201