diff --git a/engine/include/GearSrc/Math.h b/engine/include/GearSrc/Math.h index 3c7d834..e577b1a 100644 --- a/engine/include/GearSrc/Math.h +++ b/engine/include/GearSrc/Math.h @@ -15,12 +15,15 @@ GSDECL GSNumber GSMathInner3(GSVector3 v0, GSVector3 v1); GSDECL void GSMathNormalize3(GSVector3 vec); GSDECL void GSMathSubtract3(GSVector3 r, GSVector3 v0, GSVector3 v1); GSDECL void GSMathAdd3(GSVector3 r, GSVector3 v0, GSVector3 v1); -GSDECL void GSMathNormal3x3(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2); -GSDECL void GSMathNormal3x4(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2, GSVector3 v3); +GSDECL void GSMathNormalTriangle(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2); +GSDECL void GSMathNormalQuad(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2, GSVector3 v3); GSDECL void GSMathInvert4x4(GSMatrix4x4 out, GSMatrix4x4 in); +GSDECL void GSMathRowToColumn4x4(GSMatrix4x4 out, GSMatrix4x4 in); GSDECL GSNumber GSMathCot(GSNumber x); GSDECL GSNumber GSMathClosestPOT(GSNumber x); +#define GSMathColumnToRow4x4 GSMathRowToColumn4x4 + #ifdef __cplusplus } #endif diff --git a/engine/src/gl/gl_common.c b/engine/src/gl/gl_common.c index 7168dc7..162d5b8 100644 --- a/engine/src/gl/gl_common.c +++ b/engine/src/gl/gl_common.c @@ -189,7 +189,7 @@ void GSGLTetrakis(GSGL gl, GSNumber scale, GSVector4 col1, GSVector4 col2) { for(j = 0; j < 3; j++) v[i][j] *= scale; } - GSMathNormal3x3(n, v[0], v[1], v[2]); + GSMathNormalTriangle(n, v[0], v[1], v[2]); GSGLPushMatrix(gl); for(i = 0; i < 6; i++) { diff --git a/engine/src/gl/gl_shadow.c b/engine/src/gl/gl_shadow.c index f85a051..d0c4599 100644 --- a/engine/src/gl/gl_shadow.c +++ b/engine/src/gl/gl_shadow.c @@ -81,7 +81,7 @@ GSBool GSGLShadowBeforeMapping(GSGL gl) { } void GSGLShadowAfterMapping(GSGL gl) { - GSMatrix4x4 in, out; + GSMatrix4x4 in, in2, out, out2; GLdouble mat[16]; int i; @@ -115,8 +115,10 @@ void GSGLShadowAfterMapping(GSGL gl) { glLoadIdentity(); for(i = 0; i < 16; i++) in[i] = gl->shadow_old_modelview[i]; - GSMathInvert4x4(out, in); - for(i = 0; i < 16; i++) mat[i] = out[i]; + GSMathColumnToRow4x4(in2, in); + GSMathInvert4x4(out, in2); + GSMathRowToColumn4x4(out2, out); + for(i = 0; i < 16; i++) mat[i] = out2[i]; glTranslated(0.5, 0.5, 0.5); glScaled(0.5, 0.5, 0.5); diff --git a/engine/src/math.c b/engine/src/math.c index 350e67d..9c09c03 100644 --- a/engine/src/math.c +++ b/engine/src/math.c @@ -51,7 +51,7 @@ void GSMathAdd3(GSVector3 r, GSVector3 v0, GSVector3 v1) { * | / * v1/ */ -void GSMathNormal3x3(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2) { +void GSMathNormalTriangle(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2) { GSVector3 t0, t1; /** @@ -75,11 +75,11 @@ void GSMathNormal3x3(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2) { * | | * v1-v2 */ -void GSMathNormal3x4(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2, GSVector3 v3) { +void GSMathNormalQuad(GSVector3 r, GSVector3 v0, GSVector3 v1, GSVector3 v2, GSVector3 v3) { GSVector3 t0, t1; - GSMathNormal3x3(t0, v0, v1, v3); - GSMathNormal3x3(t1, v1, v2, v3); + GSMathNormalTriangle(t0, v0, v1, v3); + GSMathNormalTriangle(t1, v1, v2, v3); GSMathAdd3(r, t0, t1); @@ -90,28 +90,37 @@ GSNumber GSMathCot(GSNumber x) { return (GSNumber)1 / tan(x); } +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]; + } + } +} + void GSMathInvert4x4(GSMatrix4x4 out, GSMatrix4x4 in) { GSNumber inv[16], det; int i; - inv[0] = in[5] * in[10] * in[15] - in[5] * in[11] * in[14] - in[9] * in[6] * in[15] + in[9] * in[7] * in[14] + in[13] * in[6] * in[11] - in[13] * in[7] * in[10]; - inv[4] = -in[4] * in[10] * in[15] + in[4] * in[11] * in[14] + in[8] * in[6] * in[15] - in[8] * in[7] * in[14] - in[12] * in[6] * in[11] + in[12] * in[7] * in[10]; - inv[8] = in[4] * in[9] * in[15] - in[4] * in[11] * in[13] - in[8] * in[5] * in[15] + in[8] * in[7] * in[13] + in[12] * in[5] * in[11] - in[12] * in[7] * in[9]; - inv[12] = -in[4] * in[9] * in[14] + in[4] * in[10] * in[13] + in[8] * in[5] * in[14] - in[8] * in[6] * in[13] - in[12] * in[5] * in[10] + in[12] * in[6] * in[9]; - inv[1] = -in[1] * in[10] * in[15] + in[1] * in[11] * in[14] + in[9] * in[2] * in[15] - in[9] * in[3] * in[14] - in[13] * in[2] * in[11] + in[13] * in[3] * in[10]; - inv[5] = in[0] * in[10] * in[15] - in[0] * in[11] * in[14] - in[8] * in[2] * in[15] + in[8] * in[3] * in[14] + in[12] * in[2] * in[11] - in[12] * in[3] * in[10]; - inv[9] = -in[0] * in[9] * in[15] + in[0] * in[11] * in[13] + in[8] * in[1] * in[15] - in[8] * in[3] * in[13] - in[12] * in[1] * in[11] + in[12] * in[3] * in[9]; - inv[13] = in[0] * in[9] * in[14] - in[0] * in[10] * in[13] - in[8] * in[1] * in[14] + in[8] * in[2] * in[13] + in[12] * in[1] * in[10] - in[12] * in[2] * in[9]; - inv[2] = in[1] * in[6] * in[15] - in[1] * in[7] * in[14] - in[5] * in[2] * in[15] + in[5] * in[3] * in[14] + in[13] * in[2] * in[7] - in[13] * in[3] * in[6]; - inv[6] = -in[0] * in[6] * in[15] + in[0] * in[7] * in[14] + in[4] * in[2] * in[15] - in[4] * in[3] * in[14] - in[12] * in[2] * in[7] + in[12] * in[3] * in[6]; - inv[10] = in[0] * in[5] * in[15] - in[0] * in[7] * in[13] - in[4] * in[1] * in[15] + in[4] * in[3] * in[13] + in[12] * in[1] * in[7] - in[12] * in[3] * in[5]; - inv[14] = -in[0] * in[5] * in[14] + in[0] * in[6] * in[13] + in[4] * in[1] * in[14] - in[4] * in[2] * in[13] - in[12] * in[1] * in[6] + in[12] * in[2] * in[5]; - inv[3] = -in[1] * in[6] * in[11] + in[1] * in[7] * in[10] + in[5] * in[2] * in[11] - in[5] * in[3] * in[10] - in[9] * in[2] * in[7] + in[9] * in[3] * in[6]; - inv[7] = in[0] * in[6] * in[11] - in[0] * in[7] * in[10] - in[4] * in[2] * in[11] + in[4] * in[3] * in[10] + in[8] * in[2] * in[7] - in[8] * in[3] * in[6]; - inv[11] = -in[0] * in[5] * in[11] + in[0] * in[7] * in[9] + in[4] * in[1] * in[11] - in[4] * in[3] * in[9] - in[8] * in[1] * in[7] + in[8] * in[3] * in[5]; - inv[15] = in[0] * in[5] * in[10] - in[0] * in[6] * in[9] - in[4] * in[1] * in[10] + in[4] * in[2] * in[9] + in[8] * in[1] * in[6] - in[8] * in[2] * in[5]; + 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[1] * inv[4] + in[2] * inv[8] + in[3] * inv[12]; + det = in[0] * inv[0] + in[4] * inv[1] + in[8] * inv[2] + in[12] * inv[3]; if(det == 0) return; diff --git a/engine/src/model.c b/engine/src/model.c index fdf1db1..04f89a8 100644 --- a/engine/src/model.c +++ b/engine/src/model.c @@ -147,8 +147,8 @@ static void parse_obj(GSModel model, char* txt) { } } - if(c == 3) GSMathNormal3x3(face.normal, face.vertex[0], face.vertex[1], face.vertex[2]); - if(c == 4) GSMathNormal3x4(face.normal, face.vertex[0], face.vertex[1], face.vertex[2], face.vertex[3]); + if(c == 3) GSMathNormalTriangle(face.normal, face.vertex[0], face.vertex[1], face.vertex[2]); + if(c == 4) GSMathNormalQuad(face.normal, face.vertex[0], face.vertex[1], face.vertex[2], face.vertex[3]); arrput(model->face, face); }