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