| 
									
										
										
										
											2011-02-22 19:30:37 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-04-16 22:40:48 +00:00
										 |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							| 
									
										
										
										
											2008-04-16 22:40:48 +00:00
										 |  |  |  * of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							| 
									
										
										
										
											2010-02-12 13:34:04 +00:00
										 |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is: all of this file. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): none yet. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-04-16 22:40:48 +00:00
										 |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-02-22 19:30:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** \file SG_Node.h
 | 
					
						
							|  |  |  |  *  \ingroup bgesg | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2012-02-23 10:41:31 +00:00
										 |  |  | #ifndef __SG_NODE_H__
 | 
					
						
							|  |  |  | #define __SG_NODE_H__
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "SG_Spatial.h"
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef std::vector<SG_Node*> NodeList; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-05-16 12:54:44 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Scenegraph node. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | class SG_Node : public SG_Spatial | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	SG_Node( | 
					
						
							|  |  |  | 		void* clientobj, | 
					
						
							|  |  |  | 		void* clientinfo, | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 		SG_Callbacks& callbacks | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SG_Node( | 
					
						
							|  |  |  | 		const SG_Node & other | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual ~SG_Node(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Add a child to this object. This also informs the child of | 
					
						
							|  |  |  | 	 * it's parent. | 
					
						
							|  |  |  | 	 * This just stores a pointer to the child and does not | 
					
						
							|  |  |  | 	 * make a deep copy. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	AddChild( | 
					
						
							|  |  |  | 		SG_Node* child | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** 
 | 
					
						
							|  |  |  | 	 * Remove a child node from this object. This just removes the child | 
					
						
							|  |  |  | 	 * pointer from the list of children - it does not destroy the child. | 
					
						
							|  |  |  | 	 * This does not inform the child that this node is no longer it's parent. | 
					
						
							|  |  |  | 	 * If the node was not a child of this object no action is performed. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	RemoveChild( | 
					
						
							|  |  |  | 		SG_Node* child | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-25 21:43:36 +00:00
										 |  |  | 	/**
 | 
					
						
							| 
									
										
										
										
											2012-03-01 12:20:18 +00:00
										 |  |  | 	 * Return true if the node is the ancestor of child | 
					
						
							| 
									
										
										
										
											2010-03-25 21:43:36 +00:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 		bool | 
					
						
							|  |  |  | 	IsAncessor( | 
					
						
							|  |  |  | 		const SG_Node* child | 
					
						
							|  |  |  | 	) const; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	/** 
 | 
					
						
							|  |  |  | 	 * Get the current list of children. Do not use this interface for | 
					
						
							|  |  |  | 	 * adding or removing children please use the methods of this class for | 
					
						
							|  |  |  | 	 * that. | 
					
						
							| 
									
										
										
										
											2012-03-02 16:05:54 +00:00
										 |  |  | 	 * \return a reference to the list of children of this node. | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	NodeList& GetSGChildren() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return this->m_children; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Get the current list of children. | 
					
						
							| 
									
										
										
										
											2012-03-02 16:05:54 +00:00
										 |  |  | 	 * \return a const reference to the current list of children of this node. | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	const NodeList& GetSGChildren() const | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return this->m_children; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/** 
 | 
					
						
							|  |  |  | 	 * Clear the list of children associated with this node | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	void ClearSGChildren() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_children.clear(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * return the parent of this node if it exists. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	SG_Node* GetSGParent() const  | 
					
						
							|  |  |  | 	{  | 
					
						
							|  |  |  | 		return m_SGparent; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Set the parent of this node.  | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	void SetSGParent(SG_Node* parent) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_SGparent = parent; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Return the top node in this node's Scene graph hierarchy | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	const  | 
					
						
							|  |  |  | 		SG_Node*  | 
					
						
							|  |  |  | 	GetRootSGParent( | 
					
						
							|  |  |  | 	) const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Disconnect this node from it's parent | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	DisconnectFromParent( | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-14 20:22:57 +00:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Return vertex parent status. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	bool IsVertexParent() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (m_parent_relation) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return m_parent_relation->IsVertexRelation(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-14 20:22:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-14 17:12:49 +00:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Return slow parent status. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	bool IsSlowParent() | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (m_parent_relation) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			return m_parent_relation->IsSlowRelation(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-14 20:22:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 	/**
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	 * Update the spatial data of this node. Iterate through | 
					
						
							|  |  |  | 	 * the children of this node and update their world data. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	UpdateWorldData( | 
					
						
							| 
									
										
										
										
											2009-04-20 15:06:46 +00:00
										 |  |  | 		double time, | 
					
						
							|  |  |  | 		bool parentUpdated=false | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Update the simulation time of this node. Iterate through | 
					
						
							|  |  |  | 	 * the children nodes and update their simulated time. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	SetSimulatedTime( | 
					
						
							|  |  |  | 		double time, | 
					
						
							| 
									
										
										
										
											2007-06-25 20:15:36 +00:00
										 |  |  | 		bool recurse | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 20:08:19 +00:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Schedule this node for update by placing it in head queue | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	bool Schedule(SG_QList& head) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Put top parent in front of list to make sure they are updated before their
 | 
					
						
							|  |  |  | 		// children => the children will be udpated and removed from the list before
 | 
					
						
							|  |  |  | 		// we get to them, should they be in the list too.
 | 
					
						
							|  |  |  | 		return (m_SGparent)?head.AddBack(this):head.AddFront(this); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Used during Scenegraph update | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	static SG_Node* GetNextScheduled(SG_QList& head) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return static_cast<SG_Node*>(head.Remove()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Make this node ready for schedule on next update. This is needed for nodes | 
					
						
							|  |  |  | 	 * that must always be updated (slow parent, bone parent) | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	bool Reschedule(SG_QList& head) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return head.QAddBack(this); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Used during Scenegraph update | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	static SG_Node* GetNextRescheduled(SG_QList& head) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		return static_cast<SG_Node*>(head.QRemove()); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * Node replication functions. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		SG_Node* | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	GetSGReplica( | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	Destruct( | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2004-05-16 12:54:44 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-16 04:58:18 +00:00
										 |  |  | 		void | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	ProcessSGReplica( | 
					
						
							| 
									
										
										
										
											2008-07-18 19:56:56 +00:00
										 |  |  | 		SG_Node** replica | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * The list of children of this node. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	NodeList m_children; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * The parent of this node may be NULL | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	SG_Node* m_SGparent; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-18 15:37:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef WITH_CXX_GUARDEDALLOC
 | 
					
						
							| 
									
										
										
										
											2012-06-25 09:14:37 +00:00
										 |  |  | 	MEM_CXX_CLASS_ALLOC_FUNCS("GE:SG_Node") | 
					
						
							| 
									
										
										
										
											2009-08-18 15:37:31 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-10-30 02:07:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-09 13:36:42 +00:00
										 |  |  | #endif  /* __SG_NODE_H__ */
 |