Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
SoTrd Class Reference

#include <SoTrd.h>

+ Inheritance diagram for SoTrd:

Public Member Functions

 SoTrd ()
 Constructor, required.
 
virtual void generateAlternateRep ()
 
virtual void clearAlternateRep ()
 We better be able to clear it, too!
 

Static Public Member Functions

static void initClass ()
 Class Initializer, required.
 

Public Attributes

SoSFFloat fDx1
 half-length of x, at -fDz
 
SoSFFloat fDx2
 half-length of x, at +fDz
 
SoSFFloat fDy1
 half-length of y, at -fDz
 
SoSFFloat fDy2
 half-length of y, at +fDz
 
SoSFFloat fDz
 half-length along Z
 
SoSFNode alternateRep
 Alternate rep - required.
 

Protected Member Functions

virtual void computeBBox (SoAction *action, SbBox3f &box, SbVec3f &center)
 compute bounding Box, required
 
virtual void generatePrimitives (SoAction *action)
 Generate Primitives, required.
 
virtual SoChildList * getChildren () const
 GetChildList, required whenever the class has hidden children.
 
virtual ~SoTrd ()
 Destructor, required.
 

Detailed Description

Definition at line 62 of file SoTrd.h.

Constructor & Destructor Documentation

◆ SoTrd()

SoTrd::SoTrd ( )

Constructor, required.

Definition at line 67 of file SoTrd.cc.

67 {
68 // This statement is required
69 SO_NODE_CONSTRUCTOR(SoTrd);
70 // Data fields are initialized like this:
71 SO_NODE_ADD_FIELD(fDx1,(1.0));
72 SO_NODE_ADD_FIELD(fDx2,(1.0));
73 SO_NODE_ADD_FIELD(fDy1,(1.0));
74 SO_NODE_ADD_FIELD(fDy2,(1.0));
75 SO_NODE_ADD_FIELD(fDz,(1.0));
76 SO_NODE_ADD_FIELD(alternateRep,(NULL));
77 children = new SoChildList(this);
78}
Definition: SoTrd.h:62

◆ ~SoTrd()

SoTrd::~SoTrd ( )
protectedvirtual

Destructor, required.

Definition at line 80 of file SoTrd.cc.

80 {
81 delete children;
82}

Member Function Documentation

◆ clearAlternateRep()

void SoTrd::clearAlternateRep ( )
virtual

We better be able to clear it, too!

Definition at line 343 of file SoTrd.cc.

343 {
344 alternateRep.setValue(NULL);
345}
SoSFNode alternateRep
Alternate rep - required.
Definition: SoTrd.h:99

◆ computeBBox()

void SoTrd::computeBBox ( SoAction *  action,
SbBox3f &  box,
SbVec3f &  center 
)
protectedvirtual

compute bounding Box, required

Definition at line 230 of file SoTrd.cc.

230 {
231 float fDx= fDx1.getValue(),fDy=fDy1.getValue();
232
233 if (fDx2.getValue() > fDx) fDx = fDx2.getValue();
234 if (fDy2.getValue() > fDy) fDy = fDy2.getValue();
235
236 SbVec3f vmin(-fDx,-fDy,-fDz.getValue()),
237 vmax( fDx, fDy, fDz.getValue());
238
239 center.setValue(0,0,0);
240 box.setBounds(vmin,vmax);
241}
SoSFFloat fDx2
half-length of x, at +fDz
Definition: SoTrd.h:79
SoSFFloat fDy2
half-length of y, at +fDz
Definition: SoTrd.h:89
SoSFFloat fDy1
half-length of y, at -fDz
Definition: SoTrd.h:84
SoSFFloat fDx1
half-length of x, at -fDz
Definition: SoTrd.h:74
SoSFFloat fDz
half-length along Z
Definition: SoTrd.h:94

◆ generateAlternateRep()

void SoTrd::generateAlternateRep ( )
virtual

