KiCad PCB EDA Suite
WRL2BOX Class Reference

#include <vrml2_box.h>

Inheritance diagram for WRL2BOX:
WRL2NODE

Public Member Functions

 WRL2BOX ()
 
 WRL2BOX (WRL2NODE *aParent)
 
virtual ~WRL2BOX ()
 
bool Read (WRLPROC &proc, WRL2BASE *aTopNode) override
 
bool AddRefNode (WRL2NODE *aNode) override
 
bool AddChildNode (WRL2NODE *aNode) override
 
SGNODETranslateToSG (SGNODE *aParent) override
 Produce a representation of the data using the intermediate scenegraph structures of the kicad_3dsg library. More...
 
bool isDangling (void) override
 Determine whether an object should be moved to a different parent during the VRML to SG* translation. More...
 
WRL2NODES GetNodeType (void) const
 
WRL2NODEGetParent (void) const
 
virtual bool SetParent (WRL2NODE *aParent, bool doUnlink=true)
 Set the parent WRL2NODE of this object. More...
 
virtual std::string GetName (void)
 
virtual bool SetName (const std::string &aName)
 
const char * GetNodeTypeName (WRL2NODES aNodeType) const
 
virtual WRL2NODEFindNode (const std::string &aNodeName, const WRL2NODE *aCaller)
 Search the tree of linked nodes and returns a reference to the first node found with the given name. More...
 
std::string GetError (void)
 
WRL2NODES getNodeTypeID (const std::string &aNodeName)
 
virtual void unlinkChildNode (const WRL2NODE *aNode)
 Remove references to an owned child. More...
 
virtual void unlinkRefNode (const WRL2NODE *aNode)
 Remove pointers to a referenced node. More...
 
void addNodeRef (WRL2NODE *aNode)
 Add a pointer to a node which references but does not own this node. More...
 
void delNodeRef (WRL2NODE *aNode)
 Remove a pointer to a node which references but does not own this node. More...
 

Protected Attributes

WRL2NODEm_Parent
 
WRL2NODES m_Type
 
std::string m_Name
 
std::list< WRL2NODE * > m_BackPointers
 
std::list< WRL2NODE * > m_Children
 
std::list< WRL2NODE * > m_Refs
 
std::string m_error
 
SGNODEm_sgNode
 

Private Attributes

WRLVEC3F size
 

Detailed Description

Definition at line 38 of file vrml2_box.h.

Constructor & Destructor Documentation

◆ WRL2BOX() [1/2]

WRL2BOX::WRL2BOX ( )

Definition at line 35 of file vrml2_box.cpp.

35  : WRL2NODE()
36 {
38  size.x = 2.0;
39  size.y = 2.0;
40  size.z = 2.0;
41 }
WRL2NODES m_Type
Definition: vrml2_node.h:170
WRLVEC3F size
Definition: vrml2_box.h:53

References WRL2NODE::m_Type, size, and WRL2_BOX.

◆ WRL2BOX() [2/2]

WRL2BOX::WRL2BOX ( WRL2NODE aParent)

Definition at line 44 of file vrml2_box.cpp.

44  : WRL2NODE()
45 {
47  m_Parent = aParent;
48  size.x = 2.0;
49  size.y = 2.0;
50  size.z = 2.0;
51 
52  if( nullptr != m_Parent )
53  m_Parent->AddChildNode( this );
54 }
WRL2NODES m_Type
Definition: vrml2_node.h:170
WRL2NODE * m_Parent
Definition: vrml2_node.h:169
WRLVEC3F size
Definition: vrml2_box.h:53
virtual bool AddChildNode(WRL2NODE *aNode)
Definition: vrml2_node.cpp:356

References WRL2NODE::AddChildNode(), WRL2NODE::m_Parent, WRL2NODE::m_Type, size, and WRL2_BOX.

◆ ~WRL2BOX()

WRL2BOX::~WRL2BOX ( )
virtual

Definition at line 57 of file vrml2_box.cpp.

