27 #ifndef ICB_PX_CAPRI_MATHS_PC_H 28 #define ICB_PX_CAPRI_MATHS_PC_H 30 #include "common/util.h" 34 #if (_PSX_ON_PC == 0) && !defined ICB_PX_CAPRI_MATHS_PC_H 37 typedef struct MATRIXPC {
41 MATRIXPC() { pad = 0; }
45 typedef struct VECTOR {
52 typedef struct SVECTORPC {
55 SVECTORPC() { pad = 0; }
56 bool operator==(
const SVECTORPC &v) {
return ((v.vx == vx) && (v.vy == vy) && (v.vz == vz)); }
60 typedef struct CVECTOR {
63 CVECTOR() { pad = 0; }
64 bool operator==(
const CVECTOR &v) {
return ((v.r == r) && (v.g == g) && (v.b == b)); }
67 #endif // #if (_PSX_ON_PC==0) 70 const int32 ONE_PC_SCALE = 12;
71 const int32 ONE_PC = 1 << ONE_PC_SCALE;
72 const float myPI_PC = 3.141592654f;
73 const int32 ZSCALE = 1;
75 inline int32 myNINT_PC(
float f) {
84 #define VectorNormal_pc myVectorNormal_pc 85 #define ApplyMatrixLV_pc myApplyMatrixLV_pc 86 #define ApplyMatrixSV_pc myApplyMatrixSV_pc 87 #define RotMatrix_gte_pc myRotMatrix_gte_pc 88 #define gte_MulMatrix0_pc mygte_MulMatrix0_pc 89 #define gte_RotTrans_pc mygte_RotTrans_pc 90 #define gte_RotTransPers_pc mygte_RotTransPers_pc 91 #define gte_RotTransPers3_pc mygte_RotTransPers3_pc 92 #define gte_SetRotMatrix_pc mygte_SetRotMatrix_pc 93 #define gte_SetTransMatrix_pc mygte_SetTransMatrix_pc 94 #define gte_ApplyRotMatrix_pc mygte_ApplyRotMatrix_pc 95 #define gte_SetGeomScreen_pc mygte_SetGeomScreen_pc 96 #define gte_SetBackColor_pc mygte_SetBackColor_pc 97 #define gte_SetColorMatrix_pc mygte_SetColorMatrix_pc 98 #define gte_SetLightMatrix_pc mygte_SetLightMatrix_pc 99 #define gte_NormalColorCol_pc mygte_NormalColorCol_pc 100 #define gte_NormalColorCol3_pc mygte_NormalColorCol3_pc 101 #define gte_NormalClip_pc mygte_NormalClip_pc 102 #define gte_AverageZ3_pc mygte_AverageZ3_pc 103 #define gte_SetScreenScaleShift_pc mygte_SetScreenScaleShift_pc 107 extern MATRIXPC *gterot_pc;
108 extern MATRIXPC *gtetrans_pc;
109 extern MATRIXPC *gtecolour_pc;
110 extern MATRIXPC *gtelight_pc;
111 extern int32 gteback_pc[3];
112 extern int32 gtegeomscrn_pc;
113 extern int32 gtescreenscaleshift_pc;
117 inline void myApplyMatrixLV_pc(MATRIXPC *m, VECTOR *invec, VECTOR *outvec);
119 inline void myApplyMatrixSV_pc(MATRIXPC *m, SVECTORPC *invec, SVECTORPC *outvec);
120 inline void myApplyMatrixSV_pc(MATRIXPC *m, SVECTOR *invec, SVECTORPC *outvec);
122 inline int32 myVectorNormal_pc(VECTOR *in0, VECTOR *out0);
124 inline void mygte_MulMatrix0_pc(MATRIXPC *m1, MATRIXPC *m2, MATRIXPC *out);
126 inline void mygte_RotTrans_pc(SVECTORPC *in0, VECTOR *out0, int32 *flag);
127 inline void mygte_RotTrans_pc(SVECTOR *in0, VECTOR *out0, int32 *flag);
129 inline void mygte_RotTransPers_pc(SVECTORPC *in0, SVECTORPC *sxy0, int32 *p, int32 *flag, int32 *z);
130 inline void mygte_RotTransPers_pc(SVECTOR *in0, SVECTORPC *sxy0, int32 *p, int32 *flag, int32 *z);
132 inline void mygte_RotTransPers3_pc(SVECTORPC *in0, SVECTORPC *in1, SVECTORPC *in2, SVECTORPC *sxy0, SVECTORPC *sxy1, SVECTORPC *sxy2, int32 *p, int32 *flag, int32 *z);
134 inline void mygte_SetRotMatrix_pc(MATRIXPC *m);
136 inline void mygte_SetTransMatrix_pc(MATRIXPC *m);
138 inline void mygte_ApplyRotMatrix_pc(SVECTORPC *invec, VECTOR *outvec);
140 inline void myRotMatrix_gte_pc(SVECTOR *rot, MATRIXPC *m);
142 inline void mygte_SetColorMatrix_pc(MATRIXPC *m);
144 inline void mygte_SetLightMatrix_pc(MATRIXPC *m);
146 inline void mygte_SetGeomScreen_pc(int32 h);
148 inline void mygte_SetBackColor_pc(int32 r, int32 g, int32 b);
150 inline void mygte_SetScreenScaleShift_pc(int32 shift);
152 inline void mygte_NormalColorCol_pc(SVECTOR *v0, CVECTOR *in0, CVECTOR *out0);
154 inline void mygte_NormalColorCol3_pc(SVECTOR *v0, SVECTOR *v1, SVECTOR *v2, CVECTOR *in0, CVECTOR *out0, CVECTOR *out1, CVECTOR *out2);
156 inline void mygte_NormalClip_pc(SVECTORPC *sxy0, SVECTORPC *sxy1, SVECTORPC *sxy2, int32 *flag);
157 inline void mygte_NormalClip_pc(SVECTOR *sxy0, SVECTOR *sxy1, SVECTOR *sxy2, int32 *flag);
159 inline void mygte_AverageZ3_pc(int32 z0, int32 z1, int32 z2, int32 *sz);
163 inline void myApplyMatrixLV_pc(MATRIXPC *m, VECTOR *invec, VECTOR *outvec) {
164 outvec->vx = (m->m[0][0] * invec->vx + m->m[0][1] * invec->vy + m->m[0][2] * invec->vz) / ONE_PC;
165 outvec->vy = (m->m[1][0] * invec->vx + m->m[1][1] * invec->vy + m->m[1][2] * invec->vz) / ONE_PC;
166 outvec->vz = (m->m[2][0] * invec->vx + m->m[2][1] * invec->vy + m->m[2][2] * invec->vz) / ONE_PC;
171 inline void myApplyMatrixSV_pc(MATRIXPC *m, SVECTORPC *invec, SVECTORPC *outvec) {
172 outvec->vx = (int)((m->m[0][0] * invec->vx + m->m[0][1] * invec->vy + m->m[0][2] * invec->vz) / ONE_PC);
173 outvec->vy = (int)((m->m[1][0] * invec->vx + m->m[1][1] * invec->vy + m->m[1][2] * invec->vz) / ONE_PC);
174 outvec->vz = (int)((m->m[2][0] * invec->vx + m->m[2][1] * invec->vy + m->m[2][2] * invec->vz) / ONE_PC);
179 inline void myApplyMatrixSV_pc(MATRIXPC *m, SVECTOR *invec, SVECTORPC *outvec) {
180 outvec->vx = (int)((m->m[0][0] * (
int)invec->vx + m->m[0][1] * (
int)invec->vy + m->m[0][2] * (
int)invec->vz) / ONE_PC);
181 outvec->vy = (int)((m->m[1][0] * (
int)invec->vx + m->m[1][1] * (int)invec->vy + m->m[1][2] * (
int)invec->vz) / ONE_PC);
182 outvec->vz = (int)((m->m[2][0] * (
int)invec->vx + m->m[2][1] * (int)invec->vy + m->m[2][2] * (
int)invec->vz) / ONE_PC);
187 inline void mygte_MulMatrix0_pc(MATRIXPC *m1, MATRIXPC *m2, MATRIXPC *out) {
190 if ((out == m1) || (out == m2))
194 work->m[0][0] = (int)((m1->m[0][0] * m2->m[0][0] + m1->m[0][1] * m2->m[1][0] + m1->m[0][2] * m2->m[2][0]) / ONE_PC);
195 work->m[0][1] = (int)((m1->m[0][0] * m2->m[0][1] + m1->m[0][1] * m2->m[1][1] + m1->m[0][2] * m2->m[2][1]) / ONE_PC);
196 work->m[0][2] = (int)((m1->m[0][0] * m2->m[0][2] + m1->m[0][1] * m2->m[1][2] + m1->m[0][2] * m2->m[2][2]) / ONE_PC);
197 work->m[1][0] = (int)((m1->m[1][0] * m2->m[0][0] + m1->m[1][1] * m2->m[1][0] + m1->m[1][2] * m2->m[2][0]) / ONE_PC);
198 work->m[1][1] = (int)((m1->m[1][0] * m2->m[0][1] + m1->m[1][1] * m2->m[1][1] + m1->m[1][2] * m2->m[2][1]) / ONE_PC);
199 work->m[1][2] = (int)((m1->m[1][0] * m2->m[0][2] + m1->m[1][1] * m2->m[1][2] + m1->m[1][2] * m2->m[2][2]) / ONE_PC);
200 work->m[2][0] = (int)((m1->m[2][0] * m2->m[0][0] + m1->m[2][1] * m2->m[1][0] + m1->m[2][2] * m2->m[2][0]) / ONE_PC);
201 work->m[2][1] = (int)((m1->m[2][0] * m2->m[0][1] + m1->m[2][1] * m2->m[1][1] + m1->m[2][2] * m2->m[2][1]) / ONE_PC);
202 work->m[2][2] = (int)((m1->m[2][0] * m2->m[0][2] + m1->m[2][1] * m2->m[1][2] + m1->m[2][2] * m2->m[2][2]) / ONE_PC);
205 out->m[0][0] = work->m[0][0];
206 out->m[0][1] = work->m[0][1];
207 out->m[0][2] = work->m[0][2];
209 out->m[1][0] = work->m[1][0];
210 out->m[1][1] = work->m[1][1];
211 out->m[1][2] = work->m[1][2];
213 out->m[2][0] = work->m[2][0];
214 out->m[2][1] = work->m[2][1];
215 out->m[2][2] = work->m[2][2];
221 inline void mygte_SetRotMatrix_pc(MATRIXPC *m) { *gterot_pc = *m; }
225 inline void mygte_SetTransMatrix_pc(MATRIXPC *m) { *gtetrans_pc = *m; }
229 inline void mygte_ApplyRotMatrix_pc(SVECTORPC *invec, VECTOR *outvec) {
230 outvec->vx = ((gterot_pc->m[0][0] * invec->vx + gterot_pc->m[0][1] * invec->vy + gterot_pc->m[0][2] * invec->vz) / ONE_PC);
231 outvec->vy = ((gterot_pc->m[1][0] * invec->vx + gterot_pc->m[1][1] * invec->vy + gterot_pc->m[1][2] * invec->vz) / ONE_PC);
232 outvec->vz = ((gterot_pc->m[2][0] * invec->vx + gterot_pc->m[2][1] * invec->vy + gterot_pc->m[2][2] * invec->vz) / ONE_PC);
237 inline void mygte_RotTrans_pc(SVECTORPC *in0, VECTOR *out0, int32 *flag) {
238 mygte_ApplyRotMatrix_pc(in0, out0);
239 out0->vx += gtetrans_pc->t[0];
240 out0->vy += gtetrans_pc->t[1];
241 out0->vz += gtetrans_pc->t[2];
249 inline void mygte_RotTrans_pc(SVECTOR *in0, VECTOR *out0, int32 *flag) {
255 mygte_ApplyRotMatrix_pc(&sv_pc, out0);
257 out0->vx += gtetrans_pc->t[0];
258 out0->vy += gtetrans_pc->t[1];
259 out0->vz += gtetrans_pc->t[2];
267 inline void mygte_RotTransPers_pc(SVECTORPC *in0, SVECTORPC *sxy0, int32 * , int32 *flag, int32 *z) {
269 cam.vx = ((gterot_pc->m[0][0] * in0->vx + gterot_pc->m[0][1] * in0->vy + gterot_pc->m[0][2] * in0->vz) / ONE_PC);
270 cam.vy = ((gterot_pc->m[1][0] * in0->vx + gterot_pc->m[1][1] * in0->vy + gterot_pc->m[1][2] * in0->vz) / ONE_PC);
271 cam.vz = ((gterot_pc->m[2][0] * in0->vx + gterot_pc->m[2][1] * in0->vy + gterot_pc->m[2][2] * in0->vz) / ONE_PC);
272 cam.vx += (gtetrans_pc->t[0] << gtescreenscaleshift_pc);
273 cam.vy += (gtetrans_pc->t[1] << gtescreenscaleshift_pc);
274 cam.vz += (gtetrans_pc->t[2] << gtescreenscaleshift_pc);
279 sxy0->vx = (int)((cam.vx * gtegeomscrn_pc) / cam.vz);
280 sxy0->vy = (int)((cam.vy * gtegeomscrn_pc) / cam.vz);
287 cam.vz >>= gtescreenscaleshift_pc;
290 if (abs(sxy0->vx) > 1024)
292 if (abs(sxy0->vy) > 1024)
302 inline void mygte_RotTransPers_pc(SVECTOR *in0, SVECTORPC *sxy0, int32 * , int32 *flag, int32 *z) {
304 cam.vx = ((gterot_pc->m[0][0] * (int)in0->vx + gterot_pc->m[0][1] * (
int)in0->vy + gterot_pc->m[0][2] * (int)in0->vz) / ONE_PC);
305 cam.vy = ((gterot_pc->m[1][0] * (int)in0->vx + gterot_pc->m[1][1] * (
int)in0->vy + gterot_pc->m[1][2] * (int)in0->vz) / ONE_PC);
306 cam.vz = ((gterot_pc->m[2][0] * (int)in0->vx + gterot_pc->m[2][1] * (
int)in0->vy + gterot_pc->m[2][2] * (int)in0->vz) / ONE_PC);
307 cam.vx += (gtetrans_pc->t[0] << gtescreenscaleshift_pc);
308 cam.vy += (gtetrans_pc->t[1] << gtescreenscaleshift_pc);
309 cam.vz += (gtetrans_pc->t[2] << gtescreenscaleshift_pc);
314 sxy0->vx = (int)((cam.vx * gtegeomscrn_pc) / cam.vz);
315 sxy0->vy = (int)((cam.vy * gtegeomscrn_pc) / cam.vz);
322 cam.vz >>= gtescreenscaleshift_pc;
325 if (abs(sxy0->vx) > 1024)
327 if (abs(sxy0->vy) > 1024)
337 inline void mygte_RotTransPers3_pc(SVECTORPC *in0, SVECTORPC *in1, SVECTORPC *in2, SVECTORPC *sxy0, SVECTORPC *sxy1, SVECTORPC *sxy2, int32 *p, int32 *flag, int32 *z) {
340 int32 flag0, flag1, flag2;
342 mygte_RotTransPers_pc(in0, sxy0, &p0, &flag0, &z0);
343 mygte_RotTransPers_pc(in1, sxy1, &p1, &flag1, &z1);
344 mygte_RotTransPers_pc(in2, sxy2, &p2, &flag2, &z2);
347 *flag = flag0 | flag1 | flag2;
354 inline void myRotMatrix_gte_pc(SVECTOR *rot, MATRIXPC *m) {
355 float ang0 = (float)rot->vx * 2.0f * myPI_PC / 4096;
357 int32 c0 = myNINT_PC(ONE_PC * (
float)cos(ang0));
358 int32 s0 = myNINT_PC(ONE_PC * (
float)sin(ang0));
371 float ang1 = (float)rot->vy * 2.0f * myPI_PC / 4096;
372 int32 c1 = myNINT_PC(ONE_PC * (
float)cos(ang1));
373 int32 s1 = myNINT_PC(ONE_PC * (
float)sin(ang1));
387 float ang2 = (float)rot->vz * 2.0f * myPI_PC / 4096;
388 int32 c2 = myNINT_PC(ONE_PC * (
float)cos(ang2));
389 int32 s2 = myNINT_PC(ONE_PC * (
float)sin(ang2));
404 mygte_MulMatrix0_pc(&m0, &m1, m);
405 mygte_MulMatrix0_pc(m, &m2, m);
410 inline void mygte_SetBackColor_pc(int32 r, int32 g, int32 b) {
418 inline void mygte_SetColorMatrix_pc(MATRIXPC *m) { *gtecolour_pc = *m; }
422 inline void mygte_SetLightMatrix_pc(MATRIXPC *m) { *gtelight_pc = *m; }
426 inline void mygte_SetGeomScreen_pc(int32 h) { gtegeomscrn_pc = h; }
430 inline void mygte_NormalColorCol_pc(SVECTOR *v0, CVECTOR *in0, CVECTOR *out0) {
431 SVECTORPC lightEffect;
433 ApplyMatrixSV_pc(gtelight_pc, v0, &lightEffect);
434 if (lightEffect.vx < 0)
436 if (lightEffect.vy < 0)
438 if (lightEffect.vz < 0)
442 SVECTORPC colourEffect;
443 ApplyMatrixSV_pc(gtecolour_pc, &lightEffect, &colourEffect);
444 if (colourEffect.vx < 0)
446 if (colourEffect.vy < 0)
448 if (colourEffect.vz < 0)
453 colourEffect.vx = ((colourEffect.vx >> (ONE_PC_SCALE - 8)) + gteback_pc[0]);
454 colourEffect.vy = ((colourEffect.vy >> (ONE_PC_SCALE - 8)) + gteback_pc[1]);
455 colourEffect.vz = ((colourEffect.vz >> (ONE_PC_SCALE - 8)) + gteback_pc[2]);
459 int32 red = ((in0->r * colourEffect.vx) >> 8);
460 int32 green = ((in0->g * colourEffect.vy) >> 8);
461 int32 blue = ((in0->b * colourEffect.vz) >> 8);
470 out0->r = (uint8)(red);
471 out0->g = (uint8)(green);
472 out0->b = (uint8)(blue);
477 inline void mygte_NormalColorCol3_pc(SVECTOR *v0, SVECTOR *v1, SVECTOR *v2, CVECTOR *in0, CVECTOR *out0, CVECTOR *out1, CVECTOR *out2) {
478 gte_NormalColorCol_pc(v0, in0, out0);
479 gte_NormalColorCol_pc(v1, in0, out1);
480 gte_NormalColorCol_pc(v2, in0, out2);
485 inline int32 myVectorNormal_pc(VECTOR *in0, VECTOR *out0) {
486 int32 r2 = (in0->vx * in0->vx + in0->vy * in0->vy + in0->vz * in0->vz);
487 float r = (float)sqrt((
float)r2) / (
float)ONE_PC;
489 if (fabs(r) < 1.0e-6)
492 out0->vx = (int32)((
float)in0->vx / r);
493 out0->vy = (int32)((
float)in0->vy / r);
494 out0->vz = (int32)((
float)in0->vz / r);
500 inline void mygte_NormalClip_pc(SVECTORPC *sxy0, SVECTORPC *sxy1, SVECTORPC *sxy2, int32 *flag) {
502 int32 l0x = sxy1->vx - sxy0->vx;
503 int32 l0y = sxy1->vy - sxy0->vy;
504 int32 l1x = sxy2->vx - sxy0->vx;
505 int32 l1y = sxy2->vy - sxy0->vy;
507 *flag = ((l0x * l1y) - (l0y * l1x));
512 inline void mygte_NormalClip_pc(SVECTOR *sxy0, SVECTOR *sxy1, SVECTOR *sxy2, int32 *flag) {
514 int32 l0x = sxy1->vx - sxy0->vx;
515 int32 l0y = sxy1->vy - sxy0->vy;
516 int32 l1x = sxy2->vx - sxy0->vx;
517 int32 l1y = sxy2->vy - sxy0->vy;
519 *flag = ((l0x * l1y) - (l0y * l1x));
524 inline void mygte_AverageZ3_pc(int32 z0, int32 z1, int32 z2, int32 *sz) {
525 *sz = (z0 + z1 + z2) / 3;
531 inline void mygte_SetScreenScaleShift_pc(int32 shift) { gtescreenscaleshift_pc = shift; }
537 #endif // #ifndef __PC_CAPRI_MATHS_PC_H