Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 1
/* Some simple mathematical functions. Don't look for some logic in
2
   the function names :-) */
3
 
4
#include 
5
#include 
6
#include 
7
#include "zmath.h"
8
 
9
 
10
/* ******* Gestion des matrices 4x4 ****** */
11
 
12
void gl_M4_Id(M4 *a)
13
{
14
	int i,j;
15
	for(i=0;i<4;i++)
16
	for(j=0;j<4;j++)
17
	if (i==j) a->m[i][j]=1.0; else a->m[i][j]=0.0;
18
}
19
 
20
int gl_M4_IsId(M4 *a)
21
{
22
	int i,j;
23
	for(i=0;i<4;i++)
24
    for(j=0;j<4;j++) {
25
      if (i==j) {
26
        if (a->m[i][j] != 1.0) return 0;
27
      } else if (a->m[i][j] != 0.0) return 0;
28
    }
29
  return 1;
30
}
31
 
32
void gl_M4_Mul(M4 *c,M4 *a,M4 *b)
33
{
34
  int i,j,k;
35
  float s;
36
  for(i=0;i<4;i++)
37
    for(j=0;j<4;j++) {
38
      s=0.0;
39
      for(k=0;k<4;k++) s+=a->m[i][k]*b->m[k][j];
40
      c->m[i][j]=s;
41
    }
42
}
43
 
44
/* c=c*a */
45
void gl_M4_MulLeft(M4 *c,M4 *b)
46
{
47
  int i,j,k;
48
  float s;
49
  M4 a;
50
 
51
  /*memcpy(&a, c, 16*sizeof(float));
52
  */
53
  a=*c;
54
 
55
  for(i=0;i<4;i++)
56
    for(j=0;j<4;j++) {
57
      s=0.0;
58
      for(k=0;k<4;k++) s+=a.m[i][k]*b->m[k][j];
59
      c->m[i][j]=s;
60
    }
61
}
62
 
63
void gl_M4_Move(M4 *a,M4 *b)
64
{
65
	memcpy(a,b,sizeof(M4));
66
}
67
 
68
void gl_MoveV3(V3 *a,V3 *b)
69
{
70
	memcpy(a,b,sizeof(V3));
71
}
72
 
73
 
74
void gl_MulM4V3(V3 *a,M4 *b,V3 *c)
75
{
76
	 a->X=b->m[0][0]*c->X+b->m[0][1]*c->Y+b->m[0][2]*c->Z+b->m[0][3];
77
	 a->Y=b->m[1][0]*c->X+b->m[1][1]*c->Y+b->m[1][2]*c->Z+b->m[1][3];
78
	 a->Z=b->m[2][0]*c->X+b->m[2][1]*c->Y+b->m[2][2]*c->Z+b->m[2][3];
79
}
80
 
81
void gl_MulM3V3(V3 *a,M4 *b,V3 *c)
82
{
83
	 a->X=b->m[0][0]*c->X+b->m[0][1]*c->Y+b->m[0][2]*c->Z;
84
	 a->Y=b->m[1][0]*c->X+b->m[1][1]*c->Y+b->m[1][2]*c->Z;
85
	 a->Z=b->m[2][0]*c->X+b->m[2][1]*c->Y+b->m[2][2]*c->Z;
86
}
87
 
88
void gl_M4_MulV4(V4 *a,M4 *b,V4 *c)
89
{
90
	 a->X=b->m[0][0]*c->X+b->m[0][1]*c->Y+b->m[0][2]*c->Z+b->m[0][3]*c->W;
91
	 a->Y=b->m[1][0]*c->X+b->m[1][1]*c->Y+b->m[1][2]*c->Z+b->m[1][3]*c->W;
92
	 a->Z=b->m[2][0]*c->X+b->m[2][1]*c->Y+b->m[2][2]*c->Z+b->m[2][3]*c->W;
93
	 a->W=b->m[3][0]*c->X+b->m[3][1]*c->Y+b->m[3][2]*c->Z+b->m[3][3]*c->W;
94
}
95
 
96
/* transposition of a 4x4 matrix */
97
void gl_M4_Transpose(M4 *a,M4 *b)
98
{
99
  a->m[0][0]=b->m[0][0];
100
  a->m[0][1]=b->m[1][0];
101
  a->m[0][2]=b->m[2][0];
102
  a->m[0][3]=b->m[3][0];
103
 
104
  a->m[1][0]=b->m[0][1];
105
  a->m[1][1]=b->m[1][1];
106
  a->m[1][2]=b->m[2][1];
107
  a->m[1][3]=b->m[3][1];
108
 
109
  a->m[2][0]=b->m[0][2];
110
  a->m[2][1]=b->m[1][2];
111
  a->m[2][2]=b->m[2][2];
112
  a->m[2][3]=b->m[3][2];
113
 
114
  a->m[3][0]=b->m[0][3];
115
  a->m[3][1]=b->m[1][3];
116
  a->m[3][2]=b->m[2][3];
117
  a->m[3][3]=b->m[3][3];
118
}
119
 
120
/* inversion of an orthogonal matrix of type Y=M.X+P */
121
void gl_M4_InvOrtho(M4 *a,M4 b)
122
{
123
	int i,j;
124
	float s;
125
	for(i=0;i<3;i++)
126
	for(j=0;j<3;j++) a->m[i][j]=b.m[j][i];
127
	a->m[3][0]=0.0; a->m[3][1]=0.0; a->m[3][2]=0.0; a->m[3][3]=1.0;
128
	for(i=0;i<3;i++) {
129
		s=0;
130
		for(j=0;j<3;j++) s-=b.m[j][i]*b.m[j][3];
131
		a->m[i][3]=s;
132
	}
133
}
134
 
