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 CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_CUBEMAP_H
17  #define CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_CUBEMAP_H
18  
19  #include <3d/namespace.h>
20  #include <3d/render/intf_render_data_store_default_light.h>
21  #include <base/containers/string.h>
22  #include <base/util/uid.h>
23  #include <render/datastore/intf_render_data_store_post_process.h>
24  #include <render/datastore/render_data_store_render_pods.h>
25  #include <render/device/pipeline_state_desc.h>
26  #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h>
27  #include <render/nodecontext/intf_render_node.h>
28  #include <render/render_data_structures.h>
29  #include <render/resource_handle.h>
30  
31  #include "render/render_node_scene_util.h"
32  
33  RENDER_BEGIN_NAMESPACE()
34  struct RenderNodeGraphInputs;
35  RENDER_END_NAMESPACE()
36  
37  CORE3D_BEGIN_NAMESPACE()
38  class IRenderDataStoreDefaultCamera;
39  class IRenderDataStoreDefaultScene;
40  
41  class RenderNodeCameraCubemap final : public RENDER_NS::IRenderNode {
42  public:
43      RenderNodeCameraCubemap() = default;
44      ~RenderNodeCameraCubemap() override = default;
45  
46      void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override;
47      void PreExecuteFrame() override;
48      void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override;
GetExecuteFlags()49      ExecuteFlags GetExecuteFlags() const override
50      {
51          return 0U;
52      }
53  
54      // for plugin / factory interface
55      static constexpr BASE_NS::Uid UID { "ba8d2db0-5550-4a04-abe6-e39c6794baf8" };
56      static constexpr char const* TYPE_NAME = "RenderNodeCameraCubemap";
57      static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT;
58      static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE;
59      static IRenderNode* Create();
60      static void Destroy(IRenderNode* instance);
61  
62      struct ShadowBuffers {
63          RENDER_NS::RenderHandle pcfDepthHandle;
64          RENDER_NS::RenderHandle vsmColorHandle;
65  
66          RENDER_NS::RenderHandle pcfSamplerHandle;
67          RENDER_NS::RenderHandle vsmSamplerHandle;
68      };
69      struct DefaultImagesAndSamplers {
70          RENDER_NS::RenderHandle cubemapSamplerHandle;
71  
72          RENDER_NS::RenderHandle linearHandle;
73          RENDER_NS::RenderHandle nearestHandle;
74          RENDER_NS::RenderHandle linearMipHandle;
75  
76          RENDER_NS::RenderHandle colorPrePassHandle;
77  
78          RENDER_NS::RenderHandle skyBoxRadianceCubemapHandle;
79      };
80  
81  private:
82      RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr };
83  
84      void RegisterOutputs();
85      void InitCreateBinders();
86      void ParseRenderNodeInputs();
87      void UpdateGlobalPostProcessUbo();
88      void UpdateImageData();
89      void ProcessPostProcessConfiguration();
90      void GetSceneUniformBuffers(const BASE_NS::string_view us);
91      void UpdateCurrentScene(const IRenderDataStoreDefaultScene& dataStoreScene,
92          const IRenderDataStoreDefaultCamera& dataStoreCamera, const IRenderDataStoreDefaultLight& dataStoreLight);
93      void UpdateSet0(RENDER_NS::IRenderCommandList& cmdList);
94      void UpdateSet1(RENDER_NS::IRenderCommandList& cmdList, const uint32_t idx);
95      void ExecuteSinglePostProcess(RENDER_NS::IRenderCommandList& cmdList);
96  
97      static constexpr uint64_t INVALID_CAM_ID { 0xFFFFFFFFffffffff };
98      // Json resources which might need re-fetching
99      struct JsonInputs {
100          RENDER_NS::RenderNodeGraphInputs::RenderDataStore renderDataStore;
101  
102          BASE_NS::string ppName;
103  
104          BASE_NS::string customCameraName;
105          uint64_t customCameraId { INVALID_CAM_ID };
106  
107          uint32_t outputIdx { ~0u };
108      };
109      JsonInputs jsonInputs_;
110  
111      struct BuiltInVariables {
112          RENDER_NS::RenderHandle output;
113          BASE_NS::Math::UVec2 outputSize;
114          uint32_t outputMipCount;
115  
116          RENDER_NS::RenderHandle defBuffer;
117          RENDER_NS::RenderHandle defBlackImage;
118          RENDER_NS::RenderHandle defSampler;
119      };
120      BuiltInVariables builtInVariables_;
121  
122      SceneBufferHandles sceneBuffers_;
123      SceneCameraBufferHandles cameraBuffers_;
124  
125      DefaultImagesAndSamplers defaultImagesAndSamplers_;
126  
127      struct CurrentScene {
128          RenderCamera camera;
129          RENDER_NS::RenderHandle cameraEnvRadianceHandles[DefaultMaterialCameraConstants::MAX_ENVIRONMENT_COUNT] {};
130          RENDER_NS::RenderHandle prePassColorTarget;
131          BASE_NS::string cameraName;
132  
133          bool hasShadow { false };
134          IRenderDataStoreDefaultLight::ShadowTypes shadowTypes {};
135          IRenderDataStoreDefaultLight::LightingFlags lightingFlags { 0u };
136      };
137      CurrentScene currentScene_;
138  
139      ShadowBuffers shadowBuffers_;
140  
141      RENDER_NS::RenderNodeHandles::InputRenderPass inputRenderPass_;
142      RENDER_NS::RenderNodeHandles::InputResources inputResources_;
143      RENDER_NS::RenderHandle shader_;
144      RENDER_NS::PipelineLayout pipelineLayout_;
145      RENDER_NS::RenderHandle psoHandle_;
146      RENDER_NS::PushConstant pushConstant_;
147  
148      RENDER_NS::IDescriptorSetBinder::Ptr globalSet0_;
149      BASE_NS::vector<RENDER_NS::IDescriptorSetBinder::Ptr> localSets_;
150  
151      RENDER_NS::PostProcessConfiguration ppGlobalConfig_;
152      RENDER_NS::IRenderDataStorePostProcess::PostProcess ppLocalConfig_;
153  
154      SceneRenderDataStores stores_;
155  
156      struct UboHandles {
157          // first 512 aligned is global post process
158          // after (256) we have effect local data
159          RENDER_NS::RenderHandleReference postProcess;
160      };
161      UboHandles ubos_;
162  
163      bool valid_ { false };
164  };
165  CORE3D_END_NAMESPACE()
166  
167  #endif // CORE3D_RENDER__NODE__RENDER_NODE_CAMERA_CUBEMAP_H
168