KiCad PCB EDA Suite
SGNORMALS Class Reference

#include <sg_normals.h>

Inheritance diagram for SGNORMALS:
SGNODE

Public Member Functions

void unlinkChildNode (const SGNODE *aNode) override
 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...
 
void unlinkRefNode (const SGNODE *aNode) override
 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...
 
 SGNORMALS (SGNODE *aParent)
 
virtual ~SGNORMALS ()
 
virtual bool SetParent (SGNODE *aParent, bool notify=true) override
 Function SetParent sets the parent SGNODE of this object. More...
 
SGNODEFindNode (const char *aNodeName, const SGNODE *aCaller) override
 Function FindNode searches the tree of linked nodes and returns a reference to the first node found with the given name. More...
 
bool AddRefNode (SGNODE *aNode) override
 
bool AddChildNode (SGNODE *aNode) override
 
bool GetNormalList (size_t &aListSize, SGVECTOR *&aNormalList)
 
void SetNormalList (size_t aListSize, const SGVECTOR *aNormalList)
 
void AddNormal (double aXValue, double aYValue, double aZValue)
 
void AddNormal (const SGVECTOR &aNormal)
 
void ReNameNodes (void) override
 Function ReNameNodes renames a node and all its child nodes in preparation for Write() operations. More...
 
bool WriteVRML (std::ostream &aFile, bool aReuseFlag) override
 Function WriteVRML writes this node's data to a VRML file; this includes all data of child and referenced nodes. More...
 
bool WriteCache (std::ostream &aFile, SGNODE *parentNode) override
 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...
 
bool ReadCache (std::istream &aFile, SGNODE *parentNode) override
 Function ReadCache Reads binary format data from a cache file. 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...
 
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...
 
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
 
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...
 

Public Attributes

std::vector< SGVECTORnorms
 

Protected Attributes

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

Detailed Description

Definition at line 35 of file sg_normals.h.

Constructor & Destructor Documentation

SGNORMALS::SGNORMALS ( SGNODE aParent)

Definition at line 32 of file sg_normals.cpp.

References SGNODE::AddChildNode(), SGNODE::GetNodeType(), SGNODE::m_Parent, SGNODE::m_SGtype, S3D::SGTYPE_FACESET, and S3D::SGTYPE_NORMALS.

32  : SGNODE( aParent )
33 {
35 
36  if( NULL != aParent && S3D::SGTYPE_FACESET != aParent->GetNodeType() )
37  {
38  m_Parent = NULL;
39 
40 #ifdef DEBUG
41  std::ostringstream ostr;
42  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
43  ostr << " * [BUG] inappropriate parent to SGNORMALS (type ";
44  ostr << aParent->GetNodeType() << ")";
45  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
46 #endif
47  }
48  else if( NULL != aParent && S3D::SGTYPE_FACESET == aParent->GetNodeType() )
49  {
50  m_Parent->AddChildNode( this );
51  }
52 
53  return;
54 }
SGNODE * m_Parent
Definition: sg_node.h:83
S3D::SGTYPES GetNodeType(void) const
Function GetNodeType returns the type of this node instance.
Definition: sg_node.cpp:108
SGNODE(SGNODE *aParent)
Definition: sg_node.cpp:76
S3D::SGTYPES m_SGtype
Definition: sg_node.h:84
virtual bool AddChildNode(SGNODE *aNode)=0
SGNORMALS::~SGNORMALS ( )
virtual

Definition at line 57 of file sg_normals.cpp.

References norms.

58 {
59  norms.clear();
60  return;
61 }
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38

Member Function Documentation

bool SGNORMALS::AddChildNode ( SGNODE aNode)
overridevirtual

Implements SGNODE.

Definition at line 145 of file sg_normals.cpp.

146 {
147  #ifdef DEBUG
148  std::ostringstream ostr;
149  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
150  ostr << " * [BUG] this node does not accept children or refs";
151  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
152  #endif
153 
154  return false;
155 }
void SGNODE::addNodeRef ( SGNODE aNode)
inherited

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 SGNODE::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
void SGNORMALS::AddNormal ( double  aXValue,
double  aYValue,
double  aZValue 
)