58 {
59  wxLogTrace( traceVrmlPlugin, wxT( " * [INFO] Destroying Box node." ) );
60 }
const wxChar *const traceVrmlPlugin
Flag to enable VRML plugin trace output.
Definition: vrml.cpp:63

References traceVrmlPlugin.

Member Function Documentation

◆ AddChildNode()

bool WRL2BOX::AddChildNode ( WRL2NODE aNode)
overridevirtual

Reimplemented from WRL2NODE.

Definition at line 177 of file vrml2_box.cpp.

178 {
179  // this node may not own or reference any other node
180  wxCHECK_MSG( false, false, wxT( "AddChildNode is not applicable." ) );
181 }

◆ addNodeRef()

void WRL2NODE::addNodeRef ( WRL2NODE aNode)
inherited

Add 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 171 of file vrml2_node.cpp.

172 {
173  // the parent node must never be added as a backpointer
174  if( aNode == m_Parent )
175  return;
176 
177  std::list< WRL2NODE* >::iterator np =
178  std::find( m_BackPointers.begin(), m_BackPointers.end(), aNode );
179 
180  if( np != m_BackPointers.end() )
181  return;
182 
183  m_BackPointers.push_back( aNode );
184 }
WRL2NODE * m_Parent
Definition: vrml2_node.h:169
std::list< WRL2NODE * > m_BackPointers
Definition: vrml2_node.h:173

References WRL2NODE::m_BackPointers, and WRL2NODE::m_Parent.

Referenced by WRL2NODE::AddRefNode().

◆ AddRefNode()

bool WRL2BOX::AddRefNode ( WRL2NODE aNode)
overridevirtual

Reimplemented from WRL2NODE.

Definition at line 170 of file vrml2_box.cpp.

171 {
172  // this node may not own or reference any other node
173  wxCHECK_MSG( false, false, wxT( "AddRefNode is not applicable." ) );
174 }

◆ delNodeRef()

void WRL2NODE::delNodeRef ( WRL2NODE aNode)
inherited

Remove 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 187 of file vrml2_node.cpp.

188 {
189  std::list< WRL2NODE* >::iterator np =
190  std::find( m_BackPointers.begin(), m_BackPointers.end(), aNode );
191 
192  if( np != m_BackPointers.end() )
193  {
194  m_BackPointers.erase( np );
195  return;
196  }
197 
198  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d\n"
199  " * [BUG] delNodeRef() did not find its target." ),
200  __FILE__, __FUNCTION__, __LINE__ );
201 }
std::list< WRL2NODE * > m_BackPointers
Definition: vrml2_node.h:173
const wxChar *const traceVrmlPlugin
Flag to enable VRML plugin trace output.
Definition: vrml.cpp:63

References WRL2NODE::m_BackPointers, and traceVrmlPlugin.

◆ FindNode()

WRL2NODE * WRL2NODE::FindNode ( const std::string &  aNodeName,
const WRL2NODE aCaller 
)
virtualinherited

Search 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 or NULL.

Definition at line 305 of file vrml2_node.cpp.

306 {
307  if( aNodeName.empty() )
308  return nullptr;
309 
310  if( !m_Name.compare( aNodeName ) )
311  return this;
312 
313  std::list< WRL2NODE* >::iterator sLA = m_Children.begin();
314  std::list< WRL2NODE* >::iterator eLA = m_Children.end();
315 
316  WRL2NODE* psg = nullptr;
317 
318  while( sLA != eLA )
319  {
320  if( *sLA != aCaller )
321  {
322  psg = (*sLA)->FindNode( aNodeName, this );
323 
324  if( nullptr != psg )
325  return psg;
326 
327  }
328 
329  ++sLA;
330  }
331 
332  if( nullptr != m_Parent && aCaller != m_Parent )
333  return m_Parent->FindNode( aNodeName, this );
334 
335  return nullptr;
336 }
std::list< WRL2NODE * > m_Children
Definition: vrml2_node.h:174
std::string m_Name
Definition: vrml2_node.h:171
WRL2NODE * m_Parent
Definition: vrml2_node.h:169
virtual WRL2NODE * FindNode(const std::string &aNodeName, const WRL2NODE *aCaller)
Search the tree of linked nodes and returns a reference to the first node found with the given name.
Definition: vrml2_node.cpp:305

