在SceneNode中增加main_scene数据,每个添加到当前场景的SceneNode,都会同步Scene数据。

This commit is contained in:
2025-07-24 01:28:16 +08:00
parent f013d8327d
commit 85020572bc
4 changed files with 70 additions and 9 deletions

View File

@@ -13,6 +13,10 @@ namespace hgl::io
namespace hgl::graph
{
class Scene; //场景主类
//每个SceneNode都要记录Scene来区分自己属于那个场景
//这个场景可能是一个确实是一个场景也有可能只是一个StaticMesh
using SceneNodeID =int64;
using SceneNodeList =ObjectList<SceneNode>;
@@ -26,11 +30,17 @@ namespace hgl::graph
*/
class SceneNode:public SceneOrient ///场景节点类
{
friend class Scene;
Scene *main_scene=nullptr; ///<主场景
SceneNode *parent_node=nullptr; ///<上级节点
SceneNodeID node_id=-1; ///<节点ID
SceneNodeName node_name; ///<节点名称
void OnChangeScene(Scene *);
protected:
AABB bounding_box; ///<绑定盒
@@ -49,22 +59,30 @@ namespace hgl::graph
public:
Scene *GetScene()const{ return main_scene; } ///<取得主场景
const SceneNodeID & GetNodeID ()const { return node_id; } ///<取得节点ID
const SceneNodeName & GetNodeName ()const { return node_name; } ///<取得节点名称
const SceneNodeList & GetChildNode()const { return child_nodes; } ///<取得子节点列表
public:
protected:
SceneNode(const SceneNode &)=delete;
SceneNode(const SceneNode *)=delete;
using SceneOrient::SceneOrient; ///<继承构造函数
SceneNode():SceneOrient(){}
SceneNode(Scene *s):SceneOrient(),main_scene(s){} ///<从Scene构造
SceneNode(Scene *s,const SceneOrient &so):SceneOrient(so),main_scene(s){} ///<从SceneOrient复制构造
SceneNode(Scene *s,const Matrix4f &mat):SceneOrient(mat),main_scene(s){} ///<从Matrix4f复制构造
public:
virtual ~SceneNode();
public:
virtual SceneNode * CreateNode()const{return(new SceneNode);} ///<创建一个同类的节点对象
virtual SceneNode * CreateNode()const{return(new SceneNode(GetScene()));} ///<创建一个同类的节点对象
virtual void DuplicationChildNodes(SceneNode *node) const ///<复制子节点到指定节点
{
@@ -97,7 +115,7 @@ namespace hgl::graph
{
SceneOrient::Clear();
parent_node=nullptr;
SetParent(nullptr); //清除父节点
bounding_box.SetZero();
local_bounding_box.SetZero();
@@ -113,7 +131,16 @@ namespace hgl::graph
return(true);
}
void SetParent(SceneNode *sn) {parent_node=sn;}
virtual void SetParent(SceneNode *sn)
{
if(parent_node==sn)
return; //如果父节点没有变化,则不需要处理
parent_node=sn;
OnChangeScene(sn?sn->GetScene():nullptr);
}
SceneNode * GetParent() noexcept{return parent_node;}
const SceneNode * GetParent()const noexcept{return parent_node;}