Definition at line 187 of file sg_normals.cpp.

References norms.

188 {
189  norms.push_back( SGVECTOR( aXValue, aYValue, aZValue ) );
190  return;
191 }
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38
void SGNORMALS::AddNormal ( const SGVECTOR aNormal)

Definition at line 194 of file sg_normals.cpp.

References norms.

195 {
196  norms.push_back( aNormal );
197  return;
198 }
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38
bool SGNORMALS::AddRefNode ( SGNODE aNode)
overridevirtual

Implements SGNODE.

Definition at line 132 of file sg_normals.cpp.

133 {
134  #ifdef DEBUG
135  std::ostringstream ostr;
136  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
137  ostr << " * [BUG] this node does not accept children or refs";
138  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
139  #endif
140 
141  return false;
142 }
void SGNODE::AssociateWrapper ( SGNODE **  aWrapperRef)
inherited

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

Referenced by S3D::AssociateSGNodeWrapper(), IFSG_APPEARANCE::Attach(), IFSG_SHAPE::Attach(), IFSG_COORDINDEX::Attach(), IFSG_NORMALS::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_COORDINDEX::NewNode(), IFSG_COORDS::NewNode(), IFSG_FACESET::NewNode(), IFSG_NORMALS::NewNode(), IFSG_SHAPE::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)
inherited

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

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

Definition at line 264 of file sg_node.cpp.

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

Referenced by IFSG_APPEARANCE::Attach(), IFSG_COORDINDEX::Attach(), IFSG_NORMALS::Attach(), IFSG_FACESET::Attach(), IFSG_COORDS::Attach(), IFSG_SHAPE::Attach(), IFSG_COLORS::Attach(), IFSG_TRANSFORM::Attach(), IFSG_NODE::Destroy(), IFSG_APPEARANCE::NewNode(), IFSG_SHAPE::NewNode(), IFSG_COORDS::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_NORMALS::NewNode(), IFSG_FACESET::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
SGNODE * SGNORMALS::FindNode ( const char *  aNodeName,
const SGNODE aCaller 
)
overridevirtual

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

Implements SGNODE.

Definition at line 94 of file sg_normals.cpp.

References SGNODE::m_Name.

Referenced by SGFACESET::FindNode().

95 {
96  if( NULL == aNodeName || 0 == aNodeName[0] )
97  return NULL;
98 
99  if( !m_Name.compare( aNodeName ) )
100  return this;
101 
102  return NULL;
103 }
std::string m_Name
Definition: sg_node.h:85
const char * SGNODE::GetNodeTypeName ( S3D::SGTYPES  aNodeType) const
inherited

Definition at line 170 of file sg_node.cpp.

References node_names.

Referenced by IFSG_NODE::GetNodeTypeName(), IFSG_APPEARANCE::NewNode(), IFSG_COORDINDEX::NewNode(), IFSG_COORDS::NewNode(), IFSG_SHAPE::NewNode(), IFSG_FACESET::NewNode(), IFSG_NORMALS::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
bool SGNORMALS::GetNormalList ( size_t &  aListSize,
SGVECTOR *&  aNormalList 
)

Definition at line 158 of file sg_normals.cpp.

References norms.

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

159 {
160  if( norms.empty() )
161  {
162  aListSize = 0;
163  aNormalList = NULL;
164  return false;
165  }
166 
167  aListSize = norms.size();
168  aNormalList = &norms[0];
169  return true;
170 }
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38
SGNODE * SGNODE::GetParent ( void  ) const
inherited
bool SGNODE::isWritten ( void  )
inlineinherited

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 SGNODE::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
bool SGNORMALS::ReadCache ( std::istream &  aFile,
SGNODE parentNode 
)
overridevirtual

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.

Implements SGNODE.

Definition at line 336 of file sg_normals.cpp.

References norms, and S3D::ReadVector().

Referenced by SGFACESET::ReadCache().

