[PATCH 09/12] d3drm: Implement frame GetTransform with reference

Jeff Smith whydoubt at gmail.com
Thu Jun 13 23:27:34 CDT 2019


Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
 dlls/d3drm/frame.c       | 17 +++++++++++++----
 dlls/d3drm/tests/d3drm.c | 21 +++++++++++++++++++++
 2 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index 4de488575c..7162b8323f 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -1704,13 +1704,22 @@ static HRESULT WINAPI d3drm_frame3_GetTransform(IDirect3DRMFrame3 *iface,
         IDirect3DRMFrame3 *reference, D3DRMMATRIX4D matrix)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
+    struct d3drm_frame *ref = unsafe_impl_from_IDirect3DRMFrame3(reference);
 
     TRACE("iface %p, reference %p, matrix %p.\n", iface, reference, matrix);
 
-    if (reference)
-        FIXME("Specifying a frame as the root of the scene different from the current root frame is not supported yet\n");
-
-    memcpy(matrix, frame->transform, sizeof(D3DRMMATRIX4D));
+    if (ref == frame->parent)
+        memcpy(matrix, frame->transform, sizeof(D3DRMMATRIX4D));
+    else if (!ref)
+        matrix_expand(matrix, frame, NULL);
+    else
+    {
+        D3DRMMATRIX4D m, m2;
+        matrix_expand(m, ref, NULL);
+        matrix_invert(m2, m);
+        matrix_expand(m, frame, NULL);
+        matrix_multiply(matrix, m2, m);
+    }
 
     return D3DRM_OK;
 }
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 16fd6ae7a6..dbff1bac82 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -2815,6 +2815,7 @@ static void test_frame_transform(void)
     HRESULT hr;
     IDirect3DRM *d3drm;
     IDirect3DRMFrame *frame, *subframe, *reference;
+    IDirect3DRMFrame3 *frame3, *subframe3, *reference3;
     D3DRMMATRIX4D matrix;
     D3DVECTOR v1, v2;
 
@@ -2955,6 +2956,26 @@ static void test_frame_transform(void)
     EXPECT_VECTORS_2("GetOrientation (sub-frame vs. NULL)",  v1, 0.36,0.48,0.8,  v2, -0.48,-0.64,0.6);
 
 
+    IDirect3DRMFrame_QueryInterface(frame, &IID_IDirect3DRMFrame3, (void**)&frame3);
+    IDirect3DRMFrame_QueryInterface(subframe, &IID_IDirect3DRMFrame3, (void**)&subframe3);
+    IDirect3DRMFrame_QueryInterface(reference, &IID_IDirect3DRMFrame3, (void**)&reference3);
+
+    hr = IDirect3DRMFrame3_GetTransform(frame3, reference3, matrix);
+    EXPECT_TRANSFORM_MATRIX("GetTransform (vs. reference)", matrix,
+            -1.4,-1.45,0.25, -0.2,-1.1,-0.5, 2.44,3.67,0.45, 5.8,5.4,11);
+
+    hr = IDirect3DRMFrame3_GetTransform(frame3, NULL, matrix);
+    EXPECT_TRANSFORM_MATRIX("GetTransform (vs. NULL)", matrix,
+            0.8,-0.6,0, 0.36,0.48,0.8, -0.48,-0.64,0.6, 10,11,12);
+
+    hr = IDirect3DRMFrame3_GetTransform(subframe3, NULL, matrix);
+    EXPECT_TRANSFORM_MATRIX("GetTransform (sub-frame vs. NULL)", matrix,
+            -0.8,0.6,0, -0.48,-0.64,0.6, 0.36,0.48,0.8, 80/3.0,289/9.0,224/9.0);
+
+
+    IDirect3DRMFrame3_Release(reference3);
+    IDirect3DRMFrame3_Release(subframe3);
+    IDirect3DRMFrame3_Release(frame3);
     IDirect3DRMFrame_Release(reference);
     IDirect3DRMFrame_Release(subframe);
     IDirect3DRMFrame_Release(frame);
-- 
2.14.3




More information about the wine-devel mailing list