[PATCH 10/10] d3drm: Implement d3drm_frame3_Transform().

Henri Verbeet hverbeet at codeweavers.com
Wed Jun 19 16:59:55 CDT 2019


From: Jeff Smith <whydoubt at gmail.com>

Signed-off-by: Jeff Smith <whydoubt at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
This supersedes patch 166701.

 dlls/d3drm/frame.c       | 35 +++++++++++++++++----
 dlls/d3drm/tests/d3drm.c | 81 +++++++++++++++++++++++++++++++++---------------
 2 files changed, 85 insertions(+), 31 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index e31d8142a31..13c9af19a42 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -155,6 +155,17 @@ static void d3drm_matrix_set_rotation(struct d3drm_matrix *matrix, D3DVECTOR *ax
     matrix->_44 = 1.0f;
 }
 
+static void d3drm_vector_transform_affine(D3DVECTOR *dst, const D3DVECTOR *v, const struct d3drm_matrix *m)
+{
+    D3DVECTOR tmp;
+
+    tmp.u1.x = v->u1.x * m->_11 + v->u2.y * m->_21 + v->u3.z * m->_31 + m->_41;
+    tmp.u2.y = v->u1.x * m->_12 + v->u2.y * m->_22 + v->u3.z * m->_32 + m->_42;
+    tmp.u3.z = v->u1.x * m->_13 + v->u2.y * m->_23 + v->u3.z * m->_33 + m->_43;
+
+    *dst = tmp;
+}
+
 static HRESULT WINAPI d3drm_frame_array_QueryInterface(IDirect3DRMFrameArray *iface, REFIID riid, void **out)
 {
     TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
@@ -2589,23 +2600,35 @@ static HRESULT WINAPI d3drm_frame1_SetZbufferMode(IDirect3DRMFrame *iface, D3DRM
 
 static HRESULT WINAPI d3drm_frame3_Transform(IDirect3DRMFrame3 *iface, D3DVECTOR *d, D3DVECTOR *s)
 {
-    FIXME("iface %p, d %p, s %p stub!\n", iface, d, s);
+    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, d %p, s %p.\n", iface, d, s);
+
+    d3drm_vector_transform_affine(d, s, &frame->transform);
+    while ((frame = frame->parent))
+    {
+        d3drm_vector_transform_affine(d, d, &frame->transform);
+    }
+
+    return D3DRM_OK;
 }
 
 static HRESULT WINAPI d3drm_frame2_Transform(IDirect3DRMFrame2 *iface, D3DVECTOR *d, D3DVECTOR *s)
 {
-    FIXME("iface %p, d %p, s %p stub!\n", iface, d, s);
+    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame2(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, d %p, s %p.\n", iface, d, s);
+
+    return d3drm_frame3_Transform(&frame->IDirect3DRMFrame3_iface, d, s);
 }
 
 static HRESULT WINAPI d3drm_frame1_Transform(IDirect3DRMFrame *iface, D3DVECTOR *d, D3DVECTOR *s)
 {
-    FIXME("iface %p, d %p, s %p stub!\n", iface, d, s);
+    struct d3drm_frame *frame = impl_from_IDirect3DRMFrame(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, d %p, s %p.\n", iface, d, s);
+
+    return d3drm_frame3_Transform(&frame->IDirect3DRMFrame3_iface, d, s);
 }
 
 static HRESULT WINAPI d3drm_frame2_AddMoveCallback2(IDirect3DRMFrame2 *iface,
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 8b2922afbea..6ac7c35fae4 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -86,21 +86,21 @@ static void expect_matrix_(unsigned int line, const D3DRMMATRIX4D m,
             m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44);
 }
 
-#define check_vector(a, b, c, d, e) check_vector_(__LINE__, a, b, c, d, e)
-static void check_vector_(unsigned int line, const D3DVECTOR *v, float x, float y, float z, unsigned int ulps)
+#define expect_vector(v, x, y, z, u) expect_vector_(__LINE__, v, x, y, z, u)
+static void expect_vector_(unsigned int line, const D3DVECTOR *v, float x, float y, float z, unsigned int ulps)
 {
-    BOOL ret = compare_float(U1(v)->x, x, ulps)
-            && compare_float(U2(v)->y, y, ulps)
-            && compare_float(U3(v)->z, z, ulps);
+    BOOL equal = compare_float(U1(*v).x, x, ulps)
+            && compare_float(U2(*v).y, y, ulps)
+            && compare_float(U3(*v).z, z, ulps);
 
-    ok_(__FILE__, line)(ret, "Got unexpected vector {%.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e}.\n",
-            U1(v)->x, U2(v)->y, U3(v)->z, x, y, z);
+    ok_(__FILE__, line)(equal, "Got unexpected vector {%.8e, %.8e, %.8e}, expected {%.8e, %.8e, %.8e}.\n",
+            U1(*v).x, U2(*v).y, U3(*v).z, x, y, z);
 }
 
 #define vector_eq(a, b) vector_eq_(__LINE__, a, b)
 static void vector_eq_(unsigned int line, const D3DVECTOR *left, const D3DVECTOR *right)
 {
-    check_vector_(line, left, U1(right)->x, U2(right)->y, U3(right)->z, 0);
+    expect_vector_(line, left, U1(*right).x, U2(*right).y, U3(*right).z, 0);
 }
 
 static D3DRMMATRIX4D identity = {
@@ -125,6 +125,13 @@ static void frame_set_transform(IDirect3DRMFrame *frame,
     IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_REPLACE, matrix);
 }
 
+static void set_vector(D3DVECTOR *v, float x, float y, float z)
+{
+    U1(*v).x = x;
+    U2(*v).y = y;
+    U3(*v).z = z;
+}
+
 static void matrix_sanitise(D3DRMMATRIX4D m)
 {
     unsigned int i, j;
@@ -515,10 +522,10 @@ static void test_MeshBuilder(void)
     /* Check that Load method generated default normals */
     hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, NULL, NULL, &val2, n, NULL, NULL);
     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
-    check_vector(&n[0],  0.577350f, 0.577350f, 0.577350f, 32);
-    check_vector(&n[1], -0.229416f, 0.688247f, 0.688247f, 32);
-    check_vector(&n[2], -0.229416f, 0.688247f, 0.688247f, 32);
-    check_vector(&n[3], -0.577350f, 0.577350f, 0.577350f, 32);
+    expect_vector(&n[0],  0.577350f, 0.577350f, 0.577350f, 32);
+    expect_vector(&n[1], -0.229416f, 0.688247f, 0.688247f, 32);
+    expect_vector(&n[2], -0.229416f, 0.688247f, 0.688247f, 32);
+    expect_vector(&n[3], -0.577350f, 0.577350f, 0.577350f, 32);
 
     /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */
     valu = 1.23f;
@@ -614,12 +621,12 @@ static void test_MeshBuilder(void)
     ok(val1 == 3, "Wrong number of vertices %d (must be 3)\n", val1);
     ok(val2 == 3, "Wrong number of normals %d (must be 3)\n", val2);
     ok(val3 == 8, "Wrong number of face data bytes %d (must be 8)\n", val3);
-    check_vector(&v[0], 0.1f, 0.2f, 0.3f, 32);
-    check_vector(&v[1], 0.4f, 0.5f, 0.6f, 32);
-    check_vector(&v[2], 0.7f, 0.8f, 0.9f, 32);
-    check_vector(&n[0], 1.1f, 1.2f, 1.3f, 32);
-    check_vector(&n[1], 1.4f, 1.5f, 1.6f, 32);
-    check_vector(&n[2], 1.7f, 1.8f, 1.9f, 32);
+    expect_vector(&v[0], 0.1f, 0.2f, 0.3f, 32);
+    expect_vector(&v[1], 0.4f, 0.5f, 0.6f, 32);
+    expect_vector(&v[2], 0.7f, 0.8f, 0.9f, 32);
+    expect_vector(&n[0], 1.1f, 1.2f, 1.3f, 32);
+    expect_vector(&n[1], 1.4f, 1.5f, 1.6f, 32);
+    expect_vector(&n[2], 1.7f, 1.8f, 1.9f, 32);
     ok(f[0] == 3 , "Wrong component f[0] = %d (expected 3)\n", f[0]);
     ok(f[1] == 0 , "Wrong component f[1] = %d (expected 0)\n", f[1]);
     ok(f[2] == 0 , "Wrong component f[2] = %d (expected 0)\n", f[2]);
@@ -683,13 +690,13 @@ static void test_MeshBuilder(void)
     ok(val2 == 3, "Wrong number of normals %d (must be 3)\n", val2);
     ok(val1 == 3, "Wrong number of vertices %d (must be 3)\n", val1);
 
-    check_vector(&v[0], 0.1f * 2, 0.2f * 3, 0.3f * 4, 32);
-    check_vector(&v[1], 0.4f * 2, 0.5f * 3, 0.6f * 4, 32);
-    check_vector(&v[2], 0.7f * 2, 0.8f * 3, 0.9f * 4, 32);
+    expect_vector(&v[0], 0.1f * 2, 0.2f * 3, 0.3f * 4, 32);
+    expect_vector(&v[1], 0.4f * 2, 0.5f * 3, 0.6f * 4, 32);
+    expect_vector(&v[2], 0.7f * 2, 0.8f * 3, 0.9f * 4, 32);
     /* Normals are not affected by Scale */
-    check_vector(&n[0], 1.1f, 1.2f, 1.3f, 32);
-    check_vector(&n[1], 1.4f, 1.5f, 1.6f, 32);
-    check_vector(&n[2], 1.7f, 1.8f, 1.9f, 32);
+    expect_vector(&n[0], 1.1f, 1.2f, 1.3f, 32);
+    expect_vector(&n[1], 1.4f, 1.5f, 1.6f, 32);
+    expect_vector(&n[2], 1.7f, 1.8f, 1.9f, 32);
 
     IDirect3DRMMeshBuilder_Release(pMeshBuilder);
 
@@ -2768,9 +2775,10 @@ cleanup:
 
 static void test_frame_transform(void)
 {
+    IDirect3DRMFrame *frame, *subframe;
     D3DRMMATRIX4D matrix, add_matrix;
-    IDirect3DRMFrame *frame;
     IDirect3DRM *d3drm;
+    D3DVECTOR v1, v2;
     HRESULT hr;
 
     hr = Direct3DRMCreate(&d3drm);
@@ -3000,6 +3008,29 @@ static void test_frame_transform(void)
             0.0f, -1.0f, 0.0f, 0.0f,
             0.0f,  0.0f, 0.0f, 1.0f, 1);
 
+    frame_set_transform(frame,
+             2.0f,  0.0f,  0.0f, 0.0f,
+             0.0f,  4.0f,  0.0f, 0.0f,
+             0.0f,  0.0f,  8.0f, 0.0f,
+            64.0f, 64.0f, 64.0f, 1.0f);
+    hr = IDirect3DRM_CreateFrame(d3drm, frame, &subframe);
+    ok(hr == D3DRM_OK, "Got unexpected hr %#x.\n", hr);
+    frame_set_transform(subframe,
+             1.0f,  0.0f,  0.0f, 0.0f,
+             0.0f,  1.0f,  0.0f, 0.0f,
+             0.0f,  0.0f,  1.0f, 0.0f,
+            11.0f, 11.0f, 11.0f, 1.0f);
+    set_vector(&v1, 3.0f, 5.0f, 7.0f);
+
+    hr = IDirect3DRMFrame_Transform(frame, &v2, &v1);
+    ok(hr == D3DRM_OK, "Got unexpected hr %#x.\n", hr);
+    expect_vector(&v2, 70.0f, 84.0f, 120.0f, 1);
+
+    hr = IDirect3DRMFrame_Transform(subframe, &v2, &v1);
+    ok(hr == D3DRM_OK, "Got unexpected hr %#x.\n", hr);
+    expect_vector(&v2, 92.0f, 128.0f, 208.0f, 1);
+
+    IDirect3DRMFrame_Release(subframe);
     IDirect3DRMFrame_Release(frame);
     IDirect3DRM_Release(d3drm);
 }
-- 
2.11.0




More information about the wine-devel mailing list