[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