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::MaterialInstance * material_instance =nullptr;
vulkan::Renderable *ro_rectangle =nullptr;/*,
vulkan::Renderable *ro_rectangle =nullptr,
*ro_circle =nullptr,
*ro_round_rectangle =nullptr;*/
*ro_round_rectangle =nullptr;
vulkan::Buffer * ubo_world_matrix =nullptr;
vulkan::Buffer * ubo_color_material =nullptr;
@ -69,29 +69,29 @@ private:
ro_rectangle=CreateRenderableRectangle(db,material,&rci);
}
//{
// struct RoundRectangleCreateInfo rrci;
{
struct RoundRectangleCreateInfo rrci;
// rrci.scope.Set(SCREEN_WIDTH-30,10,20,20);
// rrci.radius=5;
// rrci.round_per=5;
rrci.scope.Set(SCREEN_WIDTH-30,10,20,20);
rrci.radius=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.y=SCREEN_HEIGHT/2;
cci.center.x=SCREEN_WIDTH/2;
cci.center.y=SCREEN_HEIGHT/2;
// cci.radius.x=SCREEN_WIDTH*0.35;
// cci.radius.y=SCREEN_HEIGHT*0.35;
cci.radius.x=SCREEN_WIDTH*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)
@ -145,8 +145,8 @@ private:
bool InitScene()
{
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_circle));
render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_round_rectangle));
render_root.Add(db->CreateRenderableInstance(pipeline,material_instance,ro_circle));
render_root.ExpendToList(&render_list);
BuildCommandBuffer(&render_list);

View File

@ -30,9 +30,10 @@ namespace hgl
struct ShaderStageBind
{
AnsiString name;
uint binding;
VAD * data =nullptr;
AnsiString name;
uint binding;
VAD * data =nullptr;
vulkan::VAB * vab =nullptr;
public:
@ -63,19 +64,21 @@ namespace hgl
vulkan::IndexBuffer * ibo;
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:
RenderableCreater(SceneDB *sdb,vulkan::Material *m);
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>
T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器
T * CreateVADA(const AnsiString &name) ///<创建一个顶点属性缓冲区以及访问器
{
const vulkan::ShaderStage *ss=vsm->GetStageInput(name);
@ -97,10 +100,12 @@ namespace hgl
return vada;
}
uint16 * CreateIBO16(uint count,const uint16 *data=nullptr); ///<创建16位的索引缓冲区
uint32 * CreateIBO32(uint count,const uint32 *data=nullptr); ///<创建32位的索引缓冲区
bool WriteVAD(const AnsiString &name,const void *data,const uint32_t bytes); ///<直接写入顶点属性数据
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
}//namespace graph
}//namespace hgl

View File

@ -77,6 +77,8 @@ public:
}
};//class VertexAttribBuffer:public Buffer
using VAB=VertexAttribBuffer;
class IndexBuffer:public Buffer
{
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

@ -39,6 +39,8 @@ namespace hgl
ssb->name =name;
ssb->binding=ss->binding;
ssb->vab =nullptr;
vab_maps.Add(name,ssb);
return ssb->data;
@ -57,6 +59,39 @@ namespace hgl
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)
{
if(!ibo)return(nullptr);
@ -85,7 +120,10 @@ namespace hgl
const auto *sp=vab_maps.GetDataList();
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;
}