Generate AlternateRep, required. Generating an alternate representation must be done upon users request. It allows an Inventor program to read back the file without requiring this code to be dynamically linked. If the users expects that this code will be dynamically linked, he need not invoke this method.

Definition at line 332 of file SoTrd.cc.

332 {
333
334 // This routine sets the alternate representation to the child
335 // list of this mode.
336
337 if (children->getLength() == 0) generateChildren();
338 updateChildren();
339 alternateRep.setValue((SoSeparator *) ( *children)[0]);
340}

◆ generatePrimitives()

void SoTrd::generatePrimitives ( SoAction *  action)
protectedvirtual

Generate Primitives, required.

Definition at line 84 of file SoTrd.cc.

84 {
85 // This variable is used to store each vertex
86 SoPrimitiveVertex pv;
87
88 // Access the stat from the action
89 SoState *state = action->getState();
90
91 // See if we have to use a texture coordinate function,
92 // rather than generating explicit texture coordinates.
93 SbBool useTexFunction=
94 (SoTextureCoordinateElement::getType(state) ==
95 SoTextureCoordinateElement::FUNCTION);
96
97 // If we need to generate texture coordinates with a function,
98 // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll
99 // set up the coordinates directly.
100 const SoTextureCoordinateElement *tce = NULL;
101 SbVec4f texCoord;
102 if (useTexFunction) {
103 tce = SoTextureCoordinateElement::getInstance(state);
104 }
105 else {
106 texCoord[2] = 0.0;
107 texCoord[3] = 1.0;
108 }
109 SbVec3f point, normal;
110
111
112 //////////////////////////////////////////
113 //----------------------------------------
114#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
115 point.setValue(x,y,z); \
116 normal.setValue(nx,ny,nz); \
117 if (useTexFunction) { \
118 texCoord=tce->get(point,normal); \
119 } \
120 else { \
121 texCoord[0]=s; \
122 texCoord[1]=t; \
123 } \
124 pv.setPoint(point); \
125 pv.setNormal(normal); \
126 pv.setTextureCoords(texCoord); \
127 shapeVertex(&pv);
128 //----------------------------------------
129 //////////////////////////////////////////
130
131 const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5;
132 int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back.
133 4,5,6,7, SO_END_FACE_INDEX, //z front.
134 0,1,5,4, SO_END_FACE_INDEX, //y up.
135 1,2,6,5, SO_END_FACE_INDEX, //x left.
136 2,3,7,6, SO_END_FACE_INDEX, //y down.
137 3,0,4,7, SO_END_FACE_INDEX}; //x right.
138
139
140 // points for the eight vertices
141 float points[NPOINTS][3];
142 points[0][0] = fDx1.getValue();
143 points[0][1] = fDy1.getValue();
144 points[0][2] = -fDz.getValue();
145
146 points[1][0] = -fDx1.getValue();
147 points[1][1] = fDy1.getValue();
148 points[1][2] = -fDz.getValue();
149
150 points[2][0] = -fDx1.getValue();
151 points[2][1] = -fDy1.getValue();
152 points[2][2] = -fDz.getValue();
153
154 points[3][0] = fDx1.getValue();
155 points[3][1] = -fDy1.getValue();
156 points[3][2] = -fDz.getValue();
157
158 points[4][0] = fDx2.getValue();
159 points[4][1] = fDy2.getValue();
160 points[4][2] = fDz.getValue();
161
162 points[5][0] = -fDx2.getValue();
163 points[5][1] = fDy2.getValue();
164 points[5][2] = fDz.getValue();
165
166 points[6][0] = -fDx2.getValue();
167 points[6][1] = -fDy2.getValue();
168 points[6][2] = fDz.getValue();
169
170 points[7][0] = fDx2.getValue();
171 points[7][1] = -fDy2.getValue();
172 points[7][2] = fDz.getValue();
173
174 float t1 = FATAN((fDx2.getValue()-fDx1.getValue())/(2*fDz.getValue()));
175 float t2 = FATAN((fDy2.getValue()-fDy1.getValue())/(2*fDz.getValue()));
176 float st1 = FSIN(t1);
177 float st2 = FSIN(t2);
178 float ct1 = FCOS(t1);
179 float ct2 = FCOS(t2);
180
181 float normals[NFACES][3];
182 //z back.
183 normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1;
184 //z front.
185 normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1;
186 //y up.
187 normals[2][0] = 0 ; normals[2][1] = ct2; normals [2][2] = -st2;
188 //x left.
189 normals[3][0] = -ct1; normals[3][1] = 0; normals [3][2] = -st1;
190 //y down.
191 normals[4][0] = 0 ; normals[4][1] = -ct2; normals [4][2] = -st2;
192 //x right.
193 normals[5][0] = ct1; normals[5][1] = 0; normals [5][2] = -st1;
194
195 float x,y,z;
196 int index;
197 for (int nf=0;nf<NFACES;nf++) {
198 beginShape(action,TRIANGLE_FAN);
199 index = indices[nf * 5];
200 x = points[index][0];
201 y = points[index][1];
202 z = points[index][2];
203 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
204 index = indices[nf * 5 + 1];
205 x = points[index][0];
206 y = points[index][1];
207 z = points[index][2];
208 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
209 index = indices[nf * 5 + 2];
210 x = points[index][0];
211 y = points[index][1];
212 z = points[index][2];
213 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
214 index = indices[nf * 5 + 3];
215 x = points[index][0];
216 y = points[index][1];
217 z = points[index][2];
218 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
219 endShape();
220 }
221}
#define FCOS(x)
Definition: SbMath.h:40
#define FSIN(x)
Definition: SbMath.h:41
#define FATAN(x)
Definition: SbMath.h:45
#define GEN_VERTEX(pv, x, y, z, s, t, nx, ny, nz)

