Added UpdateMaterialInstance method. but no any test.
This commit is contained in:
parent
726a8ec635
commit
72ceffeda2
@ -96,5 +96,6 @@ public:
|
||||
void Render(RenderCmdBuffer *);
|
||||
|
||||
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
|
||||
void UpdateMaterialInstance(SceneNode *);
|
||||
};//class MaterialRenderList
|
||||
VK_NAMESPACE_END
|
||||
|
@ -40,6 +40,7 @@ namespace hgl
|
||||
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
|
||||
|
||||
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
|
||||
virtual void UpdateMaterialInstance(SceneNode *); ///<有对象互换了材质实例
|
||||
|
||||
virtual void Clear(); ///<彻底清理
|
||||
};//class RenderList
|
||||
|
@ -13,13 +13,15 @@ namespace hgl
|
||||
|
||||
struct RenderNode
|
||||
{
|
||||
SceneNode *scene_node;
|
||||
uint index; ///<在MaterialRenderList中的索引
|
||||
|
||||
uint32 l2w_version;
|
||||
uint32 l2w_index;
|
||||
SceneNode * scene_node;
|
||||
|
||||
Vector3f world_position;
|
||||
float to_camera_distance;
|
||||
uint32 l2w_version;
|
||||
uint32 l2w_index;
|
||||
|
||||
Vector3f world_position;
|
||||
float to_camera_distance;
|
||||
};
|
||||
|
||||
using RenderNodeList=List<RenderNode>;
|
||||
|
@ -103,6 +103,20 @@ public:
|
||||
|
||||
const PrimitiveDataBuffer *GetDataBuffer ()const{return primitive_data_buffer;}
|
||||
const PrimitiveRenderData *GetRenderData ()const{return primitive_render_data;}
|
||||
|
||||
public:
|
||||
|
||||
bool ChangeMaterialInstance(MaterialInstance *mi)
|
||||
{
|
||||
if(!mi)
|
||||
return(false);
|
||||
|
||||
if(mi->GetMaterial()!=mat_inst->GetMaterial()) //不能换母材质
|
||||
return(false);
|
||||
|
||||
mat_inst=mi;
|
||||
return(true);
|
||||
}
|
||||
};//class Renderable
|
||||
|
||||
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
|
||||
|
@ -111,10 +111,12 @@ void MaterialRenderList::Add(SceneNode *sn)
|
||||
{
|
||||
RenderNode rn;
|
||||
|
||||
rn.index =rn_list.GetCount();
|
||||
|
||||
rn.scene_node =sn;
|
||||
|
||||
rn.l2w_version=sn->GetLocalToWorldMatrixVersion();
|
||||
rn.l2w_index=0;
|
||||
rn.l2w_version =sn->GetLocalToWorldMatrixVersion();
|
||||
rn.l2w_index =0;
|
||||
|
||||
rn.world_position =sn->GetWorldPosition();
|
||||
|
||||
@ -187,6 +189,30 @@ void MaterialRenderList::UpdateLocalToWorld()
|
||||
}
|
||||
}
|
||||
|
||||
void MaterialRenderList::UpdateMaterialInstance(SceneNode *sn)
|
||||
{
|
||||
if(!sn)return;
|
||||
|
||||
if(!assign_buffer)
|
||||
return;
|
||||
|
||||
const int node_count=rn_list.GetCount();
|
||||
|
||||
if(node_count<=0)return;
|
||||
RenderNode *rn=rn_list.GetData();
|
||||
|
||||
for(int i=0;i<node_count;i++)
|
||||
{
|
||||
if(rn->scene_node==sn)
|
||||
{
|
||||
assign_buffer->UpdateMaterialInstance(rn);
|
||||
return;
|
||||
}
|
||||
|
||||
++rn;
|
||||
}
|
||||
}
|
||||
|
||||
void MaterialRenderList::RenderItem::Set(Renderable *ri)
|
||||
{
|
||||
pipeline=ri->GetPipeline();
|
||||
|
@ -105,6 +105,18 @@ void RenderAssignBuffer::UpdateLocalToWorld(const RenderNodePointerList &rnp_lis
|
||||
l2w_buffer->Unmap();
|
||||
}
|
||||
|
||||
void RenderAssignBuffer::UpdateMaterialInstance(const RenderNode *rn)
|
||||
{
|
||||
if(!rn)
|
||||
return;
|
||||
|
||||
AssignData *adp=(AssignData *)(assign_vab->DeviceBuffer::Map(sizeof(AssignData)*rn->index,sizeof(AssignData)));
|
||||
|
||||
adp->mi=mi_set.Find(rn->scene_node->GetRenderable()->GetMaterialInstance());
|
||||
|
||||
assign_vab->Unmap();
|
||||
}
|
||||
|
||||
void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list)
|
||||
{
|
||||
mi_set.Clear();
|
||||
|
@ -93,5 +93,6 @@ public:
|
||||
void WriteNode(const RenderNodeList &);
|
||||
|
||||
void UpdateLocalToWorld(const RenderNodePointerList &,const int first,const int last);
|
||||
void UpdateMaterialInstance(const RenderNode *);
|
||||
};//struct RenderAssignBuffer
|
||||
VK_NAMESPACE_END
|
||||
|
@ -85,5 +85,22 @@ namespace hgl
|
||||
|
||||
mrl_map.UpdateLocalToWorld();
|
||||
}
|
||||
|
||||
void RenderList::UpdateMaterialInstance(SceneNode *sn)
|
||||
{
|
||||
if(!sn)return;
|
||||
|
||||
Renderable *ri=sn->GetRenderable();
|
||||
|
||||
if(!ri)return;
|
||||
|
||||
Material *mtl=ri->GetMaterial();
|
||||
MaterialRenderList *mrl;
|
||||
|
||||
if(!mrl_map.Get(mtl,mrl)) //找到对应的
|
||||
return;
|
||||
|
||||
mrl->UpdateMaterialInstance(sn);
|
||||
}
|
||||
}//namespace graph
|
||||
}//namespace hgl
|
||||
|
Loading…
x
Reference in New Issue
Block a user