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}
WRLVEC3F size
Definition: vrml2_box.h:53
WRL2NODES m_Type
Definition: vrml2_node.h:170

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}
WRL2NODE * m_Parent
Definition: vrml2_node.h:169
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}
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}

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::string m_Name
Definition: vrml2_node.h:171
std::list< WRL2NODE * > m_Children
Definition: vrml2_node.h:174
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}

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}

References nodenames, WRL2_BASE, WRL2_BEGIN, and WRL2_END.

Referenced by WRL2APPEARANCE::AddChildNode(), WRL2FACESET::AddChildNode(), WRL2LINESET::AddChildNode(), WRL2POINTSET::AddChildNode(), WRL2SHAPE::AddChildNode(), WRL2APPEARANCE::AddRefNode(), WRL2FACESET::AddRefNode(), WRL2LINESET::AddRefNode(), WRL2POINTSET::AddRefNode(), and WRL2SHAPE::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}
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
char Peek(void)
Definition: wrlproc.cpp:2007
std::string GetFileName(void)
Definition: wrlproc.cpp:1995
std::string GetError(void)
Definition: wrlproc.cpp:1960
bool eof(void)
Definition: wrlproc.cpp:1954
bool ReadName(std::string &aName)
Definition: wrlproc.cpp:289
std::string GetFilePosition() const
Definition: wrlproc.cpp:1982
bool ReadSFVec3f(WRLVEC3F &aSFVec3f)
Definition: wrlproc.cpp:1082

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_CHARS2
#define BAD_CHARS1
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}
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 vertices.reserve( 6 * 4 );
225 norms.reserve( 6 * 4 );
226 idx.reserve( 6 * 6 );
227
228 // top
229 vertices.emplace_back( -x, -y, z );
230 vertices.emplace_back( x, -y, z );
231 vertices.emplace_back( x, y, z );
232 vertices.emplace_back( -x, y, z );
233 norms.emplace_back( 0.0, 0.0, 1.0 );
234 norms.emplace_back( 0.0, 0.0, 1.0 );
235 norms.emplace_back( 0.0, 0.0, 1.0 );
236 norms.emplace_back( 0.0, 0.0, 1.0 );
237 idx.push_back( base );
238 idx.push_back( base + 1 );
239 idx.push_back( base + 2 );
240 idx.push_back( base );
241 idx.push_back( base + 2 );
242 idx.push_back( base + 3 );
243 base += 4;
244
245 // bottom
246 vertices.emplace_back( -x, -y, -z );
247 vertices.emplace_back( x, -y, -z );
248 vertices.emplace_back( x, y, -z );
249 vertices.emplace_back( -x, y, -z );
250 norms.emplace_back( 0.0, 0.0, -1.0 );
251 norms.emplace_back( 0.0, 0.0, -1.0 );
252 norms.emplace_back( 0.0, 0.0, -1.0 );
253 norms.emplace_back( 0.0, 0.0, -1.0 );
254 idx.push_back( base );
255 idx.push_back( base + 2 );
256 idx.push_back( base + 1 );
257 idx.push_back( base );
258 idx.push_back( base + 3 );
259 idx.push_back( base + 2 );
260 base += 4;
261
262 // front
263 vertices.emplace_back( -x, -y, z );
264 vertices.emplace_back( -x, -y, -z );
265 vertices.emplace_back( x, -y, -z );
266 vertices.emplace_back( x, -y, z );
267 norms.emplace_back( 0.0, -1.0, 0.0 );
268 norms.emplace_back( 0.0, -1.0, 0.0 );
269 norms.emplace_back( 0.0, -1.0, 0.0 );
270 norms.emplace_back( 0.0, -1.0, 0.0 );
271 idx.push_back( base );
272 idx.push_back( base + 1 );
273 idx.push_back( base + 2 );
274 idx.push_back( base );
275 idx.push_back( base + 2 );
276 idx.push_back( base + 3 );
277 base += 4;
278
279 // back
280 vertices.emplace_back( -x, y, z );
281 vertices.emplace_back( -x, y, -z );
282 vertices.emplace_back( x, y, -z );
283 vertices.emplace_back( x, y, z );
284 norms.emplace_back( 0.0, 1.0, 0.0 );
285 norms.emplace_back( 0.0, 1.0, 0.0 );
286 norms.emplace_back( 0.0, 1.0, 0.0 );
287 norms.emplace_back( 0.0, 1.0, 0.0 );
288 idx.push_back( base );
289 idx.push_back( base + 2 );
290 idx.push_back( base + 1 );
291 idx.push_back( base );
292 idx.push_back( base + 3 );
293 idx.push_back( base + 2 );
294 base += 4;
295
296 // left
297 vertices.emplace_back( -x, -y, -z );
298 vertices.emplace_back( -x, -y, z );
299 vertices.emplace_back( -x, y, z );
300 vertices.emplace_back( -x, y, -z );
301 norms.emplace_back( -1.0, 0.0, 0.0 );
302 norms.emplace_back( -1.0, 0.0, 0.0 );
303 norms.emplace_back( -1.0, 0.0, 0.0 );
304 norms.emplace_back( -1.0, 0.0, 0.0 );
305 idx.push_back( base );
306 idx.push_back( base + 1 );
307 idx.push_back( base + 2 );
308 idx.push_back( base );
309 idx.push_back( base + 2 );
310 idx.push_back( base + 3 );
311 base += 4;
312
313 // right
314 vertices.emplace_back( x, -y, -z );
315 vertices.emplace_back( x, -y, z );
316 vertices.emplace_back( x, y, z );
317 vertices.emplace_back( x, y, -z );
318 norms.emplace_back( 1.0, 0.0, 0.0 );
319 norms.emplace_back( 1.0, 0.0, 0.0 );
320 norms.emplace_back( 1.0, 0.0, 0.0 );
321 norms.emplace_back( 1.0, 0.0, 0.0 );
322 idx.push_back( base );
323 idx.push_back( base + 2 );
324 idx.push_back( base + 1 );
325 idx.push_back( base );
326 idx.push_back( base + 3 );
327 idx.push_back( base + 2 );
328
329 IFSG_FACESET fsNode( aParent );
330 IFSG_COORDS cpNode( fsNode );
331 cpNode.SetCoordsList( vertices.size(), &vertices[0] );
332 IFSG_COORDINDEX ciNode( fsNode );
333 ciNode.SetIndices( idx.size(), &idx[0] );
334 IFSG_NORMALS nmNode( fsNode );
335 nmNode.SetNormalList( norms.size(), &norms[0] );
336
337 m_sgNode = fsNode.GetRawPtr();
338
339 return m_sgNode;
340}
IFSG_COORDINDEX is the wrapper for SGCOORDINDEX.
IFSG_COORDS is the wrapper for SGCOORDS.
Definition: ifsg_coords.h:41
IFSG_FACESET is the wrapper for the SGFACESET class.
Definition: ifsg_faceset.h:41
IFSG_NORMALS is the wrapper for the SGNORMALS class.
Definition: ifsg_normals.h:41
SGNODE * m_sgNode
Definition: vrml2_node.h:178
SGLIB_API S3D::SGTYPES GetSGNodeType(SGNODE *aNode)
Definition: ifsg_api.cpp:485
SGLIB_API SGNODE * GetSGNodeParent(SGNODE *aNode)
Definition: ifsg_api.cpp:494
SGTYPES
Definition: sg_types.h:35
@ SGTYPE_SHAPE
Definition: sg_types.h:44
SGLIB_API bool AddSGNodeChild(SGNODE *aParent, SGNODE *aChild)
Definition: ifsg_api.cpp:512
SGLIB_API bool AddSGNodeRef(SGNODE *aParent, SGNODE *aChild)
Definition: ifsg_api.cpp:503
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

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 WRL2APPEARANCE, WRL2FACESET, WRL2LINESET, WRL2POINTSET, 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}

References WRL2NODE::m_Children.

Referenced by WRL2NODE::SetParent(), WRL2APPEARANCE::unlinkChildNode(), WRL2FACESET::unlinkChildNode(), WRL2LINESET::unlinkChildNode(), WRL2POINTSET::unlinkChildNode(), WRL2SHAPE::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 WRL2APPEARANCE, WRL2FACESET, WRL2LINESET, WRL2POINTSET, 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(), WRL2FACESET::unlinkRefNode(), WRL2LINESET::unlinkRefNode(), WRL2POINTSET::unlinkRefNode(), and WRL2SHAPE::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: