增加圆形几何体生成

This commit is contained in:
hyzboy 2019-05-24 19:46:46 +08:00
parent c912377dc3
commit b5bed8c677
3 changed files with 64 additions and 25 deletions

View File

@ -109,9 +109,6 @@ public:
};//class RenderableInstance
VK_NAMESPACE_END
constexpr uint32_t VERTEX_COUNT=4;
class TestApp:public VulkanApplicationFramework
{
private:
@ -167,13 +164,25 @@ private:
//render_obj=CreateRectangle(device,material,&rci);
struct RoundRectangleCreateInfo rrci;
//struct RoundRectangleCreateInfo rrci;
rrci.scope.Set(10,10,SCREEN_WIDTH-20,SCREEN_HEIGHT-20);
rrci.radius=8; //半径为8
rrci.round_per=8; //圆角切分成8段
//rrci.scope.Set(10,10,SCREEN_WIDTH-20,SCREEN_HEIGHT-20);
//rrci.radius=8; //半径为8
//rrci.round_per=8; //圆角切分成8段
render_obj=CreateRoundRectangle(device,material,&rrci);
//render_obj=CreateRoundRectangle(device,material,&rrci);
struct CircleCreateInfo cci;
cci.center.x=SCREEN_WIDTH/2;
cci.center.y=SCREEN_HEIGHT/2;
cci.radius.x=SCREEN_WIDTH*0.45;
cci.radius.y=SCREEN_HEIGHT*0.45;
cci.field_count=8;
render_obj=CreateCircle(device,material,&cci);
return render_obj;
}

View File

@ -34,9 +34,12 @@ namespace hgl
*/
struct CircleCreateInfo
{
Vector2f center;
Vector2f center; //圆心坐标
Vector2f radius; //半径
uint field_count; //分段次数
};
vulkan::Renderable *CreateCircle(vulkan::Device *device,vulkan::Material *mtl,const CircleCreateInfo *rci);
}//namespace graph
};//namespace hgl
#endif//HGL_GRAPH_INLINE_GEOMETRY_INCLUDE

View File

@ -12,27 +12,21 @@ namespace hgl
{
const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule();
vulkan::Renderable *render_obj=mtl->CreateRenderable(4);
const int vertex_binding=vsm->GetStageInputBinding("Vertex");
if(vertex_binding!=-1)
{
VB2f *vertex=new VB2f(4);
if(vertex_binding==-1)
return(nullptr);
VB2f *vertex=new VB2f(4);
vertex->Begin();
vertex->WriteRectFan(rci->scope);
vertex->End();
vertex->Begin();
vertex->WriteRectFan(rci->scope);
vertex->End();
render_obj->Set(vertex_binding,device->CreateVBO(vertex));
delete vertex;
}
else
{
delete render_obj;
return nullptr;
}
vulkan::Renderable *render_obj=mtl->CreateRenderable(vertex->GetCount());
render_obj->Set(vertex_binding,device->CreateVBO(vertex));
delete vertex;
return render_obj;
}
@ -114,7 +108,40 @@ namespace hgl
render_obj->Set(vertex_binding,device->CreateVBO(vertex));
delete vertex;
return render_obj;
}
vulkan::Renderable *CreateCircle(vulkan::Device *device,vulkan::Material *mtl,const CircleCreateInfo *cci)
{
const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule();
const int vertex_binding=vsm->GetStageInputBinding("Vertex");
if(vertex_binding==-1)
return(nullptr);
VB2f *vertex=new VB2f(cci->field_count+2);
vertex->Begin();
vertex->Write(cci->center.x,cci->center.y);
for(uint i=0;i<=cci->field_count;i++)
{
float ang=float(i)/float(cci->field_count)*360.0f;
float x=cci->center.x+sin(hgl_ang2rad(ang))*cci->radius.x;
float y=cci->center.y+cos(hgl_ang2rad(ang))*cci->radius.y;
vertex->Write(x,y);
}
vertex->End();
vulkan::Renderable *render_obj=mtl->CreateRenderable(vertex->GetCount());
render_obj->Set(vertex_binding,device->CreateVBO(vertex));
delete vertex;
return render_obj;
}
}//namespace graph