KiCad PCB EDA Suite
SGCOORDS Class Reference

Define a vertex coordinate set for a scenegraph object. More...

#include <sg_coords.h>

Inheritance diagram for SGCOORDS:
SGNODE

Public Member Functions

 SGCOORDS (SGNODE *aParent)
 
virtual ~SGCOORDS ()
 
void unlinkChildNode (const SGNODE *aNode) noexcept override
 Remove references to an owned child. More...
 
void unlinkRefNode (const SGNODE *aNode) noexcept override
 Remove pointers to a referenced node. More...
 
virtual bool SetParent (SGNODE *aParent, bool notify=true) override
 Set the parent SGNODE of this object. More...
 
SGNODEFindNode (const char *aNodeName, const SGNODE *aCaller) noexcept override
 Search the tree of linked nodes and return a reference to the first node found with the given name. More...
 
bool AddRefNode (SGNODE *aNode) noexcept override
 
bool AddChildNode (SGNODE *aNode) noexcept override
 
bool GetCoordsList (size_t &aListSize, SGPOINT *&aCoordsList)
 
void SetCoordsList (size_t aListSize, const SGPOINT *aCoordsList)
 
void AddCoord (double aXValue, double aYValue, double aZValue)
 
void AddCoord (const SGPOINT &aPoint)
 
bool CalcNormals (SGFACESET *callingNode, SGNODE **aPtr=nullptr)
 Calculate normals for this coordinate list and sets the normals list in the parent SGFACESET. More...
 
void ReNameNodes (void) override
 Rename a node and all its child nodes in preparation for write operations. More...
 
bool WriteVRML (std::ostream &aFile, bool aReuseFlag) override
 Writes this node's data to a VRML file. More...
 
bool WriteCache (std::ostream &aFile, SGNODE *parentNode) override
 Write this node's data to a binary cache file. More...
 
bool ReadCache (std::istream &aFile, SGNODE *parentNode) override
 Reads binary format data from a cache file. More...
 
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...
 
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
 
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...
 
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...
 

Public Attributes

std::vector< SGPOINTcoords
 

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

Detailed Description

Define a vertex coordinate set for a scenegraph object.

Definition at line 40 of file sg_coords.h.

Constructor & Destructor Documentation

◆ SGCOORDS()

SGCOORDS::SGCOORDS ( SGNODE aParent)

Definition at line 35 of file sg_coords.cpp.

35  : SGNODE( aParent )
36 {
38 
39  if( nullptr != aParent && S3D::SGTYPE_FACESET != aParent->GetNodeType() )
40  {
41  m_Parent = nullptr;
42 
43  wxLogTrace( MASK_3D_SG, "%s:%s:%d * [BUG] inappropriate parent to SGCOORDS (type %s)",
44  __FILE__, __FUNCTION__, __LINE__, aParent->GetNodeType() );
45  }
46  else if( nullptr != aParent && S3D::SGTYPE_FACESET == aParent->GetNodeType() )
47  {
48  m_Parent->AddChildNode( this );
49  }
50 }
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
SGNODE(SGNODE *aParent)
Definition: sg_node.cpp:76
S3D::SGTYPES m_SGtype
Type of Scene Graph node.
Definition: sg_node.h:228
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 SGNODE::AddChildNode(), SGNODE::GetNodeType(), SGNODE::m_Parent, SGNODE::m_SGtype, S3D::SGTYPE_COORDS, and S3D::SGTYPE_FACESET.

◆ ~SGCOORDS()

SGCOORDS::~SGCOORDS ( )
virtual

Definition at line 53 of file sg_coords.cpp.

54 {
55  coords.clear();
56 }
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords.

Member Function Documentation

◆ AddChildNode()

bool SGCOORDS::AddChildNode ( SGNODE aNode)
overridevirtualnoexcept

Implements SGNODE.

Definition at line 121 of file sg_coords.cpp.

122 {
123  wxCHECK( aNode, false );
124 
125  return false;
126 }

◆ AddCoord() [1/2]

