From f2a6c61c25e2b60e01ce5eacfa0e7195b4ba5c46 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 30 Jul 2024 00:47:28 +0800 Subject: [PATCH] [WIP] render gizmo_move, but model is incorrect. --- example/Gizmo/Gizmo.h | 3 ++- example/Gizmo/GizmoResource.cpp | 23 +++++++++++++------ example/Gizmo/GizmoTest.cpp | 9 +++++--- example/common/VulkanAppFramework.h | 25 +++++++++++++++++---- inc/hgl/graph/StaticMesh.h | 9 ++------ src/SceneGraph/StaticMesh.cpp | 27 ++++++++++------------- src/SceneGraph/Vulkan/VKDescriptorSet.cpp | 4 +++- 7 files changed, 62 insertions(+), 38 deletions(-) diff --git a/example/Gizmo/Gizmo.h b/example/Gizmo/Gizmo.h index b64a080d..3e177160 100644 --- a/example/Gizmo/Gizmo.h +++ b/example/Gizmo/Gizmo.h @@ -29,9 +29,10 @@ enum class GizmoShape:uint ENUM_CLASS_RANGE(Plane,Cylinder) }; -bool InitGizmoResource(GPUDevice *); +bool InitGizmoResource(RenderResource *); void FreeGizmoResource(); + StaticMesh *GetGizmoMoveStaticMesh(); VK_NAMESPACE_END diff --git a/example/Gizmo/GizmoResource.cpp b/example/Gizmo/GizmoResource.cpp index 73c45263..827296f9 100644 --- a/example/Gizmo/GizmoResource.cpp +++ b/example/Gizmo/GizmoResource.cpp @@ -84,6 +84,7 @@ namespace mtl::Material3DCreateConfig cfg(device->GetDeviceAttribute(),"VertexLuminance3D",Prim::Lines); cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名 + cfg.local_to_world=true; cfg.position_format=VAT_VEC3; mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(&cfg); @@ -94,6 +95,8 @@ namespace gizmo_line.mtl=gizmo_rr->CreateMaterial(mci); if(!gizmo_line.mtl) return(false); + + gizmo_line.mtl->Update(); } { @@ -145,6 +148,8 @@ namespace gizmo_triangle.mtl=gizmo_rr->CreateMaterial(mci); if(!gizmo_triangle.mtl) return(false); + + gizmo_triangle.mtl->Update(); } { @@ -228,12 +233,17 @@ namespace } }//namespace -bool InitGizmoResource(GPUDevice *device) +bool InitGizmoResource(RenderResource *rr) { + if(!rr) + return(false); + if(gizmo_rr) return(false); - gizmo_rr=new RenderResource(device); + gizmo_rr=rr; + + GPUDevice *device=gizmo_rr->GetDevice(); if(!InitGizmoResource3D(device)) return(false); @@ -258,10 +268,9 @@ void FreeGizmoResource() SAFE_CLEAR(gizmo_triangle.prim_creater); SAFE_CLEAR(gizmo_triangle.vdm); -// SAFE_CLEAR(gizmo_pipeline_triangles); -// SAFE_CLEAR_OBJECT_ARRAY(gizmo_mi_triangles) - //SAFE_CLEAR(gizmo_mtl_triangles); - SAFE_CLEAR(gizmo_rr); + + SAFE_CLEAR(gizmo_line.prim_creater); + SAFE_CLEAR(gizmo_line.vdm); } Renderable *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color) @@ -283,7 +292,7 @@ StaticMesh *CreateGizmoStaticMesh(SceneNode *root_node) if(root_node->IsEmpty()) return(nullptr); - return CreateRRObject(gizmo_rr,root_node); + return(new StaticMesh(root_node)); } VK_NAMESPACE_END \ No newline at end of file diff --git a/example/Gizmo/GizmoTest.cpp b/example/Gizmo/GizmoTest.cpp index 4ca0b56e..e0e2afef 100644 --- a/example/Gizmo/GizmoTest.cpp +++ b/example/Gizmo/GizmoTest.cpp @@ -12,7 +12,7 @@ private: bool InitGizmo() { - if(!InitGizmoResource(device)) + if(!InitGizmoResource(db)) return(false); sm=GetGizmoMoveStaticMesh(); @@ -34,8 +34,11 @@ public: camera_control->SetTarget(Vector3f(0,0,0)); camera_control->Refresh(); - render_root.RefreshMatrix(); - render_list->Expend(sm->GetScene()); + SceneNode *sn=sm->GetScene(); + + sn->RefreshMatrix(); + + render_list->Expend(sn); return(true); } diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 1eaab635..dcbd213c 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -76,6 +76,14 @@ protected: public: + virtual void BindRenderResource(RenderResource *rr) + { + if(!rr) + return; + + rr->static_descriptor.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info); + } + virtual ~VulkanApplicationFramework() { CloseShaderCompiler(); @@ -152,10 +160,10 @@ public: vp_info.Set(w,h); ubo_vp_info=db->CreateUBO("Viewport",sizeof(ViewportInfo),&vp_info); - - db->static_descriptor.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info); } + BindRenderResource(db); + return(true); } @@ -481,6 +489,15 @@ protected: public: + virtual void BindRenderResource(RenderResource *rr) override + { + if(!rr)return; + + VulkanApplicationFramework::BindRenderResource(rr); + + rr->global_descriptor.AddUBO(mtl::SBS_CameraInfo.name,ubo_camera_info); + } + virtual ~CameraAppFramework() { SAFE_CLEAR(ckc); @@ -494,6 +511,8 @@ public: return(false); InitCamera(w,h); + + BindRenderResource(db); return(true); } @@ -516,8 +535,6 @@ public: RefreshCameraInfo(&camera_control->GetCameraInfo(),&vp_info,camera); ubo_camera_info=db->CreateUBO("CameraInfo",sizeof(CameraInfo),&camera_control->GetCameraInfo()); - - db->global_descriptor.AddUBO(mtl::SBS_CameraInfo.name,ubo_camera_info); } void Resize(uint w,uint h)override diff --git a/inc/hgl/graph/StaticMesh.h b/inc/hgl/graph/StaticMesh.h index 95b7c4e6..37763f36 100644 --- a/inc/hgl/graph/StaticMesh.h +++ b/inc/hgl/graph/StaticMesh.h @@ -9,19 +9,14 @@ class StaticMesh { protected: - RenderResource *rr; - SceneNode *root_node; -private: - - StaticMesh(RenderResource *,SceneNode *); - public: + StaticMesh(SceneNode *); virtual ~StaticMesh(); - static StaticMesh *CreateNewObject(RenderResource *,SceneNode *); +// static StaticMesh *CreateNewObject(RenderResource *,SceneNode *); public: diff --git a/src/SceneGraph/StaticMesh.cpp b/src/SceneGraph/StaticMesh.cpp index b8ab15c4..52086f25 100644 --- a/src/SceneGraph/StaticMesh.cpp +++ b/src/SceneGraph/StaticMesh.cpp @@ -3,27 +3,24 @@ VK_NAMESPACE_BEGIN -StaticMesh *StaticMesh::CreateNewObject(RenderResource *rr,SceneNode *node) +//StaticMesh *StaticMesh::CreateNewObject(RenderResource *rr,SceneNode *node) +//{ +// if(!node) +// return(nullptr); +// +// if(node->IsEmpty()) +// return(nullptr); +// +// return(new StaticMesh(rr,node)); +//} + +StaticMesh::StaticMesh(SceneNode *sn) { - if(!node) - return(nullptr); - - if(node->IsEmpty()) - return(nullptr); - - return(new StaticMesh(rr,node)); -} - -StaticMesh::StaticMesh(RenderResource *r,SceneNode *sn) -{ - rr=r; root_node=sn; } StaticMesh::~StaticMesh() { - rr->Release(this); - SAFE_CLEAR(root_node); } diff --git a/src/SceneGraph/Vulkan/VKDescriptorSet.cpp b/src/SceneGraph/Vulkan/VKDescriptorSet.cpp index f5e9b53e..0925a9d4 100644 --- a/src/SceneGraph/Vulkan/VKDescriptorSet.cpp +++ b/src/SceneGraph/Vulkan/VKDescriptorSet.cpp @@ -188,7 +188,9 @@ void DescriptorSet::Update() { if(!is_dirty)return; - vkUpdateDescriptorSets(device,wds_list.GetCount(),wds_list.GetData(),0,nullptr); + if(wds_list.GetCount()>0) + vkUpdateDescriptorSets(device,wds_list.GetCount(),wds_list.GetData(),0,nullptr); + is_dirty=false; } VK_NAMESPACE_END