135
/* Inversion of a general nxn matrix.
136
   Note : m is destroyed */
137
 
138
int Matrix_Inv(float *r,float *m,int n)
139
{
140
	 int i,j,k,l;
141
	 float max,tmp,t;
142
 
143
	 /* identitée dans r */
144
	 for(i=0;i
145
	 for(i=0;i
146
 
147
	 for(j=0;j
148
 
149
			/* recherche du nombre de plus grand module sur la colonne j */
150
			max=m[j*n+j];
151
			k=j;
152
			for(i=j+1;i
153
				if (fabs(m[i*n+j])>fabs(max)) {
154
					 k=i;
155
					 max=m[i*n+j];
156
				}
157
 
158
      /* non intersible matrix */
159
      if (max==0) return 1;
160
 
161
 
162
			/* permutation des lignes j et k */
163
			if (k!=j) {
164
				 for(i=0;i
165
						tmp=m[j*n+i];
166
						m[j*n+i]=m[k*n+i];
167
						m[k*n+i]=tmp;
168
 
169
						tmp=r[j*n+i];
170
						r[j*n+i]=r[k*n+i];
171
						r[k*n+i]=tmp;
172
				 }
173
			}
174
 
175
			/* multiplication de la ligne j par 1/max */
176
			max=1/max;
177
			for(i=0;i
178
				 m[j*n+i]*=max;
179
				 r[j*n+i]*=max;
180
			}
181
 
182
 
183
			for(l=0;l
184
				 t=m[l*n+j];
185
				 for(i=0;i
186
						m[l*n+i]-=m[j*n+i]*t;
187
						r[l*n+i]-=r[j*n+i]*t;
188
				 }
189
			}
190
	 }
191
 
192
	 return 0;
193
}
194
 
195
 
196
/* inversion of a 4x4 matrix */
197
 
198
void gl_M4_Inv(M4 *a,M4 *b)
199
{
200
  M4 tmp;
201
  memcpy(&tmp, b, 16*sizeof(float));
202
  Matrix_Inv(&a->m[0][0],&tmp.m[0][0],4);
203
}
204
 
205
void gl_M4_Rotate(M4 *a,float t,int u)
206
{
207
	 float s,c;
208
	 int v,w;
209
   if ((v=u+1)>2) v=0;
210
	 if ((w=v+1)>2) w=0;
211
	 s=sin(t);
212
	 c=cos(t);
213
	 gl_M4_Id(a);
214
	 a->m[v][v]=c;	a->m[v][w]=-s;
215
	 a->m[w][v]=s;	a->m[w][w]=c;
216
}
217
 
218
 
219
/* inverse of a 3x3 matrix */
220
void gl_M3_Inv(M3 *a,M3 *m)
221
{
222
	 float det;
223
 
224
	 det = m->m[0][0]*m->m[1][1]*m->m[2][2]-m->m[0][0]*m->m[1][2]*m->m[2][1]-
225
		 m->m[1][0]*m->m[0][1]*m->m[2][2]+m->m[1][0]*m->m[0][2]*m->m[2][1]+
226
		 m->m[2][0]*m->m[0][1]*m->m[1][2]-m->m[2][0]*m->m[0][2]*m->m[1][1];
227
 
228
	 a->m[0][0] = (m->m[1][1]*m->m[2][2]-m->m[1][2]*m->m[2][1])/det;
229
	 a->m[0][1] = -(m->m[0][1]*m->m[2][2]-m->m[0][2]*m->m[2][1])/det;
230
	 a->m[0][2] = -(-m->m[0][1]*m->m[1][2]+m->m[0][2]*m->m[1][1])/det;
231
 
232
	 a->m[1][0] = -(m->m[1][0]*m->m[2][2]-m->m[1][2]*m->m[2][0])/det;
233
	 a->m[1][1] = (m->m[0][0]*m->m[2][2]-m->m[0][2]*m->m[2][0])/det;
234
	 a->m[1][2] = -(m->m[0][0]*m->m[1][2]-m->m[0][2]*m->m[1][0])/det;
235
 
236
	 a->m[2][0] = (m->m[1][0]*m->m[2][1]-m->m[1][1]*m->m[2][0])/det;
237
	 a->m[2][1] = -(m->m[0][0]*m->m[2][1]-m->m[0][1]*m->m[2][0])/det;
238
	 a->m[2][2] = (m->m[0][0]*m->m[1][1]-m->m[0][1]*m->m[1][0])/det;
239
}
240
 
241
 
242
/* vector arithmetic */
243
 
244
int gl_V3_Norm(V3 *a)
245
{
246
	float n;
247
	n=sqrt(a->X*a->X+a->Y*a->Y+a->Z*a->Z);
248
	if (n==0) return 1;
249
	a->X/=n;
250
	a->Y/=n;
251
	a->Z/=n;
252
	return 0;
253
}
254
 
255
V3 gl_V3_New(float x,float y,float z)
256
{
257
	 V3 a;
258
	 a.X=x;
259
	 a.Y=y;
260
	 a.Z=z;
261
	 return a;
262
}
263
 
264
V4 gl_V4_New(float x,float y,float z,float w)
265
{
266
  V4 a;
267
  a.X=x;
268
  a.Y=y;
269
  a.Z=z;
270
  a.W=w;
271
  return a;
272
}
273
 
274