Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // 27 // >> 28 // $Id: SoTrap.cc 66373 2012-12-18 09:41:34Z gcosmo $ 28 // 29 // 29 /*-----------------------------HEPVis--------- 30 /*-----------------------------HEPVis----------------------------------------*/ 30 /* 31 /* */ 31 /* Node: SoTrap 32 /* Node: SoTrap */ 32 /* Description: Represents the G4Trap Gea 33 /* Description: Represents the G4Trap Geant Geometry entity */ 33 /* Author: Joe Boudreau Nov 11 1996 34 /* Author: Joe Boudreau Nov 11 1996 */ 34 /* 35 /* */ 35 /* 36 /* */ 36 /*-------------------------------------------- 37 /*---------------------------------------------------------------------------*/ 37 38 >> 39 #ifdef G4VIS_BUILD_OI_DRIVER >> 40 38 // this : 41 // this : 39 #include "HEPVis/nodes/SoTrap.h" 42 #include "HEPVis/nodes/SoTrap.h" 40 43 41 #include <assert.h> 44 #include <assert.h> 42 #include <cmath> 45 #include <cmath> 43 #include <Inventor/SbBox.h> 46 #include <Inventor/SbBox.h> 44 #include <Inventor/actions/SoGLRenderAction.h> 47 #include <Inventor/actions/SoGLRenderAction.h> 45 #include <Inventor/actions/SoAction.h> 48 #include <Inventor/actions/SoAction.h> 46 #include <Inventor/fields/SoSFFloat.h> 49 #include <Inventor/fields/SoSFFloat.h> 47 #include <Inventor/misc/SoChildList.h> 50 #include <Inventor/misc/SoChildList.h> 48 #include <Inventor/nodes/SoSeparator.h> 51 #include <Inventor/nodes/SoSeparator.h> 49 #include <Inventor/nodes/SoIndexedFaceSet.h> 52 #include <Inventor/nodes/SoIndexedFaceSet.h> 50 #include <Inventor/nodes/SoNormal.h> 53 #include <Inventor/nodes/SoNormal.h> 51 #include <Inventor/nodes/SoCoordinate3.h> 54 #include <Inventor/nodes/SoCoordinate3.h> 52 #include <Inventor/nodes/SoNormalBinding.h> 55 #include <Inventor/nodes/SoNormalBinding.h> 53 #include <Inventor/SoPrimitiveVertex.h> 56 #include <Inventor/SoPrimitiveVertex.h> 54 #include <Inventor/elements/SoTextureCoordinat 57 #include <Inventor/elements/SoTextureCoordinateElement.h> 55 58 56 #include "HEPVis/SbMath.h" 59 #include "HEPVis/SbMath.h" 57 60 58 // This statement is required 61 // This statement is required 59 SO_NODE_SOURCE(SoTrap) 62 SO_NODE_SOURCE(SoTrap) 60 63 61 // Constructor 64 // Constructor 62 SoTrap::SoTrap() { 65 SoTrap::SoTrap() { 63 // This statement is required 66 // This statement is required 64 SO_NODE_CONSTRUCTOR(SoTrap); 67 SO_NODE_CONSTRUCTOR(SoTrap); 65 68 66 // Data fields are initialized like this: 69 // Data fields are initialized like this: 67 SO_NODE_ADD_FIELD(pDz, (1.0) 70 SO_NODE_ADD_FIELD(pDz, (1.0)); 68 SO_NODE_ADD_FIELD(pTheta, (0.0) 71 SO_NODE_ADD_FIELD(pTheta, (0.0)); 69 SO_NODE_ADD_FIELD(pPhi, (0.0) 72 SO_NODE_ADD_FIELD(pPhi, (0.0)); 70 SO_NODE_ADD_FIELD(pDy1, (1.0) 73 SO_NODE_ADD_FIELD(pDy1, (1.0)); 71 SO_NODE_ADD_FIELD(pDx1, (1.0) 74 SO_NODE_ADD_FIELD(pDx1, (1.0)); 72 SO_NODE_ADD_FIELD(pDx2, (1.0) 75 SO_NODE_ADD_FIELD(pDx2, (1.0)); 73 SO_NODE_ADD_FIELD(pDy2, (1.0) 76 SO_NODE_ADD_FIELD(pDy2, (1.0)); 74 SO_NODE_ADD_FIELD(pDx3, (1.0) 77 SO_NODE_ADD_FIELD(pDx3, (1.0)); 75 SO_NODE_ADD_FIELD(pDx4, (1.0) 78 SO_NODE_ADD_FIELD(pDx4, (1.0)); 76 SO_NODE_ADD_FIELD(pAlp1, (0.0) 79 SO_NODE_ADD_FIELD(pAlp1, (0.0)); 77 SO_NODE_ADD_FIELD(pAlp2, (0.0) 80 SO_NODE_ADD_FIELD(pAlp2, (0.0)); 78 SO_NODE_ADD_FIELD(alternateRep, (NULL 81 SO_NODE_ADD_FIELD(alternateRep, (NULL)); 79 children = new SoChildList(this); 82 children = new SoChildList(this); 80 } 83 } 81 84 82 // Destructor 85 // Destructor 83 SoTrap::~SoTrap() { 86 SoTrap::~SoTrap() { 84 delete children; 87 delete children; 85 } 88 } 86 89 87 90 88 // initClass 91 // initClass 89 void SoTrap::initClass(){ 92 void SoTrap::initClass(){ 90 // This statement is required. 93 // This statement is required. 91 static bool first = true; << 94 SO_NODE_INIT_CLASS(SoTrap,SoShape,"Shape"); 92 if (first) { << 93 first = false; << 94 SO_NODE_INIT_CLASS(SoTrap,SoShape,"Shape") << 95 } << 96 } 95 } 97 96 98 97 99 // generatePrimitives 98 // generatePrimitives 100 void SoTrap::generatePrimitives(SoAction *acti 99 void SoTrap::generatePrimitives(SoAction *action) { 101 // This variable is used to store each verte 100 // This variable is used to store each vertex 102 SoPrimitiveVertex pv; 101 SoPrimitiveVertex pv; 103 102 104 // Access the stat from the action 103 // Access the stat from the action 105 SoState *state = action->getState(); 104 SoState *state = action->getState(); 106 105 107 // See if we have to use a texture coordinat 106 // See if we have to use a texture coordinate function, 108 // rather than generating explicit texture c 107 // rather than generating explicit texture coordinates. 109 SbBool useTexFunction= 108 SbBool useTexFunction= 110 (SoTextureCoordinateElement::getType(state 109 (SoTextureCoordinateElement::getType(state) == 111 SoTextureCoordinateElement::FUNCTION); 110 SoTextureCoordinateElement::FUNCTION); 112 111 113 // If we need to generate texture coordinate 112 // If we need to generate texture coordinates with a function, 114 // we'll need an SoGLTextureCoordinateElemen 113 // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll 115 // set up the coordinates directly. 114 // set up the coordinates directly. 116 const SoTextureCoordinateElement *tce = NULL 115 const SoTextureCoordinateElement *tce = NULL; 117 SbVec4f texCoord; 116 SbVec4f texCoord; 118 if (useTexFunction) { 117 if (useTexFunction) { 119 tce = SoTextureCoordinateElement::getInsta 118 tce = SoTextureCoordinateElement::getInstance(state); 120 } 119 } 121 else { 120 else { 122 texCoord[2] = 0.0; 121 texCoord[2] = 0.0; 123 texCoord[3] = 1.0; 122 texCoord[3] = 1.0; 124 } 123 } 125 SbVec3f point, normal; 124 SbVec3f point, normal; 126 125 127 126 128 ////////////////////////////////////////// 127 ////////////////////////////////////////// 129 //---------------------------------------- 128 //---------------------------------------- 130 #define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ 129 #define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ 131 point.setValue(x,y,z); \ 130 point.setValue(x,y,z); \ 132 normal.setValue(nx,ny,nz); \ 131 normal.setValue(nx,ny,nz); \ 133 if (useTexFunction) { \ 132 if (useTexFunction) { \ 134 texCoord=tce->get(point,normal); \ 133 texCoord=tce->get(point,normal); \ 135 } \ 134 } \ 136 else { \ 135 else { \ 137 texCoord[0]=s; \ 136 texCoord[0]=s; \ 138 texCoord[1]=t; \ 137 texCoord[1]=t; \ 139 } \ 138 } \ 140 pv.setPoint(point); \ 139 pv.setPoint(point); \ 141 pv.setNormal(normal); \ 140 pv.setNormal(normal); \ 142 pv.setTextureCoords(texCoord); \ 141 pv.setTextureCoords(texCoord); \ 143 shapeVertex(&pv); 142 shapeVertex(&pv); 144 //---------------------------------------- 143 //---------------------------------------- 145 ////////////////////////////////////////// 144 ////////////////////////////////////////// 146 145 147 const int NPOINTS=8, NFACES=6, NINDICES = NF 146 const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; 148 int indices[NINDICES] = {3,2,1,0, SO_END_FAC 147 int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back. 149 4,5,6,7, SO_END_FACE_INDEX, //z fron 148 4,5,6,7, SO_END_FACE_INDEX, //z front. 150 0,1,5,4, SO_END_FACE_INDEX, //y up. 149 0,1,5,4, SO_END_FACE_INDEX, //y up. 151 1,2,6,5, SO_END_FACE_INDEX, //x left 150 1,2,6,5, SO_END_FACE_INDEX, //x left. 152 2,3,7,6, SO_END_FACE_INDEX, //y down 151 2,3,7,6, SO_END_FACE_INDEX, //y down. 153 3,0,4,7, SO_END_FACE_INDEX}; //x righ 152 3,0,4,7, SO_END_FACE_INDEX}; //x right. 154 153 155 // points for the eight vertices 154 // points for the eight vertices 156 float TthetaCphi = FTAN(pTheta.getValue())*F 155 float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue()); 157 float TthetaSphi = FTAN(pTheta.getValue())*F 156 float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue()); 158 float Talp1 = FTAN(pAlp1.getValue()); 157 float Talp1 = FTAN(pAlp1.getValue()); 159 float Talp2 = FTAN(pAlp2.getValue()); 158 float Talp2 = FTAN(pAlp2.getValue()); 160 159 161 float points[NPOINTS][3]; 160 float points[NPOINTS][3]; 162 points[0][0] = pDx2.getValue()+pDy1.getValu 161 points[0][0] = pDx2.getValue()+pDy1.getValue()*Talp1; 163 points[0][1] = pDy1.getValue(); 162 points[0][1] = pDy1.getValue(); 164 points[0][2] = -pDz.getValue(); 163 points[0][2] = -pDz.getValue(); 165 164 166 points[1][0] = -pDx2.getValue()+pDy1.getValu 165 points[1][0] = -pDx2.getValue()+pDy1.getValue()*Talp1; 167 points[1][1] = pDy1.getValue(); 166 points[1][1] = pDy1.getValue(); 168 points[1][2] = -pDz.getValue(); 167 points[1][2] = -pDz.getValue(); 169 168 170 points[2][0] = -pDx1.getValue()-pDy1.getValu 169 points[2][0] = -pDx1.getValue()-pDy1.getValue()*Talp1; 171 points[2][1] = -pDy1.getValue(); 170 points[2][1] = -pDy1.getValue(); 172 points[2][2] = -pDz.getValue(); 171 points[2][2] = -pDz.getValue(); 173 172 174 points[3][0] = pDx1.getValue()-pDy1.getValu 173 points[3][0] = pDx1.getValue()-pDy1.getValue()*Talp1; 175 points[3][1] = -pDy1.getValue(); 174 points[3][1] = -pDy1.getValue(); 176 points[3][2] = -pDz.getValue(); 175 points[3][2] = -pDz.getValue(); 177 176 178 points[4][0] = pDx4.getValue()+pDy2.getValu 177 points[4][0] = pDx4.getValue()+pDy2.getValue()*Talp2; 179 points[4][1] = pDy2.getValue(); 178 points[4][1] = pDy2.getValue(); 180 points[4][2] = pDz.getValue(); 179 points[4][2] = pDz.getValue(); 181 180 182 points[5][0] = -pDx4.getValue()+pDy2.getValu 181 points[5][0] = -pDx4.getValue()+pDy2.getValue()*Talp2; 183 points[5][1] = pDy2.getValue(); 182 points[5][1] = pDy2.getValue(); 184 points[5][2] = pDz.getValue(); 183 points[5][2] = pDz.getValue(); 185 184 186 points[6][0] = -pDx3.getValue()-pDy2.getValu 185 points[6][0] = -pDx3.getValue()-pDy2.getValue()*Talp2; 187 points[6][1] = -pDy2.getValue(); 186 points[6][1] = -pDy2.getValue(); 188 points[6][2] = pDz.getValue(); 187 points[6][2] = pDz.getValue(); 189 188 190 points[7][0] = pDx3.getValue()-pDy2.getValu 189 points[7][0] = pDx3.getValue()-pDy2.getValue()*Talp2; 191 points[7][1] = -pDy2.getValue(); 190 points[7][1] = -pDy2.getValue(); 192 points[7][2] = pDz.getValue(); 191 points[7][2] = pDz.getValue(); 193 192 194 int i; 193 int i; 195 for (i=0;i<4;i++) { 194 for (i=0;i<4;i++) { 196 points[i][0] -= pDz.getValue()*TthetaCphi; 195 points[i][0] -= pDz.getValue()*TthetaCphi; 197 points[i][1] -= pDz.getValue()*TthetaSphi; 196 points[i][1] -= pDz.getValue()*TthetaSphi; 198 } 197 } 199 for (i=4;i<8;i++) { 198 for (i=4;i<8;i++) { 200 points[i][0] += pDz.getValue()*TthetaCphi; 199 points[i][0] += pDz.getValue()*TthetaCphi; 201 points[i][1] += pDz.getValue()*TthetaSphi; 200 points[i][1] += pDz.getValue()*TthetaSphi; 202 } 201 } 203 202 204 SbVec3f normals[NFACES]; 203 SbVec3f normals[NFACES]; 205 int nf; 204 int nf; 206 for (nf=0;nf<NFACES;nf++) { 205 for (nf=0;nf<NFACES;nf++) { 207 int j0 = indices[5*nf + 0]; 206 int j0 = indices[5*nf + 0]; 208 int j1 = indices[5*nf + 1]; 207 int j1 = indices[5*nf + 1]; 209 int j2 = indices[5*nf + 2]; 208 int j2 = indices[5*nf + 2]; 210 SbVec3f p0(points[j0][0],points[j0][1],poi 209 SbVec3f p0(points[j0][0],points[j0][1],points[j0][2]); 211 SbVec3f p1(points[j1][0],points[j1][1],poi 210 SbVec3f p1(points[j1][0],points[j1][1],points[j1][2]); 212 SbVec3f p2(points[j2][0],points[j2][1],poi 211 SbVec3f p2(points[j2][0],points[j2][1],points[j2][2]); 213 normals[nf] = (p1-p0).cross(p2-p0); 212 normals[nf] = (p1-p0).cross(p2-p0); 214 normals[nf].normalize(); 213 normals[nf].normalize(); 215 } 214 } 216 215 217 float x,y,z; 216 float x,y,z; 218 int index; 217 int index; 219 for (nf=0;nf<NFACES;nf++) { 218 for (nf=0;nf<NFACES;nf++) { 220 beginShape(action,TRIANGLE_FAN); 219 beginShape(action,TRIANGLE_FAN); 221 index = indices[nf * 5]; 220 index = indices[nf * 5]; 222 x = points[index][0]; 221 x = points[index][0]; 223 y = points[index][1]; 222 y = points[index][1]; 224 z = points[index][2]; 223 z = points[index][2]; 225 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0] 224 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]); 226 index = indices[nf * 5 + 1]; 225 index = indices[nf * 5 + 1]; 227 x = points[index][0]; 226 x = points[index][0]; 228 y = points[index][1]; 227 y = points[index][1]; 229 z = points[index][2]; 228 z = points[index][2]; 230 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0] 229 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]); 231 index = indices[nf * 5 + 2]; 230 index = indices[nf * 5 + 2]; 232 x = points[index][0]; 231 x = points[index][0]; 233 y = points[index][1]; 232 y = points[index][1]; 234 z = points[index][2]; 233 z = points[index][2]; 235 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0] 234 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]); 236 index = indices[nf * 5 + 3]; 235 index = indices[nf * 5 + 3]; 237 x = points[index][0]; 236 x = points[index][0]; 238 y = points[index][1]; 237 y = points[index][1]; 239 z = points[index][2]; 238 z = points[index][2]; 240 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0] 239 GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]); 241 endShape(); 240 endShape(); 242 } 241 } 243 } 242 } 244 243 245 // getChildren 244 // getChildren 246 SoChildList *SoTrap::getChildren() const { 245 SoChildList *SoTrap::getChildren() const { 247 return children; 246 return children; 248 } 247 } 249 248 250 249 251 // computeBBox 250 // computeBBox 252 void SoTrap::computeBBox(SoAction *, SbBox3f & 251 void SoTrap::computeBBox(SoAction *, SbBox3f &box, SbVec3f ¢er ){ 253 float pDx= pDx1.getValue(),pDy=pDy1.getValue 252 float pDx= pDx1.getValue(),pDy=pDy1.getValue(); 254 253 255 if (pDx2.getValue() > pDx) pDx = pDx2.getVal 254 if (pDx2.getValue() > pDx) pDx = pDx2.getValue(); 256 if (pDx3.getValue() > pDx) pDx = pDx3.getVal 255 if (pDx3.getValue() > pDx) pDx = pDx3.getValue(); 257 if (pDx4.getValue() > pDx) pDx = pDx4.getVal 256 if (pDx4.getValue() > pDx) pDx = pDx4.getValue(); 258 if (pDy2.getValue() > pDy) pDy = pDy2.getVal 257 if (pDy2.getValue() > pDy) pDy = pDy2.getValue(); 259 float TthetaCphi = FTAN(pTheta.getValue())*F 258 float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue()); 260 float TthetaSphi = FTAN(pTheta.getValue())*F 259 float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue()); 261 float Xalp = FFABS(std::tan(pAlp1.getValue() 260 float Xalp = FFABS(std::tan(pAlp1.getValue())*pDy1.getValue()); 262 float Xalp2 = FFABS(std::tan(pAlp2.getValue( 261 float Xalp2 = FFABS(std::tan(pAlp2.getValue())*pDy2.getValue()); 263 if (Xalp< Xalp2) Xalp=Xalp2; 262 if (Xalp< Xalp2) Xalp=Xalp2; 264 pDx += FFABS(TthetaCphi*pDz.getValue()); 263 pDx += FFABS(TthetaCphi*pDz.getValue()); 265 pDx += Xalp; 264 pDx += Xalp; 266 pDy += FFABS(TthetaSphi*pDz.getValue()); 265 pDy += FFABS(TthetaSphi*pDz.getValue()); 267 266 268 267 269 center.setValue(0,0,0); 268 center.setValue(0,0,0); 270 box.setBounds(SbVec3f(-pDx,-pDy,-pDz.getValu 269 box.setBounds(SbVec3f(-pDx,-pDy,-pDz.getValue()), 271 SbVec3f( pDx, pDy, pDz.getValue())); 270 SbVec3f( pDx, pDy, pDz.getValue())); 272 } 271 } 273 272 274 273 275 274 276 275 277 // updateChildren 276 // updateChildren 278 void SoTrap::updateChildren() { 277 void SoTrap::updateChildren() { 279 278 280 279 281 // Redraw the G4Trap.... 280 // Redraw the G4Trap.... 282 281 283 assert(children->getLength()==1); 282 assert(children->getLength()==1); 284 SoSeparator *sep = (SoS 283 SoSeparator *sep = (SoSeparator *) ( *children)[0]; 285 SoCoordinate3 *theCoordinates = (SoC 284 SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0)); 286 SoNormal *theNormals = (SoN 285 SoNormal *theNormals = (SoNormal *) ( sep->getChild(1)); 287 SoNormalBinding *theNormalBinding = (SoN 286 SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2)); 288 SoIndexedFaceSet *theFaceSet = (SoI 287 SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3)); 289 288 290 const int NPOINTS=8, NFACES=6, NINDICES = NF 289 const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; 291 float points[NPOINTS][3]; 290 float points[NPOINTS][3]; 292 // Indices for the eight faces 291 // Indices for the eight faces 293 #ifdef INVENTOR2_0 292 #ifdef INVENTOR2_0 294 static long 293 static long 295 #else 294 #else 296 static int32_t 295 static int32_t 297 #endif 296 #endif 298 indices[NINDICES] = {3,2,1,0, SO_END_FACE_IN 297 indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, // bottom 299 4,5,6,7, SO_END_FACE_INDE 298 4,5,6,7, SO_END_FACE_INDEX, // top 300 0,1,5,4, SO_END_FACE_INDE 299 0,1,5,4, SO_END_FACE_INDEX, 301 1,2,6,5, SO_END_FACE_INDE 300 1,2,6,5, SO_END_FACE_INDEX, 302 2,3,7,6, SO_END_FACE_INDE 301 2,3,7,6, SO_END_FACE_INDEX, 303 3,0,4,7, SO_END_FACE_INDE 302 3,0,4,7, SO_END_FACE_INDEX}; 304 303 305 304 306 // points for the eight vertices 305 // points for the eight vertices 307 float TthetaCphi = FTAN(pTheta.getValue())*F 306 float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue()); 308 float TthetaSphi = FTAN(pTheta.getValue())*F 307 float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue()); 309 float Talp1 = FTAN(pAlp1.getValue()); 308 float Talp1 = FTAN(pAlp1.getValue()); 310 float Talp2 = FTAN(pAlp2.getValue()); 309 float Talp2 = FTAN(pAlp2.getValue()); 311 310 312 points[0][0] = pDx2.getValue()+pDy1.getValu 311 points[0][0] = pDx2.getValue()+pDy1.getValue()*Talp1; 313 points[0][1] = pDy1.getValue(); 312 points[0][1] = pDy1.getValue(); 314 points[0][2] = -pDz.getValue(); 313 points[0][2] = -pDz.getValue(); 315 314 316 points[1][0] = -pDx2.getValue()+pDy1.getValu 315 points[1][0] = -pDx2.getValue()+pDy1.getValue()*Talp1; 317 points[1][1] = pDy1.getValue(); 316 points[1][1] = pDy1.getValue(); 318 points[1][2] = -pDz.getValue(); 317 points[1][2] = -pDz.getValue(); 319 318 320 points[2][0] = -pDx1.getValue()-pDy1.getValu 319 points[2][0] = -pDx1.getValue()-pDy1.getValue()*Talp1; 321 points[2][1] = -pDy1.getValue(); 320 points[2][1] = -pDy1.getValue(); 322 points[2][2] = -pDz.getValue(); 321 points[2][2] = -pDz.getValue(); 323 322 324 points[3][0] = pDx1.getValue()-pDy1.getValu 323 points[3][0] = pDx1.getValue()-pDy1.getValue()*Talp1; 325 points[3][1] = -pDy1.getValue(); 324 points[3][1] = -pDy1.getValue(); 326 points[3][2] = -pDz.getValue(); 325 points[3][2] = -pDz.getValue(); 327 326 328 points[4][0] = pDx4.getValue()+pDy2.getValu 327 points[4][0] = pDx4.getValue()+pDy2.getValue()*Talp2; 329 points[4][1] = pDy2.getValue(); 328 points[4][1] = pDy2.getValue(); 330 points[4][2] = pDz.getValue(); 329 points[4][2] = pDz.getValue(); 331 330 332 points[5][0] = -pDx4.getValue()+pDy2.getValu 331 points[5][0] = -pDx4.getValue()+pDy2.getValue()*Talp2; 333 points[5][1] = pDy2.getValue(); 332 points[5][1] = pDy2.getValue(); 334 points[5][2] = pDz.getValue(); 333 points[5][2] = pDz.getValue(); 335 334 336 points[6][0] = -pDx3.getValue()-pDy2.getValu 335 points[6][0] = -pDx3.getValue()-pDy2.getValue()*Talp2; 337 points[6][1] = -pDy2.getValue(); 336 points[6][1] = -pDy2.getValue(); 338 points[6][2] = pDz.getValue(); 337 points[6][2] = pDz.getValue(); 339 338 340 points[7][0] = pDx3.getValue()-pDy2.getValu 339 points[7][0] = pDx3.getValue()-pDy2.getValue()*Talp2; 341 points[7][1] = -pDy2.getValue(); 340 points[7][1] = -pDy2.getValue(); 342 points[7][2] = pDz.getValue(); 341 points[7][2] = pDz.getValue(); 343 342 344 int i; 343 int i; 345 for (i=0;i<4;i++) { 344 for (i=0;i<4;i++) { 346 points[i][0] -= pDz.getValue()*TthetaCphi; 345 points[i][0] -= pDz.getValue()*TthetaCphi; 347 points[i][1] -= pDz.getValue()*TthetaSphi; 346 points[i][1] -= pDz.getValue()*TthetaSphi; 348 } 347 } 349 for (i=4;i<8;i++) { 348 for (i=4;i<8;i++) { 350 points[i][0] += pDz.getValue()*TthetaCphi; 349 points[i][0] += pDz.getValue()*TthetaCphi; 351 points[i][1] += pDz.getValue()*TthetaSphi; 350 points[i][1] += pDz.getValue()*TthetaSphi; 352 } 351 } 353 352 354 for (int np=0;np<NPOINTS;np++) theCoordinate 353 for (int np=0;np<NPOINTS;np++) theCoordinates->point.set1Value(np,points[np][0],points[np][1],points[np][2]); 355 theFaceSet->coordIndex.setValues(0,NINDICES, 354 theFaceSet->coordIndex.setValues(0,NINDICES,indices); 356 theNormals->vector.deleteValues(0); 355 theNormals->vector.deleteValues(0); 357 theNormals->vector.insertSpace(0,6); 356 theNormals->vector.insertSpace(0,6); 358 for (int n=0;n<6;n++) { 357 for (int n=0;n<6;n++) { 359 int i0 = 5*n+0,i1=5*n+1,i2=5*n+2; 358 int i0 = 5*n+0,i1=5*n+1,i2=5*n+2; 360 int j0 = theFaceSet->coordIndex[i0]; 359 int j0 = theFaceSet->coordIndex[i0]; 361 int j1 = theFaceSet->coordIndex[i1]; 360 int j1 = theFaceSet->coordIndex[i1]; 362 int j2 = theFaceSet->coordIndex[i2]; 361 int j2 = theFaceSet->coordIndex[i2]; 363 SbVec3f p0= theCoordinates->point[j0]; 362 SbVec3f p0= theCoordinates->point[j0]; 364 SbVec3f p1= theCoordinates->point[j1]; 363 SbVec3f p1= theCoordinates->point[j1]; 365 SbVec3f p2= theCoordinates->point[j2]; 364 SbVec3f p2= theCoordinates->point[j2]; 366 SbVec3f normal = (p1-p0).cross(p2-p0); 365 SbVec3f normal = (p1-p0).cross(p2-p0); 367 normal.normalize(); 366 normal.normalize(); 368 theNormals->vector.set1Value(n,normal); 367 theNormals->vector.set1Value(n,normal); 369 } 368 } 370 theNormalBinding->value=SoNormalBinding::PER 369 theNormalBinding->value=SoNormalBinding::PER_FACE; 371 } 370 } 372 371 373 // generateChildren 372 // generateChildren 374 void SoTrap::generateChildren() { 373 void SoTrap::generateChildren() { 375 374 376 // This routines creates one SoSeparator, on 375 // This routines creates one SoSeparator, one SoCoordinate3, and 377 // one SoLineSet, and puts it in the child l 376 // one SoLineSet, and puts it in the child list. This is done only 378 // once, whereas redrawing the position of t 377 // once, whereas redrawing the position of the coordinates occurs each 379 // time an update is necessary, in the updat 378 // time an update is necessary, in the updateChildren routine. 380 379 381 assert(children->getLength() ==0); 380 assert(children->getLength() ==0); 382 SoSeparator *sep = new SoS 381 SoSeparator *sep = new SoSeparator(); 383 SoCoordinate3 *theCoordinates = new SoC 382 SoCoordinate3 *theCoordinates = new SoCoordinate3(); 384 SoNormal *theNormals = new SoN 383 SoNormal *theNormals = new SoNormal(); 385 SoNormalBinding *theNormalBinding = new SoN 384 SoNormalBinding *theNormalBinding = new SoNormalBinding(); 386 SoIndexedFaceSet *theFaceSet = new SoI 385 SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet(); 387 // 386 // 388 // This line costs some in render quality! b 387 // This line costs some in render quality! but gives speed. 389 // 388 // 390 sep->addChild(theCoordinates); 389 sep->addChild(theCoordinates); 391 sep->addChild(theNormals); 390 sep->addChild(theNormals); 392 sep->addChild(theNormalBinding); 391 sep->addChild(theNormalBinding); 393 sep->addChild(theFaceSet); 392 sep->addChild(theFaceSet); 394 children->append(sep); 393 children->append(sep); 395 } 394 } 396 395 397 // generateAlternateRep 396 // generateAlternateRep 398 void SoTrap::generateAlternateRep() { 397 void SoTrap::generateAlternateRep() { 399 398 400 // This routine sets the alternate represent 399 // This routine sets the alternate representation to the child 401 // list of this mode. 400 // list of this mode. 402 401 403 if (children->getLength() == 0) generateChil 402 if (children->getLength() == 0) generateChildren(); 404 updateChildren(); 403 updateChildren(); 405 alternateRep.setValue((SoSeparator *) ( *ch 404 alternateRep.setValue((SoSeparator *) ( *children)[0]); 406 } 405 } 407 406 408 // clearAlternateRep 407 // clearAlternateRep 409 void SoTrap::clearAlternateRep() { 408 void SoTrap::clearAlternateRep() { 410 alternateRep.setValue(NULL); 409 alternateRep.setValue(NULL); 411 } 410 } >> 411 >> 412 #endif 412 413