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