]> git.mxchange.org Git - simgear.git/blob - simgear/sky/sphere.cxx
Fixed a typo in the sky dome painting code.
[simgear.git] / simgear / sky / sphere.cxx
1 // sphere.cxx -- build an ssg sphere object
2 //
3 // Pulled straight out of MesaGLU/quadratic.c
4 //
5 // Original gluSphere code is Copyright (C) 1999-2000  Brian Paul and
6 // licensed under the GPL
7 //
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.
12 //
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.
17 //
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.
21 //
22 // $Id$
23
24
25 #include <plib/ssg.h>
26
27
28 // return a sphere object as an ssgBranch
29 ssgBranch *ssgMakeSphere( ssgSimpleState *state, ssgColourArray *cl,
30                           double radius, int slices, int stacks )
31 {
32     float rho, drho, theta, dtheta;
33     float x, y, z;
34     float s, t, ds, dt;
35     int i, j, imin, imax;
36     float nsign = 1.0;
37     ssgBranch *sphere = new ssgBranch;
38     sgVec2 vec2;
39     sgVec3 vec3;
40
41     // handle cl whether it is preinitialized or not
42     if ( cl == NULL ) {
43         // create a new array if needed
44         cl = new ssgColourArray( 1 );
45     }
46
47     sgVec3 color;
48     sgSetVec3( color, 1.0, 1.0, 1.0 );
49
50     if ( cl->getNum() > 1 ) {
51         cl->removeAll();
52         cl->add( color );
53     } else if ( cl->getNum() == 0 ) {
54         cl->add( color );
55     } else {
56         // accept value as given to us in
57     }
58
59     drho = M_PI / (float) stacks;
60     dtheta = 2.0 * M_PI / (float) slices;
61
62     /* texturing: s goes from 0.0/0.25/0.5/0.75/1.0 at +y/+x/-y/-x/+y
63        axis t goes from -1.0/+1.0 at z = -radius/+radius (linear along
64        longitudes) cannot use triangle fan on texturing (s coord. at
65        top/bottom tip varies) */
66
67     ds = 1.0 / slices;
68     dt = 1.0 / stacks;
69     t = 1.0;  /* because loop now runs from 0 */
70     imin = 0;
71     imax = stacks;
72
73     /* build slices as quad strips */
74     for ( i = imin; i < imax; i++ ) {
75         ssgVertexArray   *vl = new ssgVertexArray();
76         ssgNormalArray   *nl = new ssgNormalArray();
77         ssgTexCoordArray *tl = new ssgTexCoordArray();
78
79         rho = i * drho;
80         s = 0.0;
81         for ( j = 0; j <= slices; j++ ) {
82             theta = (j == slices) ? 0.0 : j * dtheta;
83             x = -sin(theta) * sin(rho);
84             y = cos(theta) * sin(rho);
85             z = nsign * cos(rho);
86
87             // glNormal3f( x*nsign, y*nsign, z*nsign );
88             sgSetVec3( vec3, x*nsign, y*nsign, z*nsign );
89             nl->add( vec3 );
90
91             // glTexCoord2f(s,t);
92             sgSetVec2( vec2, 2, t );
93             tl->add( vec2 );
94
95             // glVertex3f( x*radius, y*radius, z*radius );
96             sgSetVec3( vec3, x*radius, y*radius, z*radius );
97             vl->add( vec3 );
98
99             x = -sin(theta) * sin(rho+drho);
100             y = cos(theta) * sin(rho+drho);
101             z = nsign * cos(rho+drho);
102
103             // glNormal3f( x*nsign, y*nsign, z*nsign );
104             sgSetVec3( vec3, x*nsign, y*nsign, z*nsign );
105             nl->add( vec3 );
106
107             // glTexCoord2f(s,t-dt);
108             sgSetVec2( vec2, s, t-dt );
109             tl->add( vec2 );
110             s += ds;
111
112             // glVertex3f( x*radius, y*radius, z*radius );
113             sgSetVec3( vec3, x*radius, y*radius, z*radius );
114             vl->add( vec3 );
115         }
116
117         ssgLeaf *slice = 
118             new ssgVtxTable ( GL_TRIANGLE_STRIP, vl, nl, tl, cl );
119         slice->setState( state );
120
121         sphere->addKid( slice );
122
123         t -= dt;
124     }
125
126     return sphere;
127 }