From f79410e434d1b0786e958777e7db2021690be746 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sun, 28 Jul 2024 23:34:04 +0800 Subject: [PATCH] [WIP] StaticMesh and GizmoMove --- CMCore | 2 +- example/Gizmo/Gizmo3DMove.cpp | 67 +++++++++++++-- example/Gizmo/GizmoResource.cpp | 84 ++++++++++++++++--- example/Gizmo/GizmoResource.h | 22 ++--- example/Gizmo/MetricCellsGrid.cpp | 9 +- example/Gizmo/StaticMesh.cpp | 30 +++++++ .../LightBasic/BlinnPhongDirectionLight.cpp | 4 +- inc/hgl/graph/SceneNode.h | 8 ++ {example/Gizmo => inc/hgl/graph}/StaticMesh.h | 16 ++-- inc/hgl/graph/VKRenderResource.h | 39 +++++++++ src/ShaderGen/MaterialFileData.h | 1 + 11 files changed, 240 insertions(+), 42 deletions(-) rename {example/Gizmo => inc/hgl/graph}/StaticMesh.h (51%) diff --git a/CMCore b/CMCore index 1fab7b4e..9567616e 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 1fab7b4ef20aad87628b69df6a7b3206c377501d +Subproject commit 9567616ee48cd38ab71ed913b0bd8e3b3a9ad86d diff --git a/example/Gizmo/Gizmo3DMove.cpp b/example/Gizmo/Gizmo3DMove.cpp index 71ab5c6b..187ea3d8 100644 --- a/example/Gizmo/Gizmo3DMove.cpp +++ b/example/Gizmo/Gizmo3DMove.cpp @@ -22,17 +22,74 @@ */ #include"GizmoResource.h" +#include +#include VK_NAMESPACE_BEGIN -struct StaticMesh -{ - -}; - namespace { + static StaticMesh *sm_gizmo_move=nullptr; + bool InitGizmoMoveStaticMesh() + { + Renderable *sphere=GetGizmoRenderable(GizmoShape::Sphere,GizmoColor::White); + Renderable *cylinder[3] + { + GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red), + GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Green), + GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Blue), + }; + + Renderable *cone[3] + { + GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Red), + GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Green), + GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Blue), + }; + + if(!sphere) + return(false); + + for(int i=0;i<3;i++) + { + if(!cylinder[i]) + return(false); + + if(!cone[i]) + return(false); + } + + { + SceneNode *root_node=new SceneNode(scale(1),sphere); + + root_node->CreateSubNode(scale(9,1,1),cylinder[0]); + + { + TransformMatrix4f tm; + + tm.SetTranslation(Vector3f(0,0,4.5f)); + root_node->CreateSubNode(tm.GetMatrix(),cylinder[2]); //Z 向上 + + tm.SetRotation(Vector3f(0,0,1),90); + tm.SetTranslation(Vector3f(4.5f,0,0)); + + root_node->CreateSubNode(tm.GetMatrix(),cylinder[0]); //X 向右 + + tm.SetRotation(Vector3f(1,0,0),90); + tm.SetTranslation(Vector3f(0,4.5f,0)); + + root_node->CreateSubNode(tm.GetMatrix(),cylinder[1]); //Y 向前 + } + + sm_gizmo_move=CreateGizmoStaticMesh(root_node); + } + + if(!sm_gizmo_move) + return(false); + + return(true); + } }//namespace VK_NAMESPACE_END diff --git a/example/Gizmo/GizmoResource.cpp b/example/Gizmo/GizmoResource.cpp index fc77bfb0..ffdd5366 100644 --- a/example/Gizmo/GizmoResource.cpp +++ b/example/Gizmo/GizmoResource.cpp @@ -14,6 +14,43 @@ VK_NAMESPACE_BEGIN namespace { + static RenderResource * gizmo_rr=nullptr; + + struct GizmoResource + { + Material * mtl; + MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)]; + Pipeline * pipeline; + VertexDataManager * vdm; + + PrimitiveCreater * prim_creater; + }; + + static GizmoResource gizmo_line{}; + static GizmoResource gizmo_triangle{}; + + struct GizmoRenderable + { + Primitive *prim; + + Renderable *renderable[size_t(GizmoColor::RANGE_SIZE)]; + }; + + GizmoRenderable gizmo_rederable[size_t(GizmoShape::RANGE_SIZE)]{}; + + void InitGizmoRenderable(const GizmoShape &gs,Primitive *prim,Pipeline *p) + { + if(!prim) + return; + + GizmoRenderable *gr=gizmo_rederable+size_t(gs); + + gr->prim=prim; + + for(uint i=0;irenderable[i]=CreateRenderable(prim,gizmo_triangle.mi[i],p); + } + bool InitMI(GizmoResource *gr) { if(!gr||!gr->mtl) @@ -122,9 +159,9 @@ namespace if(!gizmo_triangle.vdm) return(false); - if(!gizmo_triangle.vdm->Init( HGL_SIZE_1MB, //最大顶点数量 - HGL_SIZE_1MB, //最大索引数量 - IndexType::U16)) //索引类型 + if(!gizmo_triangle.vdm->Init( HGL_SIZE_1MB, //最大顶点数量 + HGL_SIZE_1MB, //最大索引数量 + IndexType::U16)) //索引类型 return(false); } @@ -139,7 +176,7 @@ namespace using namespace inline_geometry; { - gizmo_prim[size_t(GizmoShape::Plane)]=CreatePlane(gizmo_triangle.prim_creater); + InitGizmoRenderable(GizmoShape::Plane,CreatePlane(gizmo_triangle.prim_creater),gizmo_triangle.pipeline); } { @@ -149,11 +186,11 @@ namespace cci.tangent=false; cci.tex_coord=false; - gizmo_prim[size_t(GizmoShape::Cube)]=CreateCube(gizmo_triangle.prim_creater,&cci); + InitGizmoRenderable(GizmoShape::Cube,CreateCube(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline); } { - gizmo_prim[size_t(GizmoShape::Sphere)]=CreateSphere(gizmo_triangle.prim_creater,8); + InitGizmoRenderable(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,8),gizmo_triangle.pipeline); } { @@ -164,7 +201,7 @@ namespace cci.numberSlices=8; //圆锥底部分割数 cci.numberStacks=1; //圆锥高度分割数 - gizmo_prim[size_t(GizmoShape::Cone)]=CreateCone(gizmo_triangle.prim_creater,&cci); + InitGizmoRenderable(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline); } { @@ -174,12 +211,12 @@ namespace cci.numberSlices=8; //圆柱底部分割数 cci.radius =1; //圆柱半径 - gizmo_prim[size_t(GizmoShape::Cylinder)]=CreateCylinder(gizmo_triangle.prim_creater,&cci); + InitGizmoRenderable(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline); } ENUM_CLASS_FOR(GizmoShape,int,i) { - if(!gizmo_prim[i]) + if(!gizmo_rederable[i].prim) return(false); } } @@ -206,7 +243,12 @@ bool InitGizmoResource(GPUDevice *device) void FreeGizmoResource() { - SAFE_CLEAR_OBJECT_ARRAY(gizmo_prim) + for(GizmoRenderable &gr:gizmo_rederable) + { + SAFE_CLEAR(gr.prim) + SAFE_CLEAR_OBJECT_ARRAY(gr.renderable) + } + SAFE_CLEAR(gizmo_triangle.prim_creater); SAFE_CLEAR(gizmo_triangle.vdm); // SAFE_CLEAR(gizmo_pipeline_triangles); @@ -215,4 +257,26 @@ void FreeGizmoResource() SAFE_CLEAR(gizmo_rr); } +Renderable *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color) +{ + if(!gizmo_rr) + return(nullptr); + + RANGE_CHECK_RETURN_NULLPTR(shape) + RANGE_CHECK_RETURN_NULLPTR(color) + + return gizmo_rederable[size_t(shape)].renderable[size_t(color)]; +} + +StaticMesh *CreateGizmoStaticMesh(SceneNode *root_node) +{ + if(!root_node) + return(nullptr); + + if(root_node->IsEmpty()) + return(nullptr); + + return CreateRRObject(gizmo_rr,root_node); +} + VK_NAMESPACE_END \ No newline at end of file diff --git a/example/Gizmo/GizmoResource.h b/example/Gizmo/GizmoResource.h index 884e006e..0ebb72b2 100644 --- a/example/Gizmo/GizmoResource.h +++ b/example/Gizmo/GizmoResource.h @@ -1,7 +1,13 @@ #pragma once #include"Gizmo.h" +#include VK_NAMESPACE_BEGIN + +class SceneNode; +class PrimitiveCreater; +class StaticMesh; + constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]= { COLOR::MozillaCharcoal, @@ -14,20 +20,8 @@ constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]= COLOR::BlenderYellow, }; -static RenderResource * gizmo_rr=nullptr; +Renderable *GetGizmoRenderable(const GizmoShape &gs,const GizmoColor &); -struct GizmoResource -{ - Material * mtl; - MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)]; - Pipeline * pipeline; - VertexDataManager * vdm; +StaticMesh *CreateGizmoStaticMesh(SceneNode *); - PrimitiveCreater * prim_creater; -}; - -static GizmoResource gizmo_line{}; -static GizmoResource gizmo_triangle{}; - -static Primitive * gizmo_prim[size_t(GizmoShape::RANGE_SIZE)]{}; VK_NAMESPACE_END diff --git a/example/Gizmo/MetricCellsGrid.cpp b/example/Gizmo/MetricCellsGrid.cpp index c18b2114..bf82df8e 100644 --- a/example/Gizmo/MetricCellsGrid.cpp +++ b/example/Gizmo/MetricCellsGrid.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include using namespace hgl; @@ -83,7 +83,12 @@ private: bool CreateRenderObject() { - ro_plane=inline_geometry::CreatePlane(db,material->GetDefaultVIL()); + PrimitiveCreater pc(device,material->GetDefaultVIL()); + + ro_plane=inline_geometry::CreatePlane(&pc); + + if(ro_plane) + db->Add(ro_plane); return ro_plane; } diff --git a/example/Gizmo/StaticMesh.cpp b/example/Gizmo/StaticMesh.cpp index e69de29b..b8ab15c4 100644 --- a/example/Gizmo/StaticMesh.cpp +++ b/example/Gizmo/StaticMesh.cpp @@ -0,0 +1,30 @@ +#include +#include + +VK_NAMESPACE_BEGIN + +StaticMesh *StaticMesh::CreateNewObject(RenderResource *rr,SceneNode *node) +{ + 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); +} + +VK_NAMESPACE_END diff --git a/example/LightBasic/BlinnPhongDirectionLight.cpp b/example/LightBasic/BlinnPhongDirectionLight.cpp index 877fe681..e432ed8c 100644 --- a/example/LightBasic/BlinnPhongDirectionLight.cpp +++ b/example/LightBasic/BlinnPhongDirectionLight.cpp @@ -233,7 +233,7 @@ private: { struct CylinderCreateInfo cci; - cci.halfExtend =1.25; //圆柱一半高度 + cci.halfExtend =1.25; //圆柱一半高度 cci.numberSlices=16; //圆柱底部分割数 cci.radius =1.25f; //圆柱半径 @@ -256,7 +256,7 @@ private: if(!ri) { - LOG_ERROR(U8_TEXT("Create Renderable failed! Primitive: ")+r->GetName()); + LOG_ERROR("Create Renderable failed! Primitive: "+r->GetName()); return(nullptr); } diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index c6e53517..1b2c642c 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -43,6 +43,14 @@ namespace hgl render_obj=nullptr; } + const bool IsEmpty()const + { + if(render_obj)return(false); + if(SubNode.GetCount())return(false); + + return(true); + } + Renderable *GetRenderable(){return render_obj;} void SetRenderable(Renderable *); diff --git a/example/Gizmo/StaticMesh.h b/inc/hgl/graph/StaticMesh.h similarity index 51% rename from example/Gizmo/StaticMesh.h rename to inc/hgl/graph/StaticMesh.h index 9d11b8c7..df216ea6 100644 --- a/example/Gizmo/StaticMesh.h +++ b/inc/hgl/graph/StaticMesh.h @@ -5,22 +5,22 @@ #include VK_NAMESPACE_BEGIN - class StaticMesh { +protected: + RenderResource *rr; - SortedSets prim_set; - SortedSets mi_set; - SortedSets pipeline_set; + SceneNode *root_node; -protected: +private: - SceneNode *root_node + StaticMesh(RenderResource *,SceneNode *); public: + virtual ~StaticMesh(); -}; - + static StaticMesh *CreateNewObject(RenderResource *,SceneNode *); +};//class StaticMesh VK_NAMESPACE_END diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 6a680279..1c9b9b80 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ using PrimitiveID =int; using RenderableID =int; using SamplerID =int; using TextureID =int; +using StaticMeshID =int; class VertexAttribData; @@ -60,6 +62,8 @@ class RenderResource IDObjectManage rm_textures; ///<纹理合集 IDObjectManage rm_renderables; ///<渲染实例集合集 + IDObjectManage rm_static_mesh; ///<静态网格合集 + private: void AddBuffer(const AnsiString &buf_name,DeviceBuffer *buf) @@ -103,6 +107,7 @@ public: //添加数据到管理器(如果指针为nullptr会返回-1) SamplerID Add(Sampler * s ){return rm_samplers.Add(s);} TextureID Add(Texture * t ){return rm_textures.Add(t);} RenderableID Add(Renderable * r ){return rm_renderables.Add(r);} + StaticMeshID Add(StaticMesh * sm ){return rm_static_mesh.Add(sm);} public: // VAB/VAO @@ -172,6 +177,40 @@ public: //Get Sampler * GetSampler (const SamplerID &id){return rm_samplers.Get(id);} Texture * GetTexture (const TextureID &id){return rm_textures.Get(id);} Renderable * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);} + + StaticMesh * GetStaticMesh (const StaticMeshID &id){return rm_static_mesh.Get(id);} + +public: //Release + + void Release(Material * mtl ){rm_material.Release(mtl);} + void Release(MaterialInstance * mi ){rm_material_instance.Release(mi);} + void Release(DescriptorSet * ds ){rm_desc_sets.Release(ds);} + void Release(Primitive * p ){rm_primitives.Release(p);} + void Release(DeviceBuffer * buf ){rm_buffers.Release(buf);} + void Release(Sampler * s ){rm_samplers.Release(s);} + void Release(Texture * t ){rm_textures.Release(t);} + void Release(Renderable * r ){rm_renderables.Release(r);} + + void Release(StaticMesh * sm ){rm_static_mesh.Release(sm);} };//class RenderResource + +/** +* 创建一个渲染资源对像
+* 这个函数是临时的,以后会被更好的机制替代 +*/ +template +T *CreateRRObject(RenderResource *rr,ARGS...args) +{ + if(!rr) + return(nullptr); + + T *obj=T::CreateNewObject(rr,args...); + + if(!obj) + return(nullptr); + + rr->Add(obj); + return obj; +} VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_DATABASE_INCLUDE diff --git a/src/ShaderGen/MaterialFileData.h b/src/ShaderGen/MaterialFileData.h index dc1be48a..c2a95e5f 100644 --- a/src/ShaderGen/MaterialFileData.h +++ b/src/ShaderGen/MaterialFileData.h @@ -18,6 +18,7 @@ namespace material_file struct MaterialInstanceData { const char *code; + uint code_length; uint data_bytes;