337 {
338  if( !norms.empty() )
339  {
340  #ifdef DEBUG
341  std::ostringstream ostr;
342  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
343  ostr << " * [BUG] non-empty node";
344  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
345  #endif
346 
347  return false;
348  }
349 
350  size_t npts;
351  aFile.read( (char*)&npts, sizeof(size_t) );
352  SGVECTOR tmp;
353 
354  if( aFile.fail() )
355  return false;
356 
357  for( size_t i = 0; i < npts; ++i )
358  {
359  if( !S3D::ReadVector( aFile, tmp ) || aFile.fail() )
360  return false;
361 
362  norms.push_back( tmp );
363  }
364 
365  return true;
366 }
bool ReadVector(std::istream &aFile, SGVECTOR &aVector)
Definition: sg_helpers.cpp:309
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38
void SGNORMALS::ReNameNodes ( void  )
overridevirtual

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

Implements SGNODE.

Definition at line 201 of file sg_normals.cpp.

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

Referenced by SGFACESET::ReNameNodes().

202 {
203  m_written = false;
204 
205  // rename this node
206  m_Name.clear();
207  GetName();
208 }
const char * GetName(void)
Definition: sg_node.cpp:150
bool m_written
Definition: sg_node.h:86
std::string m_Name
Definition: sg_node.h:85
void SGNODE::ResetNodeIndex ( void  )
inherited

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)
inherited

Definition at line 159 of file sg_node.cpp.

References getNodeName(), SGNODE::m_Name, and SGNODE::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
void SGNORMALS::SetNormalList ( size_t  aListSize,
const SGVECTOR aNormalList 
)

Definition at line 173 of file sg_normals.cpp.

References norms.

174 {
175  norms.clear();
176 
177  if( 0 == aListSize || NULL == aNormalList )
178  return;
179 
180  for( int i = 0; i < (int)aListSize; ++i )
181  norms.push_back( aNormalList[i] );
182 
183  return;
184 }
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38
bool SGNORMALS::SetParent ( SGNODE aParent,
bool  notify = true 
)
overridevirtual

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.

Implements SGNODE.

Definition at line 64 of file sg_normals.cpp.

References SGNODE::AddChildNode(), SGNODE::GetNodeType(), SGNODE::m_Parent, S3D::SGTYPE_FACESET, and SGNODE::unlinkChildNode().

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

65 {
66  if( NULL != m_Parent )
67  {
68  if( aParent == m_Parent )
69  return true;
70 
71  // handle the change in parents
72  if( notify )
73  m_Parent->unlinkChildNode( this );
74 
75  m_Parent = NULL;
76 
77  if( NULL == aParent )
78  return true;
79  }
80 
81  // only a SGFACESET may be parent to a SGNORMALS
82  if( NULL != aParent && S3D::SGTYPE_FACESET != aParent->GetNodeType() )
83  return false;
84 
85  m_Parent = aParent;
86 
87  if( m_Parent )
88  m_Parent->AddChildNode( this );
89 
90  return true;
91 }
SGNODE * m_Parent
Definition: sg_node.h:83
S3D::SGTYPES GetNodeType(void) const
Function GetNodeType returns the type of this node instance.
Definition: sg_node.cpp:108
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
bool SGNODE::SwapParent ( SGNODE aNewParent)
inherited

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 SGNODE::AddChildNode(), SGNODE::AddRefNode(), SGNODE::GetNodeType(), SGNODE::m_Parent, SGNODE::unlinkChildNode(), and SGNODE::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
void SGNORMALS::unlinkChildNode ( const SGNODE aNode)
overridevirtual

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

Implements SGNODE.

Definition at line 106 of file sg_normals.cpp.

107 {
108  #ifdef DEBUG
109  std::ostringstream ostr;
110  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
111  ostr << " * [BUG] unexpected code branch; node should have no children or refs";
112  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
113  #endif
114 
115  return;
116 }
void SGNORMALS::unlinkRefNode ( const SGNODE aNode)
overridevirtual

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

Implements SGNODE.

Definition at line 119 of file sg_normals.cpp.

120 {
121  #ifdef DEBUG
122  std::ostringstream ostr;
123  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
124  ostr << " * [BUG] unexpected code branch; node should have no children or refs";
125  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
126  #endif
127 
128  return;
129 }
bool SGNORMALS::WriteCache ( std::ostream &  aFile,
SGNODE parentNode 
)
overridevirtual

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.

