KiCad PCB EDA Suite
SGNODE Class Referenceabstract

Class SGNODE represents the base class of all Scene Graph nodes. More...

#include <sg_node.h>

Inheritance diagram for SGNODE:
SCENEGRAPH SGAPPEARANCE SGCOLORS SGCOORDS SGFACESET SGINDEX SGNORMALS SGSHAPE

Public Member Functions

virtual void unlinkChildNode (const SGNODE *aNode)=0
 Function unlinkChild removes references to an owned child; it is invoked by the child upon destruction to ensure that the parent has no invalid references. More...
 
virtual void unlinkRefNode (const SGNODE *aNode)=0
 Function unlinkRef removes pointers to a referenced node; it is invoked by the referenced node upon destruction to ensure that the referring node has no invalid references. More...
 
void addNodeRef (SGNODE *aNode)
 Function addNodeRef adds a pointer to a node which references, but does not own, this node. More...
 
void delNodeRef (const SGNODE *aNode)
 Function delNodeRef removes a pointer to a node which references, but does not own, this node. More...
 
bool isWritten (void)
 Function IsWritten returns true if the object had already been written to a cache file or VRML file; for internal use only. More...
 
 SGNODE (SGNODE *aParent)
 
virtual ~SGNODE ()
 
S3D::SGTYPES GetNodeType (void) const
 Function GetNodeType returns the type of this node instance. More...
 
