ecere/gfx/drivers/OpenGL: Shaders support improvements
[sdk] / ecere / src / gfx / 3D / Matrix.ec
index c3c9aae..53a2ed6 100644 (file)
@@ -7,6 +7,28 @@ public union Matrix
    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);
@@ -23,6 +45,28 @@ public union Matrix
 
    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];
@@ -32,16 +76,17 @@ public union Matrix
       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)
@@ -50,7 +95,7 @@ public union Matrix
       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 ));
 
@@ -108,9 +153,9 @@ public union Matrix
          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 );
@@ -134,7 +179,7 @@ public union Matrix
          Identity();
       else
       {
-         int i, j, sign;   
+         int i, j, sign;
          for ( i = 0; i < 4; i++ )
             for ( j = 0; j < 4; j++ )
             {
@@ -144,9 +189,9 @@ public union Matrix
 
                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 );