References WRL2NODE::FindNode(), WRL2NODE::m_Children, WRL2NODE::m_Name, and WRL2NODE::m_Parent.

Referenced by WRL2NODE::FindNode(), and WRL2BASE::implementUse().

◆ GetError()

std::string WRL2NODE::GetError ( void  )
inherited

Definition at line 299 of file vrml2_node.cpp.

300 {
301  return m_error;
302 }
std::string m_error
Definition: vrml2_node.h:176

References WRL2NODE::m_error.

◆ GetName()

std::string WRL2NODE::GetName ( void  )
virtualinherited

Reimplemented in WRL2BASE.

Definition at line 216 of file vrml2_node.cpp.

217 {
218  return m_Name;
219 }
std::string m_Name
Definition: vrml2_node.h:171

References WRL2NODE::m_Name.

◆ GetNodeType()

◆ getNodeTypeID()

WRL2NODES WRL2NODE::getNodeTypeID ( const std::string &  aNodeName)
inherited
Returns
The ID based on the given aNodeName or WRL2_INVALID (WRL2_END) if no such node name exists.

Definition at line 288 of file vrml2_node.cpp.

289 {
290  NODEMAP::iterator it = nodenames.find( aNodeName );
291 
292  if( nodenames.end() != it )
293  return it->second;
294 
296 }
static NODEMAP nodenames
Definition: vrml2_node.cpp:43

References nodenames, and WRL2_INVALID.

Referenced by WRL2BASE::ReadNode().

◆ GetNodeTypeName()

const char * WRL2NODE::GetNodeTypeName ( WRL2NODES  aNodeType) const
inherited

Definition at line 273 of file vrml2_node.cpp.

274 {
275  if( aNodeType < WRL2NODES::WRL2_BASE || aNodeType >= WRL2NODES::WRL2_END )
276  return "*INVALID_TYPE*";
277 
278  if( aNodeType == WRL2NODES::WRL2_BASE )
279  return "*VIRTUAL_BASE*";
280 
281  NODEMAP::iterator it = nodenames.begin();
282  advance( it, (static_cast<int>( aNodeType ) - static_cast<int>( WRL2NODES::WRL2_BEGIN ) ) );
283 
284  return it->first.c_str();
285 }
static NODEMAP nodenames
Definition: vrml2_node.cpp:43

References nodenames, WRL2_BASE, WRL2_BEGIN, and WRL2_END.

Referenced by WRL2APPEARANCE::AddChildNode(), WRL2SHAPE::AddChildNode(), WRL2LINESET::AddChildNode(), WRL2POINTSET::AddChildNode(), WRL2FACESET::AddChildNode(), WRL2APPEARANCE::AddRefNode(), WRL2SHAPE::AddRefNode(), WRL2LINESET::AddRefNode(), WRL2POINTSET::AddRefNode(), and WRL2FACESET::AddRefNode().

◆ GetParent()

WRL2NODE * WRL2NODE::GetParent ( void  ) const
inherited

◆ isDangling()

bool WRL2BOX::isDangling ( void  )
overridevirtual

Determine whether an object should be moved to a different parent during the VRML to SG* translation.

Returns
true if the object does not have a parent which is a logical container for the object for example if a Shape has a parent which is a Base node.

Implements WRL2NODE.

Definition at line 63 of file vrml2_box.cpp.

64 {
65  // this node is dangling unless it has a parent of type WRL2_SHAPE
66 
67  if( nullptr == m_Parent || m_Parent->GetNodeType() != WRL2NODES::WRL2_SHAPE )
68  return true;
69 
70  return false;
71 }
WRL2NODE * m_Parent
Definition: vrml2_node.h:169
WRL2NODES GetNodeType(void) const
Definition: vrml2_node.cpp:204