Implements SGNODE.

Definition at line 267 of file sg_normals.cpp.

References SGNODE::GetName(), SGNODE::GetParent(), SGNODE::m_Parent, SGNODE::m_written, norms, SGNODE::WriteCache(), and S3D::WriteVector().

Referenced by SGFACESET::WriteCache().

268 {
269  if( NULL == parentNode )
270  {
271  if( NULL == m_Parent )
272  {
273  #ifdef DEBUG
274  std::ostringstream ostr;
275  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
276  ostr << " * [BUG] corrupt data; m_aParent is NULL";
277  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
278  #endif
279 
280  return false;
281  }
282 
283  SGNODE* np = m_Parent;
284 
285  while( NULL != np->GetParent() )
286  np = np->GetParent();
287 
288  if( np->WriteCache( aFile, NULL ) )
289  {
290  m_written = true;
291  return true;
292  }
293 
294  return false;
295  }
296 
297  if( parentNode != m_Parent )
298  {
299  #ifdef DEBUG
300  std::ostringstream ostr;
301  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
302  ostr << " * [BUG] corrupt data; parentNode != m_aParent";
303  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
304  #endif
305 
306  return false;
307  }
308 
309  if( !aFile.good() )
310  {
311  #ifdef DEBUG
312  std::ostringstream ostr;
313  ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
314  ostr << " * [INFO] bad stream";
315  wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() );
316  #endif
317 
318  return false;
319  }
320 
321  aFile << "[" << GetName() << "]";
322  size_t npts = norms.size();
323  aFile.write( (char*)&npts, sizeof(size_t) );
324 
325  for( size_t i = 0; i < npts; ++i )
326  S3D::WriteVector( aFile, norms[i] );
327 
328  if( aFile.fail() )
329  return false;
330 
331  m_written = true;
332  return true;
333 }
SGNODE * m_Parent
Definition: sg_node.h:83
Class SGNODE represents the base class of all Scene Graph nodes.
Definition: sg_node.h:76
const char * GetName(void)
Definition: sg_node.cpp:150
bool m_written
Definition: sg_node.h:86
SGNODE * GetParent(void) const
Function GetParent returns a pointer to the parent SGNODE of this object or NULL if the object has no...
Definition: sg_node.cpp:114
bool WriteVector(std::ostream &aFile, const SGVECTOR &aVector)
Definition: sg_helpers.cpp:178
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38
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 ch...
bool SGNORMALS::WriteVRML ( std::ostream &  aFile,
bool  aReuseFlag 
)
overridevirtual

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

Implements SGNODE.

Definition at line 211 of file sg_normals.cpp.

References S3D::FormatVector(), SGNODE::GetName(), SGNODE::m_written, and norms.

Referenced by SGFACESET::WriteVRML().

212 {
213  if( norms.empty() )
214  return false;
215 
216  if( aReuseFlag )
217  {
218  if( !m_written )
219  {
220  aFile << " normal DEF " << GetName() << " Normal { vector [\n ";
221  m_written = true;
222  }
223  else
224  {
225  aFile << " normal USE " << GetName() << "\n";
226  return true;
227  }
228  }
229  else
230  {
231  aFile << " normal Normal { vector [\n ";
232  }
233 
234  std::string tmp;
235  size_t n = norms.size();
236  bool nline = false;
237 
238  for( size_t i = 0; i < n; )
239  {
240  S3D::FormatVector( tmp, norms[i] );
241  aFile << tmp ;
242  ++i;
243 
244  if( i < n )
245  {
246  aFile << ",";
247 
248  if( nline )
249  {
250  aFile << "\n ";
251  nline = false;
252  }
253  else
254  {
255  nline = true;
256  }
257 
258  }
259  }
260 
261  aFile << "] }\n";
262 
263  return true;
264 }
void FormatVector(std::string &result, const SGVECTOR &aVector)
Definition: sg_helpers.cpp:126
const char * GetName(void)
Definition: sg_node.cpp:150
bool m_written
Definition: sg_node.h:86
std::vector< SGVECTOR > norms
Definition: sg_normals.h:38

Member Data Documentation

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

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