void SGCOORDS::AddCoord ( double  aXValue,
double  aYValue,
double  aZValue 
)

Definition at line 156 of file sg_coords.cpp.

157 {
158  coords.emplace_back( aXValue, aYValue, aZValue );
159 }
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords.

◆ AddCoord() [2/2]

void SGCOORDS::AddCoord ( const SGPOINT aPoint)

Definition at line 162 of file sg_coords.cpp.

163 {
164  coords.push_back( aPoint );
165 }
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords.

◆ addNodeRef()

void SGNODE::addNodeRef ( SGNODE aNode)
inherited

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 SGNODE::m_BackPointers.

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

◆ AddRefNode()

bool SGCOORDS::AddRefNode ( SGNODE aNode)
overridevirtualnoexcept

Implements SGNODE.

Definition at line 113 of file sg_coords.cpp.

114 {
115  wxCHECK( aNode, false );
116 
117  return false;
118 }

◆ AssociateWrapper()

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

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_COORDS::NewNode(), IFSG_FACESET::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_COLORS::NewNode(), and IFSG_TRANSFORM::NewNode().

◆ CalcNormals()

bool SGCOORDS::CalcNormals ( SGFACESET callingNode,
SGNODE **  aPtr = nullptr 
)

Calculate normals for this coordinate list and sets the normals list in the parent SGFACESET.

Definition at line 307 of file sg_coords.cpp.

308 {
309  if( aPtr )
310  *aPtr = nullptr;
311 
312  if( nullptr == m_Parent || nullptr == callingNode )
313  return false;
314 
315  // the parent and all references must have indices; collect all
316  // indices into one std::vector<>
317  std::vector< int > ilist;
318  SGNORMALS* np = nullptr;
319 
320  if( callingNode == m_Parent )
321  {
322  ((SGFACESET*)m_Parent)->GatherCoordIndices( ilist );
323 
324  std::list< SGNODE* >::iterator sB = m_BackPointers.begin();
325  std::list< SGNODE* >::iterator eB = m_BackPointers.end();
326 
327  while( sB != eB )
328  {
329  SGFACESET* fp = (SGFACESET*)(*sB);
330  fp->GatherCoordIndices( ilist );
331  ++sB;
332  }
333 
334  np = ( (SGFACESET*) m_Parent )->m_Normals;
335 
336  if( !np )
337  np = new SGNORMALS( m_Parent );
338 
339  }
340  else
341  {
342  callingNode->GatherCoordIndices( ilist );
343  np = callingNode->m_Normals;
344 
345  if( !np )
346  np = new SGNORMALS( callingNode );
347 
348  }
349 
350  if( S3D::CalcTriangleNormals( coords, ilist, np->norms ) )
351  {
352  if( aPtr )
353  *aPtr = np;
354 
355  return true;
356  }
357 
358  delete np;
359 
360  return false;
361 }
Define an indexed face set for a scenegraph.
Definition: sg_faceset.h:46
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
bool CalcTriangleNormals(std::vector< SGPOINT > coords, std::vector< int > &index, std::vector< SGVECTOR > &norms)
Definition: sg_helpers.cpp:352
Define a set of vertex normals for a scene graph object.
Definition: sg_normals.h:38
std::vector< SGVECTOR > norms
Definition: sg_normals.h:64
void GatherCoordIndices(std::vector< int > &aIndexList)
Add all internal coordinate indices to the given list in preparation for a normals calculation.
Definition: sg_faceset.cpp:943
std::vector< SGPOINT > coords
Definition: sg_coords.h:72
std::list< SGNODE * > m_BackPointers
nodes which hold a reference to this.
Definition: sg_node.h:226
SGNORMALS * m_Normals
Definition: sg_faceset.h:82

References S3D::CalcTriangleNormals(), coords, SGFACESET::GatherCoordIndices(), SGNODE::m_BackPointers, SGFACESET::m_Normals, SGNODE::m_Parent, and SGNORMALS::norms.

Referenced by SGFACESET::CalcNormals().

