1 // sphere.cxx -- build an ssg sphere object
3 // Pulled straight out of MesaGLU/quadratic.c
5 // Original gluSphere code is Copyright (C) 1999-2000 Brian Paul and
6 // licensed under the GPL
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32 // return a sphere object as an ssgBranch
33 ssgBranch *ssgMakeSphere( ssgSimpleState *state, ssgColourArray *cl,
34 double radius, int slices, int stacks,
35 ssgCallback predraw, ssgCallback postdraw )
37 float rho, drho, theta, dtheta;
42 ssgBranch *sphere = new ssgBranch;
46 // handle cl whether it is preinitialized or not
48 // create a new array if needed
49 cl = new ssgColourArray( 1 );
53 sgSetVec4( color, 1.0, 1.0, 1.0, 1.0 );
55 if ( cl->getNum() > 1 ) {
58 } else if ( cl->getNum() == 0 ) {
61 // accept value as given to us in
64 drho = M_PI / (float) stacks;
65 dtheta = 2.0 * M_PI / (float) slices;
67 /* texturing: s goes from 0.0/0.25/0.5/0.75/1.0 at +y/+x/-y/-x/+y
68 axis t goes from -1.0/+1.0 at z = -radius/+radius (linear along
69 longitudes) cannot use triangle fan on texturing (s coord. at
70 top/bottom tip varies) */
74 t = 1.0; /* because loop now runs from 0 */
78 /* build slices as quad strips */
79 for ( i = imin; i < imax; i++ ) {
80 ssgVertexArray *vl = new ssgVertexArray();
81 ssgNormalArray *nl = new ssgNormalArray();
82 ssgTexCoordArray *tl = new ssgTexCoordArray();
86 for ( j = 0; j <= slices; j++ ) {
87 theta = (j == slices) ? 0.0 : j * dtheta;
88 x = -sin(theta) * sin(rho);
89 y = cos(theta) * sin(rho);
92 // glNormal3f( x*nsign, y*nsign, z*nsign );
93 sgSetVec3( vec3, x*nsign, y*nsign, z*nsign );
94 sgNormalizeVec3( vec3 );
98 sgSetVec2( vec2, s, t );
101 // glVertex3f( x*radius, y*radius, z*radius );
102 sgSetVec3( vec3, x*radius, y*radius, z*radius );
105 x = -sin(theta) * sin(rho+drho);
106 y = cos(theta) * sin(rho+drho);
107 z = nsign * cos(rho+drho);
109 // glNormal3f( x*nsign, y*nsign, z*nsign );
110 sgSetVec3( vec3, x*nsign, y*nsign, z*nsign );
111 sgNormalizeVec3( vec3 );
114 // glTexCoord2f(s,t-dt);
115 sgSetVec2( vec2, s, t-dt );
119 // glVertex3f( x*radius, y*radius, z*radius );
120 sgSetVec3( vec3, x*radius, y*radius, z*radius );
125 new ssgVtxTable ( GL_TRIANGLE_STRIP, vl, nl, tl, cl );
126 slice->setState( state );
127 slice->setCallback( SSG_CALLBACK_PREDRAW, predraw );
128 slice->setCallback( SSG_CALLBACK_POSTDRAW, postdraw );
130 sphere->addKid( slice );