• 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 #include "render_node_scene_util.h"
17 
18 #include <algorithm>
19 
20 #include <3d/render/intf_render_data_store_default_camera.h>
21 #include <3d/render/intf_render_data_store_default_material.h>
22 #include <3d/render/intf_render_data_store_default_scene.h>
23 #include <3d/render/render_data_defines_3d.h>
24 #include <base/containers/vector.h>
25 #include <base/math/matrix_util.h>
26 #include <core/implementation_uids.h>
27 #include <core/log.h>
28 #include <core/namespace.h>
29 #include <core/plugin/intf_plugin_register.h>
30 #include <core/util/intf_frustum_util.h>
31 #include <render/datastore/intf_render_data_store_manager.h>
32 #include <render/device/intf_gpu_resource_manager.h>
33 #include <render/device/pipeline_state_desc.h>
34 #include <render/nodecontext/intf_render_node.h>
35 #include <render/nodecontext/intf_render_node_context_manager.h>
36 #include <render/nodecontext/intf_render_node_util.h>
37 
38 #include "render/datastore/render_data_store_default_material.h"
39 
40 CORE3D_BEGIN_NAMESPACE()
41 using namespace BASE_NS;
42 using namespace CORE_NS;
43 using namespace RENDER_NS;
44 
45 namespace {
operator <(const SlotSubmeshIndex & lhs,const SlotSubmeshIndex & rhs)46 inline bool operator<(const SlotSubmeshIndex& lhs, const SlotSubmeshIndex& rhs)
47 {
48     if (lhs.sortLayerKey < rhs.sortLayerKey) {
49         return true;
50     } else if (lhs.sortLayerKey == rhs.sortLayerKey) {
51         return (lhs.sortKey < rhs.sortKey);
52     } else {
53         return false;
54     }
55 }
56 
operator >(const SlotSubmeshIndex & lhs,const SlotSubmeshIndex & rhs)57 inline bool operator>(const SlotSubmeshIndex& lhs, const SlotSubmeshIndex& rhs)
58 {
59     if (lhs.sortLayerKey < rhs.sortLayerKey) {
60         return true;
61     } else if (lhs.sortLayerKey == rhs.sortLayerKey) {
62         return (lhs.sortKey > rhs.sortKey);
63     } else {
64         return false;
65     }
66 }
67 
68 template<class T>
69 struct Less {
operator ()__anoneaca6c210111::Less70     constexpr bool operator()(const T& lhs, const T& rhs) const
71     {
72         return lhs < rhs;
73     }
74 };
75 
76 template<class T>
77 struct Greater {
operator ()__anoneaca6c210111::Greater78     constexpr bool operator()(const T& lhs, const T& rhs) const
79     {
80         return lhs > rhs;
81     }
82 };
83 
UpdateRenderArea(const Math::Vec4 & scissor,RenderPassDesc::RenderArea & renderArea)84 void UpdateRenderArea(const Math::Vec4& scissor, RenderPassDesc::RenderArea& renderArea)
85 {
86     // prevent larger than image render area
87     if (scissor.x >= 0.0f && scissor.y >= 0.0f && scissor.z <= 1.0f && scissor.w <= 1.0f) {
88         const float fWidth = static_cast<float>(renderArea.extentWidth);
89         const float fHeight = static_cast<float>(renderArea.extentHeight);
90 
91         const float offsetX = (fWidth * scissor.x);
92         const float offsetY = (fHeight * scissor.y);
93         const float extentWidth = (fWidth * scissor.z);
94         const float extentHeight = (fHeight * scissor.w);
95 
96         renderArea = {
97             static_cast<int32_t>(offsetX),
98             static_cast<int32_t>(offsetY),
99             static_cast<uint32_t>(extentWidth),
100             static_cast<uint32_t>(extentHeight),
101         };
102     }
103 }
104 
UpdateCustomCameraTargets(const RenderCamera & camera,RenderPass & renderPass)105 void UpdateCustomCameraTargets(const RenderCamera& camera, RenderPass& renderPass)
106 {
107     auto& subpassDesc = renderPass.subpassDesc;
108     RenderPassDesc& renderPassDesc = renderPass.renderPassDesc;
109     if ((camera.flags & RenderCamera::CAMERA_FLAG_MSAA_BIT) == 0) {
110         if ((subpassDesc.depthAttachmentCount == 1) && camera.depthTarget) {
111             renderPassDesc.attachmentHandles[subpassDesc.depthAttachmentIndex] = camera.depthTarget.GetHandle();
112         }
113         if ((subpassDesc.colorAttachmentCount >= 1) && camera.colorTargets[0u]) {
114             renderPassDesc.attachmentHandles[subpassDesc.colorAttachmentIndices[0]] =
115                 camera.colorTargets[0u].GetHandle();
116         }
117     }
118 }
119 
UpdateCustomCameraLoadStore(const RenderCamera & camera,RenderPass & renderPass)120 void UpdateCustomCameraLoadStore(const RenderCamera& camera, RenderPass& renderPass)
121 {
122     // NOTE: if clear bits given the camera RNG loadOp is overrided with clear
123     // otherwise the loadOp is the one from RNG
124     auto& subpassDesc = renderPass.subpassDesc;
125     if ((subpassDesc.depthAttachmentCount == 1) &&
126         (subpassDesc.depthAttachmentIndex < PipelineStateConstants::MAX_RENDER_PASS_ATTACHMENT_COUNT)) {
127         auto& attRef = renderPass.renderPassDesc.attachments[subpassDesc.depthAttachmentIndex];
128         if ((camera.flags & RenderCamera::CAMERA_FLAG_CLEAR_DEPTH_BIT)) {
129             attRef.loadOp = AttachmentLoadOp::CORE_ATTACHMENT_LOAD_OP_CLEAR;
130             attRef.clearValue.depthStencil = camera.clearDepthStencil;
131         }
132         if (((camera.flags & RenderCamera::CAMERA_FLAG_MSAA_BIT) == 0) &&
133             (camera.flags & RenderCamera::CAMERA_FLAG_OUTPUT_DEPTH_BIT)) {
134             attRef.storeOp = AttachmentStoreOp::CORE_ATTACHMENT_STORE_OP_STORE;
135         }
136     }
137     for (uint32_t idx = 0; idx < subpassDesc.colorAttachmentCount; ++idx) {
138         if (subpassDesc.colorAttachmentIndices[idx] < PipelineStateConstants::MAX_RENDER_PASS_ATTACHMENT_COUNT) {
139             auto& attRef = renderPass.renderPassDesc.attachments[subpassDesc.colorAttachmentIndices[idx]];
140             if (camera.flags & RenderCamera::CAMERA_FLAG_CLEAR_COLOR_BIT) {
141                 attRef.loadOp = AttachmentLoadOp::CORE_ATTACHMENT_LOAD_OP_CLEAR;
142                 attRef.clearValue.color = camera.clearColorValues;
143             }
144         }
145     }
146 }
147 
UpdateCameraFlags(const RenderCamera & camera,RenderPass & renderPass)148 void UpdateCameraFlags(const RenderCamera& camera, RenderPass& renderPass)
149 {
150     // NOTE: does not over write viewmask if it has some special values
151     if (renderPass.subpassDesc.viewMask <= 1U) {
152         if (camera.multiViewCameraCount > 0U) {
153             const uint32_t layerCount = camera.multiViewCameraCount + 1U;
154             renderPass.subpassDesc.viewMask = (1U << layerCount) - 1U;
155         } else if (camera.flags & RenderCamera::CAMERA_FLAG_CUBEMAP_BIT) {
156             renderPass.subpassDesc.viewMask = 0x3F; // all cubemap layers
157         }
158     }
159 }
160 
IsObjectCulled(IFrustumUtil & frustumUtil,const Frustum & camFrustum,const array_view<const Frustum> addFrustums,const RenderSubmesh & submesh)161 bool IsObjectCulled(IFrustumUtil& frustumUtil, const Frustum& camFrustum, const array_view<const Frustum> addFrustums,
162     const RenderSubmesh& submesh)
163 {
164     bool notCulled =
165         frustumUtil.SphereFrustumCollision(camFrustum, submesh.bounds.worldCenter, submesh.bounds.worldRadius);
166     if (!notCulled) {
167         // if culled by main camera check additional cameras
168         for (const auto& fRef : addFrustums) {
169             notCulled =
170                 frustumUtil.SphereFrustumCollision(fRef, submesh.bounds.worldCenter, submesh.bounds.worldRadius);
171             if (notCulled) {
172                 break;
173             }
174         }
175     }
176     return !notCulled;
177 }
178 
GetRenderSlotBaseCullType(const RenderSlotCullType cullType,const RenderCamera & camera)179 inline constexpr RenderSlotCullType GetRenderSlotBaseCullType(
180     const RenderSlotCullType cullType, const RenderCamera& camera)
181 {
182     if (camera.flags & RenderCamera::CameraFlagBits::CAMERA_FLAG_CUBEMAP_BIT) {
183         return RenderSlotCullType::NONE;
184     } else {
185         return cullType;
186     }
187 }
188 } // namespace
189 
GetSceneRenderDataStores(const IRenderNodeContextManager & renderNodeContextMgr,const string_view sceneDataStoreName)190 SceneRenderDataStores RenderNodeSceneUtil::GetSceneRenderDataStores(
191     const IRenderNodeContextManager& renderNodeContextMgr, const string_view sceneDataStoreName)
192 {
193     SceneRenderDataStores stores;
194     stores.dataStoreNameScene = sceneDataStoreName.empty() ? "RenderDataStoreDefaultScene" : sceneDataStoreName;
195     const auto& renderDataStoreMgr = renderNodeContextMgr.GetRenderDataStoreManager();
196     const IRenderDataStoreDefaultScene* dsScene =
197         static_cast<IRenderDataStoreDefaultScene*>(renderDataStoreMgr.GetRenderDataStore(stores.dataStoreNameScene));
198     if (dsScene) {
199         const RenderScene& rs = dsScene->GetScene();
200         stores.dataStoreNameMaterial =
201             rs.dataStoreNameMaterial.empty() ? "RenderDataStoreDefaultMaterial" : rs.dataStoreNameMaterial;
202         stores.dataStoreNameCamera =
203             rs.dataStoreNameCamera.empty() ? "RenderDataStoreDefaultCamera" : rs.dataStoreNameCamera;
204         stores.dataStoreNameLight =
205             rs.dataStoreNameLight.empty() ? "RenderDataStoreDefaultLight" : rs.dataStoreNameLight;
206         stores.dataStoreNameMorph = rs.dataStoreNameMorph.empty() ? "RenderDataStoreMorph" : rs.dataStoreNameMorph;
207         stores.dataStoreNamePrefix = rs.dataStoreNamePrefix;
208     }
209     return stores;
210 }
211 
GetSceneRenderDataStore(const SceneRenderDataStores & sceneRds,const string_view dsName)212 string RenderNodeSceneUtil::GetSceneRenderDataStore(const SceneRenderDataStores& sceneRds, const string_view dsName)
213 {
214     return string(sceneRds.dataStoreNamePrefix + dsName);
215 }
216 
CreateViewportFromCamera(const RenderCamera & camera)217 ViewportDesc RenderNodeSceneUtil::CreateViewportFromCamera(const RenderCamera& camera)
218 {
219     const float fRenderResX = static_cast<float>(camera.renderResolution.x);
220     const float fRenderResY = static_cast<float>(camera.renderResolution.y);
221 
222     const float offsetX = (fRenderResX * camera.viewport.x);
223     const float offsetY = (fRenderResY * camera.viewport.y);
224     const float extentWidth = (fRenderResX * camera.viewport.z);
225     const float extentHeight = (fRenderResY * camera.viewport.w);
226 
227     return ViewportDesc {
228         offsetX,
229         offsetY,
230         extentWidth,
231         extentHeight,
232         0.0f,
233         1.0f,
234     };
235 }
236 
CreateScissorFromCamera(const RenderCamera & camera)237 ScissorDesc RenderNodeSceneUtil::CreateScissorFromCamera(const RenderCamera& camera)
238 {
239     const float fRenderResX = static_cast<float>(camera.renderResolution.x);
240     const float fRenderResY = static_cast<float>(camera.renderResolution.y);
241 
242     const float offsetX = (fRenderResX * camera.scissor.x);
243     const float offsetY = (fRenderResY * camera.scissor.y);
244     const float extentWidth = (fRenderResX * camera.scissor.z);
245     const float extentHeight = (fRenderResY * camera.scissor.w);
246 
247     return ScissorDesc {
248         static_cast<int32_t>(offsetX),
249         static_cast<int32_t>(offsetY),
250         static_cast<uint32_t>(extentWidth),
251         static_cast<uint32_t>(extentHeight),
252     };
253 }
254 
UpdateRenderPassFromCamera(const RenderCamera & camera,RenderPass & renderPass)255 void RenderNodeSceneUtil::UpdateRenderPassFromCamera(const RenderCamera& camera, RenderPass& renderPass)
256 {
257     renderPass.renderPassDesc.renderArea = { 0, 0, camera.renderResolution.x, camera.renderResolution.y };
258     if (camera.flags & RenderCamera::CameraFlagBits::CAMERA_FLAG_CUSTOM_TARGETS_BIT) {
259         UpdateCustomCameraTargets(camera, renderPass);
260     }
261     // NOTE: UpdateCustomCameraClears(camera, renderPass) is not yet called
262     UpdateRenderArea(camera.scissor, renderPass.renderPassDesc.renderArea);
263     UpdateCameraFlags(camera, renderPass);
264 }
265 
UpdateRenderPassFromCustomCamera(const RenderCamera & camera,const bool isNamedCamera,RenderPass & renderPass)266 void RenderNodeSceneUtil::UpdateRenderPassFromCustomCamera(
267     const RenderCamera& camera, const bool isNamedCamera, RenderPass& renderPass)
268 {
269     renderPass.renderPassDesc.renderArea = { 0, 0, camera.renderResolution.x, camera.renderResolution.y };
270     // NOTE: legacy support is only taken into account when isNamedCamera flag is true
271     if ((camera.flags & RenderCamera::CameraFlagBits::CAMERA_FLAG_CUSTOM_TARGETS_BIT) && isNamedCamera) {
272         UpdateCustomCameraTargets(camera, renderPass);
273     }
274     UpdateCustomCameraLoadStore(camera, renderPass);
275     UpdateRenderArea(camera.scissor, renderPass.renderPassDesc.renderArea);
276     UpdateCameraFlags(camera, renderPass);
277 }
278 
GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera & dataStoreCamera,const IRenderDataStoreDefaultMaterial & dataStoreMaterial,const uint32_t cameraIndex,const array_view<const uint32_t> addCameraIndices,const IRenderNodeSceneUtil::RenderSlotInfo & renderSlotInfo,vector<SlotSubmeshIndex> & refSubmeshIndices)279 void RenderNodeSceneUtil::GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera& dataStoreCamera,
280     const IRenderDataStoreDefaultMaterial& dataStoreMaterial, const uint32_t cameraIndex,
281     const array_view<const uint32_t> addCameraIndices, const IRenderNodeSceneUtil::RenderSlotInfo& renderSlotInfo,
282     vector<SlotSubmeshIndex>& refSubmeshIndices)
283 {
284     // Get IFrustumUtil from global plugin registry.
285     auto frustumUtil = GetInstance<IFrustumUtil>(UID_FRUSTUM_UTIL);
286     if (!frustumUtil) {
287         return;
288     }
289 
290     // 64 bit sorting key should have
291     // material hash with:
292     // shader, materialIndex, meshId, and depth
293 
294     double camSortCoefficient = 1000.0;
295     Math::Mat4X4 camView { Math::IDENTITY_4X4 };
296     uint64_t camLayerMask { RenderSceneDataConstants::INVALID_ID };
297     uint32_t camLevel { 0U };
298     Frustum camFrustum;
299     const auto& cameras = dataStoreCamera.GetCameras();
300     const uint32_t maxCameraCount = static_cast<uint32_t>(cameras.size());
301     RenderSlotCullType rsCullType = renderSlotInfo.cullType;
302     uint32_t camId = RenderSceneDataConstants::INVALID_INDEX;
303     bool cameraEffect = false;
304     // process first camera
305     if (cameraIndex < maxCameraCount) {
306         const auto& cam = cameras[cameraIndex];
307         camView = cam.matrices.view;
308         const float camZFar = Math::max(0.01f, cam.zFar);
309         // max uint coefficient for sorting
310         camSortCoefficient = double(4294967295.0) / double(camZFar);
311         camLayerMask = cam.layerMask;
312         camLevel = cam.sceneId;
313         camId = cam.id & 0xFFFFffff;
314         cameraEffect = (camId != RenderSceneDataConstants::INVALID_INDEX);
315         rsCullType = GetRenderSlotBaseCullType(rsCullType, cam);
316         if (rsCullType == RenderSlotCullType::VIEW_FRUSTUM_CULL) {
317             camFrustum = frustumUtil->CreateFrustum(cam.matrices.proj * cam.matrices.view);
318         }
319     }
320     vector<Frustum> addFrustums;
321     if (rsCullType == RenderSlotCullType::VIEW_FRUSTUM_CULL) {
322         addFrustums.reserve(addCameraIndices.size());
323         for (const auto& indexRef : addCameraIndices) {
324             if (indexRef < maxCameraCount) {
325                 addFrustums.push_back(
326                     frustumUtil->CreateFrustum(cameras[indexRef].matrices.proj * cameras[indexRef].matrices.view));
327             }
328         }
329     }
330 
331     constexpr uint64_t maxUDepth = RenderDataStoreDefaultMaterial::SLOT_SORT_MAX_DEPTH;
332     constexpr uint64_t sDepthShift = RenderDataStoreDefaultMaterial::SLOT_SORT_DEPTH_SHIFT;
333     constexpr uint64_t sRenderMask = RenderDataStoreDefaultMaterial::SLOT_SORT_HASH_MASK;
334     constexpr uint64_t sRenderShift = RenderDataStoreDefaultMaterial::SLOT_SORT_HASH_SHIFT;
335 
336     // NOTE: material sort should be based on PSO not shader handle
337     const auto& slotSubmeshIndices = dataStoreMaterial.GetSlotSubmeshIndices(renderSlotInfo.id);
338     const auto& slotSubmeshMatData = dataStoreMaterial.GetSlotSubmeshMaterialData(renderSlotInfo.id);
339     const auto& submeshes = dataStoreMaterial.GetSubmeshes();
340 
341     refSubmeshIndices.clear();
342     refSubmeshIndices.reserve(slotSubmeshIndices.size());
343     for (size_t idx = 0; idx < slotSubmeshIndices.size(); ++idx) {
344         const uint32_t submeshIndex = slotSubmeshIndices[idx];
345         const auto& submesh = submeshes[submeshIndex];
346         const auto& submeshMatData = slotSubmeshMatData[idx];
347         const bool notCulled = (cameraEffect && (camId == submeshMatData.cameraId)) ||
348                                ((rsCullType != RenderSlotCullType::VIEW_FRUSTUM_CULL) ||
349                                    (!IsObjectCulled(*frustumUtil, camFrustum, addFrustums, submesh)));
350         const bool discardedMat = (submeshMatData.renderMaterialFlags & renderSlotInfo.materialDiscardFlags);
351         if ((camLevel == submesh.layers.sceneId) && (camLayerMask & submesh.layers.layerMask) && notCulled &&
352             (!discardedMat)) {
353             const Math::Vec4 pos = (camView * Math::Vec4(submesh.bounds.worldCenter, 1.0f));
354             const float zVal = Math::abs(pos.z);
355             uint64_t sortKey = Math::min(maxUDepth, static_cast<uint64_t>(double(zVal) * camSortCoefficient));
356             if (renderSlotInfo.sortType == RenderSlotSortType::BY_MATERIAL) {
357                 sortKey |= (((uint64_t)submeshMatData.renderSortHash & sRenderMask) << sRenderShift);
358             } else {
359                 sortKey = (sortKey << sDepthShift) | ((uint64_t)slotSubmeshMatData[idx].renderSortHash & sRenderMask);
360             }
361             refSubmeshIndices.push_back(
362                 SlotSubmeshIndex { (uint32_t)submeshIndex, submeshMatData.combinedRenderSortLayer, sortKey,
363                     submeshMatData.renderSortHash, submeshMatData.shader, submeshMatData.gfxState });
364         }
365     }
366 
367     // front-to-back and by-material render layer sort is 0 -> 63
368     // back-to-front render layer sort is 63 -> 0
369     if (renderSlotInfo.sortType == RenderSlotSortType::FRONT_TO_BACK ||
370         renderSlotInfo.sortType == RenderSlotSortType::BY_MATERIAL) {
371         std::sort(refSubmeshIndices.begin(), refSubmeshIndices.end(), Less<SlotSubmeshIndex>());
372     } else if (renderSlotInfo.sortType == RenderSlotSortType::BACK_TO_FRONT) {
373         std::sort(refSubmeshIndices.begin(), refSubmeshIndices.end(), Greater<SlotSubmeshIndex>());
374     }
375 }
376 
GetSceneBufferHandles(RENDER_NS::IRenderNodeContextManager & renderNodeContextMgr,const BASE_NS::string_view sceneName)377 SceneBufferHandles RenderNodeSceneUtil::GetSceneBufferHandles(
378     RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName)
379 {
380     SceneBufferHandles buffers;
381     const auto& gpuMgr = renderNodeContextMgr.GetGpuResourceManager();
382     buffers.camera = gpuMgr.GetBufferHandle(sceneName + DefaultMaterialCameraConstants::CAMERA_DATA_BUFFER_NAME);
383     buffers.material = gpuMgr.GetBufferHandle(sceneName + DefaultMaterialMaterialConstants::MATERIAL_DATA_BUFFER_NAME);
384     buffers.materialTransform =
385         gpuMgr.GetBufferHandle(sceneName + DefaultMaterialMaterialConstants::MATERIAL_TRANSFORM_DATA_BUFFER_NAME);
386     buffers.materialCustom =
387         gpuMgr.GetBufferHandle(sceneName + DefaultMaterialMaterialConstants::MATERIAL_USER_DATA_BUFFER_NAME);
388     buffers.mesh = gpuMgr.GetBufferHandle(sceneName + DefaultMaterialMaterialConstants::MESH_DATA_BUFFER_NAME);
389     buffers.skinJoint = gpuMgr.GetBufferHandle(sceneName + DefaultMaterialMaterialConstants::SKIN_DATA_BUFFER_NAME);
390 
391     const RenderHandle defaultBuffer = gpuMgr.GetBufferHandle("CORE_DEFAULT_GPU_BUFFER");
392     auto checkValidity = [](const RenderHandle defaultBuffer, bool& valid, RenderHandle& buffer) {
393         if (!RenderHandleUtil::IsValid(buffer)) {
394             valid = false;
395             buffer = defaultBuffer;
396         }
397     };
398     bool valid = true;
399     checkValidity(defaultBuffer, valid, buffers.camera);
400     checkValidity(defaultBuffer, valid, buffers.material);
401     checkValidity(defaultBuffer, valid, buffers.materialTransform);
402     checkValidity(defaultBuffer, valid, buffers.materialCustom);
403     checkValidity(defaultBuffer, valid, buffers.mesh);
404     checkValidity(defaultBuffer, valid, buffers.skinJoint);
405     if (!valid) {
406         CORE_LOG_E(
407             "RN: %s, invalid configuration, not all scene buffers not found.", renderNodeContextMgr.GetName().data());
408     }
409     return buffers;
410 }
411 
GetSceneCameraBufferHandles(RENDER_NS::IRenderNodeContextManager & renderNodeContextMgr,const BASE_NS::string_view sceneName,const BASE_NS::string_view cameraName)412 SceneCameraBufferHandles RenderNodeSceneUtil::GetSceneCameraBufferHandles(
413     RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName,
414     const BASE_NS::string_view cameraName)
415 {
416     SceneCameraBufferHandles buffers;
417     const auto& gpuMgr = renderNodeContextMgr.GetGpuResourceManager();
418     buffers.generalData = gpuMgr.GetBufferHandle(
419         sceneName + DefaultMaterialCameraConstants::CAMERA_GENERAL_BUFFER_PREFIX_NAME + cameraName);
420     buffers.environment = gpuMgr.GetBufferHandle(
421         sceneName + DefaultMaterialCameraConstants::CAMERA_ENVIRONMENT_BUFFER_PREFIX_NAME + cameraName);
422     buffers.fog =
423         gpuMgr.GetBufferHandle(sceneName + DefaultMaterialCameraConstants::CAMERA_FOG_BUFFER_PREFIX_NAME + cameraName);
424     buffers.postProcess = gpuMgr.GetBufferHandle(
425         sceneName + DefaultMaterialCameraConstants::CAMERA_POST_PROCESS_BUFFER_PREFIX_NAME + cameraName);
426 
427     buffers.light = gpuMgr.GetBufferHandle(
428         sceneName + DefaultMaterialCameraConstants::CAMERA_LIGHT_BUFFER_PREFIX_NAME + cameraName);
429     buffers.lightCluster = gpuMgr.GetBufferHandle(
430         sceneName + DefaultMaterialCameraConstants::CAMERA_LIGHT_CLUSTER_BUFFER_PREFIX_NAME + cameraName);
431 
432     const RenderHandle defaultBuffer = gpuMgr.GetBufferHandle("CORE_DEFAULT_GPU_BUFFER");
433     auto checkValidity = [](const RenderHandle defaultBuffer, bool& valid, RenderHandle& buffer) {
434         if (!RenderHandleUtil::IsValid(buffer)) {
435             valid = false;
436             buffer = defaultBuffer;
437         }
438     };
439     bool valid = true;
440     checkValidity(defaultBuffer, valid, buffers.generalData);
441     checkValidity(defaultBuffer, valid, buffers.environment);
442     checkValidity(defaultBuffer, valid, buffers.fog);
443     checkValidity(defaultBuffer, valid, buffers.postProcess);
444     checkValidity(defaultBuffer, valid, buffers.light);
445     checkValidity(defaultBuffer, valid, buffers.lightCluster);
446     if (!valid) {
447         CORE_LOG_E(
448             "RN: %s, invalid configuration, not all camera buffers found.", renderNodeContextMgr.GetName().data());
449     }
450     return buffers;
451 }
452 
GetSceneCameraImageHandles(RENDER_NS::IRenderNodeContextManager & renderNodeContextMgr,const BASE_NS::string_view sceneName,const BASE_NS::string_view cameraName,const RenderCamera & camera)453 SceneCameraImageHandles RenderNodeSceneUtil::GetSceneCameraImageHandles(
454     RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName,
455     const BASE_NS::string_view cameraName, const RenderCamera& camera)
456 {
457     SceneCameraImageHandles handles;
458     const auto& gpuMgr = renderNodeContextMgr.GetGpuResourceManager();
459     handles.radianceCubemap = camera.environment.radianceCubemap.GetHandle();
460     if ((!RenderHandleUtil::IsValid(handles.radianceCubemap)) && (camera.environment.multiEnvCount > 0U)) {
461         handles.radianceCubemap =
462             gpuMgr.GetImageHandle(sceneName + DefaultMaterialSceneConstants::ENVIRONMENT_RADIANCE_CUBEMAP_PREFIX_NAME +
463                                   to_hex(camera.environment.id));
464     }
465     if (!RenderHandleUtil::IsValid(handles.radianceCubemap)) {
466         handles.radianceCubemap =
467             gpuMgr.GetImageHandle(DefaultMaterialGpuResourceConstants::CORE_DEFAULT_RADIANCE_CUBEMAP);
468     }
469     return handles;
470 }
471 
GetSceneRenderDataStores(const IRenderNodeContextManager & renderNodeContextMgr,const string_view sceneDataStoreName)472 SceneRenderDataStores RenderNodeSceneUtilImpl::GetSceneRenderDataStores(
473     const IRenderNodeContextManager& renderNodeContextMgr, const string_view sceneDataStoreName)
474 {
475     return RenderNodeSceneUtil::GetSceneRenderDataStores(renderNodeContextMgr, sceneDataStoreName);
476 }
477 
GetSceneRenderDataStore(const SceneRenderDataStores & sceneRds,const BASE_NS::string_view dsName)478 BASE_NS::string RenderNodeSceneUtilImpl::GetSceneRenderDataStore(
479     const SceneRenderDataStores& sceneRds, const BASE_NS::string_view dsName)
480 {
481     return RenderNodeSceneUtil::GetSceneRenderDataStore(sceneRds, dsName);
482 }
483 
CreateViewportFromCamera(const RenderCamera & camera)484 ViewportDesc RenderNodeSceneUtilImpl::CreateViewportFromCamera(const RenderCamera& camera)
485 {
486     return RenderNodeSceneUtil::CreateViewportFromCamera(camera);
487 }
488 
CreateScissorFromCamera(const RenderCamera & camera)489 ScissorDesc RenderNodeSceneUtilImpl::CreateScissorFromCamera(const RenderCamera& camera)
490 {
491     return RenderNodeSceneUtil::CreateScissorFromCamera(camera);
492 }
493 
UpdateRenderPassFromCamera(const RenderCamera & camera,RenderPass & renderPass)494 void RenderNodeSceneUtilImpl::UpdateRenderPassFromCamera(const RenderCamera& camera, RenderPass& renderPass)
495 {
496     return RenderNodeSceneUtil::UpdateRenderPassFromCamera(camera, renderPass);
497 }
498 
UpdateRenderPassFromCustomCamera(const RenderCamera & camera,const bool isNamedCamera,RenderPass & renderPass)499 void RenderNodeSceneUtilImpl::UpdateRenderPassFromCustomCamera(
500     const RenderCamera& camera, const bool isNamedCamera, RenderPass& renderPass)
501 {
502     return RenderNodeSceneUtil::UpdateRenderPassFromCustomCamera(camera, isNamedCamera, renderPass);
503 }
504 
GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera & dataStoreCamera,const IRenderDataStoreDefaultMaterial & dataStoreMaterial,const uint32_t cameraId,const IRenderNodeSceneUtil::RenderSlotInfo & renderSlotInfo,vector<SlotSubmeshIndex> & refSubmeshIndices)505 void RenderNodeSceneUtilImpl::GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera& dataStoreCamera,
506     const IRenderDataStoreDefaultMaterial& dataStoreMaterial, const uint32_t cameraId,
507     const IRenderNodeSceneUtil::RenderSlotInfo& renderSlotInfo, vector<SlotSubmeshIndex>& refSubmeshIndices)
508 {
509     return RenderNodeSceneUtil::GetRenderSlotSubmeshes(
510         dataStoreCamera, dataStoreMaterial, cameraId, {}, renderSlotInfo, refSubmeshIndices);
511 }
512 
GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera & dataStoreCamera,const IRenderDataStoreDefaultMaterial & dataStoreMaterial,const uint32_t cameraIndex,const array_view<const uint32_t> addCameraIndices,const IRenderNodeSceneUtil::RenderSlotInfo & renderSlotInfo,vector<SlotSubmeshIndex> & refSubmeshIndices)513 void RenderNodeSceneUtilImpl::GetRenderSlotSubmeshes(const IRenderDataStoreDefaultCamera& dataStoreCamera,
514     const IRenderDataStoreDefaultMaterial& dataStoreMaterial, const uint32_t cameraIndex,
515     const array_view<const uint32_t> addCameraIndices, const IRenderNodeSceneUtil::RenderSlotInfo& renderSlotInfo,
516     vector<SlotSubmeshIndex>& refSubmeshIndices)
517 {
518     return RenderNodeSceneUtil::GetRenderSlotSubmeshes(
519         dataStoreCamera, dataStoreMaterial, cameraIndex, addCameraIndices, renderSlotInfo, refSubmeshIndices);
520 }
521 
GetSceneBufferHandles(IRenderNodeContextManager & renderNodeContextMgr,const string_view sceneName)522 SceneBufferHandles RenderNodeSceneUtilImpl::GetSceneBufferHandles(
523     IRenderNodeContextManager& renderNodeContextMgr, const string_view sceneName)
524 {
525     return RenderNodeSceneUtil::GetSceneBufferHandles(renderNodeContextMgr, sceneName);
526 }
527 
GetSceneCameraBufferHandles(IRenderNodeContextManager & renderNodeContextMgr,const string_view sceneName,const string_view cameraName)528 SceneCameraBufferHandles RenderNodeSceneUtilImpl::GetSceneCameraBufferHandles(
529     IRenderNodeContextManager& renderNodeContextMgr, const string_view sceneName, const string_view cameraName)
530 {
531     return RenderNodeSceneUtil::GetSceneCameraBufferHandles(renderNodeContextMgr, sceneName, cameraName);
532 }
533 
GetSceneCameraImageHandles(RENDER_NS::IRenderNodeContextManager & renderNodeContextMgr,const BASE_NS::string_view sceneName,const BASE_NS::string_view cameraName,const RenderCamera & camera)534 SceneCameraImageHandles RenderNodeSceneUtilImpl::GetSceneCameraImageHandles(
535     RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr, const BASE_NS::string_view sceneName,
536     const BASE_NS::string_view cameraName, const RenderCamera& camera)
537 {
538     return RenderNodeSceneUtil::GetSceneCameraImageHandles(renderNodeContextMgr, sceneName, cameraName, camera);
539 }
540 
GetInterface(const Uid & uid) const541 const IInterface* RenderNodeSceneUtilImpl::GetInterface(const Uid& uid) const
542 {
543     if ((uid == IRenderNodeSceneUtil::UID) || (uid == IInterface::UID)) {
544         return this;
545     }
546     return nullptr;
547 }
548 
GetInterface(const Uid & uid)549 IInterface* RenderNodeSceneUtilImpl::GetInterface(const Uid& uid)
550 {
551     if ((uid == IRenderNodeSceneUtil::UID) || (uid == IInterface::UID)) {
552         return this;
553     }
554     return nullptr;
555 }
556 
Ref()557 void RenderNodeSceneUtilImpl::Ref() {}
558 
Unref()559 void RenderNodeSceneUtilImpl::Unref() {}
560 CORE3D_END_NAMESPACE()
561