ULRE/inc/hgl/graph/MaterialRenderList.h

97 lines
2.1 KiB
C
Raw Normal View History

#pragma once
#include<hgl/graph/RenderNode.h>
2024-05-25 22:57:29 +08:00
#include<hgl/graph/VKVABList.h>
2024-05-30 01:14:27 +08:00
#include<hgl/type/SortedSets.h>
#include<hgl/graph/VKIndirectCommandBuffer.h>
VK_NAMESPACE_BEGIN
class RenderAssignBuffer;
2024-07-18 01:53:23 +08:00
class SceneNode;
struct CameraInfo;
/**
*
*/
class MaterialRenderList
{
GPUDevice *device;
RenderCmdBuffer *cmd_buf;
Material *material;
CameraInfo *camera_info;
RenderNodeList rn_list;
private:
RenderAssignBuffer *assign_buffer;
struct RenderItem
{
uint32_t first_instance; ///<第一个绘制实例(和instance渲染无关,对应InstanceRate的VAB)
uint32_t instance_count;
2024-05-27 01:42:10 +08:00
Pipeline * pipeline;
MaterialInstance * mi;
2024-05-28 23:49:28 +08:00
const PrimitiveDataBuffer * pdb;
2024-05-27 01:42:10 +08:00
const PrimitiveRenderData * prd;
public:
void Set(Renderable *);
};
IndirectDrawBuffer *icb_draw;
IndirectDrawIndexedBuffer *icb_draw_indexed;
void ReallocICB();
void WriteICB(VkDrawIndirectCommand *,RenderItem *ri);
void WriteICB(VkDrawIndexedIndirectCommand *,RenderItem *ri);
2024-05-30 01:14:27 +08:00
DataArray<RenderItem> ri_array;
uint ri_count;
void Stat();
protected:
VABList * vab_list;
2024-05-27 01:42:10 +08:00
Pipeline * last_pipeline;
const PrimitiveDataBuffer * last_data_buffer;
2024-05-30 01:14:27 +08:00
const VDM * last_vdm;
2024-05-27 01:42:10 +08:00
const PrimitiveRenderData * last_render_data;
int first_indirect_draw_index=-1;
uint indirect_draw_count=0;
2024-05-28 02:21:33 +08:00
bool BindVAB(const PrimitiveDataBuffer *,const uint);
void ProcIndirectRender();
void Render(RenderItem *);
public:
MaterialRenderList(GPUDevice *d,bool l2w,Material *m);
~MaterialRenderList();
2024-07-18 01:53:23 +08:00
void Add(SceneNode *);
void SetCameraInfo(CameraInfo *ci)
{
camera_info=ci;
}
void Clear()
{
rn_list.Clear();
}
void End();
void Render(RenderCmdBuffer *);
};//class MaterialRenderList
VK_NAMESPACE_END