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 Render(RenderCmdBuffer *);
|
||||||
|
|
||||||
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
|
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
|
||||||
|
void UpdateMaterialInstance(SceneNode *);
|
||||||
};//class MaterialRenderList
|
};//class MaterialRenderList
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -40,6 +40,7 @@ namespace hgl
|
|||||||
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
|
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
|
||||||
|
|
||||||
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
|
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
|
||||||
|
virtual void UpdateMaterialInstance(SceneNode *); ///<有对象互换了材质实例
|
||||||
|
|
||||||
virtual void Clear(); ///<彻底清理
|
virtual void Clear(); ///<彻底清理
|
||||||
};//class RenderList
|
};//class RenderList
|
||||||
|
@ -13,13 +13,15 @@ namespace hgl
|
|||||||
|
|
||||||
struct RenderNode
|
struct RenderNode
|
||||||
{
|
{
|
||||||
SceneNode *scene_node;
|
uint index; ///<在MaterialRenderList中的索引
|
||||||
|
|
||||||
uint32 l2w_version;
|
SceneNode * scene_node;
|
||||||
uint32 l2w_index;
|
|
||||||
|
|
||||||
Vector3f world_position;
|
uint32 l2w_version;
|
||||||
float to_camera_distance;
|
uint32 l2w_index;
|
||||||
|
|
||||||
|
Vector3f world_position;
|
||||||
|
float to_camera_distance;
|
||||||
};
|
};
|
||||||
|
|
||||||
using RenderNodeList=List<RenderNode>;
|
using RenderNodeList=List<RenderNode>;
|
||||||
|
@ -103,6 +103,20 @@ public:
|
|||||||
|
|
||||||
const PrimitiveDataBuffer *GetDataBuffer ()const{return primitive_data_buffer;}
|
const PrimitiveDataBuffer *GetDataBuffer ()const{return primitive_data_buffer;}
|
||||||
const PrimitiveRenderData *GetRenderData ()const{return primitive_render_data;}
|
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
|
};//class Renderable
|
||||||
|
|
||||||
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
|
Renderable *CreateRenderable(Primitive *,MaterialInstance *,Pipeline *);
|
||||||
|
@ -111,10 +111,12 @@ void MaterialRenderList::Add(SceneNode *sn)
|
|||||||
{
|
{
|
||||||
RenderNode rn;
|
RenderNode rn;
|
||||||
|
|
||||||
|
rn.index =rn_list.GetCount();
|
||||||
|
|
||||||
rn.scene_node =sn;
|
rn.scene_node =sn;
|
||||||
|
|
||||||
rn.l2w_version=sn->GetLocalToWorldMatrixVersion();
|
rn.l2w_version =sn->GetLocalToWorldMatrixVersion();
|
||||||
rn.l2w_index=0;
|
rn.l2w_index =0;
|
||||||
|
|
||||||
rn.world_position =sn->GetWorldPosition();
|
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)
|
void MaterialRenderList::RenderItem::Set(Renderable *ri)
|
||||||
{
|
{
|
||||||
pipeline=ri->GetPipeline();
|
pipeline=ri->GetPipeline();
|
||||||
|
@ -105,6 +105,18 @@ void RenderAssignBuffer::UpdateLocalToWorld(const RenderNodePointerList &rnp_lis
|
|||||||
l2w_buffer->Unmap();
|
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)
|
void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list)
|
||||||
{
|
{
|
||||||
mi_set.Clear();
|
mi_set.Clear();
|
||||||
|
@ -93,5 +93,6 @@ public:
|
|||||||
void WriteNode(const RenderNodeList &);
|
void WriteNode(const RenderNodeList &);
|
||||||
|
|
||||||
void UpdateLocalToWorld(const RenderNodePointerList &,const int first,const int last);
|
void UpdateLocalToWorld(const RenderNodePointerList &,const int first,const int last);
|
||||||
|
void UpdateMaterialInstance(const RenderNode *);
|
||||||
};//struct RenderAssignBuffer
|
};//struct RenderAssignBuffer
|
||||||
VK_NAMESPACE_END
|
VK_NAMESPACE_END
|
||||||
|
@ -85,5 +85,22 @@ namespace hgl
|
|||||||
|
|
||||||
mrl_map.UpdateLocalToWorld();
|
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 graph
|
||||||
}//namespace hgl
|
}//namespace hgl
|
||||||
|
Loading…
x
Reference in New Issue
Block a user