summaryrefslogtreecommitdiff
path: root/3dc/sphere.c
diff options
context:
space:
mode:
authorRebellion Developments <rebellion@nomail>2000-03-16 11:25:00 +0100
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-19 05:45:17 +0200
commit218ca90543758a20ac326e444ca0643174ca7384 (patch)
tree16bfe3e5307f9f515489000f28728224291a0e3b /3dc/sphere.c
Import Aliens vs Predator - Gold (Build 116)
Source code release, imported from: https://www.gamefront.com/games/aliens-vs-predator-3/file/avp-gold-complete-source-code All text files were converted to Unix format.
Diffstat (limited to '3dc/sphere.c')
-rw-r--r--3dc/sphere.c257
1 files changed, 257 insertions, 0 deletions
diff --git a/3dc/sphere.c b/3dc/sphere.c
new file mode 100644
index 0000000..b5ef4bc
--- /dev/null
+++ b/3dc/sphere.c
@@ -0,0 +1,257 @@
+#include "3dc.h"
+#include "module.h"
+#include "inline.h"
+
+#include "sphere.h"
+
+#define UseLocalAssert Yes
+#include "ourasert.h"
+
+
+#define MakeVertex(o,x,y,z) \
+{ \
+ o->vx=(x); \
+ o->vy=(y); \
+ o->vz=(z); \
+ o++; \
+}
+
+#define MakeFace(f,a,b,c) \
+{ \
+ f->v[0] = (a); \
+ f->v[1] = (b); \
+ f->v[2] = (c); \
+ f++; \
+}
+
+VECTORCH OctantVertex[(SPHERE_ORDER+1)*(SPHERE_ORDER+2)/2];
+VECTORCH SphereVertex[SPHERE_VERTICES];
+
+VECTORCH SphereRotatedVertex[SPHERE_VERTICES];
+VECTORCH SphereAtmosRotatedVertex[SPHERE_VERTICES];
+int SphereAtmosU[SPHERE_VERTICES];
+int SphereAtmosV[SPHERE_VERTICES];
+
+
+TRI_FACE SphereFace[SPHERE_FACES];
+int SphereVertexHeight[SPHERE_VERTICES];
+
+static void Generate_SphereOctant(void)
+{
+ int i,j;
+
+ VECTORCH *o = OctantVertex;
+
+ /* i=0, j=0 */
+ MakeVertex(o,0,0,SPHERE_RADIUS);
+
+ for (i=1; i<SPHERE_ORDER; i++)
+ {
+ int cosPhi, sinPhi;
+ {
+ int phi = 1024*i/SPHERE_ORDER;
+ cosPhi = GetCos(phi);
+ sinPhi = GetSin(phi);
+ }
+
+ /* 0<i<n, j=0 */
+ /* => cosTheta = 1, sinTheta = 0 */
+ MakeVertex(o,sinPhi,0,cosPhi);
+
+ for (j=1; j<i; j++)
+ {
+ int cosTheta, sinTheta;
+ {
+ int theta = 1024*j/i;
+ cosTheta = GetCos(theta);
+ sinTheta = GetSin(theta);
+ }
+
+ /* 0<i<n, 0<j<i */
+ MakeVertex(o,MUL_FIXED(cosTheta,sinPhi),MUL_FIXED(sinTheta,sinPhi),cosPhi);
+ }
+
+ /* 0<i<n, j=i */
+ MakeVertex(o,0,sinPhi,cosPhi);
+ }
+
+ /* i=n, j=0 */
+ MakeVertex(o,SPHERE_RADIUS,0,0);
+
+ for (j=1; j<SPHERE_ORDER; j++)
+ {
+ int cosTheta, sinTheta;
+ {
+ int theta = 1024*j/SPHERE_ORDER;
+ cosTheta = GetCos(theta);
+ sinTheta = GetSin(theta);
+ }
+ /* i=n, 0<j<i */
+ MakeVertex(o,cosTheta,sinTheta,0);
+ }
+
+ /* i=n, j=i */
+ MakeVertex(o,0,SPHERE_RADIUS,0);
+}
+
+void Generate_Sphere(void)
+{
+ /* first generate vertices */
+ {
+ int i,j;
+ VECTORCH *v = SphereVertex;
+ VECTORCH *o = OctantVertex;
+
+ Generate_SphereOctant();
+
+ /* north pole */
+ *v++ = *o;
+ for (i=0; ++i<=SPHERE_ORDER;)
+ {
+ o += i;
+ /* 1st Quadrant */
+ for (j=i; --j>=0; o++, v++)
+ {
+ *v = *o;
+ }
+ /* 2nd Quadrant */
+ for (j=i; --j>=0; o--, v++)
+ {
+ v->vx = -o->vx;
+ v->vy = o->vy;
+ v->vz = o->vz;
+ }
+ /* 3rd Quadrant */
+ for (j=i; --j>=0; o++, v++)
+ {
+ v->vx = -o->vx;
+ v->vy = -o->vy;
+ v->vz = o->vz;
+ }
+ /* 4th Quadrant */
+ for (j=i; --j>=0; o--, v++)
+ {
+ v->vx = o->vx;
+ v->vy = -o->vy;
+ v->vz = o->vz;
+ }
+ }
+ for (; --i>1;)
+ {
+ o -= i;
+ /* 5th Quadrant */
+ for (j=i; --j>0; o++, v++)
+ {
+ v->vx = o->vx;
+ v->vy = o->vy;
+ v->vz = -o->vz;
+ }
+ /* 6th Quadrant */
+ for (j=i; --j>0; o--, v++)
+ {
+ v->vx = -o->vx;
+ v->vy = o->vy;
+ v->vz = -o->vz;
+ }
+ /* 7th Quadrant */
+ for (j=i; --j>0; o++, v++)
+ {
+ v->vx = -o->vx;
+ v->vy = -o->vy;
+ v->vz = -o->vz;
+ }
+ /* 8th Quadrant */
+ for (j=i; --j>0; o--, v++)
+ {
+ v->vx = o->vx;
+ v->vy = -o->vy;
+ v->vz = -o->vz;
+ }
+ }
+ o--;
+ /* south pole */
+ v->vx = -o->vx;
+ v->vy = -o->vy;
+ v->vz = -o->vz;
+ }
+
+ /* now generate face data */
+ {
+ TRI_FACE *f = SphereFace;
+ int kv,kw,ko,kv0,kw0,i,j;
+
+ kv = 0, kw = 1;
+
+ for(i=0; i<SPHERE_ORDER; i++)
+ {
+ kv0 = kv, kw0 = kw;
+ for (ko=1; ko<=3; ko++)
+ {
+ for (j=i;; j--)
+ {
+ MakeFace(f,kv,kw,++kw);
+ if (j==0) break;
+ MakeFace(f,kv,kw,++kv);
+ }
+ }
+ for (j=i;;j--)
+ {
+ if (j==0)
+ {
+ MakeFace(f,kv0,kw,kw0);
+ kv++;
+ kw++;
+ break;
+ }
+ MakeFace(f,kv,kw,++kw);
+ if (j==1)
+ {
+ MakeFace(f,kv,kw,kv0);
+ }
+ else MakeFace(f,kv,kw,++kv);
+ }
+ }
+ for(; --i>=0;)
+ {
+ kv0=kv,kw0=kw;
+ for(ko=5;ko<=7;ko++)
+ {
+ for (j=i;; j--)
+ {
+ MakeFace(f,kv,kw,++kv);
+ if (j==0) break;
+ MakeFace(f,kv,kw,++kw);
+ }
+ }
+ for (j=i;;j--)
+ {
+ if (j==0)
+ {
+ MakeFace(f,kv,kw0,kv0);
+ kv++;
+ kw++;
+ break;
+ }
+ MakeFace(f,kv,kw,++kv);
+ if (j==1)
+ {
+ MakeFace(f,kv,kw,kw0);
+ }
+ else MakeFace(f,kv,kw,++kw);
+ }
+ }
+ }
+ {
+ int i;
+ VECTORCH *vSphere = SphereVertex;
+ for(i=0;i<SPHERE_VERTICES;i++,vSphere++)
+ {
+// int radius = vSphere->vx*vSphere->vx+vSphere->vz*vSphere->vz;
+// if (radius<16384) radius = 16384;
+
+// SphereAtmosU[i] = DIV_FIXED(ArcCos(vSphere->vy)*32*128*8,radius);
+ SphereAtmosV[i] = ArcCos(vSphere->vy)*32*128*SPHERE_TEXTURE_WRAP;//*8;
+ SphereAtmosU[i] = ArcTan(vSphere->vz,vSphere->vx)*16*128*SPHERE_TEXTURE_WRAP;//*8;
+ }
+ }
+}