• 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 #ifndef CORE3D_RENDER_NODE_RENDER_NODE_CAMERA_CLOUDS_H
17 #define CORE3D_RENDER_NODE_RENDER_NODE_CAMERA_CLOUDS_H
18 
19 #include <3d/render/intf_render_data_store_default_light.h>
20 #include <render/datastore/intf_render_data_store_post_process.h>
21 #include <render/datastore/render_data_store_render_pods.h>
22 #include <render/nodecontext/intf_render_node.h>
23 
24 #include "render/datastore/render_data_store_weather.h"
25 #include "render_node_generics.h"
26 
27 RENDER_BEGIN_NAMESPACE()
28 struct RenderNodeGraphInputs;
29 RENDER_END_NAMESPACE()
30 
31 CORE3D_BEGIN_NAMESPACE()
32 class IRenderDataStoreDefaultCamera;
33 class IRenderDataStoreDefaultScene;
34 CORE3D_END_NAMESPACE()
35 
36 CORE3D_BEGIN_NAMESPACE()
37 class IRenderDataStoreDefaultLight;
38 class RenderDataStoreWeather;
39 struct WeatherComponent;
40 class RenderNodeCameraWeather final : public RENDER_NS::IRenderNode, public RenderNodeMixin {
41 public:
42     struct Settings;
43 
44     struct BlurShaderPushConstant {
45         BASE_NS::Math::Mat4X4 view;
46         BASE_NS::Math::Vec4 dir[4];
47     };
48 
49     RenderNodeCameraWeather() = default;
50 
51     ~RenderNodeCameraWeather() = default;
52 
53     void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
54 
55     void PreExecuteFrame() override;
56 
57     struct GlobalFrameData;
58 
59     void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
60     void ExecuteReprojected(RENDER_NS::IRenderCommandList& cmdList, const GlobalFrameData& data);
61     void ExecuteDownscaled(RENDER_NS::IRenderCommandList& cmdList, const GlobalFrameData& data);
62     void ExecuteFull(RENDER_NS::IRenderCommandList& cmdList, const GlobalFrameData& data);
63     void ExecuteGenerateClouds(RENDER_NS::IRenderCommandList& cmdList, const ExplicitPass& p, const GlobalFrameData& d);
64 
65     void ExecuteUpsampleAndPostProcess(RENDER_NS::IRenderCommandList& cmdList, RENDER_NS::RenderHandle input,
66         const ExplicitPass& p, const GlobalFrameData& d);
67     void ExecuteUpsampleAndReproject(RENDER_NS::IRenderCommandList& cmdList, RENDER_NS::RenderHandle input,
68         RENDER_NS::RenderHandle prevInput, const ExplicitPass& p, const GlobalFrameData& d);
69     void ExecuteClear(RENDER_NS::IRenderCommandList& cmdList, const ExplicitPass& p, const GlobalFrameData& d);
70 
71     template<typename T, class U>
72     void RenderFullscreenTriangle(
73         int firstSet, RENDER_NS::IRenderCommandList& commandList, const BlurParams<T, U>& args);
74 
GetExecuteFlags()75     ExecuteFlags GetExecuteFlags() const override
76     {
77         return 0U;
78     }
79 
80     // for plugin / factory interface
81     static constexpr BASE_NS::Uid UID { "c269fda6-9b07-481c-8227-a74ad7b91d2e" };
82     static constexpr char const* TYPE_NAME = "RenderNodeCameraWeather";
83     static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
84     static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
85 
86     static IRenderNode* Create();
87 
88     static void Destroy(IRenderNode* instance);
89 
90 private:
91     static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
92 
93     void ParseRenderNodeInputs();
94 
95     void GetSceneUniformBuffers(BASE_NS::string_view us);
96 
97     void UpdateCurrentScene(const CORE3D_NS::IRenderDataStoreDefaultScene& dataStoreScene,
98         const CORE3D_NS::IRenderDataStoreDefaultCamera& dataStoreCamera,
99         const CORE3D_NS::IRenderDataStoreDefaultLight& dataStoreLight);
100 
101     RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
102 
103     operator RENDER_NS::IRenderNodeContextManager*() const final
104     {
105         return renderNodeContextMgr_;
106     }
107 
108     // Json resources which might need re-fetching
109     struct JsonInputs {
110         RENDER_NS::RenderNodeGraphInputs::InputRenderPass renderPass;
111         RENDER_NS::RenderNodeGraphInputs::InputResources resources;
112 
113         BASE_NS::string customCameraName;
114         uint64_t customCameraId { INVALID_CAM_ID };
115     };
116 
117     struct ImageData {
118         RENDER_NS::RenderHandle depth;
119         RENDER_NS::RenderHandle velocityNormal;
120     };
121     ImageData images_;
122 
123     JsonInputs jsonInputs_;
124 
125     struct BuiltInVariables {
126         RENDER_NS::RenderHandle input;
127 
128         RENDER_NS::RenderHandle output;
129 
130         RENDER_NS::RenderHandle defSampler;
131 
132         // the flag for the post built-in post process
133         uint32_t postProcessFlag { 0u };
134     };
135     BuiltInVariables builtInVariables_;
136 
137     struct CurrentScene {
138         CORE3D_NS::RenderCamera camera;
139         RENDER_NS::RenderHandle cameraEnvRadianceHandle;
140         RENDER_NS::RenderHandle prePassColorTarget;
141 
142         bool hasShadow { false };
143         CORE3D_NS::IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {};
144         CORE3D_NS::IRenderDataStoreDefaultLight::LightingFlags lightingFlags { 0u };
145     };
146     CurrentScene currentScene_;
147 
148     RENDER_NS::PostProcessConfiguration ppGlobalConfig_;
149     RENDER_NS::IRenderDataStorePostProcess::PostProcess ppLocalConfig_;
150 
151     CORE3D_NS::SceneBufferHandles sceneBuffers_;
152     CORE3D_NS::SceneCameraBufferHandles cameraBuffers_;
153     CORE3D_NS::SceneRenderDataStores stores_;
154     BASE_NS::string dsWeatherName_;
155 
156     CORE3D_NS::IRenderNodeSceneUtil* renderNodeSceneUtil_ { nullptr };
157 
158     struct UboHandles {
159         // first 512 aligned is global post process
160         // after (256) we have effect local data
161         RENDER_NS::RenderHandleReference postProcess;
162     };
163     UboHandles ubos_;
164     RENDER_NS::RenderHandle cameraUboHandle_;
165 
166     bool valid_ { false };
167     bool isDefaultImageInUse_ { false };
168 
169     GraphicsShaderData cloudVolumeShaderData_ {};
170     GraphicsShaderData downsampleShaderData_ {};
171     GraphicsShaderData deubgShaderData_ {};
172 
173     GraphicsShaderData downsampleData1_ {};
174     GraphicsShaderData upsampleData1_ {};
175     GraphicsShaderData upsampleData2_ {};
176     ComputeShaderData computeShaderData_ {};
177 
178     RENDER_NS::IPipelineDescriptorSetBinder::Ptr upsample2Binder;
179     RENDER_NS::IPipelineDescriptorSetBinder::Ptr upsample1Binder;
180     RENDER_NS::IPipelineDescriptorSetBinder::Ptr cloudVolumeBinder_;
181 
182     RENDER_NS::RenderHandle depth_;
183 
184     RENDER_NS::RenderHandleReference uniformBuffer_;
185     RENDER_NS::RenderHandleReference lights_;
186     RENDER_NS::RenderHandle curlnoiseTex_;
187     RENDER_NS::RenderHandle cirrusTex_;
188     RENDER_NS::RenderHandle lowFrequencyTex_;
189     RENDER_NS::RenderHandle highFrequencyTex_;
190     RENDER_NS::RenderHandle weatherMapTex_;
191     RENDER_NS::RenderHandle skyTex_;
192     RENDER_NS::RenderHandleReference volumeSampler_;
193     RENDER_NS::RenderHandleReference weatherSampler_;
194 
195     RENDER_NS::RenderHandle cloudTexture_;
196     RENDER_NS::RenderHandle cloudTexturePrev_;
197 
198     bool clear_ { true };
199     uint64_t uniformHash_ { 0 };
200     int32_t downscale_ { 0 };
201     uint32_t targetIndex_ { 0 };
202 
203     RenderDataStoreWeather::WeatherSettings settings_;
204 };
205 CORE3D_END_NAMESPACE()
206 
207 #endif // CORE3D_RENDER_NODE_RENDER_NODE_CAMERA_CLOUDS_H
208