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