References WRL2NODE::GetNodeType(), WRL2NODE::m_Parent, and WRL2_SHAPE.

◆ Read()

bool WRL2BOX::Read ( WRLPROC proc,
WRL2BASE aTopNode 
)
overridevirtual
Note
If this box is bad, should false be returned here?

Implements WRL2NODE.

Definition at line 74 of file vrml2_box.cpp.

75 {
76  char tok = proc.Peek();
77 
78  if( proc.eof() )
79  {
80  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d\n"
81  " * [INFO] bad file format; unexpected eof %s." ),
82  __FILE__, __FUNCTION__, __LINE__, proc.GetFilePosition() );
83 
84  return false;
85  }
86 
87  if( '{' != tok )
88  {
89  wxLogTrace( traceVrmlPlugin,
90  wxT( "%s:%s:%d\n"
91  " * [INFO] bad file format; expecting '{' but got '%s' %s." ),
92  __FILE__, __FUNCTION__, __LINE__, tok, proc.GetFilePosition() );
93 
94  return false;
95  }
96 
97  proc.Pop();
98  std::string glob;
99 
100  if( proc.Peek() == '}' )
101  {
102  proc.Pop();
103  return true;
104  }
105 
106  if( !proc.ReadName( glob ) )
107  {
108  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d\n"
109  "%s" ),
110  __FILE__, __FUNCTION__, __LINE__ , proc.GetError() );
111 
112  return false;
113  }
114 
115  // expecting 'size'
116  if( !glob.compare( "size" ) )
117  {
118  if( !proc.ReadSFVec3f( size ) )
119  {
120  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d"
121  " * [INFO] invalid size %s\n"
122  " * [INFO] file: '%s'\n"
123  "%s" ),
124  __FILE__, __FUNCTION__, __LINE__, proc.GetFilePosition(),
125  proc.GetFileName(), proc.GetError() );
126 
127  return false;
128  }
129 
130  // for legacy KiCad support we interpret units as 0.1 inch
131  size *= 2.54;
132  }
133  else
134  {
135  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d"
136  " * [INFO] invalid Box %s\n"
137  " * [INFO] file: '%s'\n" ),
138  __FILE__, __FUNCTION__, __LINE__, proc.GetFilePosition(),
139  proc.GetFileName() );
140 
141  return false;
142  }
143 
144  if( size.x < 1e-6 || size.y < 1e-6 || size.z < 1e-6 )
145  {
146  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d"
147  " * [INFO] invalid Box size %s\n"
148  " * [INFO] file: '%s'\n" ),
149  __FILE__, __FUNCTION__, __LINE__, proc.GetFilePosition(),
150  proc.GetFileName() );
151 
153  }
154 
155  if( proc.Peek() == '}' )
156  {
157  proc.Pop();
158  return true;
159  }
160 
161  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d"
162  " * [INFO] invalid size %s (no closing brace).\n"
163  " * [INFO] file: '%s'\n" ),
164  __FILE__, __FUNCTION__, __LINE__, proc.GetFilePosition(), proc.GetFileName() );
165 
166  return false;
167 }
void Pop(void)
Definition: wrlproc.cpp:2035
bool ReadSFVec3f(WRLVEC3F &aSFVec3f)
Definition: wrlproc.cpp:1082
std::string GetFilePosition() const
Definition: wrlproc.cpp:1982
WRLVEC3F size
Definition: vrml2_box.h:53
char Peek(void)
Definition: wrlproc.cpp:2007
std::string GetFileName(void)
Definition: wrlproc.cpp:1995
const wxChar *const traceVrmlPlugin
Flag to enable VRML plugin trace output.
Definition: vrml.cpp:63
bool ReadName(std::string &aName)
Definition: wrlproc.cpp:289
std::string GetError(void)
Definition: wrlproc.cpp:1960
bool eof(void)
Definition: wrlproc.cpp:1954

