diff --git a/CMSceneGraph b/CMSceneGraph index d32c4ebf..eddfd63b 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit d32c4ebff959a593ce7938a0d1697987c670c837 +Subproject commit eddfd63b0595b7725320308b41ab8182ab1ee9a9 diff --git a/example/Vulkan/DrawText.cpp b/example/Vulkan/DrawText.cpp index b649101f..1865ebb0 100644 --- a/example/Vulkan/DrawText.cpp +++ b/example/Vulkan/DrawText.cpp @@ -29,7 +29,6 @@ class TestApp:public VulkanApplicationFramework private: - vulkan::Material * material =nullptr; vulkan::Sampler * sampler =nullptr; vulkan::MaterialInstance * material_instance =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr; @@ -47,6 +46,7 @@ private: TextLayout tl_engine; ///<文本排版引擎 TextRenderable * text_render_obj =nullptr; + RenderableInstance * render_instance =nullptr; public: @@ -59,23 +59,19 @@ private: bool InitMaterial() { - material=shader_manage->CreateMaterial( OS_TEXT("res/shader/DrawRect2D.vert"), - OS_TEXT("res/shader/DrawRect2D.geom"), - OS_TEXT("res/shader/FlatLumTexture.frag")); - if(!material) - return(false); + material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/LumTextureRect2D")); + if(!material_instance)return(false); - material_instance=material->CreateInstance(); + pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/default"),Prim::Rectangles); + if(!pipeline)return(false); sampler=db->CreateSampler(); - material_instance->BindSampler("tex",tile_font->GetTexture(),sampler); + material_instance->BindSampler("lum_texture",tile_font->GetTexture(),sampler); material_instance->BindUBO("world",ubo_world_matrix); material_instance->BindUBO("color_material",ubo_color); material_instance->Update(); - db->Add(material); - db->Add(material_instance); return(true); } @@ -103,19 +99,6 @@ private: return(true); } - bool InitPipeline() - { - AutoDelete - pipeline_creater=new vulkan::PipelineCreater(device,material,sc_render_target); - pipeline_creater->CloseCullFace(); - pipeline_creater->Set(Prim::Rectangles); - - pipeline=pipeline_creater->Create(); - - db->Add(pipeline); - return pipeline; - } - bool InitTileFont() { Font eng_fnt(OS_TEXT("Source Code Pro"),0,CHAR_BITMAP_SIZE); @@ -158,9 +141,13 @@ private: LoadStringFromTextFile(str,OS_TEXT("README.md")); - text_render_obj=db->CreateTextRenderable(material); + text_render_obj=db->CreateTextRenderable(material_instance->GetMaterial()); + + if(tl_engine.SimpleLayout(text_render_obj,tile_font,str)<=0)return(false); - return(tl_engine.SimpleLayout(text_render_obj,tile_font,str)>0); + render_instance=db->CreateRenderableInstance(text_render_obj,material_instance,pipeline); + + return(render_instance); } public: @@ -179,16 +166,13 @@ public: if(!InitMaterial()) return(false); - if(!InitPipeline()) - return(false); - if(!InitTextLayoutEngine()) return(false); if(!InitTextRenderable()) return(false); - BuildCommandBuffer(pipeline,material_instance,text_render_obj); + BuildCommandBuffer(render_instance); return(true); } @@ -201,8 +185,8 @@ public: cam.Refresh(); ubo_world_matrix->Write(&cam.matrix); - - BuildCommandBuffer(pipeline,material_instance,text_render_obj); + + BuildCommandBuffer(render_instance); } };//class TestApp:public VulkanApplicationFramework diff --git a/example/Vulkan/DrawTile.cpp b/example/Vulkan/DrawTile.cpp index 2d4690a0..0778bf7d 100644 --- a/example/Vulkan/DrawTile.cpp +++ b/example/Vulkan/DrawTile.cpp @@ -17,6 +17,7 @@ constexpr uint32_t SCREEN_WIDTH =1024; constexpr uint32_t SCREEN_HEIGHT=512; constexpr float BORDER=2; +constexpr uint TILE_COLS=10; struct TileBitmap { @@ -37,23 +38,18 @@ class TestApp:public VulkanApplicationFramework private: - vulkan::Material * material =nullptr; vulkan::Sampler * sampler =nullptr; vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * render_obj =nullptr; + vulkan::RenderableInstance *render_instance =nullptr; vulkan::Buffer * ubo_world_matrix =nullptr; vulkan::Pipeline * pipeline =nullptr; - vulkan::VAB *vertex_buffer =nullptr; - vulkan::VAB *tex_coord_buffer =nullptr; - public: ~TestApp() { - SAFE_CLEAR_ARRAY(vertex_data); - SAFE_CLEAR_ARRAY(tex_coord_data); SAFE_CLEAR(tile_data); } @@ -109,7 +105,7 @@ private: int col=0; int row=0; - float size =SCREEN_WIDTH/10; + float size =SCREEN_WIDTH/TILE_COLS; float view_size =size-BORDER*2; float left =0; float top =0; @@ -118,7 +114,7 @@ private: for(int i=0;ito=tile_data->Commit((*tb)->bmp); //添加一个tile图片 + (*tb)->to=tile_data->Commit((*tb)->bmp); //添加一个tile图片 vp=WriteRect(vp,left+BORDER, //产生绘制顶点信息 top +BORDER, @@ -128,7 +124,7 @@ private: tp=WriteRect(tp,(*tb)->to->uv_float); //产生绘制纹理坐标信息 ++col; - if(col==10) + if(col==TILE_COLS) { left=0; top+=size; @@ -150,13 +146,11 @@ private: bool InitMaterial() { - material=shader_manage->CreateMaterial( OS_TEXT("res/shader/DrawRect2D.vert"), - OS_TEXT("res/shader/DrawRect2D.geom"), - OS_TEXT("res/shader/FlatTexture.frag")); - if(!material) + material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureRect2D")); + if(!material_instance) return(false); - material_instance=material->CreateInstance(); + pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/default"),Prim::Rectangles); sampler=db->CreateSampler(); @@ -164,8 +158,6 @@ private: material_instance->BindUBO("world",ubo_world_matrix); material_instance->Update(); - db->Add(material); - db->Add(material_instance); return(true); } @@ -186,30 +178,19 @@ private: return(true); } - void InitVBO() + bool InitVBO() { - const int tile_count=tile_list.GetCount(); + const uint tile_count=tile_list.GetCount(); - render_obj=db->CreateRenderable(material,tile_count); + render_obj=db->CreateRenderable(tile_count); + if(!render_obj)return(false); - vertex_buffer =db->CreateVAB(VAF_VEC4,tile_count,vertex_data); - tex_coord_buffer=db->CreateVAB(VAF_VEC4,tile_count,tex_coord_data); + render_obj->Set(VAN::Position,db->CreateVAB(VAF_VEC4,tile_count,vertex_data)); + render_obj->Set(VAN::TexCoord,db->CreateVAB(VAF_VEC4,tile_count,tex_coord_data)); - render_obj->Set(VAN::Position,vertex_buffer); - render_obj->Set(VAN::TexCoord,tex_coord_buffer); - } + render_instance=db->CreateRenderableInstance(render_obj,material_instance,pipeline); - bool InitPipeline() - { - AutoDelete - pipeline_creater=new vulkan::PipelineCreater(device,material,sc_render_target); - pipeline_creater->CloseCullFace(); - pipeline_creater->Set(Prim::Rectangles); - - pipeline=pipeline_creater->Create(); - - db->Add(pipeline); - return pipeline; + return(render_instance); } public: @@ -231,12 +212,10 @@ public: if(!InitMaterial()) return(false); - InitVBO(); - - if(!InitPipeline()) + if(!InitVBO()) return(false); - BuildCommandBuffer(pipeline,material_instance,render_obj); + BuildCommandBuffer(render_instance); return(true); } @@ -249,8 +228,8 @@ public: cam.Refresh(); ubo_world_matrix->Write(&cam.matrix); - - BuildCommandBuffer(pipeline,material_instance,render_obj); + + BuildCommandBuffer(render_instance); } };//class TestApp:public VulkanApplicationFramework diff --git a/example/Vulkan/RectanglePrimitive.cpp b/example/Vulkan/RectanglePrimitive.cpp index 5d4cca59..51e9f738 100644 --- a/example/Vulkan/RectanglePrimitive.cpp +++ b/example/Vulkan/RectanglePrimitive.cpp @@ -50,12 +50,13 @@ private: bool InitMaterial() { material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureRect2D")); - if(!material_instance) - return(false); + if(!material_instance)return(false); pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/default"),Prim::Rectangles); + if(!pipeline)return(false); texture=vulkan::CreateTextureFromFile(device,OS_TEXT("res/image/lena.Tex2D")); + if(!texture)return(false); sampler=db->CreateSampler(); diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index 56225295..2abca418 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -102,7 +102,7 @@ public: { VK_NAMESPACE::CreateInstanceLayerInfo cili; - memset(&cili, 0, sizeof(VK_NAMESPACE::CreateInstanceLayerInfo)); + hgl_zero(cili); cili.lunarg.standard_validation = true; cili.khronos.validation = true; diff --git a/res b/res index 79811a81..25fc9727 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 79811a8165c34d49b4c2ac613b282b310b5d977e +Subproject commit 25fc972771ca962f0f620c4508b511326ce30307 diff --git a/src/RenderDevice/Vulkan/VKInstance.cpp b/src/RenderDevice/Vulkan/VKInstance.cpp index 5b9c6b5a..654a99a7 100644 --- a/src/RenderDevice/Vulkan/VKInstance.cpp +++ b/src/RenderDevice/Vulkan/VKInstance.cpp @@ -11,13 +11,11 @@ void CheckInstanceLayer(CharPointerList &layer_list,CreateInstanceLayerInfo *lay Instance *CreateInstance(const AnsiString &app_name,VKDebugOut *out,CreateInstanceLayerInfo *layer_info) { - VkApplicationInfo app_info; - VkInstanceCreateInfo inst_info; + ApplicationInfo app_info; + InstanceCreateInfo inst_info(&app_info); CharPointerList ext_list; CharPointerList layer_list; - app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - app_info.pNext = nullptr; app_info.pApplicationName = app_name.c_str(); app_info.applicationVersion = 1; app_info.pEngineName = "CMGameEngine/ULRE"; @@ -35,10 +33,6 @@ Instance *CreateInstance(const AnsiString &app_name,VKDebugOut *out,CreateInstan if(layer_info) CheckInstanceLayer(layer_list,layer_info); - inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - inst_info.pNext = nullptr; - inst_info.flags = 0; - inst_info.pApplicationInfo = &app_info; inst_info.enabledExtensionCount = ext_list.GetCount(); inst_info.ppEnabledExtensionNames = ext_list.GetData(); inst_info.enabledLayerCount = layer_list.GetCount();