[PATCH 4/5] wined3d: Simplify the wined3d_matrix structure.

Henri Verbeet hverbeet at codeweavers.com
Fri Mar 20 06:41:54 CDT 2015


---
 dlls/wined3d/device.c          |   44 ++++++-------
 dlls/wined3d/glsl_shader.c     |    2 +-
 dlls/wined3d/state.c           |   14 ++---
 dlls/wined3d/utils.c           |  133 ++++++++++++++++++++--------------------
 dlls/wined3d/wined3d_private.h |    4 +-
 include/wine/wined3d.h         |   15 ++---
 6 files changed, 104 insertions(+), 108 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8cab927..ed00da0 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1362,10 +1362,10 @@ void CDECL wined3d_device_set_transform(struct wined3d_device *device,
 {
     TRACE("device %p, state %s, matrix %p.\n",
             device, debug_d3dtstype(d3dts), matrix);
-    TRACE("%.8e %.8e %.8e %.8e\n", matrix->u.s._11, matrix->u.s._12, matrix->u.s._13, matrix->u.s._14);
-    TRACE("%.8e %.8e %.8e %.8e\n", matrix->u.s._21, matrix->u.s._22, matrix->u.s._23, matrix->u.s._24);
-    TRACE("%.8e %.8e %.8e %.8e\n", matrix->u.s._31, matrix->u.s._32, matrix->u.s._33, matrix->u.s._34);
-    TRACE("%.8e %.8e %.8e %.8e\n", matrix->u.s._41, matrix->u.s._42, matrix->u.s._43, matrix->u.s._44);
+    TRACE("%.8e %.8e %.8e %.8e\n", matrix->_11, matrix->_12, matrix->_13, matrix->_14);
+    TRACE("%.8e %.8e %.8e %.8e\n", matrix->_21, matrix->_22, matrix->_23, matrix->_24);
+    TRACE("%.8e %.8e %.8e %.8e\n", matrix->_31, matrix->_32, matrix->_33, matrix->_34);
+    TRACE("%.8e %.8e %.8e %.8e\n", matrix->_41, matrix->_42, matrix->_43, matrix->_44);
 
     /* Handle recording of state blocks. */
     if (device->recording)
@@ -1382,7 +1382,7 @@ void CDECL wined3d_device_set_transform(struct wined3d_device *device,
      * tend towards setting the same matrix repeatedly for some reason.
      *
      * From here on we assume that the new matrix is different, wherever it matters. */
-    if (!memcmp(&device->state.transforms[d3dts].u.m[0][0], matrix, sizeof(*matrix)))
+    if (!memcmp(&device->state.transforms[d3dts], matrix, sizeof(*matrix)))
     {
         TRACE("The application is setting the same matrix over again.\n");
         return;
@@ -2779,22 +2779,22 @@ static HRESULT process_vertices_strided(const struct wined3d_device *device, DWO
     wined3d_device_get_transform(device, WINED3D_TS_WORLD_MATRIX(0), &world_mat);
 
     TRACE("View mat:\n");
-    TRACE("%f %f %f %f\n", view_mat.u.s._11, view_mat.u.s._12, view_mat.u.s._13, view_mat.u.s._14);
-    TRACE("%f %f %f %f\n", view_mat.u.s._21, view_mat.u.s._22, view_mat.u.s._23, view_mat.u.s._24);
-    TRACE("%f %f %f %f\n", view_mat.u.s._31, view_mat.u.s._32, view_mat.u.s._33, view_mat.u.s._34);
-    TRACE("%f %f %f %f\n", view_mat.u.s._41, view_mat.u.s._42, view_mat.u.s._43, view_mat.u.s._44);
+    TRACE("%.8e %.8e %.8e %.8e\n", view_mat._11, view_mat._12, view_mat._13, view_mat._14);
+    TRACE("%.8e %.8e %.8e %.8e\n", view_mat._21, view_mat._22, view_mat._23, view_mat._24);
+    TRACE("%.8e %.8e %.8e %.8e\n", view_mat._31, view_mat._32, view_mat._33, view_mat._34);
+    TRACE("%.8e %.8e %.8e %.8e\n", view_mat._41, view_mat._42, view_mat._43, view_mat._44);
 
     TRACE("Proj mat:\n");
-    TRACE("%f %f %f %f\n", proj_mat.u.s._11, proj_mat.u.s._12, proj_mat.u.s._13, proj_mat.u.s._14);
-    TRACE("%f %f %f %f\n", proj_mat.u.s._21, proj_mat.u.s._22, proj_mat.u.s._23, proj_mat.u.s._24);
-    TRACE("%f %f %f %f\n", proj_mat.u.s._31, proj_mat.u.s._32, proj_mat.u.s._33, proj_mat.u.s._34);
-    TRACE("%f %f %f %f\n", proj_mat.u.s._41, proj_mat.u.s._42, proj_mat.u.s._43, proj_mat.u.s._44);
+    TRACE("%.8e %.8e %.8e %.8e\n", proj_mat._11, proj_mat._12, proj_mat._13, proj_mat._14);
+    TRACE("%.8e %.8e %.8e %.8e\n", proj_mat._21, proj_mat._22, proj_mat._23, proj_mat._24);
+    TRACE("%.8e %.8e %.8e %.8e\n", proj_mat._31, proj_mat._32, proj_mat._33, proj_mat._34);
+    TRACE("%.8e %.8e %.8e %.8e\n", proj_mat._41, proj_mat._42, proj_mat._43, proj_mat._44);
 
     TRACE("World mat:\n");
-    TRACE("%f %f %f %f\n", world_mat.u.s._11, world_mat.u.s._12, world_mat.u.s._13, world_mat.u.s._14);
-    TRACE("%f %f %f %f\n", world_mat.u.s._21, world_mat.u.s._22, world_mat.u.s._23, world_mat.u.s._24);
-    TRACE("%f %f %f %f\n", world_mat.u.s._31, world_mat.u.s._32, world_mat.u.s._33, world_mat.u.s._34);
-    TRACE("%f %f %f %f\n", world_mat.u.s._41, world_mat.u.s._42, world_mat.u.s._43, world_mat.u.s._44);
+    TRACE("%.8e %.8e %.8e %.8e\n", world_mat._11, world_mat._12, world_mat._13, world_mat._14);
+    TRACE("%.8e %.8e %.8e %.8e\n", world_mat._21, world_mat._22, world_mat._23, world_mat._24);
+    TRACE("%.8e %.8e %.8e %.8e\n", world_mat._31, world_mat._32, world_mat._33, world_mat._34);
+    TRACE("%.8e %.8e %.8e %.8e\n", world_mat._41, world_mat._42, world_mat._43, world_mat._44);
 
     /* Get the viewport */
     wined3d_device_get_viewport(device, &vp);
@@ -2817,11 +2817,11 @@ static HRESULT process_vertices_strided(const struct wined3d_device *device, DWO
             float x, y, z, rhw;
             TRACE("In: ( %06.2f %06.2f %06.2f )\n", p[0], p[1], p[2]);
 
-            /* Multiplication with world, view and projection matrix */
-            x =   (p[0] * mat.u.s._11) + (p[1] * mat.u.s._21) + (p[2] * mat.u.s._31) + (1.0f * mat.u.s._41);
-            y =   (p[0] * mat.u.s._12) + (p[1] * mat.u.s._22) + (p[2] * mat.u.s._32) + (1.0f * mat.u.s._42);
-            z =   (p[0] * mat.u.s._13) + (p[1] * mat.u.s._23) + (p[2] * mat.u.s._33) + (1.0f * mat.u.s._43);
-            rhw = (p[0] * mat.u.s._14) + (p[1] * mat.u.s._24) + (p[2] * mat.u.s._34) + (1.0f * mat.u.s._44);
+            /* Multiplication with world, view and projection matrix. */
+            x   = (p[0] * mat._11) + (p[1] * mat._21) + (p[2] * mat._31) + mat._41;
+            y   = (p[0] * mat._12) + (p[1] * mat._22) + (p[2] * mat._32) + mat._42;
+            z   = (p[0] * mat._13) + (p[1] * mat._23) + (p[2] * mat._33) + mat._43;
+            rhw = (p[0] * mat._14) + (p[1] * mat._24) + (p[2] * mat._34) + mat._44;
 
             TRACE("x=%f y=%f z=%f rhw=%f\n", x, y, z, rhw);
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 3d48da1..e38cd18 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -782,7 +782,7 @@ static void shader_glsl_load_constants(void *shader_priv, struct wined3d_context
         struct wined3d_matrix mat;
 
         get_modelview_matrix(context, state, &mat);
-        GL_EXTCALL(glUniformMatrix4fv(prog->vs.modelview_matrix_location, 1, FALSE, (GLfloat *)&mat));
+        GL_EXTCALL(glUniformMatrix4fv(prog->vs.modelview_matrix_location, 1, FALSE, &mat._11));
         checkGLcall("glUniformMatrix4fv");
     }
 
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 65f43a2..1c5edb3 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3299,7 +3299,7 @@ void transform_texture(struct wined3d_context *context, const struct wined3d_sta
     generated = (state->texture_states[texUnit][WINED3D_TSS_TEXCOORD_INDEX] & 0xffff0000) != WINED3DTSS_TCI_PASSTHRU;
     coordIdx = min(state->texture_states[texUnit][WINED3D_TSS_TEXCOORD_INDEX & 0x0000ffff], MAX_TEXTURES - 1);
 
-    set_texture_matrix(gl_info, &state->transforms[WINED3D_TS_TEXTURE0 + texUnit].u.m[0][0],
+    set_texture_matrix(gl_info, &state->transforms[WINED3D_TS_TEXTURE0 + texUnit],
             state->texture_states[texUnit][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS],
             generated, context->last_was_rhw,
             context->stream_info.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))
@@ -3876,7 +3876,7 @@ void clipplane(struct wined3d_context *context, const struct wined3d_state *stat
 
     /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */
     if (!use_vs(state))
-        gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW].u.m[0][0]);
+        gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW]._11);
     else
         /* With vertex shaders, clip planes are not transformed in Direct3D,
          * while in OpenGL they are still transformed by the model view matix. */
@@ -3928,9 +3928,9 @@ static void transform_worldex(struct wined3d_context *context, const struct wine
     /* World matrix 0 is multiplied with the view matrix because d3d uses 3
      * matrices while gl uses only 2. To avoid weighting the view matrix
      * incorrectly it has to be multiplied into every GL modelview matrix. */
-    gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW].u.m[0][0]);
+    gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW]._11);
     checkGLcall("glLoadMatrixf");
-    gl_info->gl_ops.gl.p_glMultMatrixf(&state->transforms[WINED3D_TS_WORLD_MATRIX(matrix)].u.m[0][0]);
+    gl_info->gl_ops.gl.p_glMultMatrixf(&state->transforms[WINED3D_TS_WORLD_MATRIX(matrix)]._11);
     checkGLcall("glMultMatrixf");
 }
 
