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