◆ delNodeRef()

void SGNODE::delNodeRef ( const SGNODE aNode)
inherited

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 SGNODE::GetNodeType(), SGNODE::m_BackPointers, and SGNODE::m_SGtype.

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

◆ DisassociateWrapper()

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

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_SHAPE::NewNode(), IFSG_COORDS::NewNode(), IFSG_FACESET::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_NORMALS::NewNode(), IFSG_COLORS::NewNode(), IFSG_TRANSFORM::NewNode(), and IFSG_NODE::~IFSG_NODE().

◆ FindNode()

SGNODE * SGCOORDS::FindNode ( const char *  aNodeName,
const SGNODE aCaller 
)
overridevirtualnoexcept

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.

Implements SGNODE.

Definition at line 89 of file sg_coords.cpp.

90 {
91  if( nullptr == aNodeName || 0 == aNodeName[0] )
92  return nullptr;
93 
94  if( !m_Name.compare( aNodeName ) )
95  return this;
96 
97  return nullptr;
98 }
std::string m_Name
name to use for referencing the entity by name.
Definition: sg_node.h:229

Referenced by SGFACESET::FindNode().

◆ GetCoordsList()

bool SGCOORDS::GetCoordsList ( size_t &  aListSize,
SGPOINT *&  aCoordsList 
)

Definition at line 129 of file sg_coords.cpp.

130 {
131  if( coords.empty() )
132  {
133  aListSize = 0;
134  aCoordsList = nullptr;
135  return false;
136  }
137 
138  aListSize = coords.size();
139  aCoordsList = &coords[0];
140  return true;
141 }
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords.

Referenced by SGSHAPE::Prepare(), and SGFACESET::validate().

◆ GetName()

◆ GetNodeType()

◆ GetNodeTypeName()

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

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_SHAPE::NewNode(), IFSG_FACESET::NewNode(), IFSG_COORDS::NewNode(), IFSG_COLORS::NewNode(), and IFSG_TRANSFORM::NewNode().

◆ GetParent()

SGNODE * SGNODE::GetParent ( void  ) const
noexceptinherited

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_NORMALS::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COORDS::NewNode(), IFSG_FACESET::NewNode(), IFSG_COLORS::NewNode(), IFSG_TRANSFORM::NewNode(), SGSHAPE::WriteCache(), SGNORMALS::WriteCache(), SGCOLORS::WriteCache(), SCENEGRAPH::WriteCache(), SGFACESET::WriteCache(), WriteCache(), SGAPPEARANCE::WriteCache(), and SGINDEX::WriteCache().

◆ isWritten()

bool SGNODE::isWritten ( void  )
inlinenoexceptinherited

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 SGNODE::m_written.

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

◆ ReadCache()

bool SGCOORDS::ReadCache ( std::istream &  aFile,
SGNODE parentNode 
)
overridevirtual

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.

Implements SGNODE.

Definition at line 284 of file sg_coords.cpp.

285 {
286  wxCHECK( coords.empty(), false );
287 
288  size_t npts;
289  aFile.read( (char*) &npts, sizeof( size_t ) );
290  SGPOINT tmp;
291 
292  if( aFile.fail() )
293  return false;
294 
295  for( size_t i = 0; i < npts; ++i )
296  {
297  if( !S3D::ReadPoint( aFile, tmp ) || aFile.fail() )
298  return false;
299 
300  coords.push_back( tmp );
301  }
302 
303  return true;
304 }
bool ReadPoint(std::istream &aFile, SGPOINT &aPoint)
Definition: sg_helpers.cpp:266
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords, and S3D::ReadPoint().

Referenced by SGFACESET::ReadCache().

◆ ReNameNodes()

void SGCOORDS::ReNameNodes ( void  )
overridevirtual

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

Implements SGNODE.

Definition at line 168 of file sg_coords.cpp.