@@ -4004,7 +4004,7 @@ static void transform_view(struct wined3d_context *context, const struct wined3d
 
     gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW);
     checkGLcall("glMatrixMode(GL_MODELVIEW)");
-    gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW].u.m[0][0]);
+    gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW]._11);
     checkGLcall("glLoadMatrixf(...)");
 
     /* Reset lights. TODO: Call light apply func */
@@ -4117,7 +4117,7 @@ void transform_projection(struct wined3d_context *context, const struct wined3d_
         gl_info->gl_ops.gl.p_glLoadMatrixd(projection);
         checkGLcall("glLoadMatrixd");
 
-        gl_info->gl_ops.gl.p_glMultMatrixf(&state->transforms[WINED3D_TS_PROJECTION].u.m[0][0]);
+        gl_info->gl_ops.gl.p_glMultMatrixf(&state->transforms[WINED3D_TS_PROJECTION]._11);
         checkGLcall("glLoadMatrixf");
     }
 }
@@ -4820,7 +4820,7 @@ void light(struct wined3d_context *context, const struct wined3d_state *state, D
         /* Light settings are affected by the model view in OpenGL, the View transform in direct3d*/
         gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW);
         gl_info->gl_ops.gl.p_glPushMatrix();
-        gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW].u.m[0][0]);
+        gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW]._11);
 
         /* Diffuse: */
         colRGBA[0] = lightInfo->OriginalParms.diffuse.r;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 116ab9a..a43029c 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -3120,12 +3120,12 @@ BOOL is_invalid_op(const struct wined3d_state *state, int stage,
 void get_identity_matrix(struct wined3d_matrix *mat)
 {
     static const struct wined3d_matrix identity =
-    {{{
+    {
         1.0f, 0.0f, 0.0f, 0.0f,
         0.0f, 1.0f, 0.0f, 0.0f,
         0.0f, 0.0f, 1.0f, 0.0f,
         0.0f, 0.0f, 0.0f, 1.0f,
-    }}};
+    };
 
     *mat = identity;
 }
@@ -3140,10 +3140,10 @@ void get_modelview_matrix(const struct wined3d_context *context, const struct wi
 
 /* Setup this textures matrix according to the texture flags. */
 /* Context activation is done by the caller (state handler). */
-void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat, DWORD flags,
-        BOOL calculatedCoords, BOOL transformed, enum wined3d_format_id vtx_fmt, BOOL ffp_proj_control)
+void set_texture_matrix(const struct wined3d_gl_info *gl_info, const struct wined3d_matrix *matrix, DWORD flags,
+        BOOL calculated_coords, BOOL transformed, enum wined3d_format_id format_id, BOOL ffp_proj_control)
 {
-    float mat[16];
+    struct wined3d_matrix mat;
 
     gl_info->gl_ops.gl.p_glMatrixMode(GL_TEXTURE);
     checkGLcall("glMatrixMode(GL_TEXTURE)");
@@ -3161,7 +3161,7 @@ void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat
         return;
     }
 
-    memcpy(mat, smat, 16 * sizeof(float));
+    mat = *matrix;
 
     if (flags & WINED3D_TTFF_PROJECTED)
     {
@@ -3170,42 +3170,47 @@ void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat
             switch (flags & ~WINED3D_TTFF_PROJECTED)
             {
                 case WINED3D_TTFF_COUNT2:
-                    mat[ 3] = mat[ 1];
-                    mat[ 7] = mat[ 5];
-                    mat[11] = mat[ 9];
-                    mat[15] = mat[13];
-                    mat[ 1] = mat[ 5] = mat[ 9] = mat[13] = 0.0f;
+                    mat._14 = mat._12;
+                    mat._24 = mat._22;
+                    mat._34 = mat._32;
+                    mat._44 = mat._42;
+                    mat._12 = mat._22 = mat._32 = mat._42 = 0.0f;
                     break;
                 case WINED3D_TTFF_COUNT3:
-                    mat[ 3] = mat[ 2];
-                    mat[ 7] = mat[ 6];
-                    mat[11] = mat[10];
-                    mat[15] = mat[14];
-                    mat[ 2] = mat[ 6] = mat[10] = mat[14] = 0.0f;
+                    mat._14 = mat._13;
+                    mat._24 = mat._23;
+                    mat._34 = mat._33;
+                    mat._44 = mat._43;
+                    mat._13 = mat._23 = mat._33 = mat._43 = 0.0f;
                     break;
             }
         }
-    } else { /* under directx the R/Z coord can be used for translation, under opengl we use the Q coord instead */
-        if(!calculatedCoords) {
-            switch(vtx_fmt)
+    }
+    else
+    {
+        /* Under Direct3D the R/Z coord can be used for translation, under
+         * OpenGL we use the Q coord instead. */
+        if (!calculated_coords)
+        {
+            switch (format_id)
             {
+                /* Direct3D passes the default 1.0 in the 2nd coord, while GL
+                 * passes it in the 4th. Swap 2nd and 4th coord. No need to
+                 * store the value of mat._41 in mat._21 because the input
+                 * value to the transformation will be 0, so the matrix value
+                 * is irrelevant. */
                 case WINED3DFMT_R32_FLOAT:
-                    /* Direct3D passes the default 1.0 in the 2nd coord, while gl passes it in the 4th.
-                     * swap 2nd and 4th coord. No need to store the value of mat[12] in mat[4] because
-                     * the input value to the transformation will be 0, so the matrix value is irrelevant
-                     */
-                    mat[12] = mat[4];
-                    mat[13] = mat[5];
-                    mat[14] = mat[6];
-                    mat[15] = mat[7];
+                    mat._41 = mat._21;
+                    mat._42 = mat._22;
+                    mat._43 = mat._23;
+                    mat._44 = mat._24;
                     break;
+                /* See above, just 3rd and 4th coord. */
                 case WINED3DFMT_R32G32_FLOAT:
-                    /* See above, just 3rd and 4th coord
-                    */
-                    mat[12] = mat[8];
-                    mat[13] = mat[9];
-                    mat[14] = mat[10];
-                    mat[15] = mat[11];
+                    mat._41 = mat._31;
+                    mat._42 = mat._32;
+                    mat._43 = mat._33;
+                    mat._44 = mat._34;
                     break;
                 case WINED3DFMT_R32G32B32_FLOAT: /* Opengl defaults match dx defaults */
                 case WINED3DFMT_R32G32B32A32_FLOAT: /* No defaults apply, all app defined */
@@ -3226,7 +3231,7 @@ void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat
             {
                 /* case WINED3D_TTFF_COUNT1: Won't ever get here. */
                 case WINED3D_TTFF_COUNT2:
-                    mat[2] = mat[6] = mat[10] = mat[14] = 0;
+                    mat._13 = mat._23 = mat._33 = mat._43 = 0.0f;
                 /* OpenGL divides the first 3 vertex coord by the 4th by default,
                 * which is essentially the same as D3DTTFF_PROJECTED. Make sure that
                 * the 4th coord evaluates to 1.0 to eliminate that.
@@ -3240,12 +3245,12 @@ void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat
                 * 4th is != 1.0(opengl default). This would have to be fixed in drawStridedSlow
                 * or a replacement shader. */
                 default:
-                    mat[3] = mat[7] = mat[11] = 0; mat[15] = 1;
+                    mat._14 = mat._24 = mat._34 = 0.0f; mat._44 = 1.0f;
             }
         }
     }
 
-    gl_info->gl_ops.gl.p_glLoadMatrixf(mat);
+    gl_info->gl_ops.gl.p_glLoadMatrixf(&mat._11);
     checkGLcall("glLoadMatrixf(mat)");
 }
 
@@ -3408,35 +3413,33 @@ enum wined3d_format_id pixelformat_for_depth(DWORD depth)
     }
 }
 
