MeshComponent增加OverrideMaterial的设计,还未测试。下一步使用Gizmo3DMove来测试override material

This commit is contained in:
2025-07-06 12:09:11 +08:00
parent 2b135b1d24
commit 033820c91d
6 changed files with 69 additions and 14 deletions

View File

@@ -59,6 +59,7 @@ public:
class MeshComponent:public RenderComponent
{
WeakPtr<ComponentData> 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

View File

@@ -13,6 +13,8 @@ public:
using PrimitiveComponent::PrimitiveComponent;
virtual ~RenderComponent()=default;
virtual const bool CanRender()const=0; ///<当前数据是否可以渲染
};//class RenderComponent
COMPONENT_NAMESPACE_END

View File

@@ -18,7 +18,8 @@ using ShaderStageCreateInfoList=ArrayList<VkPipelineShaderStageCreateInfo>;
/**
* 材质类<br>
* 用于管理shader提供DescriptorSetLayoutCreater
* 用于管理shader提供DescriptorSetLayoutCreater.
* 在材质需要用到UBO.SSBO数据情况下Material不能被用于渲染需要一个MaterialInstance来提供数据才能进行渲染。所以一般情况下不使用Material进行渲染。<br>
*/
class Material
{

View File

@@ -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;

View File

@@ -28,14 +28,12 @@ namespace hgl
if(component->GetTypeHash()!=MeshComponent::StaticTypeHash()) //暂时只支持MeshComponent
continue;
MeshComponent *smc=dynamic_cast<MeshComponent *>(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)) //找到对应的

View File

@@ -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