OpenCores
URL https://opencores.org/ocsvn/wf3d/wf3d/trunk

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [clib/] [mp_matrix4.c] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.