169 {
170  m_written = false;
171 
172  // rename this node
173  m_Name.clear();
174  GetName();
175 }
const char * GetName(void)
Definition: sg_node.cpp:146
bool m_written
Set to true when the object has been written after a ReNameNodes().
Definition: sg_node.h:230
std::string m_Name
name to use for referencing the entity by name.
Definition: sg_node.h:229

References SGNODE::GetName(), SGNODE::m_Name, and SGNODE::m_written.

Referenced by SGFACESET::ReNameNodes().

◆ ResetNodeIndex()

void SGNODE::ResetNodeIndex ( void  )
noexceptinherited

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

◆ SetCoordsList()

void SGCOORDS::SetCoordsList ( size_t  aListSize,
const SGPOINT aCoordsList 
)

Definition at line 144 of file sg_coords.cpp.

145 {
146  coords.clear();
147 
148  if( 0 == aListSize || nullptr == aCoordsList )
149  return;
150 
151  for( size_t i = 0; i < aListSize; ++i )
152  coords.push_back( aCoordsList[i] );
153 }
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords.

◆ SetName()

void SGNODE::SetName ( const char *  aName)
inherited

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(), SGNODE::m_Name, and SGNODE::m_SGtype.

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

◆ SetParent()

bool SGCOORDS::SetParent ( SGNODE aParent,
bool  notify = true 
)
overridevirtual

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.

Implements SGNODE.

Definition at line 59 of file sg_coords.cpp.

60 {
61  if( nullptr != m_Parent )
62  {
63  if( aParent == m_Parent )
64  return true;
65 
66  // handle the change in parents
67  if( notify )
68  m_Parent->unlinkChildNode( this );
69 
70  m_Parent = nullptr;
71 
72  if( nullptr == aParent )
73  return true;
74  }
75 
76  // only a SGFACESET may be parent to a SGCOORDS
77  if( nullptr != aParent && S3D::SGTYPE_FACESET != aParent->GetNodeType() )
78  return false;
79 
80  m_Parent = aParent;
81 
82  if( m_Parent )
83  m_Parent->AddChildNode( this );
84 
85  return true;
86 }
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
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 SGNODE::AddChildNode(), SGNODE::GetNodeType(), SGNODE::m_Parent, S3D::SGTYPE_FACESET, and SGNODE::unlinkChildNode().

Referenced by SGFACESET::addNode(), and SGFACESET::~SGFACESET().

◆ SwapParent()

bool SGNODE::SwapParent ( SGNODE aNewParent)
inherited

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 SGNODE::AddChildNode(), SGNODE::AddRefNode(), SGNODE::GetNodeType(), SGNODE::m_Parent, SGNODE::unlinkChildNode(), and SGNODE::unlinkRefNode().

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

◆ unlinkChildNode()

void SGCOORDS::unlinkChildNode ( const SGNODE aNode)
overridevirtualnoexcept

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.

Implements SGNODE.

Definition at line 101 of file sg_coords.cpp.

102 {
103  wxCHECK( aCaller, /* void */ );
104 }

◆ unlinkRefNode()

void SGCOORDS::unlinkRefNode ( const SGNODE aNode)
overridevirtualnoexcept

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.

Implements SGNODE.

Definition at line 107 of file sg_coords.cpp.

108 {
109  wxCHECK( aCaller, /* void */ );
110 }

◆ WriteCache()

bool SGCOORDS::WriteCache ( std::ostream &  aFile,
SGNODE parentNode 
)
overridevirtual

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.

Implements SGNODE.

Definition at line 240 of file sg_coords.cpp.