-void multiply_matrix(struct wined3d_matrix *dest, const struct wined3d_matrix *src1,
-        const struct wined3d_matrix *src2)
+void multiply_matrix(struct wined3d_matrix *dst, const struct wined3d_matrix *src1, const struct wined3d_matrix *src2)
 {
-    struct wined3d_matrix temp;
+    struct wined3d_matrix tmp;
 
     /* Now do the multiplication 'by hand'.
        I know that all this could be optimised, but this will be done later :-) */
-    temp.u.s._11 = (src1->u.s._11 * src2->u.s._11) + (src1->u.s._21 * src2->u.s._12) + (src1->u.s._31 * src2->u.s._13) + (src1->u.s._41 * src2->u.s._14);
-    temp.u.s._21 = (src1->u.s._11 * src2->u.s._21) + (src1->u.s._21 * src2->u.s._22) + (src1->u.s._31 * src2->u.s._23) + (src1->u.s._41 * src2->u.s._24);
-    temp.u.s._31 = (src1->u.s._11 * src2->u.s._31) + (src1->u.s._21 * src2->u.s._32) + (src1->u.s._31 * src2->u.s._33) + (src1->u.s._41 * src2->u.s._34);
-    temp.u.s._41 = (src1->u.s._11 * src2->u.s._41) + (src1->u.s._21 * src2->u.s._42) + (src1->u.s._31 * src2->u.s._43) + (src1->u.s._41 * src2->u.s._44);
-
-    temp.u.s._12 = (src1->u.s._12 * src2->u.s._11) + (src1->u.s._22 * src2->u.s._12) + (src1->u.s._32 * src2->u.s._13) + (src1->u.s._42 * src2->u.s._14);
-    temp.u.s._22 = (src1->u.s._12 * src2->u.s._21) + (src1->u.s._22 * src2->u.s._22) + (src1->u.s._32 * src2->u.s._23) + (src1->u.s._42 * src2->u.s._24);
-    temp.u.s._32 = (src1->u.s._12 * src2->u.s._31) + (src1->u.s._22 * src2->u.s._32) + (src1->u.s._32 * src2->u.s._33) + (src1->u.s._42 * src2->u.s._34);
-    temp.u.s._42 = (src1->u.s._12 * src2->u.s._41) + (src1->u.s._22 * src2->u.s._42) + (src1->u.s._32 * src2->u.s._43) + (src1->u.s._42 * src2->u.s._44);
-
-    temp.u.s._13 = (src1->u.s._13 * src2->u.s._11) + (src1->u.s._23 * src2->u.s._12) + (src1->u.s._33 * src2->u.s._13) + (src1->u.s._43 * src2->u.s._14);
-    temp.u.s._23 = (src1->u.s._13 * src2->u.s._21) + (src1->u.s._23 * src2->u.s._22) + (src1->u.s._33 * src2->u.s._23) + (src1->u.s._43 * src2->u.s._24);
-    temp.u.s._33 = (src1->u.s._13 * src2->u.s._31) + (src1->u.s._23 * src2->u.s._32) + (src1->u.s._33 * src2->u.s._33) + (src1->u.s._43 * src2->u.s._34);
-    temp.u.s._43 = (src1->u.s._13 * src2->u.s._41) + (src1->u.s._23 * src2->u.s._42) + (src1->u.s._33 * src2->u.s._43) + (src1->u.s._43 * src2->u.s._44);
-
-    temp.u.s._14 = (src1->u.s._14 * src2->u.s._11) + (src1->u.s._24 * src2->u.s._12) + (src1->u.s._34 * src2->u.s._13) + (src1->u.s._44 * src2->u.s._14);
-    temp.u.s._24 = (src1->u.s._14 * src2->u.s._21) + (src1->u.s._24 * src2->u.s._22) + (src1->u.s._34 * src2->u.s._23) + (src1->u.s._44 * src2->u.s._24);
-    temp.u.s._34 = (src1->u.s._14 * src2->u.s._31) + (src1->u.s._24 * src2->u.s._32) + (src1->u.s._34 * src2->u.s._33) + (src1->u.s._44 * src2->u.s._34);
-    temp.u.s._44 = (src1->u.s._14 * src2->u.s._41) + (src1->u.s._24 * src2->u.s._42) + (src1->u.s._34 * src2->u.s._43) + (src1->u.s._44 * src2->u.s._44);
-
-    /* And copy the new matrix in the good storage.. */
-    memcpy(dest, &temp, 16 * sizeof(float));
+    tmp._11 = (src1->_11 * src2->_11) + (src1->_21 * src2->_12) + (src1->_31 * src2->_13) + (src1->_41 * src2->_14);
+    tmp._21 = (src1->_11 * src2->_21) + (src1->_21 * src2->_22) + (src1->_31 * src2->_23) + (src1->_41 * src2->_24);
+    tmp._31 = (src1->_11 * src2->_31) + (src1->_21 * src2->_32) + (src1->_31 * src2->_33) + (src1->_41 * src2->_34);
+    tmp._41 = (src1->_11 * src2->_41) + (src1->_21 * src2->_42) + (src1->_31 * src2->_43) + (src1->_41 * src2->_44);
+
+    tmp._12 = (src1->_12 * src2->_11) + (src1->_22 * src2->_12) + (src1->_32 * src2->_13) + (src1->_42 * src2->_14);
+    tmp._22 = (src1->_12 * src2->_21) + (src1->_22 * src2->_22) + (src1->_32 * src2->_23) + (src1->_42 * src2->_24);
+    tmp._32 = (src1->_12 * src2->_31) + (src1->_22 * src2->_32) + (src1->_32 * src2->_33) + (src1->_42 * src2->_34);
+    tmp._42 = (src1->_12 * src2->_41) + (src1->_22 * src2->_42) + (src1->_32 * src2->_43) + (src1->_42 * src2->_44);
+
+    tmp._13 = (src1->_13 * src2->_11) + (src1->_23 * src2->_12) + (src1->_33 * src2->_13) + (src1->_43 * src2->_14);
+    tmp._23 = (src1->_13 * src2->_21) + (src1->_23 * src2->_22) + (src1->_33 * src2->_23) + (src1->_43 * src2->_24);
+    tmp._33 = (src1->_13 * src2->_31) + (src1->_23 * src2->_32) + (src1->_33 * src2->_33) + (src1->_43 * src2->_34);
+    tmp._43 = (src1->_13 * src2->_41) + (src1->_23 * src2->_42) + (src1->_33 * src2->_43) + (src1->_43 * src2->_44);
+
+    tmp._14 = (src1->_14 * src2->_11) + (src1->_24 * src2->_12) + (src1->_34 * src2->_13) + (src1->_44 * src2->_14);
+    tmp._24 = (src1->_14 * src2->_21) + (src1->_24 * src2->_22) + (src1->_34 * src2->_23) + (src1->_44 * src2->_24);
+    tmp._34 = (src1->_14 * src2->_31) + (src1->_24 * src2->_32) + (src1->_34 * src2->_33) + (src1->_44 * src2->_34);
+    tmp._44 = (src1->_14 * src2->_41) + (src1->_24 * src2->_42) + (src1->_34 * src2->_43) + (src1->_44 * src2->_44);
+
+    *dst = tmp;
 }
 
 DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
