diff --git a/CMSceneGraph b/CMSceneGraph index 9d9fad79..76aff5d5 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 9d9fad791d9c6569189bcc57dd4b219df62bc98a +Subproject commit 76aff5d55628a87baa35498520296d65ab70e995 diff --git a/inc/hgl/graph/MaterialRenderList.h b/inc/hgl/graph/MaterialRenderList.h index 4d11439a..5dbbf549 100644 --- a/inc/hgl/graph/MaterialRenderList.h +++ b/inc/hgl/graph/MaterialRenderList.h @@ -92,12 +92,12 @@ protected: VABList * vab_list; - const MeshDataBuffer * last_data_buffer; + const MeshDataBuffer * last_data_buffer; const VDM * last_vdm; - const MeshRenderData * last_render_data; + const MeshRenderData * last_render_data; - int first_indirect_draw_index=-1; - uint indirect_draw_count=0; + int first_indirect_draw_index; + uint indirect_draw_count; bool BindVAB(const MeshDataBuffer *,const uint); diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index 0c054913..49efddd7 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -6,123 +6,120 @@ #include #include -namespace hgl +namespace hgl::graph { - namespace graph + using SceneNodeID =uint64; + using SceneNodeName =U16IDName; + + /** + * 场景节点数据类
+ * 从场景坐标变换(SceneOrient)类继承, + * 每个场景节点中可能包括一个可渲染数据实例,或是完全不包含(用于坐标变换的父节点,或是灯光/摄像机之类)。 + */ + class SceneNode:public SceneOrient ///场景节点类 { - using SceneNodeID =uint64; - using SceneNodeName =U16IDName; + SceneNode *ParentNode; ///<上级节点 - /** - * 场景节点数据类
- * 从场景坐标变换(SceneOrient)类继承, - * 每个场景节点中可能包括一个可渲染数据实例,或是完全不包含(用于坐标变换的父节点,或是灯光/摄像机之类)。 - */ - class SceneNode:public SceneOrient ///场景节点类 + SceneNodeID NodeID; ///<节点ID + SceneNodeName NodeName; ///<节点名称 + + protected: + + AABB BoundingBox; ///<绑定盒 + AABB LocalBoundingBox; ///<本地坐标绑定盒 + //AABB WorldBoundingBox; ///<世界坐标绑定盒 + + Mesh *render_obj=nullptr; ///<可渲染实例 + + protected: + + ObjectList ChildNode; ///<子节点 + ObjectList ComponentList; ///<组件列表 + + public: + + const SceneNodeID & GetNodeID ()const { return NodeID; } ///<取得节点ID + const SceneNodeName & GetNodeName ()const { return NodeName; } ///<取得节点名称 + + const ObjectList &GetChildNode()const { return ChildNode; } ///<取得子节点列表 + + public: + + SceneNode()=default; + SceneNode(const SceneNode &)=delete; + SceneNode(const SceneNode *)=delete; + SceneNode(const SceneOrient &so ):SceneOrient(so) {} + SceneNode( Mesh *ri ) {render_obj=ri;} + SceneNode(const Matrix4f &mat ):SceneOrient(mat) {} + SceneNode(const Matrix4f &mat, Mesh *ri ):SceneOrient(mat) {render_obj=ri;} + + public: + + virtual ~SceneNode()=default; + + void Clear() override { - SceneNode *ParentNode; ///<上级节点 + SceneOrient::Clear(); - SceneNodeID NodeID; ///<节点ID - SceneNodeName NodeName; ///<节点名称 + ParentNode=nullptr; - protected: + BoundingBox.SetZero(); + LocalBoundingBox.SetZero(); - AABB BoundingBox; ///<绑定盒 - AABB LocalBoundingBox; ///<本地坐标绑定盒 - //AABB WorldBoundingBox; ///<世界坐标绑定盒 + ChildNode.Clear(); + ComponentList.Clear(); + render_obj=nullptr; + } - Mesh *render_obj=nullptr; ///<可渲染实例 + const bool ChildNodeIsEmpty()const + { + if(render_obj)return(false); + if(ChildNode.GetCount())return(false); - protected: + return(true); + } - ObjectList ChildNode; ///<子节点 - ObjectList ComponentList; ///<组件列表 + void SetParent(SceneNode *sn) {ParentNode=sn;} + SceneNode * GetParent() noexcept{return ParentNode;} + const SceneNode * GetParent()const noexcept{return ParentNode;} - public: + void SetRenderable(Mesh *); + Mesh * GetRenderable() noexcept{return render_obj;} + const Mesh * GetRenderable()const noexcept{return render_obj;} - const SceneNodeID & GetNodeID ()const { return NodeID; } ///<取得节点ID - const SceneNodeName & GetNodeName ()const { return NodeName; } ///<取得节点名称 + SceneNode *Add(SceneNode *sn) + { + if(!sn) + return(nullptr); - const ObjectList &GetChildNode()const { return ChildNode; } ///<取得子节点列表 + ChildNode.Add(sn); + sn->SetParent(this); + return sn; + } - public: + public: //坐标相关方法 - SceneNode()=default; - SceneNode(const SceneNode &)=delete; - SceneNode(const SceneNode *)=delete; - SceneNode(const SceneOrient &so ):SceneOrient(so) {} - SceneNode( Mesh *ri ) {render_obj=ri;} - SceneNode(const Matrix4f &mat ):SceneOrient(mat) {} - SceneNode(const Matrix4f &mat, Mesh *ri ):SceneOrient(mat) {render_obj=ri;} + virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 - public: + virtual void RefreshMatrix () override; ///<刷新世界变换 + virtual void RefreshBoundingBox (); ///<刷新绑定盒 - virtual ~SceneNode()=default; - - void Clear() override - { - SceneOrient::Clear(); - - ParentNode=nullptr; - - BoundingBox.SetZero(); - LocalBoundingBox.SetZero(); - - ChildNode.Clear(); - ComponentList.Clear(); - render_obj=nullptr; - } - - const bool ChildNodeIsEmpty()const - { - if(render_obj)return(false); - if(ChildNode.GetCount())return(false); - - return(true); - } - - void SetParent(SceneNode *sn) {ParentNode=sn;} - SceneNode * GetParent() noexcept{return ParentNode;} - const SceneNode * GetParent()const noexcept{return ParentNode;} - - void SetRenderable(Mesh *); - Mesh * GetRenderable() noexcept{return render_obj;} - const Mesh * GetRenderable()const noexcept{return render_obj;} - - SceneNode *Add(SceneNode *sn) - { - if(!sn) - return(nullptr); - - ChildNode.Add(sn); - sn->SetParent(this); - return sn; - } - - public: //坐标相关方法 - - virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 - - virtual void RefreshMatrix () override; ///<刷新世界变换 - virtual void RefreshBoundingBox (); ///<刷新绑定盒 - - virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒 - virtual const AABB & GetLocalBoundingBox ()const{return LocalBoundingBox;} ///<取得本地坐标绑定盒 + virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒 + virtual const AABB & GetLocalBoundingBox ()const{return LocalBoundingBox;} ///<取得本地坐标绑定盒 // virtual const AABB & GetWorldBoundingBox ()const{return WorldBoundingBox;} ///<取得世界坐标绑定盒 - public: //组件相关方法 + public: //组件相关方法 - bool ComponentIsEmpty ()const {return ComponentList.GetCount()==0;} ///<是否没有组件 - virtual int GetComponentCount ()const {return ComponentList.GetCount();} ///<取得组件数量 - virtual void AddComponent (Component *comp) {ComponentList.Add(comp);} ///<添加一个组件 - virtual void RemoveComponent (Component *comp) {ComponentList.DeleteByValue(comp);} ///<删除一个组件 - bool Contains (Component *comp) {return ComponentList.Contains(comp);} ///<是否包含指定组件 + bool ComponentIsEmpty ()const {return ComponentList.GetCount()==0;} ///<是否没有组件 + virtual int GetComponentCount ()const {return ComponentList.GetCount();} ///<取得组件数量 + virtual void AddComponent (Component *comp) {ComponentList.Add(comp);} ///<添加一个组件 + virtual void RemoveComponent (Component *comp) {ComponentList.DeleteByValue(comp);} ///<删除一个组件 + bool Contains (Component *comp) {return ComponentList.Contains(comp);} ///<是否包含指定组件 - bool HasComponent (const ComponentManager *); ///<是否有指定组件管理器的组件 - virtual int GetComponents (ArrayList &comp_list,const ComponentManager *); ///<取得所有组件 + bool HasComponent (const ComponentManager *); ///<是否有指定组件管理器的组件 + virtual int GetComponents (ArrayList &comp_list,const ComponentManager *); ///<取得所有组件 - };//class SceneNode + };//class SceneNode - SceneNode *Duplication(SceneNode *); ///<复制一个场景节点 - }//namespace graph -}//namespace hgl + SceneNode *Duplication(SceneNode *); ///<复制一个场景节点 +}//namespace hgl::graph diff --git a/inc/hgl/graph/SceneOrient.h b/inc/hgl/graph/SceneOrient.h index 9fcfde07..21425da3 100644 --- a/inc/hgl/graph/SceneOrient.h +++ b/inc/hgl/graph/SceneOrient.h @@ -2,51 +2,48 @@ #include #include -namespace hgl +namespace hgl::graph { - namespace graph + /** + * 方向定位数据基类
+ */ + class SceneOrient ///场景定位类 { - /** - * 方向定位数据基类
- */ - class SceneOrient ///场景定位类 + protected: + + SceneMatrix scene_matrix; + + public: + + SceneOrient()=default; + SceneOrient(const SceneOrient &); + SceneOrient(const Matrix4f &); + virtual ~SceneOrient()=default; + + virtual void Clear() { - protected: + scene_matrix.Clear(); + } - SceneMatrix scene_matrix; + void SetLocalNormal(const Vector3f &nor) {scene_matrix.SetLocalNormal(nor);} ///<设置本地法线 + void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵 + void SetParentMatrix(const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵 - public: + public: - SceneOrient()=default; - SceneOrient(const SceneOrient &); - SceneOrient(const Matrix4f &); - virtual ~SceneOrient()=default; + const uint32 GetLocalToWorldMatrixVersion()const {return scene_matrix.GetNewestVersion();} ///<取得版本号 - virtual void Clear() - { - scene_matrix.Clear(); - } + const Vector3f & GetWorldPosition() const {return scene_matrix.GetWorldPosition();} ///<取得世界坐标 + const Matrix4f & GetLocalMatrix ()const {return scene_matrix.GetLocalMatrix();} ///<取得本地矩阵 - void SetLocalNormal(const Vector3f &nor) {scene_matrix.SetLocalNormal(nor);} ///<设置本地法线 - void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵 - void SetParentMatrix(const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵 + TransformManager & GetTransform () {return scene_matrix.GetTransform();} ///<取得变换管理器 - public: + const Matrix4f & GetLocalToWorldMatrix () {return scene_matrix.GetLocalToWorldMatrix();} ///<取得本地到世界矩阵 + const Matrix4f & GetInverseLocalToWorldMatrix () {return scene_matrix.GetInverseLocalToWorldMatrix();} + const Matrix4f & GetInverseTransposeLocalToWorldMatrix () {return scene_matrix.GetInverseTransposeLocalToWorldMatrix();} - const uint32 GetLocalToWorldMatrixVersion()const {return scene_matrix.GetNewestVersion();} ///<取得版本号 + public: - const Vector3f & GetWorldPosition() const {return scene_matrix.GetWorldPosition();} ///<取得世界坐标 - const Matrix4f & GetLocalMatrix ()const {return scene_matrix.GetLocalMatrix();} ///<取得本地矩阵 - - TransformManager & GetTransform () {return scene_matrix.GetTransform();} ///<取得变换管理器 - - const Matrix4f & GetLocalToWorldMatrix () {return scene_matrix.GetLocalToWorldMatrix();} ///<取得本地到世界矩阵 - const Matrix4f & GetInverseLocalToWorldMatrix () {return scene_matrix.GetInverseLocalToWorldMatrix();} - const Matrix4f & GetInverseTransposeLocalToWorldMatrix () {return scene_matrix.GetInverseTransposeLocalToWorldMatrix();} - - public: - - virtual void RefreshMatrix(); - };//class SceneOrient - }//namespace graph -}//namespace hgl + virtual void RefreshMatrix(); + };//class SceneOrient +}//namespace hgl::graph diff --git a/src/SceneGraph/render/MaterialRenderList.cpp b/src/SceneGraph/render/MaterialRenderList.cpp index fd14e8af..3744dd4a 100644 --- a/src/SceneGraph/render/MaterialRenderList.cpp +++ b/src/SceneGraph/render/MaterialRenderList.cpp @@ -82,10 +82,19 @@ MaterialRenderList::MaterialRenderList(VulkanDevice *d,bool l2w,const RenderPipe assign_buffer=new RenderAssignBuffer(device,rp_index.material); - vab_list=new VABList(rp_index.material->GetVertexInput()->GetCount()); - icb_draw=nullptr; icb_draw_indexed=nullptr; + + ri_count=0; + + vab_list=new VABList(rp_index.material->GetVertexInput()->GetCount()); + + last_data_buffer=nullptr; + last_vdm=nullptr; + last_render_data=nullptr; + + first_indirect_draw_index=-1; + indirect_draw_count=0; } MaterialRenderList::~MaterialRenderList() @@ -231,7 +240,7 @@ void MaterialRenderList::ReallocICB() } void MaterialRenderList::WriteICB(VkDrawIndirectCommand *dicp,RenderItem *ri) -{ +{ dicp->vertexCount =ri->prd->vertex_count; dicp->instanceCount =ri->instance_count; dicp->firstVertex =ri->prd->vertex_offset;