Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenInventor/src/SoCons.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/OpenInventor/src/SoCons.cc (Version 11.3.0) and /visualization/OpenInventor/src/SoCons.cc (Version 10.3.p1)


  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: SoCons.cc 66373 2012-12-18 09:41:34Z gcosmo $
 28 //                                                 29 //
 29 /*-----------------------------HEPVis---------     30 /*-----------------------------HEPVis---------------------------------------*/
 30 /*                                                 31 /*                                                                          */
 31 /* Node:             SoCons                        32 /* Node:             SoCons                                                 */
 32 /* Description:      Represents the G4Cons Gea     33 /* Description:      Represents the G4Cons Geant Geometry entity            */
 33 /* Author:           Joe Boudreau Nov 11 1996      34 /* Author:           Joe Boudreau Nov 11 1996                               */
 34 /*                                                 35 /*                                                                          */
 35 /*--------------------------------------------     36 /*--------------------------------------------------------------------------*/
 36                                                    37 
                                                   >>  38 #ifdef G4VIS_BUILD_OI_DRIVER
                                                   >>  39 
 37 // this :                                          40 // this :
 38 #include "HEPVis/nodes/SoCons.h"                   41 #include "HEPVis/nodes/SoCons.h"
 39                                                    42 
 40 #include <assert.h>                                43 #include <assert.h>
 41 #include <cmath>                                   44 #include <cmath>
 42 #include <Inventor/SbBox.h>                        45 #include <Inventor/SbBox.h>
 43 #include <Inventor/actions/SoAction.h>             46 #include <Inventor/actions/SoAction.h>
 44 #include <Inventor/fields/SoSFFloat.h>             47 #include <Inventor/fields/SoSFFloat.h>
 45 #include <Inventor/misc/SoChildList.h>             48 #include <Inventor/misc/SoChildList.h>
 46 #include <Inventor/nodes/SoSeparator.h>            49 #include <Inventor/nodes/SoSeparator.h>
 47 #include <Inventor/nodes/SoIndexedFaceSet.h>       50 #include <Inventor/nodes/SoIndexedFaceSet.h>
 48 #include <Inventor/nodes/SoNormal.h>               51 #include <Inventor/nodes/SoNormal.h>
 49 #include <Inventor/nodes/SoCoordinate3.h>          52 #include <Inventor/nodes/SoCoordinate3.h>
 50 #include <Inventor/nodes/SoNormalBinding.h>        53 #include <Inventor/nodes/SoNormalBinding.h>
 51 #include <Inventor/SoPrimitiveVertex.h>            54 #include <Inventor/SoPrimitiveVertex.h>
 52 #include <Inventor/elements/SoTextureCoordinat     55 #include <Inventor/elements/SoTextureCoordinateElement.h>
 53                                                    56 
 54 #include "HEPVis/SbMath.h"                         57 #include "HEPVis/SbMath.h"
 55                                                    58 
 56 // This statement is required                      59 // This statement is required
 57 SO_NODE_SOURCE(SoCons)                             60 SO_NODE_SOURCE(SoCons)
 58                                                    61 
 59 // Constructor                                     62 // Constructor
 60 SoCons::SoCons() {                                 63 SoCons::SoCons() {
 61   // This statement is required                    64   // This statement is required
 62   SO_NODE_CONSTRUCTOR(SoCons);                     65   SO_NODE_CONSTRUCTOR(SoCons);
 63                                                    66 
 64   // Data fields are initialized like this:        67   // Data fields are initialized like this:
 65   SO_NODE_ADD_FIELD(fRmin1,               (0.0     68   SO_NODE_ADD_FIELD(fRmin1,               (0.0));
 66   SO_NODE_ADD_FIELD(fRmin2,               (0.0     69   SO_NODE_ADD_FIELD(fRmin2,               (0.0));
 67   SO_NODE_ADD_FIELD(fRmax1,               (1.0     70   SO_NODE_ADD_FIELD(fRmax1,               (1.0));
 68   SO_NODE_ADD_FIELD(fRmax2,               (1.0     71   SO_NODE_ADD_FIELD(fRmax2,               (1.0));
 69   SO_NODE_ADD_FIELD(fDz,                 (10.0     72   SO_NODE_ADD_FIELD(fDz,                 (10.0));
 70   SO_NODE_ADD_FIELD(fSPhi,                (0.0     73   SO_NODE_ADD_FIELD(fSPhi,                (0.0));
 71   SO_NODE_ADD_FIELD(fDPhi,             ((float     74   SO_NODE_ADD_FIELD(fDPhi,             ((float)(2*M_PI)));
 72   SO_NODE_ADD_FIELD(smoothDraw,          (TRUE     75   SO_NODE_ADD_FIELD(smoothDraw,          (TRUE));
 73   SO_NODE_ADD_FIELD(alternateRep,        (NULL     76   SO_NODE_ADD_FIELD(alternateRep,        (NULL));
 74   children = new SoChildList(this);                77   children = new SoChildList(this);
 75 }                                                  78 }
 76                                                    79 
 77 // Destructor                                      80 // Destructor
 78 SoCons::~SoCons() {                                81 SoCons::~SoCons() {
 79   delete children;                                 82   delete children;
 80 }                                                  83 }
 81                                                    84 
 82                                                    85 
 83 // initClass                                       86 // initClass
 84 void SoCons::initClass(){                          87 void SoCons::initClass(){
 85   // This statement is required.                   88   // This statement is required.
 86   static bool first = true;                    <<  89   SO_NODE_INIT_CLASS(SoCons,SoShape,"Shape");
 87   if (first) {                                 << 
 88     first = false;                             << 
 89     SO_NODE_INIT_CLASS(SoCons,SoShape,"Shape") << 
 90   }                                            << 
 91 }                                                  90 }
 92                                                    91 
 93                                                    92 
 94 // generatePrimitives                              93 // generatePrimitives
 95 void SoCons::generatePrimitives(SoAction *acti     94 void SoCons::generatePrimitives(SoAction *action) {
 96   // This variable is used to store each verte     95   // This variable is used to store each vertex
 97   SoPrimitiveVertex pv;                            96   SoPrimitiveVertex pv;
 98                                                    97 
 99   // Access the stat from the action               98   // Access the stat from the action
100   SoState *state = action->getState();             99   SoState *state = action->getState();
101                                                   100 
102   // See if we have to use a texture coordinat    101   // See if we have to use a texture coordinate function,
103   // rather than generating explicit texture c    102   // rather than generating explicit texture coordinates.
104   SbBool useTexFunction=                          103   SbBool useTexFunction=
105     (SoTextureCoordinateElement::getType(state    104     (SoTextureCoordinateElement::getType(state) == 
106      SoTextureCoordinateElement::FUNCTION);       105      SoTextureCoordinateElement::FUNCTION);
107                                                   106 
108   // If we need to generate texture coordinate    107   // If we need to generate texture coordinates with a function,
109   // we'll need an SoGLTextureCoordinateElemen    108   // we'll need an SoGLTextureCoordinateElement.  Otherwise, we'll
110   // set up the coordinates directly.             109   // set up the coordinates directly.
111   const SoTextureCoordinateElement *tce = NULL    110   const SoTextureCoordinateElement *tce = NULL;
112   SbVec4f texCoord;                               111   SbVec4f texCoord;
113   if (useTexFunction) {                           112   if (useTexFunction) {
114     tce = SoTextureCoordinateElement::getInsta    113     tce = SoTextureCoordinateElement::getInstance(state);
115   } else {                                        114   } else {
116     texCoord[2] = 0.0;                            115     texCoord[2] = 0.0;
117     texCoord[3] = 1.0;                            116     texCoord[3] = 1.0;
118   }                                               117   }
119   SbVec3f point, normal;                          118   SbVec3f point, normal;
120                                                   119 
121   ////////////////////////////////////////////    120   ///////////////////////////////////////////////////////
122   //------------------------------------------    121   //-----------------------------------------------------
123 #define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz)         122 #define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz)               \
124   point.setValue((float)(x),(float)(y),(float)    123   point.setValue((float)(x),(float)(y),(float)(z));     \
125   normal.setValue((float)(nx),(float)(ny),(flo    124   normal.setValue((float)(nx),(float)(ny),(float)(nz)); \
126   if (useTexFunction) {                           125   if (useTexFunction) {                                 \
127     texCoord=tce->get(point,normal);              126     texCoord=tce->get(point,normal);                    \
128   } else {                                        127   } else {                                              \
129     texCoord[0]=(float)(s);                       128     texCoord[0]=(float)(s);                             \
130     texCoord[1]=(float)(t);                       129     texCoord[1]=(float)(t);                             \
131   }                                               130   }                                                     \
132   pv.setPoint(point);                             131   pv.setPoint(point);                                   \
133   pv.setNormal(normal);                           132   pv.setNormal(normal);                                 \
134   pv.setTextureCoords(texCoord);                  133   pv.setTextureCoords(texCoord);                        \
135   shapeVertex(&pv);                               134   shapeVertex(&pv);
136   //------------------------------------------    135   //-----------------------------------------------------
137   ////////////////////////////////////////////    136   ///////////////////////////////////////////////////////
138                                                   137 
139                                                   138 
140   int NPHI = (int)(2+22*std::fabs(fDPhi.getVal    139   int NPHI = (int)(2+22*std::fabs(fDPhi.getValue()/(2.0*M_PI)));
141   double deltaPhi = fDPhi.getValue()/NPHI;        140   double deltaPhi = fDPhi.getValue()/NPHI;
142   double phi0     = fSPhi.getValue();             141   double phi0     = fSPhi.getValue();
143   double phi1     = phi0 + fDPhi.getValue();      142   double phi1     = phi0 + fDPhi.getValue();
144   double rMax1    = fRmax1.getValue();            143   double rMax1    = fRmax1.getValue();
145   double rMin1    = fRmin1.getValue();            144   double rMin1    = fRmin1.getValue();
146   double rMax2    = fRmax2.getValue();            145   double rMax2    = fRmax2.getValue();
147   double rMin2    = fRmin2.getValue();            146   double rMin2    = fRmin2.getValue();
148   double zMax     = fDz.getValue();               147   double zMax     = fDz.getValue();
149   double zMin     = -zMax;                        148   double zMin     = -zMax;
150   double cosPhi0  = std::cos(phi0);               149   double cosPhi0  = std::cos(phi0);
151   double sinPhi0  = std::sin(phi0);               150   double sinPhi0  = std::sin(phi0);
152   double cosPhi1  = std::cos(phi1);               151   double cosPhi1  = std::cos(phi1);
153   double sinPhi1  = std::sin(phi1);               152   double sinPhi1  = std::sin(phi1);
154   double cosDeltaPhi = std::cos(deltaPhi);        153   double cosDeltaPhi = std::cos(deltaPhi);
155   double sinDeltaPhi = std::sin(deltaPhi);        154   double sinDeltaPhi = std::sin(deltaPhi);
156   //                                              155   //
157   // The outer surface!                           156   // The outer surface!
158   //                                              157   //
159   beginShape(action,TRIANGLE_STRIP);              158   beginShape(action,TRIANGLE_STRIP);
160   int    i;                                       159   int    i;
161   double sinPhi=sinPhi0;                          160   double sinPhi=sinPhi0;
162   double cosPhi=cosPhi0;                          161   double cosPhi=cosPhi0;
163   for (i = 0; i<=NPHI; i++) {                     162   for (i = 0; i<=NPHI; i++) {
164     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zM    163     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,cosPhi,sinPhi,0);   
165     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zM    164     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,cosPhi,sinPhi,0);   
166     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaP    165     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);    
167   }                                               166   }
168   endShape();                                     167   endShape();
169   //                                              168   //
170   // The inner surface!                           169   // The inner surface!
171   //                                              170   //
172   beginShape(action,TRIANGLE_STRIP);              171   beginShape(action,TRIANGLE_STRIP);
173   sinPhi=sinPhi0;                                 172   sinPhi=sinPhi0;
174   cosPhi=cosPhi0;                                 173   cosPhi=cosPhi0;
175   for (i = 0; i<=NPHI; i++) {                     174   for (i = 0; i<=NPHI; i++) {
176     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zM    175     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,-cosPhi,-sinPhi,0);   
177     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zM    176     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,1.0,1.0,-cosPhi,-sinPhi,0);   
178     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaP    177     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);    
179   }                                               178   } 
180   endShape();                                     179   endShape();
181   if (std::fabs(deltaPhi)<2.0*M_PI) {             180   if (std::fabs(deltaPhi)<2.0*M_PI) { 
182     //                                            181     //
183     // The end                                    182     // The end 
184     //                                            183     //
185     beginShape(action,TRIANGLE_STRIP);            184     beginShape(action,TRIANGLE_STRIP);
186     sinPhi=sinPhi0;                               185     sinPhi=sinPhi0;
187     cosPhi=cosPhi0;                               186     cosPhi=cosPhi0;
188     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zM    187     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,sinPhi,-cosPhi,0);   
189     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zM    188     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,sinPhi,-cosPhi,0);   
190     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zM    189     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,1.0,0.0,sinPhi,-cosPhi,0);   
191     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zM    190     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,1.0,sinPhi,-cosPhi,0);   
192     endShape();                                   191     endShape();
193     //                                            192     //
194     // The other end                              193     // The other end 
195     //                                            194     //
196     beginShape(action,TRIANGLE_STRIP);            195     beginShape(action,TRIANGLE_STRIP);
197     sinPhi=sinPhi1;                               196     sinPhi=sinPhi1;
198     cosPhi=cosPhi1;                               197     cosPhi=cosPhi1;
199     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi, z    198     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi, zMax,0.0,0.0,-sinPhi,+cosPhi,0);  
200     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi, z    199     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi, zMin,1.0,1.0,-sinPhi,+cosPhi,0);  
201     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi, z    200     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi, zMax,1.0,0.0,-sinPhi,+cosPhi,0);  
202     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi, z    201     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi, zMin,0.0,1.0,-sinPhi,+cosPhi,0);  
203     endShape();                                   202     endShape();
204   }                                               203   }
205                                                   204 
206   //                                              205   //
207   // The outer surface at z=+PDZ                  206   // The outer surface at z=+PDZ
208   //                                              207   //
209   beginShape(action,TRIANGLE_STRIP);              208   beginShape(action,TRIANGLE_STRIP);
210   sinPhi=sinPhi0;                                 209   sinPhi=sinPhi0;
211   cosPhi=cosPhi0;                                 210   cosPhi=cosPhi0;
212   for (i = 0; i<=NPHI; i++) {                     211   for (i = 0; i<=NPHI; i++) {
213     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zM    212     GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,0,0,1);   
214     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zM    213     GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,1.0,1.0,0,0,1);   
215     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaP    214     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);    
216   }                                               215   }
217   endShape();                                     216   endShape();
218   //                                              217   //
219   // The outer surface at z=-PDZ                  218   // The outer surface at z=-PDZ
220   //                                              219   //
221   beginShape(action,TRIANGLE_STRIP);              220   beginShape(action,TRIANGLE_STRIP);
222   sinPhi=sinPhi0;                                 221   sinPhi=sinPhi0;
223   cosPhi=cosPhi0;                                 222   cosPhi=cosPhi0;
224   for (i = 0; i<=NPHI; i++) {                     223   for (i = 0; i<=NPHI; i++) {
225     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zM    224     GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,0.0,0,0,-1);   
226     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zM    225     GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,0,0,-1);   
227     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaP    226     inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);    
228   }                                               227   }
229   endShape();                                     228   endShape();
230                                                   229 
231 }                                                 230 }
232                                                   231 
233 // getChildren                                    232 // getChildren
234 SoChildList *SoCons::getChildren() const {        233 SoChildList *SoCons::getChildren() const {
235   return children;                                234   return children;
236 }                                                 235 }
237                                                   236 
238                                                   237 
239 // computeBBox                                    238 // computeBBox
240 void SoCons::computeBBox(SoAction *, SbBox3f &    239 void SoCons::computeBBox(SoAction *, SbBox3f &box, SbVec3f &center ){
241   float fRmax= fRmax1.getValue();                 240   float fRmax= fRmax1.getValue();  
242   if (fRmax2.getValue() > fRmax) fRmax = fRmax    241   if (fRmax2.getValue() > fRmax) fRmax = fRmax2.getValue(); 
243                                                   242 
244   SbVec3f vmin(-fRmax,-fRmax,-fDz.getValue()),    243   SbVec3f vmin(-fRmax,-fRmax,-fDz.getValue()), 
245           vmax( fRmax, fRmax, fDz.getValue());    244           vmax( fRmax, fRmax, fDz.getValue());
246   center.setValue(0,0,0);                         245   center.setValue(0,0,0);
247   box.setBounds(vmin,vmax);                       246   box.setBounds(vmin,vmax);
248 }                                                 247 }
249                                                   248 
250                                                   249 
251                                                   250 
252                                                   251 
253 // updateChildren                                 252 // updateChildren
254 void SoCons::updateChildren() {                   253 void SoCons::updateChildren() {
255                                                   254 
256                                                   255 
257   // Redraw the G4Cons....                        256   // Redraw the G4Cons....
258                                                   257 
259   assert(children->getLength()==1);               258   assert(children->getLength()==1);
260   SoSeparator       *sep                = (SoS    259   SoSeparator       *sep                = (SoSeparator *)  ( *children)[0];
261   SoCoordinate3     *theCoordinates     = (SoC    260   SoCoordinate3     *theCoordinates     = (SoCoordinate3 *)      ( sep->getChild(0));
262   SoNormal          *theNormals         = (SoN    261   SoNormal          *theNormals         = (SoNormal *)           ( sep->getChild(1)); 
263   SoNormalBinding   *theNormalBinding   = (SoN    262   SoNormalBinding   *theNormalBinding   = (SoNormalBinding *)    ( sep->getChild(2));
264   SoIndexedFaceSet  *theFaceSet         = (SoI    263   SoIndexedFaceSet  *theFaceSet         = (SoIndexedFaceSet *)   ( sep->getChild(3));
265                                                   264 
266   const int NPHI=24, NPOINTS=2*(2*NPHI+2), NFA    265   const int NPHI=24, NPOINTS=2*(2*NPHI+2), NFACES=4*NPHI+2, NINDICES = NFACES*5;
267   float points[NPOINTS][3], normals[NFACES][3]    266   float points[NPOINTS][3], normals[NFACES][3];
268 #ifdef INVENTOR2_0                                267 #ifdef INVENTOR2_0
269   static long     indices[NINDICES];              268   static long     indices[NINDICES];
270 #else                                             269 #else
271   static int32_t  indices[NINDICES];              270   static int32_t  indices[NINDICES];
272 #endif                                            271 #endif
273   static int init=0;                              272   static int init=0;
274   double phi, pp, DeltaPhi;                       273   double phi, pp, DeltaPhi;
275                                                   274 
276   // Indices need to be generated once! This i    275   // Indices need to be generated once! This is here to keep it close to the point
277   // generation, since otherwise it will be co    276   // generation, since otherwise it will be confusing.
278                                                   277 
279   int i;                                          278   int i;
280   if (!init) {                                    279   if (!init) {
281     init = 1;                                     280     init = 1;
282     // Outer face                                 281     // Outer face
283     for (i = 0; i< NPHI; i++) {                   282     for (i = 0; i< NPHI; i++) {
284       // 0 1 3 2;                                 283       // 0 1 3 2;
285       indices[5*i+0] =  2*i+0;                    284       indices[5*i+0] =  2*i+0;
286       indices[5*i+1] =  2*i+1;                    285       indices[5*i+1] =  2*i+1;
287       indices[5*i+2] =  2*i+3;                    286       indices[5*i+2] =  2*i+3;
288       indices[5*i+3] =  2*i+2;                    287       indices[5*i+3] =  2*i+2;
289       indices[5*i+4] = SO_END_FACE_INDEX;         288       indices[5*i+4] = SO_END_FACE_INDEX;
290     }                                             289     }
291     // the inner face                             290     // the inner face
292     for (i=0;i<NPHI;i++) {                        291     for (i=0;i<NPHI;i++) {
293       indices[5*1*NPHI + 5*i+0] = 2*NPHI+2 + 2    292       indices[5*1*NPHI + 5*i+0] = 2*NPHI+2 + 2*i+0;  
294       indices[5*1*NPHI + 5*i+1] = 2*NPHI+2 + 2    293       indices[5*1*NPHI + 5*i+1] = 2*NPHI+2 + 2*i+1;
295       indices[5*1*NPHI + 5*i+2] = 2*NPHI+2 + 2    294       indices[5*1*NPHI + 5*i+2] = 2*NPHI+2 + 2*i+3;
296       indices[5*1*NPHI + 5*i+3] = 2*NPHI+2 + 2    295       indices[5*1*NPHI + 5*i+3] = 2*NPHI+2 + 2*i+2;
297       indices[5*1*NPHI + 5*i+4] = SO_END_FACE_    296       indices[5*1*NPHI + 5*i+4] = SO_END_FACE_INDEX;
298     }                                             297     }
299     // the top side                               298     // the top side
300     for (i=0;i<NPHI;i++) {                        299     for (i=0;i<NPHI;i++) {
301       indices[5*2*NPHI + 5*i+0] = 2*i+0;          300       indices[5*2*NPHI + 5*i+0] = 2*i+0;
302       indices[5*2*NPHI + 5*i+1] = 2*i+2;          301       indices[5*2*NPHI + 5*i+1] = 2*i+2;
303       indices[5*2*NPHI + 5*i+2] = NPOINTS - (2    302       indices[5*2*NPHI + 5*i+2] = NPOINTS - (2*i+4);
304       indices[5*2*NPHI + 5*i+3] = NPOINTS - (2    303       indices[5*2*NPHI + 5*i+3] = NPOINTS - (2*i+2);
305       indices[5*2*NPHI + 5*i+4] = SO_END_FACE_    304       indices[5*2*NPHI + 5*i+4] = SO_END_FACE_INDEX;
306     }                                             305     }
307     // the bottom side                            306     // the bottom side
308     for (i=0;i<NPHI;i++) {                        307     for (i=0;i<NPHI;i++) {
309       indices[5*3*NPHI + 5*i+0] = 2*i+1;          308       indices[5*3*NPHI + 5*i+0] = 2*i+1;
310       indices[5*3*NPHI + 5*i+1] = NPOINTS - (2    309       indices[5*3*NPHI + 5*i+1] = NPOINTS - (2*i+1);
311       indices[5*3*NPHI + 5*i+2] = NPOINTS - (2    310       indices[5*3*NPHI + 5*i+2] = NPOINTS - (2*i+3);
312       indices[5*3*NPHI + 5*i+3] = 2*i+3;          311       indices[5*3*NPHI + 5*i+3] = 2*i+3;
313       indices[5*3*NPHI + 5*i+4] = SO_END_FACE_    312       indices[5*3*NPHI + 5*i+4] = SO_END_FACE_INDEX;
314     }                                             313     }
315     // the odd side                               314     // the odd side
316     indices[5*4*NPHI +0] = 2*NPHI;                315     indices[5*4*NPHI +0] = 2*NPHI;
317     indices[5*4*NPHI +1] = 2*NPHI+1;              316     indices[5*4*NPHI +1] = 2*NPHI+1;
318     indices[5*4*NPHI +2] = 2*NPHI+3;              317     indices[5*4*NPHI +2] = 2*NPHI+3;
319     indices[5*4*NPHI +3] = 2*NPHI+2;              318     indices[5*4*NPHI +3] = 2*NPHI+2;
320     indices[5*4*NPHI +4] = SO_END_FACE_INDEX;     319     indices[5*4*NPHI +4] = SO_END_FACE_INDEX;
321     // aother odd side                            320     // aother odd side
322     indices[5*4*NPHI +5 +0] = 0;                  321     indices[5*4*NPHI +5 +0] = 0;
323     indices[5*4*NPHI +5 +1] = NPOINTS-2;          322     indices[5*4*NPHI +5 +1] = NPOINTS-2;
324     indices[5*4*NPHI +5 +2] = NPOINTS-1;          323     indices[5*4*NPHI +5 +2] = NPOINTS-1;
325     indices[5*4*NPHI +5 +3] = 1;                  324     indices[5*4*NPHI +5 +3] = 1;
326     indices[5*4*NPHI +5 +4] = SO_END_FACE_INDE    325     indices[5*4*NPHI +5 +4] = SO_END_FACE_INDEX;
327   }                                               326   }
328   // Points need to be generated each time:       327   // Points need to be generated each time:
329   // The outer surface                            328   // The outer surface
330   DeltaPhi = fDPhi.getValue()/NPHI, phi = fSPh    329   DeltaPhi = fDPhi.getValue()/NPHI, phi = fSPhi.getValue();
331   float  t,st,ct;                                 330   float  t,st,ct;
332   t = FATAN((fRmax2.getValue()-fRmax1.getValue    331   t = FATAN((fRmax2.getValue()-fRmax1.getValue())/(2*fDz.getValue()));
333   st = FSIN(t);                                   332   st = FSIN(t);
334   ct = FCOS(t);                                   333   ct = FCOS(t);
335   for (i = 0; i<=NPHI; i++) {                     334   for (i = 0; i<=NPHI; i++) {
336     points[2*i+0][0] = fRmax2.getValue()*FCOS(    335     points[2*i+0][0] = fRmax2.getValue()*FCOS(phi); 
337     points[2*i+0][1] = fRmax2.getValue()*FSIN(    336     points[2*i+0][1] = fRmax2.getValue()*FSIN(phi); 
338     points[2*i+0][2] = +fDz.getValue();           337     points[2*i+0][2] = +fDz.getValue();
339     points[2*i+1][0] = fRmax1.getValue()*FCOS(    338     points[2*i+1][0] = fRmax1.getValue()*FCOS(phi); 
340     points[2*i+1][1] = fRmax1.getValue()*FSIN(    339     points[2*i+1][1] = fRmax1.getValue()*FSIN(phi); 
341     points[2*i+1][2] = -fDz.getValue();           340     points[2*i+1][2] = -fDz.getValue();
342     pp = phi+DeltaPhi/2.0;                        341     pp = phi+DeltaPhi/2.0;
343     if (i!=NPHI) {                                342     if (i!=NPHI) {
344       normals[i][0] = ct * FCOS(pp);              343       normals[i][0] = ct * FCOS(pp); 
345       normals[i][1] = ct * FSIN(pp);              344       normals[i][1] = ct * FSIN(pp); 
346       normals[i][2] = -st;                        345       normals[i][2] = -st;
347     }                                             346     }
348     phi+=DeltaPhi;                                347     phi+=DeltaPhi;
349   }                                               348   }
350   // The inner surface                            349   // The inner surface
351   phi = fSPhi.getValue() + fDPhi.getValue();      350   phi = fSPhi.getValue() + fDPhi.getValue();
352   t = FATAN((fRmin2.getValue()-fRmin1.getValue    351   t = FATAN((fRmin2.getValue()-fRmin1.getValue())/(2*fDz.getValue()));
353   st = FSIN(t);                                   352   st = FSIN(t);
354   ct = FCOS(t);                                   353   ct = FCOS(t);
355   for (i = 0; i<=NPHI; i++) {                     354   for (i = 0; i<=NPHI; i++) {
356     points[2*NPHI+2+2*i+0][0] = fRmin2.getValu    355     points[2*NPHI+2+2*i+0][0] = fRmin2.getValue()*FCOS(phi); 
357     points[2*NPHI+2+2*i+0][1] = fRmin2.getValu    356     points[2*NPHI+2+2*i+0][1] = fRmin2.getValue()*FSIN(phi); 
358     points[2*NPHI+2+2*i+0][2] = +fDz.getValue(    357     points[2*NPHI+2+2*i+0][2] = +fDz.getValue();
359     points[2*NPHI+2+2*i+1][0] = fRmin1.getValu    358     points[2*NPHI+2+2*i+1][0] = fRmin1.getValue()*FCOS(phi); 
360     points[2*NPHI+2+2*i+1][1] = fRmin1.getValu    359     points[2*NPHI+2+2*i+1][1] = fRmin1.getValue()*FSIN(phi); 
361     points[2*NPHI+2+2*i+1][2] = -fDz.getValue(    360     points[2*NPHI+2+2*i+1][2] = -fDz.getValue();
362     pp = phi-DeltaPhi/2.0;                        361     pp = phi-DeltaPhi/2.0;
363     if (i!=NPHI) {                                362     if (i!=NPHI) {
364       normals[NPHI+i][0] = -ct*FCOS(pp);          363       normals[NPHI+i][0] = -ct*FCOS(pp); 
365       normals[NPHI+i][1] = -ct*FSIN(pp);          364       normals[NPHI+i][1] = -ct*FSIN(pp); 
366       normals[NPHI+i][2] = st;                    365       normals[NPHI+i][2] = st;
367     }                                             366     }
368     phi-=DeltaPhi;                                367     phi-=DeltaPhi;
369   }                                               368   }
370   // The top side                                 369   // The top side
371   for (i=0;i<NPHI;i++) {                          370   for (i=0;i<NPHI;i++) {
372     normals[2*NPHI+i][0]=normals[2*NPHI+i][1]=    371     normals[2*NPHI+i][0]=normals[2*NPHI+i][1]=0; 
373     normals[2*NPHI+i][2]=  1.0;                   372     normals[2*NPHI+i][2]=  1.0;
374   }                                               373   } 
375   // The bottom side                              374   // The bottom side
376   for (i=0;i<NPHI;i++) {                          375   for (i=0;i<NPHI;i++) {
377     normals[3*NPHI+i][0]=normals[3*NPHI+i][1]=    376     normals[3*NPHI+i][0]=normals[3*NPHI+i][1]=0; 
378     normals[3*NPHI+i][2]= -1.0;                   377     normals[3*NPHI+i][2]= -1.0;
379   }                                               378   } 
380   // The odd side                                 379   // The odd side
381   phi = fSPhi.getValue();                         380   phi = fSPhi.getValue(); 
382   normals[4*NPHI+0][0]=  FSIN(phi);               381   normals[4*NPHI+0][0]=  FSIN(phi); 
383   normals[4*NPHI+0][1]= -FCOS(phi);               382   normals[4*NPHI+0][1]= -FCOS(phi); 
384   normals[4*NPHI+0][2]= 0;                        383   normals[4*NPHI+0][2]= 0;
385                                                   384 
386   // Another odd side                             385   // Another odd side
387   phi = fSPhi.getValue()+fDPhi.getValue();        386   phi = fSPhi.getValue()+fDPhi.getValue(); 
388   normals[4*NPHI+1][0]= -FSIN(phi);               387   normals[4*NPHI+1][0]= -FSIN(phi); 
389   normals[4*NPHI+1][1]= +FCOS(phi);               388   normals[4*NPHI+1][1]= +FCOS(phi); 
390   normals[4*NPHI+1][2]=0;                         389   normals[4*NPHI+1][2]=0;
391                                                   390 
392   for (int np=0;np<NPOINTS;np++) theCoordinate    391   for (int np=0;np<NPOINTS;np++) theCoordinates->point.set1Value(np,points[np][0],points[np][1],points[np][2]);
393   theFaceSet->coordIndex.setValues(0,NINDICES,    392   theFaceSet->coordIndex.setValues(0,NINDICES,indices);
394   if (smoothDraw.getValue()) {                    393   if (smoothDraw.getValue()) {
395     //    This Line is replaced by the next on    394     //    This Line is replaced by the next one because of an apparent Bug in Inventor (mem. leak).
396     //    theNormals->vector.deleteValues(0);     395     //    theNormals->vector.deleteValues(0);
397     for (int nf=0;nf<NFACES;nf++) theNormals->    396     for (int nf=0;nf<NFACES;nf++) theNormals->vector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]);
398     theNormalBinding->value=SoNormalBinding::P    397     theNormalBinding->value=SoNormalBinding::PER_FACE;
399   }                                               398   }
400   else {                                          399   else {
401     for (int nf=0;nf<NFACES;nf++) theNormals->    400     for (int nf=0;nf<NFACES;nf++) theNormals->vector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]);
402     theNormalBinding->value=SoNormalBinding::P    401     theNormalBinding->value=SoNormalBinding::PER_FACE;
403   }                                               402   }
404 }                                                 403 }
405                                                   404 
406 // generateChildren                               405 // generateChildren
407 void SoCons::generateChildren() {                 406 void SoCons::generateChildren() {
408                                                   407 
409   // This routines creates one SoSeparator, on    408   // This routines creates one SoSeparator, one SoCoordinate3, and
410   // one SoLineSet, and puts it in the child l    409   // one SoLineSet, and puts it in the child list.  This is done only
411   // once, whereas redrawing the position of t    410   // once, whereas redrawing the position of the coordinates occurs each
412   // time an update is necessary, in the updat    411   // time an update is necessary, in the updateChildren routine. 
413                                                   412 
414   assert(children->getLength() ==0);              413   assert(children->getLength() ==0);
415   SoSeparator      *sep              = new SoS    414   SoSeparator      *sep              = new SoSeparator(); 
416   SoCoordinate3    *theCoordinates   = new SoC    415   SoCoordinate3    *theCoordinates   = new SoCoordinate3();
417   SoNormal         *theNormals       = new SoN    416   SoNormal         *theNormals       = new SoNormal(); 
418   SoNormalBinding  *theNormalBinding = new SoN    417   SoNormalBinding  *theNormalBinding = new SoNormalBinding();
419   SoIndexedFaceSet *theFaceSet       = new SoI    418   SoIndexedFaceSet *theFaceSet       = new SoIndexedFaceSet();
420   //                                              419   // 
421   // This line costs some in render quality! b    420   // This line costs some in render quality! but gives speed.
422   //                                              421   // 
423   sep->addChild(theCoordinates);                  422   sep->addChild(theCoordinates);
424   sep->addChild(theNormals);                      423   sep->addChild(theNormals);
425   sep->addChild(theNormalBinding);                424   sep->addChild(theNormalBinding);
426   sep->addChild(theFaceSet);                      425   sep->addChild(theFaceSet);
427   children->append(sep);                          426   children->append(sep);
428 }                                                 427 }
429                                                   428 
430 // generateAlternateRep                           429 // generateAlternateRep
431 void SoCons::generateAlternateRep() {             430 void SoCons::generateAlternateRep() {
432                                                   431 
433   // This routine sets the alternate represent    432   // This routine sets the alternate representation to the child
434   // list of this mode.                           433   // list of this mode.  
435                                                   434 
436   if (children->getLength() == 0) generateChil    435   if (children->getLength() == 0) generateChildren();
437   updateChildren();                               436   updateChildren();
438   alternateRep.setValue((SoSeparator *)  ( *ch    437   alternateRep.setValue((SoSeparator *)  ( *children)[0]);
439 }                                                 438 }
440                                                   439 
441 // clearAlternateRep                              440 // clearAlternateRep
442 void SoCons::clearAlternateRep() {                441 void SoCons::clearAlternateRep() {
443   alternateRep.setValue(NULL);                    442   alternateRep.setValue(NULL);
444 }                                                 443 }
                                                   >> 444 
                                                   >> 445 #endif
445                                                   446