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