ULRE/src/SceneGraph/render/RenderList.cpp

112 lines
2.6 KiB
C++
Raw Normal View History

2024-10-06 02:30:59 +08:00
#include<hgl/graph/MaterialRenderList.h>
#include<hgl/graph/RenderList.h>
2019-05-21 21:28:33 +08:00
#include<hgl/graph/SceneNode.h>
2024-10-06 02:30:59 +08:00
#include<hgl/graph/VK.h>
#include<hgl/graph/VKCommandBuffer.h>
2024-10-06 02:30:59 +08:00
#include<hgl/graph/VKMaterial.h>
#include<hgl/graph/Mesh.h>
2025-06-15 17:53:15 +08:00
#include<hgl/component/MeshComponent.h>
2019-05-21 21:28:33 +08:00
namespace hgl
{
namespace graph
{
RenderList::RenderList(VulkanDevice *dev)
{
device =dev;
2023-05-07 01:07:26 +08:00
renderable_count=0;
camera_info=nullptr;
}
2023-05-07 01:07:26 +08:00
bool RenderList::ExpendNode(SceneNode *sn)
{
if(!sn)return(false);
2025-06-14 21:05:36 +08:00
for(auto component:sn->GetComponents())
{
2025-06-15 17:53:15 +08:00
if(component->GetHashCode()!=MeshComponent::StaticHashCode()) //暂时只支持MeshComponent
2025-06-14 21:05:36 +08:00
continue;
2025-06-15 17:53:15 +08:00
MeshComponent *smc=reinterpret_cast<MeshComponent *>(component);
2025-06-14 21:05:36 +08:00
Mesh *mesh=smc->GetMesh();
RenderPipelineIndex rpi(mesh->GetMaterial(),mesh->GetPipeline());
2023-05-07 01:07:26 +08:00
MaterialRenderList *mrl;
if(!mrl_map.Get(rpi,mrl))
2023-05-07 01:07:26 +08:00
{
mrl=new MaterialRenderList(device,true,rpi);
mrl_map.Add(rpi,mrl);
2023-05-07 01:07:26 +08:00
}
2025-06-14 21:05:36 +08:00
mrl->Add(smc);
2023-05-07 01:07:26 +08:00
++renderable_count;
}
for(SceneNode *sub:sn->GetChildNode())
2023-05-07 01:07:26 +08:00
ExpendNode(sub);
return(true);
}
2023-05-07 01:07:26 +08:00
bool RenderList::Expend(SceneNode *sn)
{
if(!device|!sn)return(false);
mrl_map.Begin(camera_info);
2023-05-07 01:07:26 +08:00
ExpendNode(sn);
mrl_map.End();
return(true);
}
bool RenderList::Render(RenderCmdBuffer *cb)
{
if(!cb)
2019-05-21 21:28:33 +08:00
return(false);
2023-05-07 01:07:26 +08:00
if(renderable_count<=0)
return(true);
2023-05-07 01:07:26 +08:00
mrl_map.Render(cb);
2019-05-21 21:28:33 +08:00
return(true);
}
2023-05-07 01:07:26 +08:00
void RenderList::Clear()
{
mrl_map.Clear();
}
void RenderList::UpdateLocalToWorld()
{
if(renderable_count<=0)
return;
mrl_map.UpdateLocalToWorld();
}
2025-06-15 17:53:15 +08:00
void RenderList::UpdateMaterialInstance(MeshComponent *smc)
{
2025-06-14 21:05:36 +08:00
if(!smc)return;
2025-06-14 21:05:36 +08:00
Mesh *ri=smc->GetMesh();
if(!ri)return;
RenderPipelineIndex rli(ri->GetMaterial(),ri->GetPipeline());
MaterialRenderList *mrl;
if(!mrl_map.Get(rli,mrl)) //找到对应的
return;
2025-06-14 21:05:36 +08:00
mrl->UpdateMaterialInstance(smc);
}
2019-05-21 21:28:33 +08:00
}//namespace graph
}//namespace hgl