diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index 1b2c642c..ba5d9b26 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -31,6 +31,7 @@ namespace hgl public: SceneNode()=default; + SceneNode(SceneNode *); SceneNode( Renderable *ri ) {render_obj=ri;} SceneNode(const Matrix4f &mat ):SceneOrient(mat) {} SceneNode(const Matrix4f &mat, Renderable *ri ):SceneOrient(mat) {render_obj=ri;} @@ -92,6 +93,29 @@ namespace hgl return sn; } + SceneNode *CreateSubNode(SceneNode *node) + { + if(!node) + return(nullptr); + + SceneNode *sn=new SceneNode(node); + + SubNode.Add(sn); + return node; + } + + SceneNode *CreateSubNode(const Matrix4f &mat,SceneNode *node) + { + if(!node) + return(nullptr); + + SceneNode *sn=new SceneNode(mat); + sn->CreateSubNode(node); + + SubNode.Add(sn); + return sn; + } + public: //坐标相关方法 virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 diff --git a/inc/hgl/graph/SceneOrient.h b/inc/hgl/graph/SceneOrient.h index e80f2471..c2963932 100644 --- a/inc/hgl/graph/SceneOrient.h +++ b/inc/hgl/graph/SceneOrient.h @@ -32,6 +32,7 @@ namespace hgl public: SceneOrient(); + SceneOrient(const SceneOrient &); SceneOrient(const Matrix4f &mat); virtual ~SceneOrient()=default; diff --git a/src/SceneGraph/SceneNode.cpp b/src/SceneGraph/SceneNode.cpp index 5dc80cd2..417b14ef 100644 --- a/src/SceneGraph/SceneNode.cpp +++ b/src/SceneGraph/SceneNode.cpp @@ -4,6 +4,24 @@ namespace hgl { namespace graph { + SceneNode::SceneNode(SceneNode *node):SceneOrient(*node) + { + if(!node) + return; + + BoundingBox=node->BoundingBox; + LocalBoundingBox=node->LocalBoundingBox; + + render_obj=node->render_obj; + + for(SceneNode *sn:node->SubNode) + { + SceneNode *new_sn=new SceneNode(sn); + + SubNode.Add(new_sn); + } + } + void SceneNode::SetRenderable(Renderable *ri) { render_obj=ri; diff --git a/src/SceneGraph/SceneOrient.cpp b/src/SceneGraph/SceneOrient.cpp index fffbd187..85834542 100644 --- a/src/SceneGraph/SceneOrient.cpp +++ b/src/SceneGraph/SceneOrient.cpp @@ -15,6 +15,11 @@ namespace hgl InverseLocalMatrix =Identity4f; InverseLocalToWorldMatrix =Identity4f; } + + SceneOrient::SceneOrient(const SceneOrient &so) + { + hgl_cpy(*this,so); + } SceneOrient::SceneOrient(const Matrix4f &mat) {