glstuff

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
Mtest2.c | 2+-
Mtest3.c | 2+-
Mtest5.c | 13++++++++++---
Mutil.c | 59+++++++++++++++++++++++++++--------------------------------
Mutil.h | 1+
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);