diff --git a/example/Vulkan/OffscreenRender.cpp b/example/Vulkan/OffscreenRender.cpp index f1b56e41..1a898575 100644 --- a/example/Vulkan/OffscreenRender.cpp +++ b/example/Vulkan/OffscreenRender.cpp @@ -1,55 +1,15 @@ #include +#include #include"VulkanAppFramework.h" using namespace hgl; using namespace hgl::graph; -constexpr uint OFFSCREEN_SIZE =64; +constexpr uint OFFSCREEN_SIZE =16; constexpr uint SCREEN_WIDTH =1024; constexpr uint SCREEN_HEIGHT =(SCREEN_WIDTH/16)*9; -constexpr uint32_t TRIANGLE_VERTEX_COUNT=3; - -constexpr float triangle_vertex_data[TRIANGLE_VERTEX_COUNT][2]= -{ - {OFFSCREEN_SIZE*0.5, OFFSCREEN_SIZE*0.25}, - {OFFSCREEN_SIZE*0.75, OFFSCREEN_SIZE*0.75}, - {OFFSCREEN_SIZE*0.25, OFFSCREEN_SIZE*0.75} -}; - -constexpr float triangle_color_data[TRIANGLE_VERTEX_COUNT][3]= -{ {1,0,0}, - {0,1,0}, - {0,0,1} -}; - -constexpr uint32_t RECT_VERTEX_COUNT=4; - -constexpr float rect_vertex_data[RECT_VERTEX_COUNT][2]= -{ - {0, 0}, - {SCREEN_WIDTH, 0}, - {0, SCREEN_HEIGHT}, - {SCREEN_WIDTH, SCREEN_HEIGHT} -}; - -constexpr float rect_texcoord_data[RECT_VERTEX_COUNT][2]= -{ - {0,0}, - {1,0}, - {0,1}, - {1,1} -}; - -constexpr uint32_t RECT_INDEX_COUNT=6; - -constexpr uint16 rect_index_data[RECT_INDEX_COUNT]= -{ - 0,1,3, - 0,3,2 -}; - -class TestApp:public VulkanApplicationFramework +class TestApp:public CameraAppFramework { struct RenderObject { @@ -69,13 +29,14 @@ class TestApp:public VulkanApplicationFramework struct:public RenderObject { - Camera cam; - vulkan::Sampler * sampler =nullptr; vulkan::Pipeline * pipeline =nullptr; vulkan::RenderableInstance *renderable_instance =nullptr; - }rect; + + SceneNode scene_root; + RenderList render_list; + }cube; public: @@ -109,25 +70,31 @@ public: os.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D")); if(!os.material_instance)return(false); - os.pipeline=db->CreatePipeline(os.material_instance,os.render_taget,vulkan::InlinePipeline::Solid2D); + os.pipeline=db->CreatePipeline(os.material_instance,os.render_taget,vulkan::InlinePipeline::Solid2D,Prim::Fan); if(!os.pipeline)return(false); if(!InitUBO(&os,os.render_taget->GetExtent())) return(false); { - vulkan::Renderable *render_obj=db->CreateRenderable(TRIANGLE_VERTEX_COUNT); - if(!render_obj)return(false); + CircleCreateInfo cci; + + cci.center.Set(OFFSCREEN_SIZE*0.5,OFFSCREEN_SIZE*0.5); + cci.radius.Set(OFFSCREEN_SIZE*0.45,OFFSCREEN_SIZE*0.45); + cci.field_count=32; + cci.has_color=true; + cci.center_color.Set(1,1,1,1); + cci.border_color.Set(1,1,1,0); - if(!render_obj->Set(VAN::Position, db->CreateVAB(VAF_VEC2,TRIANGLE_VERTEX_COUNT,triangle_vertex_data)))return(false); - if(!render_obj->Set(VAN::Color, db->CreateVAB(VAF_VEC3,TRIANGLE_VERTEX_COUNT,triangle_color_data)))return(false); + vulkan::Renderable *render_obj=CreateRenderableCircle(db,os.material_instance->GetMaterial(),&cci); + if(!render_obj)return(false); os.renderable_instance=db->CreateRenderableInstance(render_obj,os.material_instance,os.pipeline); if(!os.renderable_instance)return(false); } - BuildCommandBuffer(os.render_taget,os.renderable_instance); + VulkanApplicationFramework::BuildCommandBuffer(os.render_taget,os.renderable_instance); os.render_taget->Submit(nullptr); os.render_taget->WaitQueue(); @@ -135,39 +102,43 @@ public: return(true); } - bool InitRectangle() + bool InitCube() { - rect.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D")); - if(!rect.material_instance)return(false); + cube.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureMask3D")); + if(!cube.material_instance)return(false); - rect.pipeline=CreatePipeline(rect.material_instance,vulkan::InlinePipeline::Alpha2D); - if(!rect.pipeline)return(false); + cube.pipeline=CreatePipeline(cube.material_instance,vulkan::InlinePipeline::Solid3D); + if(!cube.pipeline)return(false); + + cube.sampler=db->CreateSampler(); + if(!cube.sampler)return(false); - rect.sampler=db->CreateSampler(); - rect.material_instance->BindSampler("tex",os.render_taget->GetColorTexture(),rect.sampler); - - if(!InitUBO(&rect,sc_render_target->GetExtent())) - return(false); + cube.material_instance->BindSampler("tex",os.render_taget->GetColorTexture(),cube.sampler); + cube.material_instance->BindUBO("world",GetCameraMatrixBuffer()); + cube.material_instance->Update(); { - vulkan::Renderable *render_obj=db->CreateRenderable(RECT_VERTEX_COUNT); + CubeCreateInfo cci; + + vulkan::Renderable *render_obj=CreateRenderableCube(db,cube.material_instance->GetMaterial(),&cci); if(!render_obj)return(false); - if(!render_obj->Set(VAN::Position,db->CreateVAB(VAF_VEC2,RECT_VERTEX_COUNT,rect_vertex_data)))return(false); - if(!render_obj->Set(VAN::TexCoord,db->CreateVAB(VAF_VEC2,RECT_VERTEX_COUNT,rect_texcoord_data)))return(false); - if(!render_obj->Set(db->CreateIBO16(RECT_INDEX_COUNT,rect_index_data)))return(false); + cube.renderable_instance=db->CreateRenderableInstance(render_obj,cube.material_instance,cube.pipeline); - rect.renderable_instance=db->CreateRenderableInstance(render_obj,rect.material_instance,rect.pipeline); + cube.scene_root.Add(cube.renderable_instance); } - BuildCommandBuffer(rect.renderable_instance); + cube.scene_root.RefreshMatrix(); + cube.scene_root.ExpendToList(&cube.render_list); + + camera.eye.Set(5,5,5,1.0); return(true); } bool Init() { - if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) + if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT)) return(false); SetClearColor(COLOR::MozillaCharcoal); @@ -175,24 +146,17 @@ public: if(!InitOffscreen()) return(false); - if(!InitRectangle()) + if(!InitCube()) return(false); return(true); - } - - void Resize(int w,int h)override - { - rect.cam.width=w; - rect.cam.height=h; - - rect.cam.Refresh(); - - rect.ubo_world_matrix->Write(&rect.cam.matrix); - - BuildCommandBuffer(rect.renderable_instance); } -};//class TestApp:public VulkanApplicationFramework + + void BuildCommandBuffer(uint32 index) + { + VulkanApplicationFramework::BuildCommandBuffer(index,&cube.render_list); + } +};//class TestApp:public CameraAppFramework int main(int,char **) {