SGNODEGetParent (void) const
 Function GetParent returns a pointer to the parent SGNODE of this object or NULL if the object has no parent (ie. More...
 
virtual bool SetParent (SGNODE *aParent, bool notify=true)=0
 Function SetParent sets the parent SGNODE of this object. More...
 
bool SwapParent (SGNODE *aNewParent)
 Function SwapParent swaps the ownership with the given parent. More...
 
const char * GetName (void)
 
void SetName (const char *aName)
 
const char * GetNodeTypeName (S3D::SGTYPES aNodeType) const
 
virtual SGNODEFindNode (const char *aNodeName, const SGNODE *aCaller)=0
 Function FindNode searches the tree of linked nodes and returns a reference to the first node found with the given name. More...
 
virtual bool AddRefNode (SGNODE *aNode)=0
 
virtual bool AddChildNode (SGNODE *aNode)=0
 
void AssociateWrapper (SGNODE **aWrapperRef)
 Function AssociateWrapper associates this object with a handle to itself; this handle is typically held by an IFSG* wrapper and the pointer which it refers to is set to NULL upon destruction of this object. More...
 
void DisassociateWrapper (SGNODE **aWrapperRef)
 Function DisassociateWrapper removes the association between an IFSG* wrapper object and this object. More...
 
void ResetNodeIndex (void)
 Function ResetNodeIndex resets the global SG* node indices in preparation for Write() operations. More...
 
virtual void ReNameNodes (void)=0
 Function ReNameNodes renames a node and all its child nodes in preparation for Write() operations. More...
 
virtual bool WriteVRML (std::ostream &aFile, bool aReuseFlag)=0
 Function WriteVRML writes this node's data to a VRML file; this includes all data of child and referenced nodes. More...
 
virtual bool WriteCache (std::ostream &aFile, SGNODE *parentNode)=0
 Function WriteCache write's this node's data to a binary cache file; the data includes all data of children and references to children. More...
 
virtual bool ReadCache (std::istream &aFile, SGNODE *parentNode)=0
 Function ReadCache Reads binary format data from a cache file. More...
 

Protected Attributes

std::list< SGNODE * > m_BackPointers
 
SGNODEm_Parent
 
S3D::SGTYPES m_SGtype
 
std::string m_Name
 
bool m_written
 

Private Attributes

SGNODE ** m_Association
 

Detailed Description

Class SGNODE represents the base class of all Scene Graph nodes.

Definition at line 76 of file sg_node.h.

Constructor & Destructor Documentation

SGNODE::SGNODE ( SGNODE aParent)

Definition at line 76 of file sg_node.cpp.

References m_Association, m_Parent, m_SGtype, m_written, and S3D::SGTYPE_END.

77 {
78  m_Parent = aParent;
79  m_Association = NULL;
80  m_written = false;
82 
83  return;
84 }
SGNODE * m_Parent
Definition: sg_node.h:83
SGNODE ** m_Association
Definition: sg_node.h:79
bool m_written
Definition: sg_node.h:86
S3D::SGTYPES m_SGtype
Definition: sg_node.h:84
SGNODE::~SGNODE ( )
virtual

Definition at line 87 of file sg_node.cpp.

References m_Association, m_BackPointers, m_Parent, and unlinkChildNode().

88 {
89  if( m_Parent )
90  m_Parent->unlinkChildNode( this );
91 
92  if( m_Association )
93  *m_Association = NULL;
94 
95  std::list< SGNODE* >::iterator sBP = m_BackPointers.begin();
96  std::list< SGNODE* >::iterator eBP = m_BackPointers.end();
97 
98  while( sBP != eBP )
99  {
100  (*sBP)->unlinkRefNode( this );
101  ++sBP;
102  }
103 
104  return;
105 }
SGNODE * m_Parent
Definition: sg_node.h:83
SGNODE ** m_Association
Definition: sg_node.h:79
virtual void unlinkChildNode(const SGNODE *aNode)=0
Function unlinkChild removes references to an owned child; it is invoked by the child upon destructio...
std::list< SGNODE * > m_BackPointers
Definition: sg_node.h:82

Member Function Documentation

void SGNODE::addNodeRef ( SGNODE aNode)

Function addNodeRef adds a pointer to a node which references, but does not own, this node.

Such back-pointers are required to ensure that invalidated references are removed when a node is deleted

Parameters
aNodeis the node holding a reference to this object

Definition at line 176 of file sg_node.cpp.

References m_BackPointers.

Referenced by SGSHAPE::addNode(), SGFACESET::addNode(), SGSHAPE::ReadCache(), and SGFACESET::ReadCache().

177 {
178  if( NULL == aNode )
179  return;
180 
181  std::list< SGNODE* >::iterator np =
182  std::find( m_BackPointers.begin(), m_BackPointers.end(), aNode );
183 
184  if( np != m_BackPointers.end() )
185  return;
186 
187  m_BackPointers.push_back( aNode );
188  return;
189 }
std::list< SGNODE * > m_BackPointers
Definition: sg_node.h:82
virtual bool SGNODE::AddRefNode ( SGNODE aNode)
pure virtual
void SGNODE::AssociateWrapper ( SGNODE **  aWrapperRef)

Function AssociateWrapper associates this object with a handle to itself; this handle is typically held by an IFSG* wrapper and the pointer which it refers to is set to NULL upon destruction of this object.

This mechanism provides a scheme by which a wrapper can be notified of the destruction of the object which it wraps.

Definition at line 219 of file sg_node.cpp.

References m_Association.

Referenced by S3D::AssociateSGNodeWrapper(), IFSG_APPEARANCE::Attach(), IFSG_NORMALS::Attach(), IFSG_SHAPE::Attach(), IFSG_COORDINDEX::Attach(), IFSG_COORDS::Attach(), IFSG_FACESET::Attach(), IFSG_COLORS::Attach(), IFSG_TRANSFORM::Attach(), IFSG_APPEARANCE::IFSG_APPEARANCE(), IFSG_COLORS::IFSG_COLORS(), IFSG_COORDINDEX::IFSG_COORDINDEX(), IFSG_COORDS::IFSG_COORDS(), IFSG_FACESET::IFSG_FACESET(), IFSG_NORMALS::IFSG_NORMALS(), IFSG_SHAPE::IFSG_SHAPE(), IFSG_TRANSFORM::IFSG_TRANSFORM(), IFSG_APPEARANCE::NewNode(), IFSG_NORMALS::NewNode(), IFSG_FACESET::NewNode(), IFSG_COORDS::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_COLORS::NewNode(), and IFSG_TRANSFORM::NewNode().

220 {
221  if( NULL == aWrapperRef )
222  {
223  #ifdef DEBUG
224  std::ostringstream ostr;
225  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
226  ostr << " * [BUG] NULL handle";
227  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
228  #endif
229 
230  return;
231  }
232 
233  if( *aWrapperRef != this )
234  {
235  #ifdef DEBUG
236  std::ostringstream ostr;
237  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
238  ostr << " * [BUG] handle value does not match this object's pointer";
239  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
240  #endif
241 
242  return;
243  }
244 
245  // if there is an existing association then break it and emit a warning
246  // just in case the behavior is undesired
247  if( m_Association )
248  {
249  *m_Association = NULL;
250 
251  #ifdef DEBUG
252  std::ostringstream ostr;
253  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
254  ostr << " * [WARNING] association being broken with previous wrapper";
255  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
256  #endif
257  }
258 
259  m_Association = aWrapperRef;
260 
261  return;
262 }
SGNODE ** m_Association
Definition: sg_node.h:79
void SGNODE::delNodeRef ( const SGNODE aNode)

Function delNodeRef removes a pointer to a node which references, but does not own, this node.

Parameters
aNodeis the node holding a reference to this object

Definition at line 192 of file sg_node.cpp.

References GetNodeType(), m_BackPointers, and m_SGtype.

Referenced by SGSHAPE::unlinkNode(), SGFACESET::unlinkNode(), SGFACESET::~SGFACESET(), and SGSHAPE::~SGSHAPE().

193 {
194  if( NULL == aNode )
195  return;
196 
197  std::list< SGNODE* >::iterator np =
198  std::find( m_BackPointers.begin(), m_BackPointers.end(), aNode );
199 
200  if( np != m_BackPointers.end() )
201  {
202  m_BackPointers.erase( np );
203  return;
204  }
205 
206  #ifdef DEBUG
207  std::ostringstream ostr;
208  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
209  ostr << " * [BUG] delNodeRef() did not find its target\n";
210  ostr << " * This Node Type: " << m_SGtype << ", Referenced node type: ";
211  ostr << aNode->GetNodeType() << "\n";
212  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
213  #endif
214 
215  return;
216 }
S3D::SGTYPES GetNodeType(void) const
Function GetNodeType returns the type of this node instance.
Definition: sg_node.cpp:108
S3D::SGTYPES m_SGtype
Definition: sg_node.h:84
std::list< SGNODE * > m_BackPointers
Definition: sg_node.h:82
void SGNODE::DisassociateWrapper ( SGNODE **  aWrapperRef)

Function DisassociateWrapper removes the association between an IFSG* wrapper object and this object.

Definition at line 264 of file sg_node.cpp.

References GetName(), m_Association, m_SGtype, and node_names.

Referenced by IFSG_APPEARANCE::Attach(), IFSG_COORDINDEX::Attach(), IFSG_COORDS::Attach(), IFSG_NORMALS::Attach(), IFSG_FACESET::Attach(), IFSG_SHAPE::Attach(), IFSG_COLORS::Attach(), IFSG_TRANSFORM::Attach(), IFSG_NODE::Destroy(), IFSG_APPEARANCE::NewNode(), IFSG_COORDS::NewNode(), IFSG_SHAPE::NewNode(), IFSG_FACESET::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_NORMALS::NewNode(), IFSG_COLORS::NewNode(), IFSG_TRANSFORM::NewNode(), and IFSG_NODE::~IFSG_NODE().

265 {
266  if( !m_Association )
267  return;
268 
269  if( !aWrapperRef )
270  {
271  #ifdef DEBUG
272  std::ostringstream ostr;
273  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
274  ostr << " * [BUG] invalid handle value aWrapperRef";
275  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
276  #endif
277 
278  return;
279  }
280 
281  if( *aWrapperRef != *m_Association || aWrapperRef != m_Association )
282  {
283  #ifdef DEBUG
284  std::ostringstream ostr;
285  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
286  ostr << " * [BUG] *aWrapperRef (" << *aWrapperRef;
287  ostr << ") does not match *m_Association (" << *m_Association << ") in type ";
288  ostr << node_names[ m_SGtype] << "\n";
289  ostr << " * [INFO] OR aWrapperRef(" << aWrapperRef << ") != m_Association(";
290  ostr << m_Association << ")\n";
291  ostr << " * [INFO] node name: " << GetName();
292  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
293  #endif
294 
295  return;
296  }
297 
298  m_Association = NULL;
299 
300  return;
301 }
SGNODE ** m_Association
Definition: sg_node.h:79
const char * GetName(void)
Definition: sg_node.cpp:150
static const std::string node_names[S3D::SGTYPE_END+1]
Definition: sg_node.cpp:34
S3D::SGTYPES m_SGtype
Definition: sg_node.h:84
virtual SGNODE* SGNODE::FindNode ( const char *  aNodeName,
const SGNODE aCaller 
)
pure virtual

Function FindNode searches the tree of linked nodes and returns a reference to the first node found with the given name.

The reference is then typically added to another node via AddRefNode().

Parameters
aNodeNameis the name of the node to search for
aCalleris a pointer to the node invoking this function
Returns
is a valid node pointer on success, otherwise NULL

Implemented in SCENEGRAPH, SGFACESET, SGAPPEARANCE, SGSHAPE, SGINDEX, SGCOORDS, SGCOLORS, and SGNORMALS.

Referenced by SGSHAPE::FindNode(), SGFACESET::FindNode(), SCENEGRAPH::FindNode(), and IFSG_NODE::FindNode().

const char * SGNODE::GetNodeTypeName ( S3D::SGTYPES  aNodeType) const

Definition at line 170 of file sg_node.cpp.

References node_names.

Referenced by IFSG_NODE::GetNodeTypeName(), IFSG_APPEARANCE::NewNode(), IFSG_NORMALS::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_FACESET::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COORDS::NewNode(), IFSG_COLORS::NewNode(), and IFSG_TRANSFORM::NewNode().

171 {
172  return node_names[aNodeType].c_str();
173 }
static const std::string node_names[S3D::SGTYPE_END+1]
Definition: sg_node.cpp:34
SGNODE * SGNODE::GetParent ( void  ) const
bool SGNODE::isWritten ( void  )
inline

Function IsWritten returns true if the object had already been written to a cache file or VRML file; for internal use only.

Definition at line 130 of file sg_node.h.

References m_written.

Referenced by SGSHAPE::WriteCache(), SGFACESET::WriteCache(), and SCENEGRAPH::WriteCache().

131  {
132  return m_written;
133  }
bool m_written
Definition: sg_node.h:86
virtual bool SGNODE::ReadCache ( std::istream &  aFile,
SGNODE parentNode 
)
pure virtual

Function ReadCache Reads binary format data from a cache file.

To read a cache file, open the file for reading and invoke this function from a new SCENEGRAPH node.

Implemented in SGINDEX, SCENEGRAPH, SGFACESET, SGAPPEARANCE, SGCOORDS, SGSHAPE, SGCOLORS, and SGNORMALS.

Referenced by S3D::ReadCache().

virtual void SGNODE::ReNameNodes ( void  )
pure virtual

Function ReNameNodes renames a node and all its child nodes in preparation for Write() operations.

Implemented in SGINDEX, SCENEGRAPH, SGFACESET, SGAPPEARANCE, SGCOORDS, SGSHAPE, SGCOLORS, and SGNORMALS.

Referenced by S3D::RenameNodes(), and S3D::WriteVRML().

void SGNODE::ResetNodeIndex ( void  )

Function ResetNodeIndex resets the global SG* node indices in preparation for Write() operations.

Definition at line 304 of file sg_node.cpp.

References node_counts, and S3D::SGTYPE_END.

Referenced by S3D::ResetNodeIndex(), SCENEGRAPH::WriteCache(), and S3D::WriteVRML().

305 {
306  for( int i = 0; i < (int)S3D::SGTYPE_END; ++i )
307  node_counts[i] = 1;
308 
309  return;
310 }
static unsigned int node_counts[S3D::SGTYPE_END]
Definition: sg_node.cpp:48
void SGNODE::SetName ( const char *  aName)

Definition at line 159 of file sg_node.cpp.

References getNodeName(), m_Name, and m_SGtype.

Referenced by SGSHAPE::ReadCache(), SGFACESET::ReadCache(), SCENEGRAPH::ReadCache(), and IFSG_NODE::SetName().

160 {
161  if( NULL == aName || 0 == aName[0] )
163  else
164  m_Name = aName;
165 
166  return;
167 }
std::string m_Name
Definition: sg_node.h:85
S3D::SGTYPES m_SGtype
Definition: sg_node.h:84
static void getNodeName(S3D::SGTYPES nodeType, std::string &aName)
Definition: sg_node.cpp:57
virtual bool SGNODE::SetParent ( SGNODE aParent,
bool  notify = true 
)
pure virtual

Function SetParent sets the parent SGNODE of this object.

Parameters
aParent[in] is the desired parent node
Returns
true if the operation succeeds; false if the given node is not allowed to be a parent to the derived object.

Implemented in SCENEGRAPH, SGFACESET, SGSHAPE, SGINDEX, SGAPPEARANCE, SGCOORDS, SGCOLORS, and SGNORMALS.

Referenced by IFSG_APPEARANCE::IFSG_APPEARANCE(), IFSG_COLORS::IFSG_COLORS(), IFSG_COORDINDEX::IFSG_COORDINDEX(), IFSG_COORDS::IFSG_COORDS(), IFSG_FACESET::IFSG_FACESET(), IFSG_NORMALS::IFSG_NORMALS(), IFSG_SHAPE::IFSG_SHAPE(), IFSG_TRANSFORM::IFSG_TRANSFORM(), and IFSG_NODE::SetParent().

bool SGNODE::SwapParent ( SGNODE aNewParent)

Function SwapParent swaps the ownership with the given parent.

This operation may be required when reordering nodes for optimization.

Parameters
aNewParent[in] will become the new parent to the object; it must be the same type as the parent of this instance.

Definition at line 120 of file sg_node.cpp.

References AddChildNode(), AddRefNode(), GetNodeType(), m_Parent, unlinkChildNode(), and unlinkRefNode().

Referenced by SGSHAPE::WriteCache(), and SGFACESET::WriteCache().

121 {
122  if( aNewParent == m_Parent )
123  return true;
124 
125  if( NULL == aNewParent )
126  return false;
127 
128  if( NULL == m_Parent )
129  {
130  if( aNewParent->AddChildNode( this ) )
131  return true;
132 
133  return false;
134  }
135 
136  if( aNewParent->GetNodeType() != m_Parent->GetNodeType() )
137  return false;
138 
139  SGNODE* oldParent = m_Parent;
140  m_Parent->unlinkChildNode( this );
141  m_Parent = NULL;
142  aNewParent->unlinkRefNode( this );
143  aNewParent->AddChildNode( this );
144  oldParent->AddRefNode( this );
145 
146  return true;
147 }
virtual bool AddRefNode(SGNODE *aNode)=0
SGNODE * m_Parent
Definition: sg_node.h:83
Class SGNODE represents the base class of all Scene Graph nodes.
Definition: sg_node.h:76
S3D::SGTYPES GetNodeType(void) const
Function GetNodeType returns the type of this node instance.
Definition: sg_node.cpp:108
virtual void unlinkRefNode(const SGNODE *aNode)=0
Function unlinkRef removes pointers to a referenced node; it is invoked by the referenced node upon d...
virtual void unlinkChildNode(const SGNODE *aNode)=0
Function unlinkChild removes references to an owned child; it is invoked by the child upon destructio...
virtual bool AddChildNode(SGNODE *aNode)=0
virtual void SGNODE::unlinkChildNode ( const SGNODE aNode)
pure virtual

Function unlinkChild removes references to an owned child; it is invoked by the child upon destruction to ensure that the parent has no invalid references.

Parameters
aNodeis the child which is being deleted

Implemented in SGFACESET, SCENEGRAPH, SGSHAPE, SGINDEX, SGAPPEARANCE, SGCOORDS, SGCOLORS, and SGNORMALS.

Referenced by SGCOLORS::SetParent(), SGNORMALS::SetParent(), SGCOORDS::SetParent(), SGAPPEARANCE::SetParent(), SGINDEX::SetParent(), SGSHAPE::SetParent(), SGFACESET::SetParent(), SCENEGRAPH::SetParent(), SwapParent(), and ~SGNODE().

virtual void SGNODE::unlinkRefNode ( const SGNODE aNode)
pure virtual

Function unlinkRef removes pointers to a referenced node; it is invoked by the referenced node upon destruction to ensure that the referring node has no invalid references.

Parameters
aNodeis the node which is being deleted

Implemented in SGFACESET, SCENEGRAPH, SGSHAPE, SGINDEX, SGAPPEARANCE, SGCOORDS, SGCOLORS, and SGNORMALS.

Referenced by SwapParent().

virtual bool SGNODE::WriteCache ( std::ostream &  aFile,
SGNODE parentNode 
)
pure virtual

Function WriteCache write's this node's data to a binary cache file; the data includes all data of children and references to children.

If this function is invoked by the user, parentNode must be set to NULL in order to ensure coherent data.

Implemented in SGINDEX, SCENEGRAPH, SGFACESET, SGAPPEARANCE, SGCOORDS, SGSHAPE, SGCOLORS, and SGNORMALS.

Referenced by SGCOLORS::WriteCache(), SGNORMALS::WriteCache(), SGSHAPE::WriteCache(), SGCOORDS::WriteCache(), S3D::WriteCache(), SGAPPEARANCE::WriteCache(), SGFACESET::WriteCache(), SCENEGRAPH::WriteCache(), and SGINDEX::WriteCache().

virtual bool SGNODE::WriteVRML ( std::ostream &  aFile,
bool  aReuseFlag 
)
pure virtual

Function WriteVRML writes this node's data to a VRML file; this includes all data of child and referenced nodes.

Implemented in SGINDEX, SCENEGRAPH, SGFACESET, SGAPPEARANCE, SGCOORDS, SGSHAPE, SGCOLORS, and SGNORMALS.

Referenced by S3D::WriteVRML().

Member Data Documentation

SGNODE** SGNODE::m_Association
private

Definition at line 79 of file sg_node.h.

Referenced by AssociateWrapper(), DisassociateWrapper(), SGNODE(), and ~SGNODE().

std::list< SGNODE* > SGNODE::m_BackPointers
protected

Definition at line 82 of file sg_node.h.

Referenced by addNodeRef(), SGCOORDS::CalcNormals(), delNodeRef(), and ~SGNODE().


The documentation for this class was generated from the following files: