1 #include "3dc.h"
2 #include "module.h"
3 #include "inline.h"
4
5 #include "sphere.h"
6
7 #define UseLocalAssert Yes
8 #include "ourasert.h"
9
10
11 #define MakeVertex(o,x,y,z) \
12 { \
13 o->vx=(x); \
14 o->vy=(y); \
15 o->vz=(z); \
16 o++; \
17 }
18
19 #define MakeFace(f,a,b,c) \
20 { \
21 f->v[0] = (a); \
22 f->v[1] = (b); \
23 f->v[2] = (c); \
24 f++; \
25 }
26
27 VECTORCH OctantVertex[(SPHERE_ORDER+1)*(SPHERE_ORDER+2)/2];
28 VECTORCH SphereVertex[SPHERE_VERTICES];
29
30 VECTORCH SphereRotatedVertex[SPHERE_VERTICES];
31 VECTORCH SphereAtmosRotatedVertex[SPHERE_VERTICES];
32 int SphereAtmosU[SPHERE_VERTICES];
33 int SphereAtmosV[SPHERE_VERTICES];
34
35
36 TRI_FACE SphereFace[SPHERE_FACES];
37 int SphereVertexHeight[SPHERE_VERTICES];
38
Generate_SphereOctant(void)39 static void Generate_SphereOctant(void)
40 {
41 int i,j;
42
43 VECTORCH *o = OctantVertex;
44
45 /* i=0, j=0 */
46 MakeVertex(o,0,0,SPHERE_RADIUS);
47
48 for (i=1; i<SPHERE_ORDER; i++)
49 {
50 int cosPhi, sinPhi;
51 {
52 int phi = 1024*i/SPHERE_ORDER;
53 cosPhi = GetCos(phi);
54 sinPhi = GetSin(phi);
55 }
56
57 /* 0<i<n, j=0 */
58 /* => cosTheta = 1, sinTheta = 0 */
59 MakeVertex(o,sinPhi,0,cosPhi);
60
61 for (j=1; j<i; j++)
62 {
63 int cosTheta, sinTheta;
64 {
65 int theta = 1024*j/i;
66 cosTheta = GetCos(theta);
67 sinTheta = GetSin(theta);
68 }
69
70 /* 0<i<n, 0<j<i */
71 MakeVertex(o,MUL_FIXED(cosTheta,sinPhi),MUL_FIXED(sinTheta,sinPhi),cosPhi);
72 }
73
74 /* 0<i<n, j=i */
75 MakeVertex(o,0,sinPhi,cosPhi);
76 }
77
78 /* i=n, j=0 */
79 MakeVertex(o,SPHERE_RADIUS,0,0);
80
81 for (j=1; j<SPHERE_ORDER; j++)
82 {
83 int cosTheta, sinTheta;
84 {
85 int theta = 1024*j/SPHERE_ORDER;
86 cosTheta = GetCos(theta);
87 sinTheta = GetSin(theta);
88 }
89 /* i=n, 0<j<i */
90 MakeVertex(o,cosTheta,sinTheta,0);
91 }
92
93 /* i=n, j=i */
94 MakeVertex(o,0,SPHERE_RADIUS,0);
95 }
96
Generate_Sphere(void)97 void Generate_Sphere(void)
98 {
99 /* first generate vertices */
100 {
101 int i,j;
102 VECTORCH *v = SphereVertex;
103 VECTORCH *o = OctantVertex;
104
105 Generate_SphereOctant();
106
107 /* north pole */
108 *v++ = *o;
109 for (i=0; ++i<=SPHERE_ORDER;)
110 {
111 o += i;
112 /* 1st Quadrant */
113 for (j=i; --j>=0; o++, v++)
114 {
115 *v = *o;
116 }
117 /* 2nd Quadrant */
118 for (j=i; --j>=0; o--, v++)
119 {
120 v->vx = -o->vx;
121 v->vy = o->vy;
122 v->vz = o->vz;
123 }
124 /* 3rd Quadrant */
125 for (j=i; --j>=0; o++, v++)
126 {
127 v->vx = -o->vx;
128 v->vy = -o->vy;
129 v->vz = o->vz;
130 }
131 /* 4th Quadrant */
132 for (j=i; --j>=0; o--, v++)
133 {
134 v->vx = o->vx;
135 v->vy = -o->vy;
136 v->vz = o->vz;
137 }
138 }
139 for (; --i>1;)
140 {
141 o -= i;
142 /* 5th Quadrant */
143 for (j=i; --j>0; o++, v++)
144 {
145 v->vx = o->vx;
146 v->vy = o->vy;
147 v->vz = -o->vz;
148 }
149 /* 6th Quadrant */
150 for (j=i; --j>0; o--, v++)
151 {
152 v->vx = -o->vx;
153 v->vy = o->vy;
154 v->vz = -o->vz;
155 }
156 /* 7th Quadrant */
157 for (j=i; --j>0; o++, v++)
158 {
159 v->vx = -o->vx;
160 v->vy = -o->vy;
161 v->vz = -o->vz;
162 }
163 /* 8th Quadrant */
164 for (j=i; --j>0; o--, v++)
165 {
166 v->vx = o->vx;
167 v->vy = -o->vy;
168 v->vz = -o->vz;
169 }
170 }
171 o--;
172 /* south pole */
173 v->vx = -o->vx;
174 v->vy = -o->vy;
175 v->vz = -o->vz;
176 }
177
178 /* now generate face data */
179 {
180 TRI_FACE *f = SphereFace;
181 int kv,kw,ko,kv0,kw0,i,j;
182
183 kv = 0, kw = 1;
184
185 for(i=0; i<SPHERE_ORDER; i++)
186 {
187 kv0 = kv, kw0 = kw;
188 for (ko=1; ko<=3; ko++)
189 {
190 for (j=i;; j--)
191 {
192 MakeFace(f,kv,kw,++kw);
193 if (j==0) break;
194 MakeFace(f,kv,kw,++kv);
195 }
196 }
197 for (j=i;;j--)
198 {
199 if (j==0)
200 {
201 MakeFace(f,kv0,kw,kw0);
202 kv++;
203 kw++;
204 break;
205 }
206 MakeFace(f,kv,kw,++kw);
207 if (j==1)
208 {
209 MakeFace(f,kv,kw,kv0);
210 }
211 else MakeFace(f,kv,kw,++kv);
212 }
213 }
214 for(; --i>=0;)
215 {
216 kv0=kv,kw0=kw;
217 for(ko=5;ko<=7;ko++)
218 {
219 for (j=i;; j--)
220 {
221 MakeFace(f,kv,kw,++kv);
222 if (j==0) break;
223 MakeFace(f,kv,kw,++kw);
224 }
225 }
226 for (j=i;;j--)
227 {
228 if (j==0)
229 {
230 MakeFace(f,kv,kw0,kv0);
231 kv++;
232 kw++;
233 break;
234 }
235 MakeFace(f,kv,kw,++kv);
236 if (j==1)
237 {
238 MakeFace(f,kv,kw,kw0);
239 }
240 else MakeFace(f,kv,kw,++kw);
241 }
242 }
243 }
244 {
245 int i;
246 VECTORCH *vSphere = SphereVertex;
247 for(i=0;i<SPHERE_VERTICES;i++,vSphere++)
248 {
249 // int radius = vSphere->vx*vSphere->vx+vSphere->vz*vSphere->vz;
250 // if (radius<16384) radius = 16384;
251
252 // SphereAtmosU[i] = DIV_FIXED(ArcCos(vSphere->vy)*32*128*8,radius);
253 SphereAtmosV[i] = ArcCos(vSphere->vy)*32*128*SPHERE_TEXTURE_WRAP;//*8;
254 SphereAtmosU[i] = ArcTan(vSphere->vz,vSphere->vx)*16*128*SPHERE_TEXTURE_WRAP;//*8;
255 }
256 }
257 }
258