17 if (i==j) a->m[i][j]=1.0;
else a->m[i][j]=0.0;
26 if (a->m[i][j] != 1.0)
return 0;
27 }
else if (a->m[i][j] != 0.0)
return 0;
32 void gl_M4_Mul(
M4 *c,
M4 *a,
M4 *b)
39 for(k=0;k<4;k++) s+=a->m[i][k]*b->m[k][j];
45 void gl_M4_MulLeft(
M4 *c,
M4 *b)
58 for(k=0;k<4;k++) s+=a.m[i][k]*b->m[k][j];
63 void gl_M4_Move(
M4 *a,
M4 *b)
65 memcpy(a,b,
sizeof(
M4));
68 void gl_MoveV3(
V3 *a,
V3 *b)
70 memcpy(a,b,
sizeof(
V3));
74 void gl_MulM4V3(
V3 *a,
M4 *b,
V3 *c)
76 a->v[0]=b->m[0][0]*c->v[0]+b->m[0][1]*c->v[1]+b->m[0][2]*c->v[2]+b->m[0][3];
77 a->v[1]=b->m[1][0]*c->v[0]+b->m[1][1]*c->v[1]+b->m[1][2]*c->v[2]+b->m[1][3];
78 a->v[2]=b->m[2][0]*c->v[0]+b->m[2][1]*c->v[1]+b->m[2][2]*c->v[2]+b->m[2][3];
81 void gl_MulM3V3(
V3 *a,
M4 *b,
V3 *c)
83 a->v[0]=b->m[0][0]*c->v[0]+b->m[0][1]*c->v[1]+b->m[0][2]*c->v[2];
84 a->v[1]=b->m[1][0]*c->v[0]+b->m[1][1]*c->v[1]+b->m[1][2]*c->v[2];
85 a->v[2]=b->m[2][0]*c->v[0]+b->m[2][1]*c->v[1]+b->m[2][2]*c->v[2];
88 void gl_M4_MulV4(
V4 *a,
M4 *b,
V4 *c)
90 a->v[0]=b->m[0][0]*c->v[0]+b->m[0][1]*c->v[1]+b->m[0][2]*c->v[2]+b->m[0][3]*c->v[3];
91 a->v[1]=b->m[1][0]*c->v[0]+b->m[1][1]*c->v[1]+b->m[1][2]*c->v[2]+b->m[1][3]*c->v[3];
92 a->v[2]=b->m[2][0]*c->v[0]+b->m[2][1]*c->v[1]+b->m[2][2]*c->v[2]+b->m[2][3]*c->v[3];
93 a->v[3]=b->m[3][0]*c->v[0]+b->m[3][1]*c->v[1]+b->m[3][2]*c->v[2]+b->m[3][3]*c->v[3];
97 void gl_M4_Transpose(
M4 *a,
M4 *b)
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];
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];
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];
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];
121 void gl_M4_InvOrtho(
M4 *a,
M4 b)
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;
130 for(j=0;j<3;j++) s-=b.m[j][i]*b.m[j][3];
138 int Matrix_Inv(PN_stdfloat *r,PN_stdfloat *m,
int n)
141 PN_stdfloat max,tmp,t;
144 for(i=0;i<n*n;i++) r[i]=0;
145 for(i=0;i<n;i++) r[i*n+i]=1;
153 if (fabs(m[i*n+j])>fabs(max)) {
159 if (max==0)
return 1;
183 for(l=0;l<n;l++)
if (l!=j) {
186 m[l*n+i]-=m[j*n+i]*t;
187 r[l*n+i]-=r[j*n+i]*t;
198 void gl_M4_Inv(
M4 *a,
M4 *b)
201 memcpy(&tmp, b, 16*
sizeof(PN_stdfloat));
203 Matrix_Inv(&a->m[0][0],&tmp.m[0][0],4);
206 void gl_M4_Rotate(
M4 *a,PN_stdfloat t,
int u)
215 a->m[v][v]=c; a->m[v][w]=-s;
216 a->m[w][v]=s; a->m[w][w]=c;
221 void gl_M3_Inv(
M3 *a,
M3 *m)
225 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]-
226 m->m[1][0]*m->m[0][1]*m->m[2][2]+m->m[1][0]*m->m[0][2]*m->m[2][1]+
227 m->m[2][0]*m->m[0][1]*m->m[1][2]-m->m[2][0]*m->m[0][2]*m->m[1][1];
229 a->m[0][0] = (m->m[1][1]*m->m[2][2]-m->m[1][2]*m->m[2][1])/det;
230 a->m[0][1] = -(m->m[0][1]*m->m[2][2]-m->m[0][2]*m->m[2][1])/det;
231 a->m[0][2] = -(-m->m[0][1]*m->m[1][2]+m->m[0][2]*m->m[1][1])/det;
233 a->m[1][0] = -(m->m[1][0]*m->m[2][2]-m->m[1][2]*m->m[2][0])/det;
234 a->m[1][1] = (m->m[0][0]*m->m[2][2]-m->m[0][2]*m->m[2][0])/det;
235 a->m[1][2] = -(m->m[0][0]*m->m[1][2]-m->m[0][2]*m->m[1][0])/det;
237 a->m[2][0] = (m->m[1][0]*m->m[2][1]-m->m[1][1]*m->m[2][0])/det;
238 a->m[2][1] = -(m->m[0][0]*m->m[2][1]-m->m[0][1]*m->m[2][0])/det;
239 a->m[2][2] = (m->m[0][0]*m->m[1][1]-m->m[0][1]*m->m[1][0])/det;
245 int gl_V3_Norm(
V3 *a)
248 n=sqrt(a->v[0]*a->v[0]+a->v[1]*a->v[1]+a->v[2]*a->v[2]);
256 V3 gl_V3_New(PN_stdfloat x,PN_stdfloat y,PN_stdfloat z)
265 V4 gl_V4_New(PN_stdfloat x,PN_stdfloat y,PN_stdfloat z,PN_stdfloat w)