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