KiCad PCB EDA Suite
SGNODE Class Referenceabstract

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

 SGNODE (SGNODE *aParent)
 
virtual ~SGNODE ()
 
S3D::SGTYPES GetNodeType (void) const noexcept
 Return the type of this node instance. More...
 
SGNODEGetParent (void) const noexcept
 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
 Set the parent SGNODE of this object. More...
 
bool SwapParent (SGNODE *aNewParent)
 Swap the ownership with the given parent. More...
 
const char * GetName (void)
 
void SetName (const char *aName)
 
const char * GetNodeTypeName (S3D::SGTYPES aNodeType) const noexcept
 
virtual SGNODEFindNode (const char *aNodeName, const SGNODE *aCaller)=0
 Search the tree of linked nodes and return 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) noexcept
 Associate this object with a handle to itself. More...
 
void DisassociateWrapper (SGNODE **aWrapperRef) noexcept
 Remove the association between an IFSG* wrapper object and this object. More...
 
void ResetNodeIndex (void) noexcept
 Reset the global SG* node indices in preparation for write operations. More...
 
virtual void ReNameNodes (void)=0
 Rename a node and all its child nodes in preparation for write operations. More...
 
virtual bool WriteVRML (std::ostream &aFile, bool aReuseFlag)=0
 Writes this node's data to a VRML file. More...
 
virtual bool WriteCache (std::ostream &aFile, SGNODE *parentNode)=0
 Write this node's data to a binary cache file. More...
 
virtual bool ReadCache (std::istream &aFile, SGNODE *parentNode)=0
 Reads binary format data from a cache file. More...
 
virtual void unlinkChildNode (const SGNODE *aNode)=0
 Remove references to an owned child. More...
 
virtual void unlinkRefNode (const SGNODE *aNode)=0
 Remove pointers to a referenced node. More...
 
void addNodeRef (SGNODE *aNode)
 Add a pointer to a node which references this node, but does not own. More...
 
void delNodeRef (const SGNODE *aNode)
 Remove a pointer to a node which references this node, but does not own. More...
 
bool isWritten (void) noexcept
 Return true if the object had already been written to a cache file or VRML file. More...
 

Protected Attributes

std::list< SGNODE * > m_BackPointers
 nodes which hold a reference to this. More...
 
SGNODEm_Parent
 Pointer to parent node; may be NULL for top level transform. More...
 
S3D::SGTYPES m_SGtype
 Type of Scene Graph node. More...
 
std::string m_Name
 name to use for referencing the entity by name. More...
 
bool m_written
 Set to true when the object has been written after a ReNameNodes(). More...
 

Private Attributes

SGNODE ** m_Association
 Handle to the instance held by a wrapper. More...
 

Detailed Description

The base class of all Scene Graph nodes.

Definition at line 74 of file sg_node.h.

Constructor & Destructor Documentation

◆ SGNODE()

SGNODE::SGNODE ( SGNODE aParent)

Definition at line 76 of file sg_node.cpp.

77 {
78  m_Parent = aParent;
79  m_Association = nullptr;
80  m_written = false;
82 }
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
SGNODE ** m_Association
Handle to the instance held by a wrapper.
Definition: sg_node.h:233
bool m_written
Set to true when the object has been written after a ReNameNodes().
Definition: sg_node.h:230
S3D::SGTYPES m_SGtype
Type of Scene Graph node.
Definition: sg_node.h:228

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

◆ ~SGNODE()

SGNODE::~SGNODE ( )
virtual

Definition at line 85 of file sg_node.cpp.

86 {
87  if( m_Parent )
88  m_Parent->unlinkChildNode( this );
89 
90  if( m_Association )
91  *m_Association = nullptr;
92 
93  std::list< SGNODE* >::iterator sBP = m_BackPointers.begin();
94  std::list< SGNODE* >::iterator eBP = m_BackPointers.end();
95 
96  while( sBP != eBP )
97  {
98  (*sBP)->unlinkRefNode( this );
99  ++sBP;
100  }
101 }
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
SGNODE ** m_Association
Handle to the instance held by a wrapper.
Definition: sg_node.h:233
virtual void unlinkChildNode(const SGNODE *aNode)=0
Remove references to an owned child.
std::list< SGNODE * > m_BackPointers
nodes which hold a reference to this.
Definition: sg_node.h:226

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

Member Function Documentation

◆ AddChildNode()

◆ addNodeRef()

void SGNODE::addNodeRef ( SGNODE aNode)

Add a pointer to a node which references this node, but does not own.

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 170 of file sg_node.cpp.

171 {
172  if( nullptr == aNode )
173  return;
174 
175  std::list< SGNODE* >::iterator np =
176  std::find( m_BackPointers.begin(), m_BackPointers.end(), aNode );
177 
178  if( np != m_BackPointers.end() )
179  return;
180 
181  m_BackPointers.push_back( aNode );
182 }
std::list< SGNODE * > m_BackPointers
nodes which hold a reference to this.
Definition: sg_node.h:226

