save full SceneNode in RenderNode,added length sort.
This commit is contained in:
parent
7f074c6c79
commit
3768507169
2
CMCore
2
CMCore
@ -1 +1 @@
|
|||||||
Subproject commit 7589d62732b68b99de1bec561b1703dd2b043c03
|
Subproject commit 0dd89d78abd3cb24c6ce36d57fd9d8ccac3ec983
|
@ -92,6 +92,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
root.RefreshMatrix();
|
root.RefreshMatrix();
|
||||||
|
render_list->SetCamera(&(camera_control->GetCameraInfo()));
|
||||||
render_list->Expend(&root);
|
render_list->Expend(&root);
|
||||||
|
|
||||||
SceneAppFramework::BuildCommandBuffer(index);
|
SceneAppFramework::BuildCommandBuffer(index);
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
class RenderAssignBuffer;
|
class RenderAssignBuffer;
|
||||||
class SceneNode;
|
class SceneNode;
|
||||||
|
struct CameraInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同一材质的对象渲染列表
|
* 同一材质的对象渲染列表
|
||||||
@ -18,6 +19,8 @@ class MaterialRenderList
|
|||||||
|
|
||||||
Material *material;
|
Material *material;
|
||||||
|
|
||||||
|
CameraInfo *camera_info;
|
||||||
|
|
||||||
RenderNodeList rn_list;
|
RenderNodeList rn_list;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -76,6 +79,11 @@ public:
|
|||||||
|
|
||||||
void Add(SceneNode *);
|
void Add(SceneNode *);
|
||||||
|
|
||||||
|
void SetCameraInfo(CameraInfo *ci)
|
||||||
|
{
|
||||||
|
camera_info=ci;
|
||||||
|
}
|
||||||
|
|
||||||
void Clear()
|
void Clear()
|
||||||
{
|
{
|
||||||
rn_list.Clear();
|
rn_list.Clear();
|
||||||
|
@ -9,11 +9,14 @@ public:
|
|||||||
MaterialRenderMap()=default;
|
MaterialRenderMap()=default;
|
||||||
virtual ~MaterialRenderMap()=default;
|
virtual ~MaterialRenderMap()=default;
|
||||||
|
|
||||||
void Begin()
|
void Begin(CameraInfo *ci)
|
||||||
{
|
{
|
||||||
for(auto *it:data_list)
|
for(auto *it:data_list)
|
||||||
|
{
|
||||||
|
it->value->SetCameraInfo(ci);
|
||||||
it->value->Clear();
|
it->value->Clear();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void End()
|
void End()
|
||||||
{
|
{
|
||||||
|
@ -20,6 +20,8 @@ namespace hgl
|
|||||||
|
|
||||||
GPUDevice * device;
|
GPUDevice * device;
|
||||||
|
|
||||||
|
CameraInfo * camera_info; ///<相机信息
|
||||||
|
|
||||||
uint renderable_count; ///<可渲染对象数量
|
uint renderable_count; ///<可渲染对象数量
|
||||||
MaterialRenderMap mrl_map; ///<按材质分类的渲染列表
|
MaterialRenderMap mrl_map; ///<按材质分类的渲染列表
|
||||||
|
|
||||||
@ -32,6 +34,7 @@ namespace hgl
|
|||||||
RenderList(GPUDevice *);
|
RenderList(GPUDevice *);
|
||||||
virtual ~RenderList()=default;
|
virtual ~RenderList()=default;
|
||||||
|
|
||||||
|
virtual void SetCamera(CameraInfo *ci){camera_info=ci;} ///<设置相机信息
|
||||||
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
|
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
|
||||||
|
|
||||||
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
|
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
|
||||||
|
@ -9,12 +9,14 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
class Renderable;
|
class Renderable;
|
||||||
class MaterialInstance;
|
class MaterialInstance;
|
||||||
|
class SceneNode;
|
||||||
|
|
||||||
struct RenderNode
|
struct RenderNode
|
||||||
{
|
{
|
||||||
Matrix4f local_to_world;
|
SceneNode *scene_node;
|
||||||
|
|
||||||
Renderable *ri;
|
Vector3f world_position;
|
||||||
|
float to_camera_distance;
|
||||||
};
|
};
|
||||||
|
|
||||||
using RenderNodeList=List<RenderNode>;
|
using RenderNodeList=List<RenderNode>;
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include"RenderAssignBuffer.h"
|
#include"RenderAssignBuffer.h"
|
||||||
#include<hgl/graph/VertexDataManager.h>
|
#include<hgl/graph/VertexDataManager.h>
|
||||||
#include<hgl/graph/SceneNode.h>
|
#include<hgl/graph/SceneNode.h>
|
||||||
|
#include<hgl/graph/CameraInfo.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -30,8 +31,8 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
|
|||||||
{
|
{
|
||||||
hgl::int64 off;
|
hgl::int64 off;
|
||||||
|
|
||||||
hgl::graph::Renderable *ri_one=obj_one.ri;
|
hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable();
|
||||||
hgl::graph::Renderable *ri_two=obj_two.ri;
|
hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable();
|
||||||
|
|
||||||
//比较管线
|
//比较管线
|
||||||
{
|
{
|
||||||
@ -45,14 +46,15 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
|
|||||||
auto *prim_one=ri_one->GetPrimitive();
|
auto *prim_one=ri_one->GetPrimitive();
|
||||||
auto *prim_two=ri_two->GetPrimitive();
|
auto *prim_two=ri_two->GetPrimitive();
|
||||||
|
|
||||||
//比如VDM
|
//比较VDM
|
||||||
|
|
||||||
|
if(prim_one->GetVDM()) //有VDM
|
||||||
{
|
{
|
||||||
off=prim_one->GetVDM()
|
off=prim_one->GetVDM()
|
||||||
-prim_two->GetVDM();
|
-prim_two->GetVDM();
|
||||||
|
|
||||||
if(off)
|
if(off)
|
||||||
return off;
|
return off;
|
||||||
}
|
|
||||||
|
|
||||||
//比较模型
|
//比较模型
|
||||||
{
|
{
|
||||||
@ -66,8 +68,17 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
|
|||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
//比较距离。。。。。。。。。。。。。。。。。。。。。还不知道这个是正了还是反了,等测出来确认后修改下面的返回值和这里的注释
|
||||||
|
|
||||||
|
float foff=obj_one.to_camera_distance
|
||||||
|
-obj_two.to_camera_distance;
|
||||||
|
|
||||||
|
if(foff>0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
@ -77,6 +88,8 @@ MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m)
|
|||||||
cmd_buf=nullptr;
|
cmd_buf=nullptr;
|
||||||
material=m;
|
material=m;
|
||||||
|
|
||||||
|
camera_info=nullptr;
|
||||||
|
|
||||||
assign_buffer=new RenderAssignBuffer(device,material);
|
assign_buffer=new RenderAssignBuffer(device,material);
|
||||||
|
|
||||||
vab_list=new VABList(material->GetVertexInput()->GetCount());
|
vab_list=new VABList(material->GetVertexInput()->GetCount());
|
||||||
@ -98,8 +111,14 @@ void MaterialRenderList::Add(SceneNode *sn)
|
|||||||
{
|
{
|
||||||
RenderNode rn;
|
RenderNode rn;
|
||||||
|
|
||||||
rn.local_to_world =sn->GetLocalToWorldMatrix();
|
rn.scene_node =sn;
|
||||||
rn.ri =sn->GetRenderable();
|
|
||||||
|
rn.world_position =sn->GetWorldPosition();
|
||||||
|
|
||||||
|
if(camera_info)
|
||||||
|
rn.to_camera_distance=length(camera_info->pos,rn.world_position);
|
||||||
|
else
|
||||||
|
rn.to_camera_distance=0;
|
||||||
|
|
||||||
rn_list.Add(rn);
|
rn_list.Add(rn);
|
||||||
}
|
}
|
||||||
@ -177,12 +196,13 @@ void MaterialRenderList::Stat()
|
|||||||
ri_array.Alloc(count);
|
ri_array.Alloc(count);
|
||||||
|
|
||||||
RenderItem *ri=ri_array.GetData();
|
RenderItem *ri=ri_array.GetData();
|
||||||
|
Renderable *ro=rn->scene_node->GetRenderable();
|
||||||
|
|
||||||
ri_count=1;
|
ri_count=1;
|
||||||
|
|
||||||
ri->first_instance=0;
|
ri->first_instance=0;
|
||||||
ri->instance_count=1;
|
ri->instance_count=1;
|
||||||
ri->Set(rn->ri);
|
ri->Set(ro);
|
||||||
|
|
||||||
last_pipeline =ri->pipeline;
|
last_pipeline =ri->pipeline;
|
||||||
last_data_buffer=ri->pdb;
|
last_data_buffer=ri->pdb;
|
||||||
@ -193,9 +213,11 @@ void MaterialRenderList::Stat()
|
|||||||
|
|
||||||
for(uint i=1;i<count;i++)
|
for(uint i=1;i<count;i++)
|
||||||
{
|
{
|
||||||
if(last_pipeline==rn->ri->GetPipeline())
|
ro=rn->scene_node->GetRenderable();
|
||||||
if(last_data_buffer->Comp(rn->ri->GetDataBuffer()))
|
|
||||||
if(last_render_data->_Comp(rn->ri->GetRenderData())==0)
|
if(last_pipeline==ro->GetPipeline())
|
||||||
|
if(last_data_buffer->Comp(ro->GetDataBuffer()))
|
||||||
|
if(last_render_data->_Comp(ro->GetRenderData())==0)
|
||||||
{
|
{
|
||||||
++ri->instance_count;
|
++ri->instance_count;
|
||||||
++rn;
|
++rn;
|
||||||
@ -218,7 +240,7 @@ void MaterialRenderList::Stat()
|
|||||||
|
|
||||||
ri->first_instance=i;
|
ri->first_instance=i;
|
||||||
ri->instance_count=1;
|
ri->instance_count=1;
|
||||||
ri->Set(rn->ri);
|
ri->Set(ro);
|
||||||
|
|
||||||
last_pipeline =ri->pipeline;
|
last_pipeline =ri->pipeline;
|
||||||
last_data_buffer=ri->pdb;
|
last_data_buffer=ri->pdb;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include<hgl/graph/VKVertexAttribBuffer.h>
|
#include<hgl/graph/VKVertexAttribBuffer.h>
|
||||||
#include<hgl/graph/VKDevice.h>
|
#include<hgl/graph/VKDevice.h>
|
||||||
#include<hgl/graph/VKMaterialInstance.h>
|
#include<hgl/graph/VKMaterialInstance.h>
|
||||||
|
#include<hgl/graph/SceneNode.h>
|
||||||
#include<hgl/graph/RenderNode.h>
|
#include<hgl/graph/RenderNode.h>
|
||||||
#include<hgl/graph/VKRenderable.h>
|
#include<hgl/graph/VKRenderable.h>
|
||||||
#include<hgl/graph/VKRenderAssign.h>
|
#include<hgl/graph/VKRenderAssign.h>
|
||||||
@ -72,7 +73,7 @@ void RenderAssignBuffer::StatL2W(const RenderNodeList &rn_list)
|
|||||||
|
|
||||||
for(uint i=0;i<rn_list.GetCount();i++)
|
for(uint i=0;i<rn_list.GetCount();i++)
|
||||||
{
|
{
|
||||||
*l2wp=rn->local_to_world;
|
*l2wp=rn->scene_node->GetLocalToWorldMatrix();
|
||||||
++l2wp;
|
++l2wp;
|
||||||
++rn;
|
++rn;
|
||||||
}
|
}
|
||||||
@ -115,7 +116,7 @@ void RenderAssignBuffer::StatMI(const RenderNodeList &rn_list)
|
|||||||
mi_set.PreAlloc(rn_list.GetCount());
|
mi_set.PreAlloc(rn_list.GetCount());
|
||||||
|
|
||||||
for(RenderNode &rn:rn_list)
|
for(RenderNode &rn:rn_list)
|
||||||
mi_set.Add(rn.ri->GetMaterialInstance());
|
mi_set.Add(rn.scene_node->GetRenderable()->GetMaterialInstance());
|
||||||
|
|
||||||
if(mi_set.GetCount()>material->GetMIMaxCount())
|
if(mi_set.GetCount()>material->GetMIMaxCount())
|
||||||
{
|
{
|
||||||
@ -181,7 +182,7 @@ void RenderAssignBuffer::WriteNode(const RenderNodeList &rn_list)
|
|||||||
for(uint i=0;i<rn_list.GetCount();i++)
|
for(uint i=0;i<rn_list.GetCount();i++)
|
||||||
{
|
{
|
||||||
adp->l2w=i;
|
adp->l2w=i;
|
||||||
adp->mi=mi_set.Find(rn->ri->GetMaterialInstance());
|
adp->mi=mi_set.Find(rn->scene_node->GetRenderable()->GetMaterialInstance());
|
||||||
++adp;
|
++adp;
|
||||||
|
|
||||||
++rn;
|
++rn;
|
||||||
|
@ -16,6 +16,8 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
device =dev;
|
device =dev;
|
||||||
renderable_count=0;
|
renderable_count=0;
|
||||||
|
|
||||||
|
camera_info=nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RenderList::ExpendNode(SceneNode *sn)
|
bool RenderList::ExpendNode(SceneNode *sn)
|
||||||
@ -51,7 +53,7 @@ namespace hgl
|
|||||||
{
|
{
|
||||||
if(!device|!sn)return(false);
|
if(!device|!sn)return(false);
|
||||||
|
|
||||||
mrl_map.Begin();
|
mrl_map.Begin(camera_info);
|
||||||
ExpendNode(sn);
|
ExpendNode(sn);
|
||||||
mrl_map.End();
|
mrl_map.End();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user