sphere.c 4.5 KB

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