241 {
242  if( nullptr == parentNode )
243  {
244  wxCHECK( m_Parent, false );
245 
246  SGNODE* np = m_Parent;
247 
248  while( nullptr != np->GetParent() )
249  np = np->GetParent();
250 
251  if( np->WriteCache( aFile, nullptr ) )
252  {
253  m_written = true;
254  return true;
255  }
256 
257  return false;
258  }
259 
260  wxCHECK( parentNode == m_Parent, false );
261 
262  if( !aFile.good() )
263  {
264  wxLogTrace( MASK_3D_SG, "%s:%s:%d * [INFO] bad stream", __FILE__, __FUNCTION__, __LINE__ );
265 
266  return false;
267  }
268 
269  aFile << "[" << GetName() << "]";
270  size_t npts = coords.size();
271  aFile.write( (char*)&npts, sizeof(size_t) );
272 
273  for( size_t i = 0; i < npts; ++i )
274  S3D::WritePoint( aFile, coords[i] );
275 
276  if( aFile.fail() )
277  return false;
278 
279  m_written = true;
280  return true;
281 }
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
const char * GetName(void)
Definition: sg_node.cpp:146
bool m_written
Set to true when the object has been written after a ReNameNodes().
Definition: sg_node.h:230
bool WritePoint(std::ostream &aFile, const SGPOINT &aPoint)
Definition: sg_helpers.cpp:152
SGNODE * GetParent(void) const noexcept
Returns a pointer to the parent SGNODE of this object or NULL if the object has no parent (ie.
Definition: sg_node.cpp:110
virtual bool WriteCache(std::ostream &aFile, SGNODE *parentNode)=0
Write this node's data to a binary cache file.
std::vector< SGPOINT > coords
Definition: sg_coords.h:72

References coords, SGNODE::GetName(), SGNODE::GetParent(), SGNODE::m_Parent, SGNODE::m_written, SGNODE::WriteCache(), and S3D::WritePoint().

Referenced by SGFACESET::WriteCache().

◆ WriteVRML()

bool SGCOORDS::WriteVRML ( std::ostream &  aFile,
bool  aReuseFlag 
)
overridevirtual

Writes this node's data to a VRML file.

This includes all data of child and referenced nodes.

Implements SGNODE.

Definition at line 178 of file sg_coords.cpp.

179 {
180  if( coords.empty() )
181  return false;
182 
183  if( aReuseFlag )
184  {
185  if( !m_written )
186  {
187  aFile << " coord DEF " << GetName() << " Coordinate { point [\n ";
188  m_written = true;
189  }
190  else
191  {
192  aFile << " coord USE " << GetName() << "\n";
193  return true;
194  }
195  }
196  else
197  {
198  aFile << " coord Coordinate { point [\n ";
199  }
200 
201  std::string tmp;
202  size_t n = coords.size();
203  bool nline = false;
204  SGPOINT pt;
205 
206  for( size_t i = 0; i < n; )
207  {
208  // ensure VRML output has 1U = 0.1 inch as per legacy kicad expectations
209  pt = coords[i];
210  pt.x /= 2.54;
211  pt.y /= 2.54;
212  pt.z /= 2.54;
213  S3D::FormatPoint( tmp, pt );
214  aFile << tmp ;
215  ++i;
216 
217  if( i < n )
218  {
219  aFile << ",";
220 
221  if( nline )
222  {
223  aFile << "\n ";
224  nline = false;
225  }
226  else
227  {
228  nline = true;
229  }
230 
231  }
232  }
233 
234  aFile << "] }\n";
235 
236  return true;
237 }
double x
Definition: sg_base.h:70
void FormatPoint(std::string &result, const SGPOINT &point)
Definition: sg_helpers.cpp:103
double y
Definition: sg_base.h:71
const char * GetName(void)
Definition: sg_node.cpp:146
bool m_written
Set to true when the object has been written after a ReNameNodes().
Definition: sg_node.h:230
std::vector< SGPOINT > coords
Definition: sg_coords.h:72
double z
Definition: sg_base.h:72

References coords, S3D::FormatPoint(), SGNODE::GetName(), SGNODE::m_written, SGPOINT::x, SGPOINT::y, and SGPOINT::z.

Referenced by SGFACESET::WriteVRML().

Member Data Documentation

◆ coords

std::vector< SGPOINT > SGCOORDS::coords

◆ m_BackPointers

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

nodes which hold a reference to this.

Definition at line 226 of file sg_node.h.

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

◆ m_Name

◆ m_Parent

◆ m_SGtype

◆ m_written


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