From b5bed8c67701afd2cd307193ef1e8d0b8173bc57 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 24 May 2019 19:46:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9C=86=E5=BD=A2=E5=87=A0?= =?UTF-8?q?=E4=BD=95=E4=BD=93=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/Geometry2D.cpp | 25 ++++++++----- inc/hgl/graph/InlineGeometry.h | 5 ++- src/SceneGraph/InlineGeometry.cpp | 59 ++++++++++++++++++++++--------- 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/example/Vulkan/Geometry2D.cpp b/example/Vulkan/Geometry2D.cpp index 744300a8..273d76ef 100644 --- a/example/Vulkan/Geometry2D.cpp +++ b/example/Vulkan/Geometry2D.cpp @@ -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; } diff --git a/inc/hgl/graph/InlineGeometry.h b/inc/hgl/graph/InlineGeometry.h index 016a8ec1..08f893f1 100644 --- a/inc/hgl/graph/InlineGeometry.h +++ b/inc/hgl/graph/InlineGeometry.h @@ -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 diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index c1ba4524..faff68ce 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -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