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 CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H 17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H 18 19 #include <base/containers/string.h> 20 #include <base/util/uid.h> 21 #include <core/namespace.h> 22 #include <render/datastore/render_data_store_render_pods.h> 23 #include <render/nodecontext/intf_render_node.h> 24 #include <render/resource_handle.h> 25 26 #include "render/render_node_scene_util.h" 27 28 CORE3D_BEGIN_NAMESPACE() 29 class IRenderDataStoreDefaultMaterial; 30 class IRenderDataStoreDefaultLight; 31 class IRenderDataStoreDefaultScene; 32 33 class RenderNodeDefaultCameraController final : public RENDER_NS::IRenderNode { 34 public: 35 RenderNodeDefaultCameraController() = default; 36 ~RenderNodeDefaultCameraController() override = default; 37 38 void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override; 39 void PreExecuteFrame() override; 40 void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override; GetExecuteFlags()41 ExecuteFlags GetExecuteFlags() const override 42 { 43 return 0U; 44 } 45 46 // for plugin / factory interface 47 static constexpr BASE_NS::Uid UID { "46144344-29f8-4fc1-913a-ed5f6f2e20d0" }; 48 static constexpr char const* TYPE_NAME = "RenderNodeDefaultCameraController"; 49 static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT; 50 static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE; 51 static IRenderNode* Create(); 52 static void Destroy(IRenderNode* instance); 53 54 struct ImageDescs { 55 RENDER_NS::GpuImageDesc depth; 56 57 RENDER_NS::GpuImageDesc output; 58 59 RENDER_NS::GpuImageDesc color; 60 RENDER_NS::GpuImageDesc velocityNormal; 61 RENDER_NS::GpuImageDesc history; 62 RENDER_NS::GpuImageDesc baseColor; 63 RENDER_NS::GpuImageDesc material; 64 65 RENDER_NS::GpuImageDesc cubemap; 66 }; 67 68 struct CreatedTargets { 69 RENDER_NS::RenderHandleReference outputColor; 70 RENDER_NS::RenderHandleReference depth; 71 72 // NOTE: depending on the post processes and the output target one could re-use colorTarget as resolve 73 // With hdrp and no msaa acts as a 3d scene camera rendering output 74 RENDER_NS::RenderHandleReference colorResolve; 75 76 RENDER_NS::RenderHandleReference colorMsaa; 77 RENDER_NS::RenderHandleReference depthMsaa; 78 79 // used in both DF and FW pipeline (not with light-weight) 80 RENDER_NS::RenderHandleReference velocityNormal; 81 // enabled with a flag with both DF and FW (not with light-weight) 82 RENDER_NS::RenderHandleReference history[2u]; 83 84 RENDER_NS::RenderHandleReference baseColor; 85 RENDER_NS::RenderHandleReference material; 86 87 RENDER_NS::RenderHandleReference cubemap; 88 89 ImageDescs imageDescs; 90 }; 91 92 struct CameraResourceSetup { 93 BASE_NS::Math::UVec2 outResolution { 0u, 0u }; 94 BASE_NS::Math::UVec2 renResolution { 0u, 0u }; 95 96 RenderCamera::Flags camFlags { 0u }; 97 RenderCamera::RenderPipelineType pipelineType { RenderCamera::RenderPipelineType::FORWARD }; 98 99 RENDER_NS::RenderHandle colorTarget; 100 RENDER_NS::RenderHandle depthTarget; 101 102 uint32_t historyFlipFrame { 0 }; 103 104 RENDER_NS::DeviceBackendType backendType { RENDER_NS::DeviceBackendType::VULKAN }; 105 106 ImageDescs inputImageDescs; 107 108 bool isMultiview { false }; 109 }; 110 111 private: 112 RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr }; 113 114 static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff }; 115 struct JsonInputs { 116 BASE_NS::string customCameraName; 117 uint64_t customCameraId { INVALID_CAM_ID }; 118 }; 119 JsonInputs jsonInputs_; 120 121 struct UboHandles { 122 RENDER_NS::RenderHandleReference generalData; 123 RENDER_NS::RenderHandleReference environment; 124 RENDER_NS::RenderHandleReference postProcess; 125 RENDER_NS::RenderHandleReference fog; 126 127 RENDER_NS::RenderHandleReference light; 128 RENDER_NS::RenderHandleReference lightCluster; 129 }; 130 struct CurrentScene { 131 RenderCamera camera; 132 133 uint32_t cameraIdx { 0 }; 134 BASE_NS::Math::Vec4 sceneTimingData { 0.0f, 0.0f, 0.0f, 0.0f }; 135 136 BASE_NS::string customCameraName; 137 uint64_t customCameraId { INVALID_CAM_ID }; 138 BASE_NS::string customCamRngName; 139 }; 140 struct ConfigurationNames { 141 BASE_NS::string renderDataStoreName; 142 BASE_NS::string postProcessConfigurationName; 143 }; 144 145 void SetDefaultGpuImageDescs(); 146 void ParseRenderNodeInputs(); 147 void CreateResources(); 148 void CreateResourceBaseTargets(); 149 void RegisterOutputs(); 150 151 void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene, 152 const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight); 153 void CreateBuffers(); 154 void UpdateBuffers(); 155 void UpdateGeneralUniformBuffer(); 156 void UpdateEnvironmentUniformBuffer(); 157 void UpdateFogUniformBuffer(); 158 void UpdatePostProcessUniformBuffer(); 159 void UpdateLightBuffer(); 160 void UpdatePostProcessConfiguration(); 161 162 SceneRenderDataStores stores_; 163 CameraResourceSetup camRes_; 164 UboHandles uboHandles_; 165 CurrentScene currentScene_; 166 CreatedTargets createdTargets_; 167 RENDER_NS::RenderHandle defaultCubemap_; 168 169 RENDER_NS::RenderPostProcessConfiguration currentRenderPPConfiguration_; 170 }; 171 CORE3D_END_NAMESPACE() 172 173 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_CAMERA_CONTROLLER_H 174