@@ -3973,10 +3976,10 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_state *state, const struct
     {
         settings->fog_mode = WINED3D_FFP_VS_FOG_DEPTH;
 
-        if (state->transforms[WINED3D_TS_PROJECTION].u.m[0][3] == 0.0f
-                && state->transforms[WINED3D_TS_PROJECTION].u.m[1][3] == 0.0f
-                && state->transforms[WINED3D_TS_PROJECTION].u.m[2][3] == 0.0f
-                && state->transforms[WINED3D_TS_PROJECTION].u.m[3][3] == 1.0f)
+        if (state->transforms[WINED3D_TS_PROJECTION]._14 == 0.0f
+                && state->transforms[WINED3D_TS_PROJECTION]._24 == 0.0f
+                && state->transforms[WINED3D_TS_PROJECTION]._34 == 0.0f
+                && state->transforms[WINED3D_TS_PROJECTION]._44 == 1.0f)
             settings->ortho_fog = 1;
     }
     else if (state->render_states[WINED3D_RS_FOGVERTEXMODE] == WINED3D_FOG_NONE)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f05e72f..2d62846 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2782,8 +2782,8 @@ BOOL is_invalid_op(const struct wined3d_state *state, int stage,
 void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state,
         BOOL is_alpha, int stage, enum wined3d_texture_op op, DWORD arg1, DWORD arg2, DWORD arg3,
         INT texture_idx, DWORD dst) DECLSPEC_HIDDEN;
-void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat, DWORD flags,
-        BOOL calculatedCoords, BOOL transformed, enum wined3d_format_id coordtype,
+void set_texture_matrix(const struct wined3d_gl_info *gl_info, const struct wined3d_matrix *matrix,
+        DWORD flags, BOOL calculated_coords, BOOL transformed, enum wined3d_format_id format_id,
         BOOL ffp_can_disable_proj) DECLSPEC_HIDDEN;
 void texture_activate_dimensions(const struct wined3d_texture *texture,
         const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 089db9e..6905585 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1530,17 +1530,10 @@ struct wined3d_vec4
 
 struct wined3d_matrix
 {
-    union
-    {
-        struct
-        {
-            float _11, _12, _13, _14;
-            float _21, _22, _23, _24;
-            float _31, _32, _33, _34;
-            float _41, _42, _43, _44;
-        } DUMMYSTRUCTNAME;
-        float m[4][4];
-    } DUMMYUNIONNAME;
+    float _11, _12, _13, _14;
+    float _21, _22, _23, _24;
+    float _31, _32, _33, _34;
+    float _41, _42, _43, _44;
 };
 
 struct wined3d_light
-- 
1.7.10.4




More information about the wine-patches mailing list