diff --git a/inc/hgl/graph/SceneNode.h b/inc/hgl/graph/SceneNode.h index 5dde18c7..d4a53e5e 100644 --- a/inc/hgl/graph/SceneNode.h +++ b/inc/hgl/graph/SceneNode.h @@ -69,10 +69,11 @@ namespace hgl LocalBoundingBox.SetZero(); ChildNode.Clear(); + ComponentList.Clear(); render_obj=nullptr; } - const bool IsEmpty()const + const bool ChildNodeIsEmpty()const { if(render_obj)return(false); if(ChildNode.GetCount())return(false); @@ -111,6 +112,14 @@ namespace hgl 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 HasComponent (const ComponentManager *); ///<是否有指定组件管理器的组件 + virtual int GetComponents (List &comp_list,const ComponentManager *); ///<取得所有组件 };//class SceneNode diff --git a/src/SceneGraph/scene/SceneNode.cpp b/src/SceneGraph/scene/SceneNode.cpp index 02a41dd7..dd5c8993 100644 --- a/src/SceneGraph/scene/SceneNode.cpp +++ b/src/SceneGraph/scene/SceneNode.cpp @@ -88,5 +88,38 @@ namespace hgl LocalBoundingBox=local; } + + int SceneNode::GetComponents(List &comp_list,const ComponentManager *mgr) + { + if(!mgr)return(-1); + if(ComponentIsEmpty())return(0); + + int result=0; + + for(Component *c:ComponentList) + { + if(c->GetManager()==mgr) + { + comp_list.Add(c); + ++result; + } + } + + return result; + } + + bool SceneNode::HasComponent(const ComponentManager *mgr) + { + if(!mgr)return(false); + if(ComponentIsEmpty())return(false); + + for(Component *c:ComponentList) + { + if(c->GetManager()==mgr) + return(true); + } + + return(false); + } }//namespace graph }//namespace hgl