Generate Primitives, required.
76 {
77
79
80
81 SoState *state =
action->getState();
82 if (!state)
83 return;
84
85
86
87 SbBool useTexFunction=
88 (SoTextureCoordinateElement::getType(state) ==
89 SoTextureCoordinateElement::FUNCTION);
90
91
92
93
94 const SoTextureCoordinateElement *tce = NULL;
95 SbVec4f texCoord;
96 if (useTexFunction) {
97 tce = SoTextureCoordinateElement::getInstance(state);
98 } else {
99 texCoord[2] = 0.0;
100 texCoord[3] = 1.0;
101 }
102 SbVec3f point, normal;
103
105
106#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
107point.setValue((float)(x),(float)(y),(float)(z)); \
108normal.setValue((float)(nx),(float)(ny),(float)(nz)); \
109if (useTexFunction) { \
110texCoord=tce->get(point,normal); \
111} else { \
112texCoord[0]=(float)(s); \
113texCoord[1]=(float)(t); \
114} \
115pv.setPoint(point); \
116pv.setNormal(normal); \
117pv.setTextureCoords(texCoord); \
118shapeVertex(&pv);
119
121
123 return;
124 }
125
126 int nSeg =
fRmin.getNum()-1;
127 if (nSeg<1) {
128 return;
129 }
130
131 for (
int p=0;
p<nSeg;
p++) {
132
135
138
139 double zMin =
fDz[
p];
140 double zMax=
fDz[
p+1];
141
143
147 double cosPhi0 =
cos(phi0);
148 double sinPhi0 =
sin(phi0);
149 double cosPhi1 =
cos(phi1);
150 double sinPhi1 =
sin(phi1);
153
155 double sinPhi;
156 double cosPhi;
157
158 const bool noPhiCutout=fabs(
fDPhi.getValue())==0.F || fabs(fabs(
fDPhi.getValue())-2.0*
M_PI)<0.01;
159 const bool disableLighting(glIsEnabled(GL_LIGHTING));
160 const bool transparencyOn(glIsEnabled(GL_BLEND));
161
162
163
164
165
166
167
168 double dR =rMax2-rMax1;
169 double dZ =zMax-zMin;
170 double cosTheta = -dR/sqrt(dR*dR+dZ*dZ);
171 double sinTheta = dZ/sqrt(dR*dR+dZ*dZ);
172
173 beginShape(action,TRIANGLE_STRIP);
174 sinPhi=sinPhi0;
175 cosPhi=cosPhi0;
176 for (i = 0;
i<=NPHI;
i++) {
177 GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,sinTheta*cosPhi,sinTheta*sinPhi,cosTheta);
178 GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,sinTheta*cosPhi,sinTheta*sinPhi,cosTheta);
179 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
180 }
181 endShape();
182
184 if (disableLighting) glDisable(GL_LIGHTING);
185 if (transparencyOn) glDisable(GL_BLEND);
186 glBegin(GL_LINE_STRIP);
187 sinPhi=sinPhi0;
188 cosPhi=cosPhi0;
189 if (!noPhiCutout && p==0) glVertex3f(rMin1*cosPhi,rMin1*sinPhi,zMin);
190 for (i = 0;
i<=NPHI;
i++) {
191 glVertex3f(rMax1*cosPhi,rMax1*sinPhi,zMin);
192 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
193 }
194 if (!noPhiCutout && p==0) glVertex3f(rMin1*cosPhi1,rMin1*sinPhi1,zMin);
195 glEnd();
196 if (disableLighting) glEnable(GL_LIGHTING);
197 if (transparencyOn) glEnable(GL_BLEND);
198 }
199
200
201
202
203
204
205
206 beginShape(action,TRIANGLE_STRIP);
207 sinPhi=sinPhi0;
208 cosPhi=cosPhi0;
209
210 dR =rMin2-rMin1;
211 dZ =zMax-zMin;
212 cosTheta = -dR/sqrt(dR*dR+dZ*dZ);
213 sinTheta = dZ/sqrt(dR*dR+dZ*dZ);
214
215 for (i = 0;
i<=NPHI;
i++) {
216 GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,-cosPhi*sinTheta,-sinPhi*sinTheta,-cosTheta);
217 GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,1.0,1.0,-cosPhi*sinTheta,-sinPhi*sinTheta,-cosTheta);
218 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
219 }
220 endShape();
221
223 if (disableLighting) glDisable(GL_LIGHTING);
224 if (transparencyOn) glDisable(GL_BLEND);
225 glBegin(GL_LINE_STRIP);
226 sinPhi=sinPhi0;
227 cosPhi=cosPhi0;
228
229 for (i = 0;
i<=NPHI;
i++) {
230 glVertex3f(rMin1*cosPhi,rMin1*sinPhi,zMin);
231 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
232 }
233
234 glEnd();
235 if (disableLighting) glEnable(GL_LIGHTING);
236 if (transparencyOn) glEnable(GL_BLEND);
237 }
238
239
240
241
242 if (!noPhiCutout) {
243
244
245
246 beginShape(action,TRIANGLE_STRIP);
247 sinPhi=sinPhi0;
248 cosPhi=cosPhi0;
249 GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,sinPhi,-cosPhi,0);
250 GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,sinPhi,-cosPhi,0);
251 GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,1.0,0.0,sinPhi,-cosPhi,0);
252 GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,1.0,sinPhi,-cosPhi,0);
253 endShape();
254
255
256
257 beginShape(action,TRIANGLE_STRIP);
258 sinPhi=sinPhi1;
259 cosPhi=cosPhi1;
260 GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi, zMax,0.0,0.0,-sinPhi,+cosPhi,0);
261 GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi, zMin,1.0,1.0,-sinPhi,+cosPhi,0);
262 GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi, zMax,1.0,0.0,-sinPhi,+cosPhi,0);
263 GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi, zMin,0.0,1.0,-sinPhi,+cosPhi,0);
264 endShape();
265
267 if (disableLighting) glDisable(GL_LIGHTING);
268 if (transparencyOn) glDisable(GL_BLEND);
269
270 glBegin(GL_LINES);
271 glVertex3f(rMax2*cosPhi0,rMax2*sinPhi0, zMax);
272 glVertex3f(rMax1*cosPhi0,rMax1*sinPhi0, zMin);
273 glVertex3f(rMin2*cosPhi0,rMin2*sinPhi0, zMax);
274 glVertex3f(rMin1*cosPhi0,rMin1*sinPhi0, zMin);
275 glVertex3f(rMax2*cosPhi1,rMax2*sinPhi1, zMax);
276 glVertex3f(rMax1*cosPhi1,rMax1*sinPhi1, zMin);
277 glVertex3f(rMin2*cosPhi1,rMin2*sinPhi1, zMax);
278 glVertex3f(rMin1*cosPhi1,rMin1*sinPhi1, zMin);
279 glEnd();
280 if (disableLighting) glEnable(GL_LIGHTING);
281 if (transparencyOn) glEnable(GL_BLEND);
282 }
283
284 }
285
286 if (p==(nSeg-1)) {
287
288
289
290 beginShape(action,TRIANGLE_STRIP);
291 sinPhi=sinPhi0;
292 cosPhi=cosPhi0;
293 for (i = 0;
i<=NPHI;
i++) {
294 GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,0,0,1);
295 GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,1.0,1.0,0,0,1);
296 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
297 }
298 endShape();
299
301 if (disableLighting) glDisable(GL_LIGHTING);
302 if (transparencyOn) glDisable(GL_BLEND);
303 glBegin(GL_LINE_STRIP);
304 sinPhi=sinPhi0;
305 cosPhi=cosPhi0;
306 if (!noPhiCutout) glVertex3f(rMin1*cosPhi,rMin1*sinPhi,zMax);
307 for (i = 0;
i<=NPHI;
i++) {
308 glVertex3f(rMax1*cosPhi,rMax1*sinPhi,zMax);
309 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
310 }
311 if (!noPhiCutout) glVertex3f(rMin1*cosPhi1,rMin1*sinPhi1,zMax);
312 glEnd();
313 if (disableLighting) glEnable(GL_LIGHTING);
314 if (transparencyOn) glEnable(GL_BLEND);
315 }
316
317 }
318 if (p==0) {
319
320
321
322 beginShape(action,TRIANGLE_STRIP);
323 sinPhi=sinPhi0;
324 cosPhi=cosPhi0;
325 for (i = 0;
i<=NPHI;
i++) {
326 GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,0.0,0,0,-1);
327 GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,0,0,-1);
328 inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
329 }
330 endShape();
331 }
332 }
333
334 if (state&&state->isElementEnabled(SoGLCacheContextElement::getClassStackIndex())) {
335
336 SoGLCacheContextElement::shouldAutoCache(state, SoGLCacheContextElement::DO_AUTO_CACHE);
337#if ((COIN_MAJOR_VERSION>=3)||((COIN_MAJOR_VERSION==2)&&(COIN_MINOR_VERSION>=5)))
338 SoGLCacheContextElement::incNumShapes(state);
339#endif
340 }
341}
#define GEN_VERTEX(pv, x, y, z, s, t, nx, ny, nz)
static int nphiDivisions(const float &dphi, const float &complexity, int OverrideNPhi=0)