References m_BackPointers.

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

◆ AddRefNode()

virtual bool SGNODE::AddRefNode ( SGNODE aNode)
pure virtual

◆ AssociateWrapper()

void SGNODE::AssociateWrapper ( SGNODE **  aWrapperRef)
noexcept

Associate this object with a handle to itself.

The 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 205 of file sg_node.cpp.

206 {
207  wxCHECK( aWrapperRef && *aWrapperRef == this, /* void */ );
208 
209  // if there is an existing association then break it and emit a warning
210  // just in case the behavior is undesired
211  if( m_Association )
212  {
213  *m_Association = nullptr;
214 
215  wxLogTrace( MASK_3D_SG,
216  "%s:%s:%d * [WARNING] association being broken with previous wrapper",
217  __FILE__, __FUNCTION__, __LINE__ );
218  }
219 
220  m_Association = aWrapperRef;
221 }
SGNODE ** m_Association
Handle to the instance held by a wrapper.
Definition: sg_node.h:233

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().

◆ delNodeRef()

void SGNODE::delNodeRef ( const SGNODE aNode)

Remove a pointer to a node which references this node, but does not own.

Parameters
aNodeis the node holding a reference to this object.

Definition at line 185 of file sg_node.cpp.

186 {
187  if( nullptr == aNode )
188  return;
189 
190  std::list< SGNODE* >::iterator np =
191  std::find( m_BackPointers.begin(), m_BackPointers.end(), aNode );
192 
193  if( np != m_BackPointers.end() )
194  {
195  m_BackPointers.erase( np );
196  return;
197  }
198 
199  wxLogTrace( MASK_3D_SG, "%s:%s:%d * [BUG] delNodeRef() did not find its target, "
200  "this node type %d, referenced node type %d", __FILE__, __FUNCTION__, __LINE__,
201  m_SGtype, aNode->GetNodeType() );
202 }
S3D::SGTYPES m_SGtype
Type of Scene Graph node.
Definition: sg_node.h:228
std::list< SGNODE * > m_BackPointers
nodes which hold a reference to this.
Definition: sg_node.h:226
S3D::SGTYPES GetNodeType(void) const noexcept
Return the type of this node instance.
Definition: sg_node.cpp:104

References GetNodeType(), m_BackPointers, and m_SGtype.

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

◆ DisassociateWrapper()

void SGNODE::DisassociateWrapper ( SGNODE **  aWrapperRef)
noexcept

Remove the association between an IFSG* wrapper object and this object.

Definition at line 223 of file sg_node.cpp.

224 {
225  if( !m_Association )
226  return;
227 
228  wxCHECK( aWrapperRef, /* void */ );
229 
230  wxCHECK( *aWrapperRef == *m_Association && aWrapperRef == m_Association, /* void */ );
231 
232  m_Association = nullptr;
233 }
SGNODE ** m_Association
Handle to the instance held by a wrapper.
Definition: sg_node.h:233

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().

◆ FindNode()

virtual SGNODE* SGNODE::FindNode ( const char *  aNodeName,
const SGNODE aCaller 
)
pure virtual

Search the tree of linked nodes and return 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 SGAPPEARANCE, SCENEGRAPH, SGFACESET, SGCOORDS, SGSHAPE, SGCOLORS, SGINDEX, and SGNORMALS.

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

◆ GetName()

◆ GetNodeType()

◆ GetNodeTypeName()

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

Definition at line 164 of file sg_node.cpp.

165 {
166  return node_names[aNodeType].c_str();
167 }
static const std::string node_names[S3D::SGTYPE_END+1]
Definition: sg_node.cpp:36

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().

◆ GetParent()

SGNODE * SGNODE::GetParent ( void  ) const
noexcept

Returns a pointer to the parent SGNODE of this object or NULL if the object has no parent (ie.

top level transform).

Definition at line 110 of file sg_node.cpp.

111 {
112  return m_Parent;
113 }
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227

Referenced by IFSG_NODE::GetParent(), S3D::GetSGNodeParent(), IFSG_APPEARANCE::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COORDS::NewNode(), IFSG_FACESET::NewNode(), IFSG_NORMALS::NewNode(), IFSG_COLORS::NewNode(), IFSG_TRANSFORM::NewNode(), SGSHAPE::WriteCache(), SGNORMALS::WriteCache(), SCENEGRAPH::WriteCache(), SGCOLORS::WriteCache(), SGFACESET::WriteCache(), SGCOORDS::WriteCache(), SGAPPEARANCE::WriteCache(), and SGINDEX::WriteCache().

◆ isWritten()

bool SGNODE::isWritten ( void  )
inlinenoexcept

Return true if the object had already been written to a cache file or VRML file.

For internal use only.

Definition at line 220 of file sg_node.h.

