| 1 |
2 |
specular |
#include <math.h>
|
| 2 |
|
|
#include "mp_matrix4.h"
|
| 3 |
|
|
#include "mp_lib.h"
|
| 4 |
|
|
|
| 5 |
|
|
extern t_fui u_fui;
|
| 6 |
|
|
|
| 7 |
|
|
static int TR[16] = { 0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15 };
|
| 8 |
|
|
static int AA[16][16] = {
|
| 9 |
|
|
/* aa00 */ {5,6,7,9,10,11,13,14,15},
|
| 10 |
|
|
/* aa10 */ {1,2,3,9,10,11,13,14,15},
|
| 11 |
|
|
/* aa20 */ {1,2,3,5,6,7,13,14,15},
|
| 12 |
|
|
/* aa30 */ {1,2,3,5,6,7,9,10,11},
|
| 13 |
|
|
/* aa01 */ {4,6,7,8,10,11,12,14,15},
|
| 14 |
|
|
/* aa11 */ {0,2,3,8,10,11,12,14,15},
|
| 15 |
|
|
/* aa21 */ {0,2,3,4,6,7,12,14,15},
|
| 16 |
|
|
/* aa31 */ {0,2,3,4,6,7,8,10,11},
|
| 17 |
|
|
/* aa02 */ {4,5,7,8,9,11,12,13,15},
|
| 18 |
|
|
/* aa12 */ {0,1,3,8,9,11,12,13,15},
|
| 19 |
|
|
/* aa22 */ {0,1,3,4,5,7,12,13,15},
|
| 20 |
|
|
/* aa32 */ {0,1,3,4,5,7,8,9,11},
|
| 21 |
|
|
/* aa03 */ {4,5,6,8,9,10,12,13,14},
|
| 22 |
|
|
/* aa13 */ {0,1,2,8,9,10,12,13,14},
|
| 23 |
|
|
/* aa23 */ {0,1,2,4,5,6,12,13,14},
|
| 24 |
|
|
/* aa33 */ {0,1,2,4,5,6,8,9,10}};
|
| 25 |
|
|
|
| 26 |
|
|
void mp_matrix4_init(mp_matrix4 *dst) {
|
| 27 |
|
|
int i;
|
| 28 |
|
|
for (i=0;i<16;i++) dst->a[i] = 0.0;
|
| 29 |
|
|
dst->a[0] = dst->a[5] = dst->a[10] = dst->a[15] = 1.0;
|
| 30 |
|
|
}
|
| 31 |
|
|
|
| 32 |
|
|
void mp_matrix4_set0(mp_matrix4 *dst, float b[]) {
|
| 33 |
|
|
int i;
|
| 34 |
|
|
for (i=0;i<16;i++) dst->a[i] = b[i];
|
| 35 |
|
|
}
|
| 36 |
|
|
|
| 37 |
|
|
void mp_matrix4_set0_t(mp_matrix4 *dst, float b[]) {
|
| 38 |
|
|
int i;
|
| 39 |
|
|
for (i=0;i<16;i++) dst->a[TR[i]] = b[i];
|
| 40 |
|
|
}
|
| 41 |
|
|
|
| 42 |
|
|
void mp_matrix4_set1(mp_matrix4 *dst, unsigned int b[]) {
|
| 43 |
|
|
int i;
|
| 44 |
|
|
for (i = 0; i <16; i++) {
|
| 45 |
|
|
u_fui.ui= b[i];
|
| 46 |
|
|
dst->a[i] = u_fui.f;
|
| 47 |
|
|
}
|
| 48 |
|
|
}
|
| 49 |
|
|
|
| 50 |
|
|
void mp_matrix4_set2(mp_matrix4 *dst, mp_matrix4 *t) {
|
| 51 |
|
|
int i;
|
| 52 |
|
|
for (i=0;i<16;i++) dst->a[i] = t->a[i];
|
| 53 |
|
|
}
|
| 54 |
|
|
|
| 55 |
|
|
void mp_matrix4_identity(mp_matrix4 *dst) {
|
| 56 |
|
|
mp_matrix4_init(dst);
|
| 57 |
|
|
}
|
| 58 |
|
|
|
| 59 |
|
|
void mp_matrix4_assign(mp_matrix4 *dst, mp_matrix4 *v) {
|
| 60 |
|
|
int i;
|
| 61 |
|
|
for (i=0 ; i < 16 ; i++ ) dst->a[i] = v->a[i];
|
| 62 |
|
|
}
|
| 63 |
|
|
|
| 64 |
|
|
void mp_matrix4_multiply_vector4(mp_vector4 *dst, mp_matrix4 *m, mp_vector4 *v) {
|
| 65 |
|
|
mp_vector4 t;
|
| 66 |
|
|
mp_vector4_set2(&t, v);
|
| 67 |
|
|
dst->x = m->a[0]*t.x + m->a[1]*t.y + m->a[2]*t.z + m->a[3]*t.w;
|
| 68 |
|
|
dst->y = m->a[4]*t.x + m->a[5]*t.y + m->a[6]*t.z + m->a[7]*t.w;
|
| 69 |
|
|
dst->z = m->a[8]*t.x + m->a[9]*t.y + m->a[10]*t.z + m->a[11]*t.w;
|
| 70 |
|
|
dst->w = m->a[12]*t.x + m->a[13]*t.y + m->a[14]*t.z + m->a[15]*t.w;
|
| 71 |
|
|
}
|
| 72 |
|
|
|
| 73 |
|
|
void mp_matrix4_multiply_f(mp_matrix4 *m, float *v) {
|
| 74 |
|
|
float r[4];
|
| 75 |
|
|
r[0] = m->a[0]*v[0] + m->a[1]*v[1] + m->a[2]*v[2] + m->a[3]*v[3];
|
| 76 |
|
|
r[1] = m->a[4]*v[0] + m->a[5]*v[1] + m->a[6]*v[2] + m->a[7]*v[3];
|
| 77 |
|
|
r[2] = m->a[8]*v[0] + m->a[9]*v[1] + m->a[10]*v[2] + m->a[11]*v[3];
|
| 78 |
|
|
r[3] = m->a[12]*v[0] + m->a[13]*v[1] + m->a[14]*v[2] + m->a[15]*v[3];
|
| 79 |
|
|
v[0] = r[0];
|
| 80 |
|
|
v[1] = r[1];
|
| 81 |
|
|
v[2] = r[2];
|
| 82 |
|
|
v[3] = r[3];
|
| 83 |
|
|
}
|
| 84 |
|
|
|
| 85 |
|
|
void mp_matrix4_multiply_f2(mp_matrix4 *m, float *dst, float *src) {
|
| 86 |
|
|
// w is always 1.0
|
| 87 |
|
|
dst[0] = m->a[0]*src[0] + m->a[1]*src[1] + m->a[2]*src[2] + m->a[3];
|
| 88 |
|
|
dst[1] = m->a[4]*src[0] + m->a[5]*src[1] + m->a[6]*src[2] + m->a[7];
|
| 89 |
|
|
dst[2] = m->a[8]*src[0] + m->a[9]*src[1] + m->a[10]*src[2] + m->a[11];
|
| 90 |
|
|
dst[3] = m->a[12]*src[0] + m->a[13]*src[1] + m->a[14]*src[2] + m->a[15];
|
| 91 |
|
|
}
|
| 92 |
|
|
|
| 93 |
|
|
void mp_matrix4_multiply_matrix4(mp_matrix4 *dst, mp_matrix4 *mm, mp_matrix4 *b) {
|
| 94 |
|
|
int i,j,k,m,n,p,r,s;
|
| 95 |
|
|
mp_matrix4 c;
|
| 96 |
|
|
for ( i = r = 0 ; i < 4 ; i ++, r += 4 ) {
|
| 97 |
|
|
for ( j = 0 ; j < 4 ; j ++ ) {
|
| 98 |
|
|
m = r + j;
|
| 99 |
|
|
c.a[m] = 0.0;
|
| 100 |
|
|
for ( k = s = 0 ; k < 4 ; k++, s += 4 ){
|
| 101 |
|
|
n = r + k;
|
| 102 |
|
|
p = s + j;
|
| 103 |
|
|
c.a[m] += b->a[n] * mm->a[p];
|
| 104 |
|
|
}
|
| 105 |
|
|
}
|
| 106 |
|
|
}
|
| 107 |
|
|
for ( k = 0 ; k < 16 ; k++ ) dst->a[k] = c.a[k];
|
| 108 |
|
|
}
|
| 109 |
|
|
|
| 110 |
|
|
void mp_matrix4_multiply_matrix4i(mp_matrix4 *dst, mp_matrix4 *mm, mp_matrix4 *b) {
|
| 111 |
|
|
int i,j,k,m,n,p,r,s;
|
| 112 |
|
|
mp_matrix4 c;
|
| 113 |
|
|
for ( i = r = 0 ; i < 4 ; i ++, r += 4 ) {
|
| 114 |
|
|
for ( j = 0 ; j < 4 ; j ++ ) {
|
| 115 |
|
|
m = r + j;
|
| 116 |
|
|
c.a[m] = 0.0;
|
| 117 |
|
|
for ( k = s = 0 ; k < 4 ; k++, s += 4 ){
|
| 118 |
|
|
n = r + k;
|
| 119 |
|
|
p = s + j;
|
| 120 |
|
|
c.a[m] += mm->a[n] * b->a[p];
|
| 121 |
|
|
}
|
| 122 |
|
|
}
|
| 123 |
|
|
}
|
| 124 |
|
|
for ( k = 0 ; k < 16 ; k++ ) dst->a[k] = c.a[k];
|
| 125 |
|
|
}
|
| 126 |
|
|
|
| 127 |
|
|
void mp_matrix4_transpose(mp_matrix4 *dst,mp_matrix4 *src) {
|
| 128 |
|
|
int i;
|
| 129 |
|
|
for (i = 0 ; i < 16 ; i++ ){
|
| 130 |
|
|
dst->a[i] = src->a[TR[i]];
|
| 131 |
|
|
}
|
| 132 |
|
|
}
|
| 133 |
|
|
|
| 134 |
|
|
void mp_matrix4_inverse(mp_matrix4 *dst,mp_matrix4 *src) {
|
| 135 |
|
|
float determinant4, determinant3;
|
| 136 |
|
|
float v[9];
|
| 137 |
|
|
|
| 138 |
|
|
int m,n,sign;
|
| 139 |
|
|
int i,j;
|
| 140 |
|
|
mp_matrix3 w;
|
| 141 |
|
|
for (i=0 ; i < 16 ; i++ ){
|
| 142 |
|
|
m = (i+1)/4 + 1; n = (i+1)%4;
|
| 143 |
|
|
if (n==0) { n = 4; m--; }
|
| 144 |
|
|
if ((m+n)%2 == 1) sign = -1; else sign = 1;
|
| 145 |
|
|
for (j=0 ; j < 9 ; j++ ) v[j] = src->a[AA[i][j]];
|
| 146 |
|
|
mp_matrix3_set0(&w, v);
|
| 147 |
|
|
determinant3 = mp_matrix3_determinant0(&w);
|
| 148 |
|
|
dst->a[i] = sign * determinant3;
|
| 149 |
|
|
}
|
| 150 |
|
|
determinant4 =
|
| 151 |
|
|
src->a[0]*dst->a[0]
|
| 152 |
|
|
+ src->a[4]*dst->a[1]
|
| 153 |
|
|
+ src->a[8]*dst->a[2]
|
| 154 |
|
|
+ src->a[12]*dst->a[3];
|
| 155 |
|
|
|
| 156 |
|
|
determinant4 = 1.0F / determinant4;
|
| 157 |
|
|
for (i=0 ; i < 16 ; i++ ) dst->a[i] *= determinant4;
|
| 158 |
|
|
}
|
| 159 |
|
|
|
| 160 |
|
|
void mp_matrix4_rotate(mp_matrix4 *dst, mp_vector3 *v, float theta) {
|
| 161 |
|
|
mp_matrix3 m3a;
|
| 162 |
|
|
mp_matrix3_init(&m3a);
|
| 163 |
|
|
mp_matrix3_rotate0(&m3a, v, theta);
|
| 164 |
|
|
mp_matrix4_init(dst);
|
| 165 |
|
|
dst->a[0] = m3a.a[0];
|
| 166 |
|
|
dst->a[1] = m3a.a[1];
|
| 167 |
|
|
dst->a[2] = m3a.a[2];
|
| 168 |
|
|
dst->a[4] = m3a.a[3];
|
| 169 |
|
|
dst->a[5] = m3a.a[4];
|
| 170 |
|
|
dst->a[6] = m3a.a[5];
|
| 171 |
|
|
dst->a[8] = m3a.a[6];
|
| 172 |
|
|
dst->a[9] = m3a.a[7];
|
| 173 |
|
|
dst->a[10] = m3a.a[8];
|
| 174 |
|
|
}
|
| 175 |
|
|
|
| 176 |
|
|
void mp_matrix4_get_elements(mp_matrix4 *dst, unsigned int *b) {
|
| 177 |
|
|
int i;
|
| 178 |
|
|
for (i = 0; i <16; i++) {
|
| 179 |
|
|
u_fui.f= dst->a[i];
|
| 180 |
|
|
b[i] = u_fui.ui;
|
| 181 |
|
|
}
|
| 182 |
|
|
}
|
| 183 |
|
|
|