◆ getChildren()

SoChildList * SoTrd::getChildren ( ) const
protectedvirtual

GetChildList, required whenever the class has hidden children.

Definition at line 224 of file SoTrd.cc.

224 {
225 return children;
226}

◆ initClass()

void SoTrd::initClass ( )
static

Class Initializer, required.

Definition at line 59 of file SoTrd.cc.

59 {
60 static bool first = true;
61 if (first) {
62 first = false;
63 SO_NODE_INIT_CLASS(SoTrd,SoShape,"Shape");
64 }
65}

Referenced by G4OpenInventor::InitNodes().

Member Data Documentation

◆ alternateRep

SoSFNode SoTrd::alternateRep

Alternate rep - required.

Definition at line 99 of file SoTrd.h.

Referenced by clearAlternateRep(), generateAlternateRep(), and SoTrd().

◆ fDx1

SoSFFloat SoTrd::fDx1

half-length of x, at -fDz

Definition at line 74 of file SoTrd.h.

Referenced by computeBBox(), generatePrimitives(), and SoTrd().

◆ fDx2

SoSFFloat SoTrd::fDx2

half-length of x, at +fDz

Definition at line 79 of file SoTrd.h.

Referenced by computeBBox(), generatePrimitives(), and SoTrd().

◆ fDy1

SoSFFloat SoTrd::fDy1

half-length of y, at -fDz

Definition at line 84 of file SoTrd.h.

Referenced by computeBBox(), generatePrimitives(), and SoTrd().

◆ fDy2

SoSFFloat SoTrd::fDy2

half-length of y, at +fDz

Definition at line 89 of file SoTrd.h.

Referenced by computeBBox(), generatePrimitives(), and SoTrd().

◆ fDz

SoSFFloat SoTrd::fDz

half-length along Z

Definition at line 94 of file SoTrd.h.

Referenced by computeBBox(), generatePrimitives(), and SoTrd().


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