References WRLPROC::eof(), WRLPROC::GetError(), WRLPROC::GetFileName(), WRLPROC::GetFilePosition(), WRLPROC::Peek(), WRLPROC::Pop(), WRLPROC::ReadName(), WRLPROC::ReadSFVec3f(), size, and traceVrmlPlugin.

Referenced by WRL2BASE::readBox().

◆ SetName()

bool WRL2NODE::SetName ( const std::string &  aName)
virtualinherited

Reimplemented in WRL2BASE.

Definition at line 222 of file vrml2_node.cpp.

223 {
224  if( aName.empty() )
225  return false;
226 
227  std::set< std::string >::iterator item = badNames.find( aName );
228 
229  if( item != badNames.end() )
230  {
231  wxLogTrace( traceVrmlPlugin,
232  wxT( "%s:%s:%d\n"
233  " * [INFO] invalid node name '%s' (matches restricted word)" ),
234  __FILE__, __FUNCTION__, __LINE__, *item );
235 
236  return false;
237  }
238 
239 
240  if( isdigit( aName[0] ) )
241  {
242  wxLogTrace( traceVrmlPlugin, wxT( "%s:%s:%d\n"
243  " * [INFO] invalid node name '%s' (begins with digit)" ),
244  __FILE__, __FUNCTION__, __LINE__, aName );
245 
246  return false;
247  }
248 
249  // The characters '+' and '-' are not allowed in names as per the VRML2 specification;
250  // however many parsers accept them and many bad generators use them so the rules
251  // have been relaxed here.
252  // #define BAD_CHARS1 "\"\'#+,-.\\[]{}\x00\x01\x02\x03\x04\x05\x06\x09\x0A\x0B\x0C\x0D\x0E\x0F"
253  #define BAD_CHARS1 "\"\'#,.\\[]{}\x00\x01\x02\x03\x04\x05\x06\x09\x0A\x0B\x0C\x0D\x0E\x0F"
254  #define BAD_CHARS2 "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
255 
256  if( std::string::npos != aName.find_first_of( BAD_CHARS1 )
257  || std::string::npos != aName.find_first_of( BAD_CHARS2 ) )
258  {
259  wxLogTrace( traceVrmlPlugin,
260  wxT( "%s:%s:%d\n"
261  " * [INFO] invalid node name '%s' (contains invalid character)" ),
262  __FILE__, __FUNCTION__, __LINE__, aName );
263 
264  return false;
265  }
266 
267  m_Name = aName;
268 
269  return true;
270 }
#define BAD_CHARS1
#define BAD_CHARS2
std::string m_Name
Definition: vrml2_node.h:171
const wxChar *const traceVrmlPlugin
Flag to enable VRML plugin trace output.
Definition: vrml.cpp:63
static std::set< std::string > badNames
Definition: vrml2_node.cpp:39

References BAD_CHARS1, BAD_CHARS2, badNames, WRL2NODE::m_Name, and traceVrmlPlugin.

Referenced by WRL2BASE::implementDef().

◆ SetParent()

bool WRL2NODE::SetParent ( WRL2NODE aParent,
bool  doUnlink = true 
)
virtualinherited

Set the parent WRL2NODE of this object.

Parameters
aParent[in] is the desired parent node.
doUnlinkindicates that the child must be unlinked from the parent
Returns
true if the operation succeeds of false if the given node is not allowed to be a parent to the derived object.

Reimplemented in WRL2BASE.

Definition at line 339 of file vrml2_node.cpp.

340 {
341  if( aParent == m_Parent )
342  return true;
343 
344  if( nullptr != m_Parent && doUnlink )
345  m_Parent->unlinkChildNode( this );
346 
347  m_Parent = aParent;
348 
349  if( nullptr != m_Parent )
350  m_Parent->AddChildNode( this );
351 
352  return true;
353 }
WRL2NODE * m_Parent
Definition: vrml2_node.h:169
virtual bool AddChildNode(WRL2NODE *aNode)
Definition: vrml2_node.cpp:356
virtual void unlinkChildNode(const WRL2NODE *aNode)
Remove references to an owned child.
Definition: vrml2_node.cpp:407

References WRL2NODE::AddChildNode(), WRL2NODE::m_Parent, and WRL2NODE::unlinkChildNode().

Referenced by WRL2NODE::AddChildNode(), WRL2SWITCH::AddRefNode(), and WRL2TRANSFORM::AddRefNode().

◆ TranslateToSG()

SGNODE * WRL2BOX::TranslateToSG ( SGNODE aParent)
overridevirtual

Produce a representation of the data using the intermediate scenegraph structures of the kicad_3dsg library.

Parameters
aParentis a pointer to the parent SG node.
Returns
is non-NULL on success.

Implements WRL2NODE.

Definition at line 184 of file vrml2_box.cpp.

185 {
186  S3D::SGTYPES ptype = S3D::GetSGNodeType( aParent );
187 
188  wxCHECK_MSG( aParent && ( ptype == S3D::SGTYPE_SHAPE ), nullptr,
189  wxString::Format( wxT( "Box does not have a Shape parent (parent ID: %s)" ),
190  ptype ) );
191 
192  // do not render a bad box
193  if( size.x < 1e-6 || size.y < 1e-6 || size.z < 1e-6 )
194  return nullptr;
195 
196  if( m_sgNode )
197  {
198  if( nullptr != aParent )
199  {
200  if( nullptr == S3D::GetSGNodeParent( m_sgNode )
201  && !S3D::AddSGNodeChild( aParent, m_sgNode ) )
202  {
203  return nullptr;
204  }
205  else if( aParent != S3D::GetSGNodeParent( m_sgNode )
206  && !S3D::AddSGNodeRef( aParent, m_sgNode ) )
207  {
208  return nullptr;
209  }
210  }
211 
212  return m_sgNode;
213  }
214 
215  // create the vertices, triangle indices, and normals
216  float x = size.x / 2.0;
217  float y = size.y / 2.0;
218  float z = size.z / 2.0;
219  std::vector< SGPOINT > vertices;
220  std::vector< SGVECTOR > norms;
221  std::vector< int > idx;
222  int base = 0;
223 
224  // top
225  vertices.emplace_back( -x, -y, z );
226  vertices.emplace_back( x, -y, z );
227  vertices.emplace_back( x, y, z );
228  vertices.emplace_back( -x, y, z );
229  norms.emplace_back( 0.0, 0.0, 1.0 );
230  norms.emplace_back( 0.0, 0.0, 1.0 );
231  norms.emplace_back( 0.0, 0.0, 1.0 );
232  norms.emplace_back( 0.0, 0.0, 1.0 );
233  idx.push_back( base );
234  idx.push_back( base + 1 );
235  idx.push_back( base + 2 );
236  idx.push_back( base );
237  idx.push_back( base + 2 );
238  idx.push_back( base + 3 );
239  base += 4;
240 
241  // bottom
242  vertices.emplace_back( -x, -y, -z );
243  vertices.emplace_back( x, -y, -z );
244  vertices.emplace_back( x, y, -z );
245  vertices.emplace_back( -x, y, -z );
246  norms.emplace_back( 0.0, 0.0, -1.0 );
247  norms.emplace_back( 0.0, 0.0, -1.0 );
248  norms.emplace_back( 0.0, 0.0, -1.0 );
249  norms.emplace_back( 0.0, 0.0, -1.0 );
250  idx.push_back( base );
251  idx.push_back( base + 2 );
252  idx.push_back( base + 1 );
253  idx.push_back( base );
254  idx.push_back( base + 3 );
255  idx.push_back( base + 2 );
256  base += 4;
257 
258  // front
259  vertices.emplace_back( -x, -y, z );
260  vertices.emplace_back( -x, -y, -z );
261  vertices.emplace_back( x, -y, -z );
262  vertices.emplace_back( x, -y, z );
263  norms.emplace_back( 0.0, -1.0, 0.0 );
264  norms.emplace_back( 0.0, -1.0, 0.0 );
265  norms.emplace_back( 0.0, -1.0, 0.0 );
266  norms.emplace_back( 0.0, -1.0, 0.0 );
267  idx.push_back( base );
268  idx.push_back( base + 1 );
269  idx.push_back( base + 2 );
270  idx.push_back( base );
271  idx.push_back( base + 2 );
272  idx.push_back( base + 3 );
273  base += 4;
274 
275  // back
276  vertices.emplace_back( -x, y, z );
277  vertices.emplace_back( -x, y, -z );
278  vertices.emplace_back( x, y, -z );
279  vertices.emplace_back( x, y, z );
280  norms.emplace_back( 0.0, 1.0, 0.0 );
281  norms.emplace_back( 0.0, 1.0, 0.0 );
282  norms.emplace_back( 0.0, 1.0, 0.0 );
283  norms.emplace_back( 0.0, 1.0, 0.0 );
284  idx.push_back( base );
285  idx.push_back( base + 2 );
286  idx.push_back( base + 1 );
287  idx.push_back( base );
288  idx.push_back( base + 3 );
289  idx.push_back( base + 2 );
290  base += 4;
291 
292  // left
293  vertices.emplace_back( -x, -y, -z );
294  vertices.emplace_back( -x, -y, z );
295  vertices.emplace_back( -x, y, z );
296  vertices.emplace_back( -x, y, -z );
297  norms.emplace_back( -1.0, 0.0, 0.0 );
298  norms.emplace_back( -1.0, 0.0, 0.0 );
299  norms.emplace_back( -1.0, 0.0, 0.0 );
300  norms.emplace_back( -1.0, 0.0, 0.0 );
301  idx.push_back( base );
302  idx.push_back( base + 1 );
303  idx.push_back( base + 2 );
304  idx.push_back( base );
305  idx.push_back( base + 2 );
306  idx.push_back( base + 3 );
307  base += 4;
308 
309  // right
310  vertices.emplace_back( x, -y, -z );
311  vertices.emplace_back( x, -y, z );
312  vertices.emplace_back( x, y, z );
313  vertices.emplace_back( x, y, -z );
314  norms.emplace_back( 1.0, 0.0, 0.0 );
315  norms.emplace_back( 1.0, 0.0, 0.0 );
316  norms.emplace_back( 1.0, 0.0, 0.0 );
317  norms.emplace_back( 1.0, 0.0, 0.0 );
318  idx.push_back( base );
319  idx.push_back( base + 2 );
320  idx.push_back( base + 1 );
321  idx.push_back( base );
322  idx.push_back( base + 3 );
323  idx.push_back( base + 2 );
324 
325  IFSG_FACESET fsNode( aParent );
326  IFSG_COORDS cpNode( fsNode );
327  cpNode.SetCoordsList( vertices.size(), &vertices[0] );
328  IFSG_COORDINDEX ciNode( fsNode );
329  ciNode.SetIndices( idx.size(), &idx[0] );
330  IFSG_NORMALS nmNode( fsNode );
331  nmNode.SetNormalList( norms.size(), &norms[0] );
332 
333  m_sgNode = fsNode.GetRawPtr();
334 
335  return m_sgNode;
336 }
IFSG_COORDS is the wrapper for SGCOORDS.
Definition: ifsg_coords.h:40
IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:494
SGLIB_API bool AddSGNodeRef(SGNODE *aParent, SGNODE *aChild)
Definition: ifsg_api.cpp:503
IFSG_NORMALS is the wrapper for the SGNORMALS class.
Definition: ifsg_normals.h:40
SGLIB_API bool AddSGNodeChild(SGNODE *aParent, SGNODE *aChild)
Definition: ifsg_api.cpp:512
SGNODE * m_sgNode
Definition: vrml2_node.h:178
WRLVEC3F size
Definition: vrml2_box.h:53
SGTYPES
Definition: sg_types.h:34
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
SGLIB_API S3D::SGTYPES GetSGNodeType(SGNODE *aNode)
Definition: ifsg_api.cpp:485
IFSG_FACESET is the wrapper for the SGFACESET class.
Definition: ifsg_faceset.h:40

References S3D::AddSGNodeChild(), S3D::AddSGNodeRef(), Format(), IFSG_NODE::GetRawPtr(), S3D::GetSGNodeParent(), S3D::GetSGNodeType(), WRL2NODE::m_sgNode, IFSG_COORDS::SetCoordsList(), IFSG_INDEX::SetIndices(), IFSG_NORMALS::SetNormalList(), S3D::SGTYPE_SHAPE, and size.

◆ unlinkChildNode()

void WRL2NODE::unlinkChildNode ( const WRL2NODE aNode)
virtualinherited

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

Reimplemented in WRL2FACESET, WRL2LINESET, WRL2POINTSET, WRL2APPEARANCE, and WRL2SHAPE.

Definition at line 407 of file vrml2_node.cpp.

408 {
409  std::list< WRL2NODE* >::iterator sL = m_Children.begin();
410  std::list< WRL2NODE* >::iterator eL = m_Children.end();
411 
412  while( sL != eL )
413  {
414  if( *sL == aNode )
415  {
416  m_Children.erase( sL );
417  return;
418  }
419 
420  ++sL;
421  }
422 }
std::list< WRL2NODE * > m_Children
Definition: vrml2_node.h:174

References WRL2NODE::m_Children.

Referenced by WRL2NODE::SetParent(), WRL2APPEARANCE::unlinkChildNode(), WRL2SHAPE::unlinkChildNode(), WRL2LINESET::unlinkChildNode(), WRL2FACESET::unlinkChildNode(), WRL2POINTSET::unlinkChildNode(), and WRL2NODE::~WRL2NODE().

◆ unlinkRefNode()

void WRL2NODE::unlinkRefNode ( const WRL2NODE aNode)
virtualinherited

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

Reimplemented in WRL2FACESET, WRL2LINESET, WRL2POINTSET, WRL2APPEARANCE, and WRL2SHAPE.

Definition at line 425 of file vrml2_node.cpp.

426 {
427  std::list< WRL2NODE* >::iterator sL = m_Refs.begin();
428  std::list< WRL2NODE* >::iterator eL = m_Refs.end();
429 
430  while( sL != eL )
431  {
432  if( *sL == aNode )
433  {
434  m_Refs.erase( sL );
435  return;
436  }
437 
438  ++sL;
439  }
440 }
std::list< WRL2NODE * > m_Refs
Definition: vrml2_node.h:175

References WRL2NODE::m_Refs.

Referenced by WRL2APPEARANCE::unlinkRefNode(), WRL2SHAPE::unlinkRefNode(), WRL2LINESET::unlinkRefNode(), WRL2POINTSET::unlinkRefNode(), and WRL2FACESET::unlinkRefNode().

Member Data Documentation

◆ m_BackPointers

◆ m_Children

◆ m_error

std::string WRL2NODE::m_error
protectedinherited

Definition at line 176 of file vrml2_node.h.

Referenced by WRL2NODE::GetError().

◆ m_Name

std::string WRL2NODE::m_Name
protectedinherited

Definition at line 171 of file vrml2_node.h.

Referenced by WRL2NODE::FindNode(), WRL2NODE::GetName(), and WRL2NODE::SetName().

◆ m_Parent

◆ m_Refs

◆ m_sgNode

◆ m_Type

◆ size

WRLVEC3F WRL2BOX::size
private

Definition at line 53 of file vrml2_box.h.

Referenced by Read(), TranslateToSG(), and WRL2BOX().


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