221  {
222  return m_written;
223  }
bool m_written
Set to true when the object has been written after a ReNameNodes().
Definition: sg_node.h:230

References m_written.

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

◆ ReadCache()

virtual bool SGNODE::ReadCache ( std::istream &  aFile,
SGNODE parentNode 
)
pure virtual

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, SGAPPEARANCE, SGCOORDS, SGFACESET, SCENEGRAPH, SGCOLORS, SGNORMALS, and SGSHAPE.

Referenced by S3D::ReadCache().

◆ ReNameNodes()

virtual void SGNODE::ReNameNodes ( void  )
pure virtual

Rename a node and all its child nodes in preparation for write operations.

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

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

◆ ResetNodeIndex()

void SGNODE::ResetNodeIndex ( void  )
noexcept

Reset the global SG* node indices in preparation for write operations.

Definition at line 236 of file sg_node.cpp.

237 {
238  for( int i = 0; i < (int)S3D::SGTYPE_END; ++i )
239  node_counts[i] = 1;
240 }
static unsigned int node_counts[S3D::SGTYPE_END]
Definition: sg_node.cpp:50

References node_counts, and S3D::SGTYPE_END.

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

◆ SetName()

void SGNODE::SetName ( const char *  aName)

Definition at line 155 of file sg_node.cpp.

156 {
157  if( nullptr == aName || 0 == aName[0] )
159  else
160  m_Name = aName;
161 }
std::string m_Name
name to use for referencing the entity by name.
Definition: sg_node.h:229
S3D::SGTYPES m_SGtype
Type of Scene Graph node.
Definition: sg_node.h:228
static void getNodeName(S3D::SGTYPES nodeType, std::string &aName)
Definition: sg_node.cpp:59

References getNodeName(), m_Name, and m_SGtype.

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

◆ SetParent()

virtual bool SGNODE::SetParent ( SGNODE aParent,
bool  notify = true 
)
pure virtual

Set 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, SGCOORDS, SGSHAPE, SGAPPEARANCE, SGCOLORS, SGINDEX, 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().

◆ SwapParent()

bool SGNODE::SwapParent ( SGNODE aNewParent)

Swap the ownership with the given parent.

This operation may be required when reordering nodes for optimization.

Parameters
aNewParentwill become the new parent to the object; it must be the same type as the parent of this instance.

Definition at line 116 of file sg_node.cpp.

117 {
118  if( aNewParent == m_Parent )
119  return true;
120 
121  if( nullptr == aNewParent )
122  return false;
123 
124  if( nullptr == m_Parent )
125  {
126  if( aNewParent->AddChildNode( this ) )
127  return true;
128 
129  return false;
130  }
131 
132  if( aNewParent->GetNodeType() != m_Parent->GetNodeType() )
133  return false;
134 
135  SGNODE* oldParent = m_Parent;
136  m_Parent->unlinkChildNode( this );
137  m_Parent = nullptr;
138  aNewParent->unlinkRefNode( this );
139  aNewParent->AddChildNode( this );
140  oldParent->AddRefNode( this );
141 
142  return true;
143 }
virtual bool AddRefNode(SGNODE *aNode)=0
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
The base class of all Scene Graph nodes.
Definition: sg_node.h:74
virtual void unlinkRefNode(const SGNODE *aNode)=0
Remove pointers to a referenced node.
virtual void unlinkChildNode(const SGNODE *aNode)=0
Remove references to an owned child.
virtual bool AddChildNode(SGNODE *aNode)=0
S3D::SGTYPES GetNodeType(void) const noexcept
Return the type of this node instance.
Definition: sg_node.cpp:104

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

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

◆ unlinkChildNode()

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

Remove references to an owned child.

This 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, SGSHAPE, SGNORMALS, SGINDEX, SCENEGRAPH, SGCOLORS, SGCOORDS, and SGAPPEARANCE.

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

◆ unlinkRefNode()

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

Remove pointers to a referenced node.

This 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, SGSHAPE, SGNORMALS, SGINDEX, SCENEGRAPH, SGCOLORS, SGCOORDS, and SGAPPEARANCE.

Referenced by SwapParent().

◆ WriteCache()

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

Write 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, SGAPPEARANCE, SGCOORDS, SGFACESET, SCENEGRAPH, SGCOLORS, SGNORMALS, and SGSHAPE.

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

◆ WriteVRML()

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

Writes this node's data to a VRML file.

This includes all data of child and referenced nodes.

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

Referenced by S3D::WriteVRML().

Member Data Documentation

◆ m_Association

SGNODE** SGNODE::m_Association
private

Handle to the instance held by a wrapper.

Definition at line 233 of file sg_node.h.

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

◆ m_BackPointers

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

nodes which hold a reference to this.

Definition at line 226 of file sg_node.h.

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

◆ m_Name

◆ m_Parent

◆ m_SGtype

◆ m_written


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