update Geometry2D/3D and RenderableCreater to best new

This commit is contained in:
hyzboy 2020-07-20 19:19:09 +08:00
parent 8c32fb4d3c
commit ec3919626e
6 changed files with 1227 additions and 1282 deletions

View File

@ -34,9 +34,9 @@ private:
vulkan::Material * material =nullptr; vulkan::Material * material =nullptr;
vulkan::MaterialInstance * material_instance =nullptr; vulkan::MaterialInstance * material_instance =nullptr;
vulkan::Renderable *ro_rectangle =nullptr;/*, vulkan::Renderable *ro_rectangle =nullptr,
*ro_circle =nullptr, *ro_circle =nullptr,
*ro_round_rectangle =nullptr;*/ *ro_round_rectangle =nullptr;
vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr;
vulkan::Buffer * ubo_color_material =nullptr; vulkan::Buffer * ubo_color_material =nullptr;
@ -69,29 +69,29 @@ private:
ro_rectangle=CreateRenderableRectangle(db,material,&rci); ro_rectangle=CreateRenderableRectangle(db,material,&rci);
} }
//{ {
// struct RoundRectangleCreateInfo rrci; struct RoundRectangleCreateInfo rrci;
// rrci.scope.Set(SCREEN_WIDTH-30,10,20,20); rrci.scope.Set(SCREEN_WIDTH-30,10,20,20);
// rrci.radius=5; rrci.radius=5;
// rrci.round_per=5; rrci.round_per=5;
// ro_round_rectangle=CreateRenderableRoundRectangle(db,material,&rrci); ro_round_rectangle=CreateRenderableRoundRectangle(db,material,&rrci);
//} }
//{ {
// struct CircleCreateInfo cci; struct CircleCreateInfo cci;
// cci.center.x=SCREEN_WIDTH/2; cci.center.x=SCREEN_WIDTH/2;
// cci.center.y=SCREEN_HEIGHT/2; cci.center.y=SCREEN_HEIGHT/2;
// cci.radius.x=SCREEN_WIDTH*0.35; cci.radius.x=SCREEN_WIDTH*0.35;
// cci.radius.y=SCREEN_HEIGHT*0.35; cci.radius.y=SCREEN_HEIGHT*0.35;
// cci.field_count=8; cci.field_count=8;
// ro_circle=CreateRenderableCircle(db,material,&cci); ro_circle=CreateRenderableCircle(db,material,&cci);
//} }
} }
vulkan::Buffer *CreateUBO(const AnsiString &name,const VkDeviceSize size,void *data) vulkan::Buffer *CreateUBO(const AnsiString &name,const VkDeviceSize size,void *data)
@ -145,8 +145,8 @@ private:
bool InitScene() bool InitScene()
{ {
render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_rectangle)); render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_rectangle));
// render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_round_rectangle)); render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_round_rectangle));
// render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_circle)); render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_circle));
render_root.ExpendToList(&render_list); render_root.ExpendToList(&render_list);
BuildCommandBuffer(&render_list); BuildCommandBuffer(&render_list);

View File

@ -30,9 +30,10 @@ namespace hgl
struct ShaderStageBind struct ShaderStageBind
{ {
AnsiString name; AnsiString name;
uint binding; uint binding;
VAD * data =nullptr; VAD * data =nullptr;
vulkan::VAB * vab =nullptr;
public: public:
@ -63,19 +64,21 @@ namespace hgl
vulkan::IndexBuffer * ibo; vulkan::IndexBuffer * ibo;
VADMaps vab_maps; VADMaps vab_maps;
virtual VAD *CreateVAD(const AnsiString &name,const vulkan::ShaderStage *ss); ///<创建一个顶点属性缓冲区 protected:
virtual VAD *CreateVAD(const AnsiString &name,const vulkan::ShaderStage *ss); ///<创建一个顶点属性缓冲区
public: public:
RenderableCreater(SceneDB *sdb,vulkan::Material *m); RenderableCreater(SceneDB *sdb,vulkan::Material *m);
virtual ~RenderableCreater()=default; virtual ~RenderableCreater()=default;
virtual bool Init(const uint32 count); ///<初始化,参数为顶点数量 virtual bool Init(const uint32 count); ///<初始化,参数为顶点数量
VAD * CreateVAD(const AnsiString &name); ///<创建一个顶点属性缓冲区 VAD * CreateVAD(const AnsiString &name); ///<创建一个顶点属性缓冲区
template<typename T> template<typename T>
T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器 T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器
{ {
const vulkan::ShaderStage *ss=vsm->GetStageInput(name); const vulkan::ShaderStage *ss=vsm->GetStageInput(name);
@ -97,10 +100,12 @@ namespace hgl
return vada; return vada;
} }
uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); ///<创建16位的索引缓冲区 bool WriteVAD(const AnsiString &name,const void *data,const uint32_t bytes); ///<直接写入顶点属性数据
uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); ///<创建32位的索引缓冲区
virtual vulkan::Renderable * Finish(); ///<结束并创建可渲染对象 uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); ///<创建16位的索引缓冲区
uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); ///<创建32位的索引缓冲区
virtual vulkan::Renderable * Finish(); ///<结束并创建可渲染对象
};//class RenderableCreater };//class RenderableCreater
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl

View File

@ -77,6 +77,8 @@ public:
} }
};//class VertexAttribBuffer:public Buffer };//class VertexAttribBuffer:public Buffer
using VAB=VertexAttribBuffer;
class IndexBuffer:public Buffer class IndexBuffer:public Buffer
{ {
VkIndexType index_type; VkIndexType index_type;

2
res

@ -1 +1 @@
Subproject commit 394fe76188845b306575e0f68fe587a286ab1d14 Subproject commit c6eafccb4e3db9336cbfeef610c3a7f114016213

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,8 @@ namespace hgl
ssb->data =hgl::graph::CreateVertexAttribData(ss->base_type,ss->component,vertices_number); ssb->data =hgl::graph::CreateVertexAttribData(ss->base_type,ss->component,vertices_number);
ssb->name =name; ssb->name =name;
ssb->binding=ss->binding; ssb->binding=ss->binding;
ssb->vab =nullptr;
vab_maps.Add(name,ssb); vab_maps.Add(name,ssb);
@ -57,6 +59,39 @@ namespace hgl
return this->CreateVAD(name,ss); return this->CreateVAD(name,ss);
} }
bool RenderableCreater::WriteVAD(const AnsiString &name,const void *data,const uint32_t bytes)
{
if(!vsm)return(false);
if(name.IsEmpty())return(false);
if(!data)return(false);
if(!bytes)return(false);
ShaderStageBind *ssb;
if(vab_maps.Get(name,ssb))
return false;
const vulkan::ShaderStage *ss=vsm->GetStageInput(name);
if(!ss)
return(nullptr);
if(ss->stride*vertices_number!=bytes)
return(nullptr);
ssb=new ShaderStageBind;
ssb->data =nullptr;
ssb->name =name;
ssb->binding=ss->binding;
ssb->vab =db->CreateVAB(ss->format,vertices_number,data);
vab_maps.Add(name,ssb);
return true;
}
uint16 *RenderableCreater::CreateIBO16(uint count,const uint16 *data) uint16 *RenderableCreater::CreateIBO16(uint count,const uint16 *data)
{ {
if(!ibo)return(nullptr); if(!ibo)return(nullptr);
@ -85,7 +120,10 @@ namespace hgl
const auto *sp=vab_maps.GetDataList(); const auto *sp=vab_maps.GetDataList();
for(uint i=0;i<si_count;i++) for(uint i=0;i<si_count;i++)
{ {
render_obj->Set((*sp)->right->binding,db->CreateVAB((*sp)->right->data)); if((*sp)->right->vab)
render_obj->Set((*sp)->right->binding,(*sp)->right->vab);
else
render_obj->Set((*sp)->right->binding,db->CreateVAB((*sp)->right->data));
++sp; ++sp;
} }