added RenderNode2D.cpp

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-04-25 19:18:07 +08:00
parent 48b5479ade
commit cd03ee8211
3 changed files with 176 additions and 148 deletions

View File

@ -35,14 +35,15 @@ source_group("Light" FILES ${LIGHT_FILES})
SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/SceneInfo.h SET(SCENE_GRAPH_HEADER ${SG_INCLUDE_PATH}/SceneInfo.h
${SG_INCLUDE_PATH}/SceneNode.h ${SG_INCLUDE_PATH}/SceneNode.h
${SG_INCLUDE_PATH}/RenderNode.h ${SG_INCLUDE_PATH}/RenderNode2D.h
${SG_INCLUDE_PATH}/SceneOrient.h ${SG_INCLUDE_PATH}/SceneOrient.h
${SG_INCLUDE_PATH}/RenderList.h #${SG_INCLUDE_PATH}/RenderList.h
${SG_INCLUDE_PATH}/RenderList2D.h ${SG_INCLUDE_PATH}/RenderList2D.h
) )
SET(SCENE_GRAPH_SOURCE SET(SCENE_GRAPH_SOURCE
#RenderList.cpp #RenderList.cpp
RenderNode2D.cpp
RenderList2D.cpp RenderList2D.cpp
#RenderList3D.cpp #RenderList3D.cpp
SceneNode.cpp SceneNode.cpp

View File

@ -8,68 +8,6 @@
#include<hgl/graph/VKRenderable.h> #include<hgl/graph/VKRenderable.h>
#include<hgl/util/sort/Sort.h> #include<hgl/util/sort/Sort.h>
/**
*
*
*
* for(material)
* for(pipeline)
* for(material_instance)
* for(vbo)
*/
template<>
int Comparator<RenderNode2DPointer>::compare(const RenderNode2DPointer &obj_one,const RenderNode2DPointer &obj_two) const
{
int off;
hgl::graph::Renderable *ri_one=obj_one->ri;
hgl::graph::Renderable *ri_two=obj_two->ri;
//比较材质
{
off=ri_one->GetMaterial()
-ri_two->GetMaterial();
if(off)
return off;
}
//比较管线
{
off=ri_one->GetPipeline()
-ri_two->GetPipeline();
if(off)
return off;
}
//比较材质实例
//{
// for(int i =(int)hgl::graph::DescriptorSetType::BEGIN_RANGE;
// i<=(int)hgl::graph::DescriptorSetType::END_RANGE;
// i++)
// {
// off=ri_one->GetMP((hgl::graph::DescriptorSetType)i)
// -ri_two->GetMP((hgl::graph::DescriptorSetType)i);
// if(off)
// return off;
// }
//}
//比较vbo+ebo
{
off=ri_one->GetBufferHash()
-ri_two->GetBufferHash();
if(off)
return off;
}
return 0;
}
namespace hgl namespace hgl
{ {
namespace graph namespace graph
@ -79,7 +17,6 @@ namespace hgl
device =dev; device =dev;
cmd_buf =nullptr; cmd_buf =nullptr;
last_mtl =nullptr;
last_pipeline =nullptr; last_pipeline =nullptr;
hgl_zero(last_mp); hgl_zero(last_mp);
last_vbo =0; last_vbo =0;
@ -91,61 +28,66 @@ namespace hgl
bool RenderList2D::Begin() bool RenderList2D::Begin()
{ {
mrl_map.ClearData(); renderable_count=0;
mrl_map.Begin();
return(true); return(true);
} }
void RenderList2D::End() void RenderList2D::End()
{ {
if(render_node_list.GetCount()<=0)return; if(renderable_count<=0)return;
//排序 mrl_map.End();
Sort(render_node_list,&render_node_comparator);
//产生MVP矩阵UBO数据
{
const uint32_t count=render_node_list.GetCount();
{ //
//按当前总节点数量分配UBO // //排序
// mvp_array->Alloc(count); // Sort(render_node_list,&render_node_comparator);
// mvp_array->Clear(); //
// //产生MVP矩阵UBO数据
ri_list.ClearData(); // {
ri_list.SetCount(count); // const uint32_t count=render_node_list.GetCount();
} //
// {
{ // //按当前总节点数量分配UBO
// ubo_align=mvp_array->GetAlignSize(); //// mvp_array->Alloc(count);
//// mvp_array->Clear();
// char *mp=(char *)(mvp_array->Map(0,count)); //
Renderable **ri=ri_list.GetData(); // ri_list.ClearData();
// ri_list.SetCount(count);
for(RenderNode2D *node:render_node_list) //未来可能要在Expend处考虑做去重 // }
{ //
// memcpy(mp,&(node->matrix),MVPMatrixBytes); // {
// mp+=ubo_align; //// ubo_align=mvp_array->GetAlignSize();
//
(*ri)=node->ri; //// char *mp=(char *)(mvp_array->Map(0,count));
++ri; // Renderable **ri=ri_list.GetData();
} //
// for(RenderNode2D *node:render_node_list) //未来可能要在Expend处考虑做去重
// mvp_array->Flush(count); // {
} //// memcpy(mp,&(node->matrix),MVPMatrixBytes);
} //// mp+=ubo_align;
//
//为所有的材质绑定 // (*ri)=node->ri;
//for(Material *mtl:material_sets) // ++ri;
//{ // }
// MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject); //
//// mvp_array->Flush(count);
// if(mp) // }
// { // }
// if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) //
// mp->Update(); // //为所有的材质绑定
// } // //for(Material *mtl:material_sets)
//} // //{
// // MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerObject);
//
// // if(mp)
// // {
// // if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true))
// // mp->Update();
// // }
// //}
} }
bool RenderList2D::ExpendNode(SceneNode *sn) bool RenderList2D::ExpendNode(SceneNode *sn)
@ -156,15 +98,19 @@ namespace hgl
if(ri) if(ri)
{ {
RenderNode2D *rn=new RenderNode2D; Material *mtl=ri->GetMaterial();
MaterialRenderList2D *mrl;
rn->local_to_world=sn->GetLocalToWorldMatrix(); if(!mrl_map.Get(mtl,mrl))
{
mrl=new MaterialRenderList2D(mtl);
rn->ri=ri; mrl_map.Add(mtl,mrl);
}
render_node_list.Add(rn); mrl->Add(ri,sn->GetLocalToWorldMatrix());
material_sets.Add(ri->GetMaterial()); ++renderable_count;
} }
for(SceneNode *sub:sn->SubNode) for(SceneNode *sub:sn->SubNode)
@ -179,45 +125,45 @@ namespace hgl
Begin(); Begin();
ExpendNode(sn); ExpendNode(sn);
End(); // End();
return(true); return(true);
} }
bool RenderList2D::BindPerFrameDescriptor() //bool RenderList2D::BindPerFrameDescriptor()
{ //{
if(!cmd_buf)return(false); // if(!cmd_buf)return(false);
for(Material *mtl:material_sets) // for(Material *mtl:material_sets)
{ // {
MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerFrame); // MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerFrame);
if(!mp)continue; // if(!mp)continue;
//
// //if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true))
// // mp->Update();
// }
//if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true)) // return(true);
// mp->Update(); //}
}
return(true); //bool RenderList2D::BindPerMaterialDescriptor()
} //{
// //为每个材质实例,绑定它们的描述符
// if(!cmd_buf)return(false);
bool RenderList2D::BindPerMaterialDescriptor() // for(Material *mtl:material_sets)
{ // {
//为每个材质实例,绑定它们的描述符 // MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerMaterial);
if(!cmd_buf)return(false);
for(Material *mtl:material_sets) // if(!mp)continue;
{ //
MaterialParameters *mp=mtl->GetMP(DescriptorSetType::PerMaterial); // //if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true))
// // mp->Update();
// }
if(!mp)continue; // return(true);
//}
//if(mp->BindUBO("r_scene_info",mvp_array->GetBuffer(),true))
// mp->Update();
}
return(true);
}
void RenderList2D::Render(Renderable *ri) void RenderList2D::Render(Renderable *ri)
{ {

View File

@ -0,0 +1,81 @@
#include<hgl/graph/RenderNode2D.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/util/sort/Sort.h>
/**
*
*
*
* for(material)
* for(pipeline)
* for(material_instance)
* for(vbo)
*/
template<>
int Comparator<hgl::graph::RenderNode2D>::compare(const hgl::graph::RenderNode2D &obj_one,const hgl::graph::RenderNode2D &obj_two) const
{
int off;
hgl::graph::Renderable *ri_one=obj_one.ri;
hgl::graph::Renderable *ri_two=obj_two.ri;
//比较管线
{
off=ri_one->GetPipeline()
-ri_two->GetPipeline();
if(off)
return off;
}
//比较材质实例
//{
// for(int i =(int)hgl::graph::DescriptorSetType::BEGIN_RANGE;
// i<=(int)hgl::graph::DescriptorSetType::END_RANGE;
// i++)
// {
// off=ri_one->GetMP((hgl::graph::DescriptorSetType)i)
// -ri_two->GetMP((hgl::graph::DescriptorSetType)i);
// if(off)
// return off;
// }
//}
//比较vbo+ebo
{
off=ri_one->GetBufferHash()
-ri_two->GetBufferHash();
if(off)
return off;
}
return 0;
}
namespace hgl
{
namespace graph
{
void MaterialRenderList2D::Add(Renderable *ri,const Matrix3x4f &mat)
{
RenderNode2D rn;
rn.local_to_world=mat;
rn.ri=ri;
rn_list.Add(rn);
}
void MaterialRenderList2D::End()
{
Comparator<hgl::graph::RenderNode2D> rnc;
Sort(rn_list,&rnc);
}
}//namespace graph
}//namespace hgl