diff --git a/CMCore b/CMCore index 8f024e15..6107f34e 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 8f024e159807b3d4e98c474636fda2b555a364e2 +Subproject commit 6107f34e21e5f104091d28b3db17e6cbeb7dc967 diff --git a/example/Vulkan/Atomsphere.cpp b/example/Vulkan/Atomsphere.cpp index 83287144..8d14c9b1 100644 --- a/example/Vulkan/Atomsphere.cpp +++ b/example/Vulkan/Atomsphere.cpp @@ -16,7 +16,7 @@ constexpr uint32_t SCREEN_HEIGHT=128; struct AtomsphereData { - alignas(16) Vector3f position; + Vector3f position; float intensity; float scattering_direction; };// @@ -29,11 +29,11 @@ private: RenderList render_list; vulkan::Material * material =nullptr; - vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; - vulkan::Renderable *ro_sphere; + vulkan::Renderable * ro_sphere =nullptr; - vulkan::Pipeline *pipeline_solid =nullptr; + vulkan::Pipeline * pipeline_solid =nullptr; vulkan::Buffer * ubo_atomsphere =nullptr; AtomsphereData atomsphere_data; @@ -47,10 +47,10 @@ private: if(!material) return(false); - descriptor_sets=material->CreateDescriptorSets(); + material_instance=material->CreateInstance(); db->Add(material); - db->Add(descriptor_sets); + db->Add(material_instance); return(true); } @@ -59,7 +59,7 @@ private: ro_sphere=CreateRenderableSphere(db,material,128); } - bool InitAtomsphereUBO(vulkan::DescriptorSets *desc_set,uint bindpoint) + bool InitAtomsphereUBO(vulkan::MaterialInstance *mi,const UTF8String &sun_node_name) { atomsphere_data.position.Set(0,0.1f,-1.0f); atomsphere_data.intensity=22.0f; @@ -70,18 +70,18 @@ private: if(!ubo_atomsphere) return(false); - return desc_set->BindUBO(bindpoint,ubo_atomsphere); + return mi->BindUBO(sun_node_name,ubo_atomsphere); } bool InitUBO() { - if(!InitCameraUBO(descriptor_sets,material->GetUBO("world"))) + if(!InitCameraUBO(material_instance,"world")) return(false); - if(!InitAtomsphereUBO(descriptor_sets,material->GetUBO("sun"))) + if(!InitAtomsphereUBO(material_instance,"sun")) return(false); - descriptor_sets->Update(); + material_instance->Update(); return(true); } @@ -104,7 +104,7 @@ private: bool InitScene() { - render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_sphere),scale(100)); + render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_sphere),scale(100)); render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); diff --git a/example/Vulkan/DeferredModel.cpp b/example/Vulkan/DeferredModel.cpp index 1eb3643b..e1ef78e6 100644 --- a/example/Vulkan/DeferredModel.cpp +++ b/example/Vulkan/DeferredModel.cpp @@ -82,10 +82,10 @@ private: struct SubpassParam { - vulkan::Material * material; - vulkan::DescriptorSets *desc_sets; - vulkan::Pipeline * pipeline_fan; - vulkan::Pipeline * pipeline_triangles; + vulkan::Material * material; + vulkan::MaterialInstance * material_instance; + vulkan::Pipeline * pipeline_fan; + vulkan::Pipeline * pipeline_triangles; };// SubpassParam sp_gbuffer; diff --git a/example/Vulkan/FragCoordTest.cpp b/example/Vulkan/FragCoordTest.cpp index 9d0f5861..7b1ea73c 100644 --- a/example/Vulkan/FragCoordTest.cpp +++ b/example/Vulkan/FragCoordTest.cpp @@ -122,7 +122,7 @@ public: if(!InitPipeline()) return(false); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); return(true); } @@ -136,7 +136,7 @@ public: ubo_mvp->Write(&cam.matrix); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); } };//class TestApp:public VulkanApplicationFramework diff --git a/example/Vulkan/Geometry2D.cpp b/example/Vulkan/Geometry2D.cpp index 1b649865..0202e6b7 100644 --- a/example/Vulkan/Geometry2D.cpp +++ b/example/Vulkan/Geometry2D.cpp @@ -142,9 +142,9 @@ private: bool InitScene() { - render_root.Add(db->CreateRenderableInstance(pipeline,material_instance->GetDescriptorSets(),ro_rectangle)); - render_root.Add(db->CreateRenderableInstance(pipeline,material_instance->GetDescriptorSets(),ro_round_rectangle)); - render_root.Add(db->CreateRenderableInstance(pipeline,material_instance->GetDescriptorSets(),ro_circle)); + 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.ExpendToList(&render_list); BuildCommandBuffer(&render_list); diff --git a/example/Vulkan/Geometry3D.cpp b/example/Vulkan/Geometry3D.cpp index 6e0daaca..41ccf0ed 100644 --- a/example/Vulkan/Geometry3D.cpp +++ b/example/Vulkan/Geometry3D.cpp @@ -22,9 +22,9 @@ private: struct MDP { - vulkan::Material * material =nullptr; - vulkan::DescriptorSets *descriptor_sets =nullptr; - vulkan::Pipeline * pipeline =nullptr; + vulkan::Material * material =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; + vulkan::Pipeline * pipeline =nullptr; }m3d,m2d; vulkan::Renderable *ro_plane_grid[3], @@ -39,19 +39,19 @@ private: if(!mdp->material) return(false); - mdp->descriptor_sets=mdp->material->CreateDescriptorSets(); + mdp->material_instance=mdp->material->CreateInstance(); db->Add(mdp->material); - db->Add(mdp->descriptor_sets); + db->Add(mdp->material_instance); return(true); } bool InitUBO(MDP *mdp) { - if(!InitCameraUBO(mdp->descriptor_sets,mdp->material->GetUBO("world"))) + if(!InitCameraUBO(mdp->material_instance,mdp->material->GetUBO("world"))) return(false); - mdp->descriptor_sets->Update(); + mdp->material_instance->Update(); return(true); } @@ -87,11 +87,11 @@ private: bool InitScene() { - render_root.Add(db->CreateRenderableInstance(m2d.pipeline,m2d.descriptor_sets,ro_round_rectangle)); + render_root.Add(db->CreateRenderableInstance(m2d.pipeline,m2d.material_instance,ro_round_rectangle)); - render_root.Add(db->CreateRenderableInstance(m3d.pipeline,m3d.descriptor_sets,ro_plane_grid[0])); - render_root.Add(db->CreateRenderableInstance(m3d.pipeline,m3d.descriptor_sets,ro_plane_grid[1]),rotate(HGL_RAD_90,0,1,0)); - render_root.Add(db->CreateRenderableInstance(m3d.pipeline,m3d.descriptor_sets,ro_plane_grid[2]),rotate(HGL_RAD_90,1,0,0)); + render_root.Add(db->CreateRenderableInstance(m3d.pipeline,m3d.material_instance,ro_plane_grid[0])); + render_root.Add(db->CreateRenderableInstance(m3d.pipeline,m3d.material_instance,ro_plane_grid[1]),rotate(HGL_RAD_90,0,1,0)); + render_root.Add(db->CreateRenderableInstance(m3d.pipeline,m3d.material_instance,ro_plane_grid[2]),rotate(HGL_RAD_90,1,0,0)); render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); diff --git a/example/Vulkan/HQFilterTexture.cpp b/example/Vulkan/HQFilterTexture.cpp index 109d0afc..238bfc67 100644 --- a/example/Vulkan/HQFilterTexture.cpp +++ b/example/Vulkan/HQFilterTexture.cpp @@ -164,7 +164,7 @@ private: bool Add(struct MPD *mpd,const Matrix4f &offset) { - RenderableInstance *ri=db->CreateRenderableInstance(mpd->pipeline,mpd->material_instance->GetDescriptorSets(),mpd->render_obj); + RenderableInstance *ri=db->CreateRenderableInstance(mpd->pipeline,mpd->material_instance,mpd->render_obj); if(!ri)return(false); diff --git a/example/Vulkan/InlineGeometryScene.cpp b/example/Vulkan/InlineGeometryScene.cpp index 32a2acf6..e837fe8a 100644 --- a/example/Vulkan/InlineGeometryScene.cpp +++ b/example/Vulkan/InlineGeometryScene.cpp @@ -22,7 +22,7 @@ private: RenderList render_list; vulkan::Material * material =nullptr; - vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable *ro_plane_grid, *ro_cube, @@ -44,10 +44,10 @@ private: if(!material) return(false); - descriptor_sets=material->CreateDescriptorSets(); + material_instance=material->CreateInstance(); db->Add(material); - db->Add(descriptor_sets); + db->Add(material_instance); return(true); } @@ -127,10 +127,10 @@ private: bool InitUBO() { - if(!InitCameraUBO(descriptor_sets,material->GetUBO("world"))) + if(!InitCameraUBO(material_instance,"world")) return(false); - descriptor_sets->Update(); + material_instance->Update(); return(true); } @@ -160,13 +160,13 @@ private: bool InitScene() { - render_root.Add(db->CreateRenderableInstance(pipeline_line,descriptor_sets,ro_plane_grid)); - //render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_dome)); - render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_torus)); - render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_cube ),translate(-10, 0, 5)*scale(10,10,10)); - render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_sphere ),translate( 10, 0, 5)*scale(10,10,10)); - render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_cylinder ),translate( 0, 16, 0)); - render_root.Add(db->CreateRenderableInstance(pipeline_solid,descriptor_sets,ro_cone ),translate( 0,-16, 0)); + render_root.Add(db->CreateRenderableInstance(pipeline_line,material_instance,ro_plane_grid)); + //render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_dome)); + render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_torus)); + render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_cube ),translate(-10, 0, 5)*scale(10,10,10)); + render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_sphere ),translate( 10, 0, 5)*scale(10,10,10)); + render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_cylinder ),translate( 0, 16, 0)); + render_root.Add(db->CreateRenderableInstance(pipeline_solid,material_instance,ro_cone ),translate( 0,-16, 0)); render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); diff --git a/example/Vulkan/LoadModel.cpp b/example/Vulkan/LoadModel.cpp index 8e4d7222..8be1371e 100644 --- a/example/Vulkan/LoadModel.cpp +++ b/example/Vulkan/LoadModel.cpp @@ -81,7 +81,7 @@ class TestApp:public ViewModelFramework private: vulkan::Material * material =nullptr; - vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; vulkan::Pipeline * pipeline_wireframe =nullptr; vulkan::Pipeline * pipeline_lines =nullptr; @@ -108,10 +108,10 @@ private: if(!material) return(false); - descriptor_sets=material->CreateDescriptorSets(); + material_instance=material->CreateInstance(); db->Add(material); - db->Add(descriptor_sets); + db->Add(material_instance); return(true); } @@ -126,7 +126,7 @@ private: for(uint i=0;iCreateRenderableInstance(pipeline_wireframe,descriptor_sets,mesh_renderable[i]); + mesh_renderable_instance[i]=db->CreateRenderableInstance(pipeline_wireframe,material_instance,mesh_renderable[i]); ++md; } @@ -137,7 +137,7 @@ private: aci.size=model_data->bounding_box.HalfSize().xyz(); axis_renderable=CreateRenderableAxis(db,material,&aci); - axis_renderable_instance=db->CreateRenderableInstance(pipeline_lines,descriptor_sets,axis_renderable); + axis_renderable_instance=db->CreateRenderableInstance(pipeline_lines,material_instance,axis_renderable); } { @@ -147,16 +147,16 @@ private: cci.size=model_data->bounding_box.Size().xyz(); bbox_renderable=CreateRenderableBoundingBox(db,material,&cci); - bbox_renderable_instance=db->CreateRenderableInstance(pipeline_lines,descriptor_sets,bbox_renderable); + bbox_renderable_instance=db->CreateRenderableInstance(pipeline_lines,material_instance,bbox_renderable); } } bool InitUBO() { - if(!InitCameraUBO(descriptor_sets,material->GetUBO("world"))) + if(!InitCameraUBO(material_instance,"world")) return(false); - descriptor_sets->Update(); + material_instance->Update(); return(true); } diff --git a/example/Vulkan/SceneTree.cpp b/example/Vulkan/SceneTree.cpp index d53ecfd3..f1393083 100644 --- a/example/Vulkan/SceneTree.cpp +++ b/example/Vulkan/SceneTree.cpp @@ -25,7 +25,7 @@ private: RenderList render_list; vulkan::Material * material =nullptr; - vulkan::DescriptorSets * descriptor_sets =nullptr; + vulkan::MaterialInstance * material_instance =nullptr; vulkan::Renderable * renderable_object =nullptr; @@ -49,10 +49,10 @@ private: if(!material) return(false); - descriptor_sets=material->CreateDescriptorSets(); + material_instance=material->CreateInstance(); db->Add(material); - db->Add(descriptor_sets); + db->Add(material_instance); return(true); } @@ -65,10 +65,10 @@ private: bool InitUBO() { - if(!InitCameraUBO(descriptor_sets,material->GetUBO("world"))) + if(!InitCameraUBO(material_instance,"world")) return(false); - descriptor_sets->Update(); + material_instance->Update(); return(true); } @@ -97,7 +97,7 @@ private: uint count; float size; - RenderableInstance *ri=db->CreateRenderableInstance(pipeline_line,descriptor_sets,renderable_object); + RenderableInstance *ri=db->CreateRenderableInstance(pipeline_line,material_instance,renderable_object); for(uint i=0;i<360;i++) { diff --git a/example/Vulkan/ViewModelFramework.h b/example/Vulkan/ViewModelFramework.h index 1a8cc5d3..1cfab57a 100644 --- a/example/Vulkan/ViewModelFramework.h +++ b/example/Vulkan/ViewModelFramework.h @@ -69,14 +69,14 @@ public: origin_matrix=object_matrix; } - bool InitCameraUBO(vulkan::DescriptorSets *desc_set,uint world_matrix_bindpoint) + bool InitCameraUBO(vulkan::MaterialInstance *mi,const UTF8String &world_matrix_name) { ubo_world_matrix=db->CreateUBO(sizeof(WorldMatrix),&camera.matrix); if(!ubo_world_matrix) return(false); - return desc_set->BindUBO(world_matrix_bindpoint,ubo_world_matrix); + return mi->BindUBO(world_matrix_name,ubo_world_matrix); } void Resize(int w,int h)override diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index e7177357..feeb2d87 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -54,17 +54,17 @@ protected: vulkan::Semaphore * present_complete_semaphore =nullptr, * render_complete_semaphore =nullptr; - vulkan::ShaderModuleManage * shader_manage =nullptr; + vulkan::ShaderModuleManage * shader_manage =nullptr; protected: - uint32_t swap_chain_count=0; + int32_t swap_chain_count =0; - vulkan::CommandBuffer ** cmd_buf =nullptr; + vulkan::CommandBuffer ** cmd_buf =nullptr; protected: - SceneDB * db =nullptr; + SceneDB * db =nullptr; bool key_status[kbRangeSize]; @@ -181,9 +181,9 @@ public: } } - void BuildCommandBuffer(uint32_t index,vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r) + void BuildCommandBuffer(uint32_t index,vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r) { - if(!p||!ds||!r) + if(!p||!mi||!r) return; const vulkan::IndexBuffer *ib=r->GetIndexBuffer(); @@ -193,7 +193,7 @@ public: cb->Begin(); cb->BeginRenderPass(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index)); cb->Bind(p); - cb->Bind(ds); + cb->Bind(mi->GetDescriptorSets()); cb->Bind(r); if (ib) @@ -205,15 +205,15 @@ public: cb->End(); } - void BuildCommandBuffer(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r) + void BuildCommandBuffer(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r) { for(uint32_t i=0;iGetCurrentFrameIndices(),p,ds,r); + BuildCommandBuffer(sc_render_target->GetCurrentFrameIndices(),p,mi,r); } void BuildCommandBuffer(uint32_t index,RenderList *rl) @@ -321,14 +321,14 @@ public: camera.height=h; } - bool InitCameraUBO(vulkan::DescriptorSets *desc_set,uint world_matrix_bindpoint) + bool InitCameraUBO(vulkan::MaterialInstance *mi,const UTF8String &node_name) { ubo_world_matrix=db->CreateUBO(sizeof(WorldMatrix),&camera.matrix); if(!ubo_world_matrix) return(false); - return desc_set->BindUBO(world_matrix_bindpoint,ubo_world_matrix); + return mi->BindUBO(node_name,ubo_world_matrix); } virtual void BuildCommandBuffer(uint32_t index)=0; diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 6c36624e..85b03af3 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -143,7 +143,7 @@ public: if(!InitPipeline()) return(false); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); return(true); } @@ -157,7 +157,7 @@ public: ubo_mvp->Write(&cam.matrix); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); } };//class TestApp:public VulkanApplicationFramework diff --git a/example/Vulkan/indices_rect.cpp b/example/Vulkan/indices_rect.cpp index abdbce19..6f726c08 100644 --- a/example/Vulkan/indices_rect.cpp +++ b/example/Vulkan/indices_rect.cpp @@ -146,14 +146,14 @@ public: if(!InitPipeline()) return(false); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); return(true); } void Resize(int,int)override { - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); } };//class TestApp:public VulkanApplicationFramework diff --git a/example/Vulkan/texture_rect.cpp b/example/Vulkan/texture_rect.cpp index 5f0ef9e7..3f565f9b 100644 --- a/example/Vulkan/texture_rect.cpp +++ b/example/Vulkan/texture_rect.cpp @@ -179,7 +179,7 @@ public: if(!InitPipeline()) return(false); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); return(true); } @@ -193,7 +193,7 @@ public: ubo_mvp->Write(&cam.matrix); - BuildCommandBuffer(pipeline,material_instance->GetDescriptorSets(),render_obj); + BuildCommandBuffer(pipeline,material_instance,render_obj); } };//class TestApp:public VulkanApplicationFramework diff --git a/inc/hgl/graph/RenderList.h b/inc/hgl/graph/RenderList.h index eeea1571..c574e7c6 100644 --- a/inc/hgl/graph/RenderList.h +++ b/inc/hgl/graph/RenderList.h @@ -19,10 +19,10 @@ namespace hgl List scene_node_list; - vulkan::PushConstant * last_pc; - vulkan::Pipeline * last_pipeline; - vulkan::DescriptorSets *last_desc_sets; - vulkan::Renderable * last_renderable; + vulkan::PushConstant * last_pc; + vulkan::Pipeline * last_pipeline; + vulkan::MaterialInstance * last_mat_inst; + vulkan::Renderable * last_renderable; void Render(SceneNode *,RenderableInstance *); void Render(SceneNode *,List &); @@ -34,7 +34,7 @@ namespace hgl cmd_buf=nullptr; last_pc=nullptr; last_pipeline=nullptr; - last_desc_sets=nullptr; + last_mat_inst=nullptr; last_renderable=nullptr; } diff --git a/inc/hgl/graph/RenderableInstance.h b/inc/hgl/graph/RenderableInstance.h index 343a064c..9194be33 100644 --- a/inc/hgl/graph/RenderableInstance.h +++ b/inc/hgl/graph/RenderableInstance.h @@ -14,21 +14,21 @@ namespace hgl class RenderableInstance { vulkan::Pipeline * pipeline; - vulkan::DescriptorSets * desc_sets; + vulkan::MaterialInstance *mat_inst; vulkan::Renderable * render_obj; public: - RenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r):pipeline(p),desc_sets(ds),render_obj(r){} + RenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r):pipeline(p),mat_inst(mi),render_obj(r){} virtual ~RenderableInstance() { //需要在这里添加删除pipeline/desc_sets/render_obj引用计数的代码 } - vulkan::Pipeline * GetPipeline (){return pipeline;} - vulkan::DescriptorSets *GetDescriptorSets (){return desc_sets;} - vulkan::Renderable * GetRenderable (){return render_obj;} - const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();} + vulkan::Pipeline * GetPipeline (){return pipeline;} + vulkan::MaterialInstance * GetMaterialInstance (){return mat_inst;} + vulkan::Renderable * GetRenderable (){return render_obj;} + const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();} const int Comp(const RenderableInstance *ri)const { @@ -63,8 +63,8 @@ namespace hgl if(pipeline!=ri->pipeline) return pipeline-ri->pipeline; - if(desc_sets!=ri->desc_sets) - return desc_sets-ri->desc_sets; + if(mat_inst!=ri->mat_inst) + return int64(mat_inst)-int64(ri->mat_inst); return render_obj-ri->render_obj; } diff --git a/inc/hgl/graph/SceneDB.h b/inc/hgl/graph/SceneDB.h index 1cb6bbb4..b49d055b 100644 --- a/inc/hgl/graph/SceneDB.h +++ b/inc/hgl/graph/SceneDB.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,7 @@ namespace hgl vulkan::IndexBuffer *CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,nullptr,sharing_mode);} vulkan::IndexBuffer *CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,nullptr,sharing_mode);} - RenderableInstance * CreateRenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r); + RenderableInstance * CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r); vulkan::Material * GetMaterial (const MaterialID &id){return rm_material.Get(id);} vulkan::MaterialInstance * GetMaterialInstance (const MaterialInstanceID &id){return rm_material_instance.Get(id);} diff --git a/res/shader/PositionColor3D.vert b/res/shader/PositionColor3D.vert index 11011ebe..1f42239e 100644 --- a/res/shader/PositionColor3D.vert +++ b/res/shader/PositionColor3D.vert @@ -3,18 +3,30 @@ layout(location = 0) in vec3 Vertex; layout(location = 1) in vec4 Color; -layout(binding = 0) uniform WorldMatrix +layout(binding=0) uniform WorldMatrix // hgl/math/Math.h { mat4 ortho; + mat4 projection; + mat4 inverse_projection; + mat4 modelview; + mat4 inverse_modelview; + mat4 mvp; + mat4 inverse_mvp; + vec4 view_pos; + vec2 resolution; } world; -layout(push_constant) uniform Consts { +layout(push_constant) uniform Consts +{ mat4 local_to_world; -} pc; + mat3 normal; + vec3 object_position; + vec3 object_size; +}pc; layout(location = 0) out vec4 FragmentColor; diff --git a/src/SceneGraph/RenderList.cpp b/src/SceneGraph/RenderList.cpp index 6b751143..b6c3079c 100644 --- a/src/SceneGraph/RenderList.cpp +++ b/src/SceneGraph/RenderList.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace hgl { @@ -34,14 +35,14 @@ namespace hgl cmd_buf->Bind(last_pipeline); - last_desc_sets=nullptr; + last_mat_inst=nullptr; } - if(last_desc_sets!=ri->GetDescriptorSets()) + if(last_mat_inst!=ri->GetMaterialInstance()) { - last_desc_sets=ri->GetDescriptorSets(); + last_mat_inst=ri->GetMaterialInstance(); - cmd_buf->Bind(last_desc_sets); + cmd_buf->Bind(last_mat_inst->GetDescriptorSets()); } if(last_pc!=node->GetPushConstant()) @@ -94,7 +95,7 @@ namespace hgl cmd_buf=cb; last_pipeline=nullptr; - last_desc_sets=nullptr; + last_mat_inst=nullptr; last_renderable=nullptr; last_pc=nullptr; diff --git a/src/SceneGraph/SceneDB.cpp b/src/SceneGraph/SceneDB.cpp index 17b43aa3..185355e5 100644 --- a/src/SceneGraph/SceneDB.cpp +++ b/src/SceneGraph/SceneDB.cpp @@ -51,12 +51,12 @@ namespace hgl return(buf); } - RenderableInstance *SceneDB::CreateRenderableInstance(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r) + RenderableInstance *SceneDB::CreateRenderableInstance(vulkan::Pipeline *p,vulkan::MaterialInstance *mi,vulkan::Renderable *r) { - if(!p||!ds||!r) + if(!p||!mi||!r) return(nullptr); - RenderableInstance *ri=new RenderableInstance(p,ds,r); + RenderableInstance *ri=new RenderableInstance(p,mi,r); Add(ri);