assaultfish/engine/src/math.c

166 lines
5 KiB
C
Raw Normal View History

2026-01-12 01:54:35 +09:00
#include <GearSrc/Math.h>
2026-01-09 03:38:29 +09:00
2026-01-12 01:54:35 +09:00
void GSMathCross3(GSVector3 r, GSVector3 v0, GSVector3 v1) {
2026-01-10 19:51:48 +09:00
r[0] = v0[1] * v1[2] - v0[2] * v1[1];
r[1] = v0[2] * v1[0] - v0[0] * v1[2];
r[2] = v0[0] * v1[1] - v0[1] * v1[0];
}
2026-01-25 13:35:09 +09:00
GSNumber GSMathInner3(GSVector3 v0, GSVector3 v1) {
GSNumber r = 0;
int i;
for(i = 0; i < 3; i++) r += v0[i] * v1[i];
return r;
}
2026-01-30 23:07:23 +09:00
GSNumber GSMathLength3(GSVector3 vec) {
2026-01-12 01:54:35 +09:00
GSNumber l = 0;
2026-01-11 23:10:13 +09:00
int i;
2026-01-10 19:51:48 +09:00
for(i = 0; i < 3; i++) l += vec[i] * vec[i];
l = sqrt(l);
2026-01-30 23:07:23 +09:00
return l;
}
void GSMathNormalize3(GSVector3 vec) {
GSNumber l = GSMathLength3(vec);
2026-01-10 19:51:48 +09:00
if(l > 0) {
2026-01-12 01:54:35 +09:00
l = (GSNumber)1 / l;
2026-01-10 19:51:48 +09:00
} else {
l = 0;
}
vec[0] *= l;
vec[1] *= l;
vec[2] *= l;
}
2026-01-12 01:54:35 +09:00
void GSMathSubtract3(GSVector3 r, GSVector3 v0, GSVector3 v1) {
2026-01-10 19:51:48 +09:00
int i;
for(i = 0; i < 3; i++) r[i] = v0[i] - v1[i];
}
2026-01-12 01:54:35 +09:00
void GSMathAdd3(GSVector3 r, GSVector3 v0, GSVector3 v1) {
2026-01-10 19:51:48 +09:00
int i;
for(i = 0; i < 3; i++) r[i] = v0[i] + v1[i];
2026-01-09 03:38:29 +09:00
}
/*
* v0-v2
* | /
* v1/
*/
2026-01-30 08:09:06 +09:00
void GSMathNormalTriangle(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2) {
2026-01-12 01:54:35 +09:00
GSVector3 t0, t1;
2026-01-09 03:38:29 +09:00
2026-01-27 22:59:53 +09:00
/**
* this used to be:
* (v1 - v0) * (v2 - v0)
*
* why do i have to do this now? i know it is because of +z front
* but why?
*/
2026-01-27 22:35:38 +09:00
GSMathSubtract3(t0, v1, v2);
GSMathSubtract3(t1, v0, v2);
2026-01-09 03:38:29 +09:00
2026-01-12 01:54:35 +09:00
GSMathCross3(r, t0, t1);
2026-01-09 03:38:29 +09:00
2026-01-12 01:54:35 +09:00
GSMathNormalize3(r);
2026-01-09 03:38:29 +09:00
}
/*
* v0-v3
* | |
* v1-v2
*/
2026-01-30 08:09:06 +09:00
void GSMathNormalQuad(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2, GSVector3 v3) {
2026-01-12 01:54:35 +09:00
GSVector3 t0, t1;
2026-01-09 03:38:29 +09:00
2026-01-30 08:09:06 +09:00
GSMathNormalTriangle(t0, v0, v1, v3);
GSMathNormalTriangle(t1, v1, v2, v3);
2026-01-09 03:38:29 +09:00
2026-01-12 01:54:35 +09:00
GSMathAdd3(r, t0, t1);
2026-01-09 03:38:29 +09:00
2026-01-12 01:54:35 +09:00
GSMathNormalize3(r);
2026-01-10 19:51:48 +09:00
}
2026-01-09 03:38:29 +09:00
2026-01-12 01:54:35 +09:00
GSNumber GSMathCot(GSNumber x) {
return (GSNumber)1 / tan(x);
2026-01-09 03:38:29 +09:00
}
2026-01-11 17:43:03 +09:00
2026-01-30 08:09:06 +09:00
void GSMathRowToColumn4x4(GSMatrix4x4 out, GSMatrix4x4 in) {
int y, x;
for(y = 0; y < 4; y++) {
for(x = 0; x < 4; x++) {
out[4 * x + y] = in[4 * y + x];
}
}
}
2026-01-30 08:44:11 +09:00
void GSMathRowToColumn3x3(GSMatrix3x3 out, GSMatrix3x3 in) {
int y, x;
for(y = 0; y < 3; y++) {
for(x = 0; x < 3; x++) {
out[3 * x + y] = in[3 * y + x];
}
}
}
void GSMath3x3To4x4(GSMatrix4x4 out, GSMatrix3x3 in) {
int y, x, i;
for(i = 0; i < 16; i++) out[i] = 0;
for(y = 0; y < 3; y++) {
for(x = 0; x < 3; x++) {
out[4 * y + x] = in[3 * y + x];
}
}
out[15] = 1;
}
2026-01-12 01:54:35 +09:00
void GSMathInvert4x4(GSMatrix4x4 out, GSMatrix4x4 in) {
GSNumber inv[16], det;
2026-01-11 23:10:13 +09:00
int i;
2026-01-11 17:43:03 +09:00
2026-01-30 08:09:06 +09:00
inv[0] = in[5] * in[10] * in[15] - in[5] * in[14] * in[11] - in[6] * in[9] * in[15] + in[6] * in[13] * in[11] + in[7] * in[9] * in[14] - in[7] * in[13] * in[10];
inv[1] = -in[1] * in[10] * in[15] + in[1] * in[14] * in[11] + in[2] * in[9] * in[15] - in[2] * in[13] * in[11] - in[3] * in[9] * in[14] + in[3] * in[13] * in[10];
inv[2] = in[1] * in[6] * in[15] - in[1] * in[14] * in[7] - in[2] * in[5] * in[15] + in[2] * in[13] * in[7] + in[3] * in[5] * in[14] - in[3] * in[13] * in[6];
inv[3] = -in[1] * in[6] * in[11] + in[1] * in[10] * in[7] + in[2] * in[5] * in[11] - in[2] * in[9] * in[7] - in[3] * in[5] * in[10] + in[3] * in[9] * in[6];
inv[4] = -in[4] * in[10] * in[15] + in[4] * in[14] * in[11] + in[6] * in[8] * in[15] - in[6] * in[12] * in[11] - in[7] * in[8] * in[14] + in[7] * in[12] * in[10];
inv[5] = in[0] * in[10] * in[15] - in[0] * in[14] * in[11] - in[2] * in[8] * in[15] + in[2] * in[12] * in[11] + in[3] * in[8] * in[14] - in[3] * in[12] * in[10];
inv[6] = -in[0] * in[6] * in[15] + in[0] * in[14] * in[7] + in[2] * in[4] * in[15] - in[2] * in[12] * in[7] - in[3] * in[4] * in[14] + in[3] * in[12] * in[6];
inv[7] = in[0] * in[6] * in[11] - in[0] * in[10] * in[7] - in[2] * in[4] * in[11] + in[2] * in[8] * in[7] + in[3] * in[4] * in[10] - in[3] * in[8] * in[6];
inv[8] = in[4] * in[9] * in[15] - in[4] * in[13] * in[11] - in[5] * in[8] * in[15] + in[5] * in[12] * in[11] + in[7] * in[8] * in[13] - in[7] * in[12] * in[9];
inv[9] = -in[0] * in[9] * in[15] + in[0] * in[13] * in[11] + in[1] * in[8] * in[15] - in[1] * in[12] * in[11] - in[3] * in[8] * in[13] + in[3] * in[12] * in[9];
inv[10] = in[0] * in[5] * in[15] - in[0] * in[13] * in[7] - in[1] * in[4] * in[15] + in[1] * in[12] * in[7] + in[3] * in[4] * in[13] - in[3] * in[12] * in[5];
inv[11] = -in[0] * in[5] * in[11] + in[0] * in[9] * in[7] + in[1] * in[4] * in[11] - in[1] * in[8] * in[7] - in[3] * in[4] * in[9] + in[3] * in[8] * in[5];
inv[12] = -in[4] * in[9] * in[14] + in[4] * in[13] * in[10] + in[5] * in[8] * in[14] - in[5] * in[12] * in[10] - in[6] * in[8] * in[13] + in[6] * in[12] * in[9];
inv[13] = in[0] * in[9] * in[14] - in[0] * in[13] * in[10] - in[1] * in[8] * in[14] + in[1] * in[12] * in[10] + in[2] * in[8] * in[13] - in[2] * in[12] * in[9];
inv[14] = -in[0] * in[5] * in[14] + in[0] * in[13] * in[6] + in[1] * in[4] * in[14] - in[1] * in[12] * in[6] - in[2] * in[4] * in[13] + in[2] * in[12] * in[5];
inv[15] = in[0] * in[5] * in[10] - in[0] * in[9] * in[6] - in[1] * in[4] * in[10] + in[1] * in[8] * in[6] + in[2] * in[4] * in[9] - in[2] * in[8] * in[5];
det = in[0] * inv[0] + in[4] * inv[1] + in[8] * inv[2] + in[12] * inv[3];
2026-01-11 17:43:03 +09:00
if(det == 0)
return;
det = 1.0 / det;
for(i = 0; i < 16; i++)
out[i] = inv[i] * det;
}
2026-01-25 05:18:56 +09:00
GSNumber GSMathClosestPOT(GSNumber x) {
GSNumber r = 2;
while(r < x) r *= 2;
return r;
}