• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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