commit 188e8f45df324dcb4cbc13718d5dc06562392298
parent 0b702adaa3d85f87e0fc55e2edc58070dd61052d
Author: Brian Swetland <swetland@frotz.net>
Date: Sun, 20 Jan 2013 20:07:04 -0800
tidy up matrix ops, make translate and rotate both post-multiply
Diffstat:
5 files changed, 40 insertions(+), 37 deletions(-)
diff --git a/test2.c b/test2.c
@@ -127,9 +127,9 @@ int scene_draw(struct ctxt *c) {
mat4 camera;
mtx_identity(camera);
- mtx_translate(camera, 0, 0, -3.0);
mtx_rotate_y(camera, a);
mtx_rotate_x(camera, 25.0);
+ mtx_translate(camera, 0, 0, -3.0);
mtx_mul_unsafe(MVP, camera, perspective);
diff --git a/test3.c b/test3.c
@@ -91,9 +91,9 @@ int scene_draw(struct ctxt *c) {
mat4 camera;
mtx_identity(camera);
- mtx_translate(camera, 0, 0, -5.0);
mtx_rotate_y(camera, a);
mtx_rotate_x(camera, 25.0);
+ mtx_translate(camera, 0, 0, -5.0);
mtx_mul_unsafe(MVP, camera, perspective);
diff --git a/test5.c b/test5.c
@@ -124,7 +124,9 @@ int scene_draw(struct ctxt *c) {
if (camrx > 45.0) camrx = 45.0;
mtx_identity(View);
- mtx_translate(View, -camx, camy, camz);
+ mtx_translation(tmp, -camx, camy, camz);
+ mtx_mul(View, View, tmp);
+ //mtx_translate(View, -camx, camy, camz);
mtx_y_rotation(tmp, camry);
mtx_mul(View, View, tmp);
mtx_x_rotation(tmp, camrx);
@@ -172,8 +174,13 @@ int scene_draw(struct ctxt *c) {
glDrawElements(GL_TRIANGLES, m->icount, GL_UNSIGNED_SHORT, m->idx);
mtx_identity(Model);
- mtx_translate(Model, 3, 0, 0);
- mtx_rotate_y(Model, a);
+ mtx_y_rotation(tmp, a);
+ mtx_mul_unsafe(Model, Model, tmp);
+ mtx_translation(tmp, 3, 0, 0);
+ mtx_mul_unsafe(Model, Model, tmp);
+ //mtx_translate(Model, 3, 0, 0);
+ //mtx_mul(Model, tmp, Model);
+ //mtx_rotate_y(Model, a);
mtx_mul_unsafe(MV, Model, View);
mtx_mul_unsafe(MVP, MV, Projection);
diff --git a/util.c b/util.c
@@ -21,22 +21,14 @@
void mtx_mul_unsafe(mat4 m, mat4 a, mat4 b) {
int i;
for (i = 0; i < 4; i++) {
- m[i][0] = (a[i][0] * b[0][0]) +
- (a[i][1] * b[1][0]) +
- (a[i][2] * b[2][0]) +
- (a[i][3] * b[3][0]);
- m[i][1] = (a[i][0] * b[0][1]) +
- (a[i][1] * b[1][1]) +
- (a[i][2] * b[2][1]) +
- (a[i][3] * b[3][1]);
- m[i][2] = (a[i][0] * b[0][2]) +
- (a[i][1] * b[1][2]) +
- (a[i][2] * b[2][2]) +
- (a[i][3] * b[3][2]);
- m[i][3] = (a[i][0] * b[0][3]) +
- (a[i][1] * b[1][3]) +
- (a[i][2] * b[2][3]) +
- (a[i][3] * b[3][3]);
+ float ai0 = a[i][0];
+ float ai1 = a[i][1];
+ float ai2 = a[i][2];
+ float ai3 = a[i][3];
+ m[i][0] = ai0*b[0][0] + ai1*b[1][0] + ai2*b[2][0] + ai3*b[3][0];
+ m[i][1] = ai0*b[0][1] + ai1*b[1][1] + ai2*b[2][1] + ai3*b[3][1];
+ m[i][2] = ai0*b[0][2] + ai1*b[1][2] + ai2*b[2][2] + ai3*b[3][2];
+ m[i][3] = ai0*b[0][3] + ai1*b[1][3] + ai2*b[2][3] + ai3*b[3][3];
}
}
@@ -47,15 +39,11 @@ void mtx_mul(mat4 m, mat4 a, mat4 b) {
}
void mtx_mul_vec4(vec4 o, mat4 m, vec4 v) {
- float a, b, c, d;
- a = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0] * v[3];
- b = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1] * v[3];
- c = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2] * v[3];
- d = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3] * v[3];
- o[0] = a;
- o[1] = b;
- o[2] = c;
- o[3] = d;
+ float v0=v[0], v1=v[1], v2=v[2], v3=v[3];
+ o[0] = m[0][0] * v0 + m[1][0] * v1 + m[2][0] * v2 + m[3][0] * v3;
+ o[1] = m[0][1] * v0 + m[1][1] * v1 + m[2][1] * v2 + m[3][1] * v3;
+ o[2] = m[0][2] * v0 + m[1][2] * v1 + m[2][2] * v2 + m[3][2] * v3;
+ o[3] = m[0][3] * v0 + m[1][3] * v1 + m[2][3] * v2 + m[3][3] * v3;
}
void mtx_identity(mat4 m) {
@@ -63,11 +51,18 @@ void mtx_identity(mat4 m) {
m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
}
+void mtx_translation(mat4 m, float x, float y, float z) {
+ memset(m, 0, sizeof(mat4));
+ m[3][0] = x;
+ m[3][1] = y;
+ m[3][2] = z;
+ m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0;
+}
+
void mtx_translate(mat4 m, float x, float y, float z) {
- m[3][0] += (m[0][0] * x + m[1][0] * y + m[2][0] * z);
- m[3][1] += (m[0][1] * x + m[1][1] * y + m[2][1] * z);
- m[3][2] += (m[0][2] * x + m[1][2] * y + m[2][2] * z);
- m[3][3] += (m[0][3] * x + m[1][3] * y + m[2][3] * z);
+ mat4 t;
+ mtx_translation(t, x, y, z);
+ mtx_mul_unsafe(m, m, t);
}
void mtx_x_rotation(mat4 r, float angle) {
@@ -115,19 +110,19 @@ void mtx_z_rotation(mat4 r, float angle) {
void mtx_rotate_x(mat4 m, float angle) {
mat4 r;
mtx_x_rotation(r, angle);
- mtx_mul(m, r, m);
+ mtx_mul_unsafe(m, m, r);
}
void mtx_rotate_y(mat4 m, float angle) {
mat4 r;
mtx_y_rotation(r, angle);
- mtx_mul(m, r, m);
+ mtx_mul_unsafe(m, m, r);
}
void mtx_rotate_z(mat4 m, float angle) {
mat4 r;
mtx_z_rotation(r, angle);
- mtx_mul(m, r, m);
+ mtx_mul_unsafe(m, m, r);
}
void mtx_frustum(mat4 m, float left, float right, float bottom, float top, float znear, float zfar) {
diff --git a/util.h b/util.h
@@ -38,6 +38,7 @@ void mtx_rotate_y(mat4 out, float angle);
void mtx_rotate_z(mat4 out, float angle);
/* initializes matrix out to the transform */
+void mtx_translation(mat4 out, float x, float y, float z);
void mtx_x_rotation(mat4 out, float angle);
void mtx_y_rotation(mat4 out, float angle);
void mtx_z_rotation(mat4 out, float angle);