double array[16];
double m[4][4];
+ const char * OnGetString(char * string, void * fieldData, bool * needClass)
+ {
+ int y, x;
+ string[0] = 0;
+ strcat(string, "{ ");
+ for(y = 0; y < 4; y++)
+ {
+ strcat(string, "{ ");
+ for(x = 0; x < 4; x++)
+ {
+ char member[256];
+ const char * s = m[y][x].OnGetString(member, null, null);
+ strcat(string, s);
+ if(x < 3) strcat(string, ", ");
+ }
+ strcat(string, " }");
+ if(y < 3) strcat(string, ", ");
+ }
+ strcat(string, " }");
+ return string;
+ }
+
void Identity()
{
FillBytesBy4(this, 0, sizeof(Matrix) >> 2);
void Multiply(Matrix a, Matrix b)
{
+#if 1 // defined(_GLES) || defined(SHADERS)
+ // We need a full matrix multiplication for the Projection matrix
+ m[0][0]=a.m[0][0]*b.m[0][0] + a.m[0][1]*b.m[1][0] + a.m[0][2]*b.m[2][0] + a.m[0][3]*b.m[3][0];
+ m[0][1]=a.m[0][0]*b.m[0][1] + a.m[0][1]*b.m[1][1] + a.m[0][2]*b.m[2][1] + a.m[0][3]*b.m[3][1];
+ m[0][2]=a.m[0][0]*b.m[0][2] + a.m[0][1]*b.m[1][2] + a.m[0][2]*b.m[2][2] + a.m[0][3]*b.m[3][2];
+ m[0][3]=a.m[0][0]*b.m[0][3] + a.m[0][1]*b.m[1][3] + a.m[0][2]*b.m[2][3] + a.m[0][3]*b.m[3][3];
+
+ m[1][0]=a.m[1][0]*b.m[0][0] + a.m[1][1]*b.m[1][0] + a.m[1][2]*b.m[2][0] + a.m[1][3]*b.m[3][0];
+ m[1][1]=a.m[1][0]*b.m[0][1] + a.m[1][1]*b.m[1][1] + a.m[1][2]*b.m[2][1] + a.m[1][3]*b.m[3][1];
+ m[1][2]=a.m[1][0]*b.m[0][2] + a.m[1][1]*b.m[1][2] + a.m[1][2]*b.m[2][2] + a.m[1][3]*b.m[3][2];
+ m[1][3]=a.m[1][0]*b.m[0][3] + a.m[1][1]*b.m[1][3] + a.m[1][2]*b.m[2][3] + a.m[1][3]*b.m[3][3];
+
+ m[2][0]=a.m[2][0]*b.m[0][0] + a.m[2][1]*b.m[1][0] + a.m[2][2]*b.m[2][0] + a.m[2][3]*b.m[3][0];
+ m[2][1]=a.m[2][0]*b.m[0][1] + a.m[2][1]*b.m[1][1] + a.m[2][2]*b.m[2][1] + a.m[2][3]*b.m[3][1];
+ m[2][2]=a.m[2][0]*b.m[0][2] + a.m[2][1]*b.m[1][2] + a.m[2][2]*b.m[2][2] + a.m[2][3]*b.m[3][2];
+ m[2][3]=a.m[2][0]*b.m[0][3] + a.m[2][1]*b.m[1][3] + a.m[2][2]*b.m[2][3] + a.m[2][3]*b.m[3][3];
+
+ m[3][0]=a.m[3][0]*b.m[0][0] + a.m[3][1]*b.m[1][0] + a.m[3][2]*b.m[2][0] + a.m[3][3]*b.m[3][0];
+ m[3][1]=a.m[3][0]*b.m[0][1] + a.m[3][1]*b.m[1][1] + a.m[3][2]*b.m[2][1] + a.m[3][3]*b.m[3][1];
+ m[3][2]=a.m[3][0]*b.m[0][2] + a.m[3][1]*b.m[1][2] + a.m[3][2]*b.m[2][2] + a.m[3][3]*b.m[3][2];
+ m[3][3]=a.m[3][0]*b.m[0][3] + a.m[3][1]*b.m[1][3] + a.m[3][2]*b.m[2][3] + a.m[3][3]*b.m[3][3];
+#else
m[0][0]=a.m[0][0]*b.m[0][0] + a.m[0][1]*b.m[1][0] + a.m[0][2]*b.m[2][0];
m[0][1]=a.m[0][0]*b.m[0][1] + a.m[0][1]*b.m[1][1] + a.m[0][2]*b.m[2][1];
m[0][2]=a.m[0][0]*b.m[0][2] + a.m[0][1]*b.m[1][2] + a.m[0][2]*b.m[2][2];
m[1][1]=a.m[1][0]*b.m[0][1] + a.m[1][1]*b.m[1][1] + a.m[1][2]*b.m[2][1];
m[1][2]=a.m[1][0]*b.m[0][2] + a.m[1][1]*b.m[1][2] + a.m[1][2]*b.m[2][2];
m[1][3]=0;
-
+
m[2][0]=a.m[2][0]*b.m[0][0] + a.m[2][1]*b.m[1][0] + a.m[2][2]*b.m[2][0];
m[2][1]=a.m[2][0]*b.m[0][1] + a.m[2][1]*b.m[1][1] + a.m[2][2]*b.m[2][1];
m[2][2]=a.m[2][0]*b.m[0][2] + a.m[2][1]*b.m[1][2] + a.m[2][2]*b.m[2][2];
m[2][3]=0;
-
+
m[3][0]=a.m[3][0]*b.m[0][0] + a.m[3][1]*b.m[1][0] + a.m[3][2]*b.m[2][0] + b.m[3][0];
m[3][1]=a.m[3][0]*b.m[0][1] + a.m[3][1]*b.m[1][1] + a.m[3][2]*b.m[2][1] + b.m[3][1];
m[3][2]=a.m[3][0]*b.m[0][2] + a.m[3][1]*b.m[1][2] + a.m[3][2]*b.m[2][2] + b.m[3][2];
m[3][3]=1;
+#endif
}
void RotationQuaternion(Quaternion quat)
double xy = quat.x*quat.y, xz = quat.x*quat.z, yz = quat.y*quat.z;
double wx = quat.w*quat.x, wy = quat.w*quat.y, wz = quat.w*quat.z;
- m[0][0] = (double) (1 - 2 * ( yy + zz ));
+ m[0][0] = (double) (1 - 2 * ( yy + zz ));
m[0][1] = (double) ( 2 * ( xy - wz ));
m[0][2] = (double) ( 2 * ( xz + wy ));
double msub3[3][3];
int di, dj;
- for(di = 0; di < 3; di++)
+ for(di = 0; di < 3; di++)
{
- for(dj = 0; dj < 3; dj++)
+ for(dj = 0; dj < 3; dj++)
{
int si = di + ( ( di >= 0 ) ? 1 : 0 );
int sj = dj + ( ( dj >= n ) ? 1 : 0 );
Identity();
else
{
- int i, j, sign;
+ int i, j, sign;
for ( i = 0; i < 4; i++ )
for ( j = 0; j < 4; j++ )
{
sign = 1 - ( (i+j) % 2 ) * 2;
- for(di = 0; di < 3; di++)
+ for(di = 0; di < 3; di++)
{
- for(dj = 0; dj < 3; dj++)
+ for(dj = 0; dj < 3; dj++)
{
int si = di + ( ( di >= i ) ? 1 : 0 );
int sj = dj + ( ( dj >= j ) ? 1 : 0 );