diff --git a/inc/hgl/component/MeshComponent.h b/inc/hgl/component/MeshComponent.h index c48c9d61..5b7122f4 100644 --- a/inc/hgl/component/MeshComponent.h +++ b/inc/hgl/component/MeshComponent.h @@ -59,6 +59,7 @@ public: class MeshComponent:public RenderComponent { WeakPtr sm_data; + MaterialInstance* override_material = nullptr; // 新增 public: @@ -88,6 +89,61 @@ public: return mcd->mesh; } + +public: + + Pipeline *GetPipeline() const + { + Mesh *mesh=GetMesh(); + + if (!mesh) + return nullptr; + + return mesh->GetPipeline(); + } + + void SetOverrideMaterial (MaterialInstance* mi){override_material=mi;} + MaterialInstance * GetOverrideMaterial ()const{return override_material;} + void ClearOverrideMaterial (){override_material=nullptr;} + + MaterialInstance * GetMaterialInstance () const + { + if (override_material) + return override_material; + + Mesh *mesh=GetMesh(); + + if (!mesh) + return nullptr; + + return mesh->GetMaterialInstance(); + } + + Material *GetMaterial() const + { + if (override_material) + return override_material->GetMaterial(); + + Mesh *mesh=GetMesh(); + + if (!mesh) + return nullptr; + + return mesh->GetMaterial(); + } + + const bool CanRender() const override + { + if (!sm_data.valid()) + return false; + + const MeshComponentData *mcd=GetData(); + + if (!mcd || !mcd->mesh) + return false; + + return true; + } };//class MeshComponent COMPONENT_NAMESPACE_END diff --git a/inc/hgl/component/RenderComponent.h b/inc/hgl/component/RenderComponent.h index c8936e86..0765ddb1 100644 --- a/inc/hgl/component/RenderComponent.h +++ b/inc/hgl/component/RenderComponent.h @@ -13,6 +13,8 @@ public: using PrimitiveComponent::PrimitiveComponent; virtual ~RenderComponent()=default; + + virtual const bool CanRender()const=0; ///<当前数据是否可以渲染 };//class RenderComponent COMPONENT_NAMESPACE_END diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index e7fc9ca5..9d0358ed 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -18,7 +18,8 @@ using ShaderStageCreateInfoList=ArrayList; /** * 材质类
- * 用于管理shader,提供DescriptorSetLayoutCreater + * 用于管理shader,提供DescriptorSetLayoutCreater. + * 在材质需要用到UBO.SSBO数据情况下,Material不能被用于渲染,需要一个MaterialInstance来提供数据才能进行渲染。所以一般情况下,不使用Material进行渲染。
*/ class Material { diff --git a/src/SceneGraph/render/RenderAssignBuffer.cpp b/src/SceneGraph/render/RenderAssignBuffer.cpp index 167b8070..41b2c939 100644 --- a/src/SceneGraph/render/RenderAssignBuffer.cpp +++ b/src/SceneGraph/render/RenderAssignBuffer.cpp @@ -113,7 +113,7 @@ void RenderAssignBuffer::UpdateMaterialInstance(const RenderNode *rn) AssignData *adp=(AssignData *)(assign_vab->DeviceBuffer::Map(sizeof(AssignData)*rn->index,sizeof(AssignData))); - adp->mi=mi_set.Find(rn->sm_component->GetMesh()->GetMaterialInstance()); + adp->mi=mi_set.Find(rn->sm_component->GetMaterialInstance()); assign_vab->Unmap(); } @@ -153,7 +153,7 @@ void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list) mi_set.PreAlloc(rn_list.GetCount()); for(RenderNode &rn:rn_list) - mi_set.Add(rn.sm_component->GetMesh()->GetMaterialInstance()); + mi_set.Add(rn.sm_component->GetMaterialInstance()); if(mi_set.GetCount()>material->GetMIMaxCount()) { @@ -221,7 +221,7 @@ void RenderAssignBuffer::WriteNode(const RenderNodeList &rn_list) rn->l2w_index=i; adp->l2w=i; - adp->mi=mi_set.Find(rn->sm_component->GetMesh()->GetMaterialInstance()); + adp->mi=mi_set.Find(rn->sm_component->GetMaterialInstance()); ++adp; ++rn; diff --git a/src/SceneGraph/render/RenderList.cpp b/src/SceneGraph/render/RenderList.cpp index c93f53fb..20fd258d 100644 --- a/src/SceneGraph/render/RenderList.cpp +++ b/src/SceneGraph/render/RenderList.cpp @@ -28,14 +28,12 @@ namespace hgl if(component->GetTypeHash()!=MeshComponent::StaticTypeHash()) //暂时只支持MeshComponent continue; - MeshComponent *smc=dynamic_cast(component); + MeshComponent *smc=(MeshComponent *)component; - if(!smc) + if(!smc||!smc->CanRender()) continue; - Mesh *mesh=smc->GetMesh(); - - RenderPipelineIndex rpi(mesh->GetMaterial(),mesh->GetPipeline()); + RenderPipelineIndex rpi(smc->GetMaterial(),smc->GetPipeline()); MaterialRenderList *mrl; @@ -98,11 +96,9 @@ namespace hgl { if(!smc)return; - Mesh *ri=smc->GetMesh(); + if(!smc->CanRender())return; - if(!ri)return; - - RenderPipelineIndex rli(ri->GetMaterial(),ri->GetPipeline()); + RenderPipelineIndex rli(smc->GetMaterial(),smc->GetPipeline()); MaterialRenderList *mrl; if(!mrl_map.Get(rli,mrl)) //找到对应的 diff --git a/src/SceneGraph/render/RenderNode.cpp b/src/SceneGraph/render/RenderNode.cpp index 143919f1..6ffa77a0 100644 --- a/src/SceneGraph/render/RenderNode.cpp +++ b/src/SceneGraph/render/RenderNode.cpp @@ -92,7 +92,7 @@ MaterialInstance *RenderNode::GetMaterialInstance()const if(!sm_component)return(nullptr); if(!sm_component->GetMesh())return(nullptr); - return sm_component->GetMesh()->GetMaterialInstance(); + return sm_component->GetMaterialInstance(); } VK_NAMESPACE_END