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