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