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_MATERIAL_OBJECTS_H 17 #define CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_OBJECTS_H 18 19 #include <3d/render/intf_render_data_store_default_material.h> 20 #include <base/containers/vector.h> 21 #include <base/util/uid.h> 22 #include <core/namespace.h> 23 #include <render/nodecontext/intf_pipeline_descriptor_set_binder.h> 24 #include <render/nodecontext/intf_render_node.h> 25 #include <render/resource_handle.h> 26 27 #include "render/render_node_scene_util.h" 28 29 CORE3D_BEGIN_NAMESPACE() 30 class IRenderDataStoreDefaultMaterial; 31 32 class RenderNodeDefaultMaterialObjects final : public RENDER_NS::IRenderNode { 33 public: 34 RenderNodeDefaultMaterialObjects() = default; 35 ~RenderNodeDefaultMaterialObjects() override = default; 36 37 void InitNode(RENDER_NS::IRenderNodeContextManager& renderNodeContextMgr) override; 38 void PreExecuteFrame() override; 39 void ExecuteFrame(RENDER_NS::IRenderCommandList& cmdList) override; GetExecuteFlags()40 ExecuteFlags GetExecuteFlags() const override 41 { 42 return 0U; 43 } 44 45 // for plugin / factory interface 46 static constexpr BASE_NS::Uid UID { "a25b27ea-a4ff-4b64-87c7-a7865cccfd92" }; 47 static constexpr const char* const TYPE_NAME = "RenderNodeDefaultMaterialObjects"; 48 static constexpr IRenderNode::BackendFlags BACKEND_FLAGS = IRenderNode::BackendFlagBits::BACKEND_FLAG_BITS_DEFAULT; 49 static constexpr IRenderNode::ClassType CLASS_TYPE = IRenderNode::ClassType::CLASS_TYPE_NODE; 50 static IRenderNode* Create(); 51 static void Destroy(IRenderNode* instance); 52 53 struct MaterialHandleStruct { 54 RENDER_NS::BindableImage resources[RenderDataDefaultMaterial::MATERIAL_TEXTURE_COUNT]; 55 }; 56 57 private: 58 struct ObjectCounts { 59 uint32_t maxMeshCount { 0u }; 60 uint32_t maxSubmeshCount { 0u }; 61 uint32_t maxSkinCount { 0u }; 62 uint32_t maxMaterialCount { 0u }; 63 uint32_t maxUniqueMaterialCount { 0u }; 64 }; 65 struct UboHandles { 66 RENDER_NS::RenderHandleReference mat; 67 RENDER_NS::RenderHandleReference matTransform; 68 RENDER_NS::RenderHandleReference userMat; 69 RENDER_NS::RenderHandleReference mesh; 70 RENDER_NS::RenderHandleReference submeshSkin; 71 }; 72 struct GlobalDescriptorSets { 73 BASE_NS::vector<RENDER_NS::RenderHandleReference> handles; 74 BASE_NS::vector<RENDER_NS::IDescriptorSetBinder::Ptr> descriptorSets; 75 76 // keeps track if we need changes 77 BASE_NS::vector<MaterialHandleStruct> materials; 78 // force update all new descriptor sets 79 bool forceUpdate { false }; 80 81 // default material set 1 descriptor set 82 RENDER_NS::RenderHandleReference dmSet1; 83 RENDER_NS::IDescriptorSetBinder::Ptr dmSet1Binder; 84 85 // default material set 2 descriptor set 86 RENDER_NS::RenderHandleReference dmSet2; 87 RENDER_NS::IDescriptorSetBinder::Ptr dmSet2Binder; 88 bool dmSet2Ready { false }; 89 }; 90 91 void UpdateBuffers(const IRenderDataStoreDefaultMaterial& dataStoreMaterial); 92 void UpdateMeshBuffer(const IRenderDataStoreDefaultMaterial& dataStoreMaterial); 93 void UpdateSkinBuffer(const IRenderDataStoreDefaultMaterial& dataStoreMaterial); 94 void UpdateMaterialBuffers(const IRenderDataStoreDefaultMaterial& dataStoreMaterial); 95 void UpdateDescriptorSets( 96 RENDER_NS::IRenderCommandList& cmdList, const IRenderDataStoreDefaultMaterial& dataStoreMaterial); 97 98 void ProcessBuffers(const ObjectCounts& objectCounts); 99 void ProcessGlobalBinders(); 100 101 RENDER_NS::IRenderNodeContextManager* renderNodeContextMgr_ { nullptr }; 102 103 SceneRenderDataStores stores_; 104 ObjectCounts objectCounts_; 105 UboHandles ubos_; 106 107 GlobalDescriptorSets globalDescs_; 108 RENDER_NS::PipelineLayout defaultMaterialPipelineLayout_; 109 MaterialHandleStruct defaultMaterialStruct_; 110 }; 111 CORE3D_END_NAMESPACE() 112 113 #endif // CORE__RENDER__NODE__RENDER_NODE_DEFAULT_MATERIAL_OBJECTS_H 114