diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index 3524e108..adb2045b 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -24,12 +24,12 @@ namespace hgl Vector4f Center; ///<中心点 Vector4f LocalCenter; ///<本地坐标中心点 Vector4f WorldCenter; ///<世界坐标中心点 + + RenderableInstance *render_obj=nullptr; ///<可渲染实例 public: ObjectList SubNode; ///<子节点 - - RenderableInstance *render_obj=nullptr; ///<可渲染实例 public: @@ -38,7 +38,7 @@ namespace hgl SceneNode(const Matrix4f &mat ):SceneOrient(mat) {} SceneNode(const Matrix4f &mat, RenderableInstance *ri ):SceneOrient(mat) {render_obj=ri;} - virtual ~SceneNode(){} + virtual ~SceneNode()=default; void Clear() { @@ -46,6 +46,33 @@ namespace hgl render_obj=nullptr; } + RenderableInstance *GetRI(){return render_obj;} + void SetRI(RenderableInstance *); + + SceneNode *CreateSubNode() + { + SceneNode *sn=new SceneNode(); + + SubNode.Add(sn); + return sn; + } + + SceneNode *CreateSubNode(const Matrix4f &mat) + { + SceneNode *sn=new SceneNode(mat); + + SubNode.Add(sn); + return sn; + } + + SceneNode *CreateSubNode(const Matrix4f &mat,RenderableInstance *ri) + { + SceneNode *sn=new SceneNode(mat,ri); + + SubNode.Add(sn); + return sn; + } + public: //坐标相关方法 virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 diff --git a/src/SceneGraph/SceneNode.cpp b/src/SceneGraph/SceneNode.cpp index c97563f2..f08c9785 100644 --- a/src/SceneGraph/SceneNode.cpp +++ b/src/SceneGraph/SceneNode.cpp @@ -1,9 +1,27 @@ #include #include +#include namespace hgl { namespace graph { + void SceneNode::SetRI(RenderableInstance *ri) + { + render_obj=ri; + + if(render_obj) + { + SetBoundingBox(render_obj->GetBoundingBox()); + } + else + { + BoundingBox.minPoint=vec::zero; + BoundingBox.maxPoint=vec::zero; + + WorldBoundingBox=LocalBoundingBox=BoundingBox; + } + } + /** * 刷新矩阵 * @param root_matrix 根矩阵 diff --git a/src/SceneGraph/SceneTreeToRenderList.cpp b/src/SceneGraph/SceneTreeToRenderList.cpp index 5c31b884..adaac1bf 100644 --- a/src/SceneGraph/SceneTreeToRenderList.cpp +++ b/src/SceneGraph/SceneTreeToRenderList.cpp @@ -139,7 +139,9 @@ namespace hgl { if(!sn)return(false); - if(sn->render_obj) + RenderableInstance *ri=sn->GetRI(); + + if(ri) { RenderNode *rn=new RenderNode; @@ -150,7 +152,7 @@ namespace hgl rn->distance_to_camera_square=length_squared(rn->WorldCenter,camera_info.pos); // rn->distance_to_camera=sqrtf(rn->distance_to_camera_square); - rn->ri=sn->render_obj; + rn->ri=ri; render_node_list.Add(rn); }