+#elif defined(__ANDROID__) || defined(__ODROID__)
+
+ #define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
+ #define GL_RENDERBUFFER GL_RENDERBUFFER_OES
+ #define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES
+
+ #define GL_POLYGON_STIPPLE 0xFFFF
+ #define GL_LINE_STIPPLE 0xFFFF
+ #define GL_LINE 0xFFFF
+ #define GL_FILL 0xFFFF
+ #define GL_ALL_ATTRIB_BITS 0xFFFF
+ #define GL_LIGHT_MODEL_LOCAL_VIEWER 0xFFFF
+
+ #define GL_POLYGON 9
+ #define GL_QUADS 7
+
+ //#define GL_QUADS 0
+ #define GL_QUAD_STRIP 0
+ //#define GL_DOUBLE 0
+ //#define GL_UNSIGNED_INT 0
+ //#define GL_FILL 0
+ //#define GL_LINE 0
+ //#define GL_LINE_STIPPLE 0
+ #define GL_BGRA_EXT 0
+ #define GL_UNPACK_ROW_LENGTH 0
+ #define GL_UNPACK_SKIP_PIXELS 0
+ #define GL_UNPACK_SKIP_ROWS 0
+ #define GL_RGBA8 0
+ #define GL_PACK_ROW_LENGTH 0
+ #define GL_PACK_SKIP_ROWS 0
+ #define GL_PACK_SKIP_PIXELS 0
+
+#endif
+
+#if defined(ECERE_NO3D) || defined(ECERE_VANILLA)
+public union Matrix
+{
+ double array[16];
+ double m[4][4];
+
+ void Identity()
+ {
+ FillBytesBy4(this, 0, sizeof(Matrix) >> 2);
+ m[0][0]=m[1][1]=m[2][2]=m[3][3]=1;
+ }
+
+ void Transpose(Matrix source)
+ {
+ int i,j;
+ for(i=0; i<4; i++)
+ for(j=0; j<4; j++)
+ m[j][i] = source.m[i][j];
+ }
+
+ void Multiply(Matrix a, Matrix b)
+ {
+ // 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];
+ }
+};