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