Signed-off-by: Jeff Smith whydoubt@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);