Module: wine Branch: master Commit: 43c4c4b1c5661519c424e66964d9fe78b0151e6b URL: http://source.winehq.org/git/wine.git/?a=commit;h=43c4c4b1c5661519c424e66964...
Author: Christian Costa titan.costa@gmail.com Date: Tue May 8 22:31:16 2012 +0200
d3drm: Implement IDirect3DRMFrameX_GetTransform.
---
dlls/d3drm/frame.c | 25 +++++++++++++++++++++---- dlls/d3drm/tests/d3drm.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c index 536932e..b3d2f60 100644 --- a/dlls/d3drm/frame.c +++ b/dlls/d3drm/frame.c @@ -30,6 +30,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
+static D3DRMMATRIX4D 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 } +}; + typedef struct IDirect3DRMFrameImpl IDirect3DRMFrameImpl;
struct IDirect3DRMFrameImpl { @@ -46,6 +53,7 @@ struct IDirect3DRMFrameImpl { ULONG nb_lights; ULONG lights_capacity; IDirect3DRMLight** lights; + D3DRMMATRIX4D transform; };
typedef struct { @@ -420,9 +428,11 @@ static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTransform(IDirect3DRMFrame2* ifac { IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
- FIXME("(%p/%p)->(%p): stub\n", iface, This, return_matrix); + TRACE("(%p/%p)->(%p)\n", iface, This, return_matrix);
- return E_NOTIMPL; + memcpy(&return_matrix[0][0], &This->transform[0][0], sizeof(D3DRMMATRIX4D)); + + return D3DRM_OK; }
static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVelocity(IDirect3DRMFrame2* iface, @@ -1430,9 +1440,14 @@ static HRESULT WINAPI IDirect3DRMFrame3Impl_GetTransform(IDirect3DRMFrame3* ifac { IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
- FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, return_matrix); + TRACE("(%p/%p)->(%p,%p)\n", iface, This, reference, return_matrix);
- return E_NOTIMPL; + if (reference) + FIXME("Specifying a frame as the root of the scene different from the current root frame is not supported yet\n"); + + memcpy(&return_matrix[0][0], &This->transform[0][0], sizeof(D3DRMMATRIX4D)); + + return D3DRM_OK; }
static HRESULT WINAPI IDirect3DRMFrame3Impl_GetVelocity(IDirect3DRMFrame3* iface, @@ -2220,6 +2235,8 @@ HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown** ppObj) object->IDirect3DRMFrame3_iface.lpVtbl = &Direct3DRMFrame3_Vtbl; object->ref = 1;
+ memcpy(&object->transform[0][0], &identity[0][0], sizeof(D3DRMMATRIX4D)); + if (IsEqualGUID(riid, &IID_IDirect3DRMFrame3)) *ppObj = (IUnknown*)&object->IDirect3DRMFrame3_iface; else diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 6fdc2f7..c48cc2c 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -1,5 +1,5 @@ /* - * Copyright 2010 Christian Costa + * Copyright 2010, 2012 Christian Costa * Copyright 2012 André Hentschel * * This library is free software; you can redistribute it and/or @@ -63,6 +63,13 @@ static int get_refcount(IUnknown *object) return IUnknown_Release( object ); }
+static D3DRMMATRIX4D 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 } +}; + static char data_bad_version[] = "xof 0302txt 0064\n" "Header Object\n" @@ -741,6 +748,26 @@ static void test_Light(void) IDirect3DRM_Release(pD3DRM); }
+static void test_frame_transform(void) +{ + HRESULT hr; + LPDIRECT3DRM d3drm; + LPDIRECT3DRMFRAME frame; + D3DRMMATRIX4D matrix; + + hr = pDirect3DRMCreate(&d3drm); + ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr); + + hr = IDirect3DRM_CreateFrame(d3drm, NULL, &frame); + ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr); + + hr = IDirect3DRMFrame_GetTransform(frame, matrix); + ok(hr == D3DRM_OK, "IDirect3DRMFrame_GetTransform returned hr = %x\n", hr); + ok(!memcmp(matrix, identity, sizeof(D3DRMMATRIX4D)), "Returned matrix is not identity\n"); + + IDirect3DRM_Release(d3drm); +} + static int nb_objects = 0; static const GUID* refiids[] = { @@ -785,6 +812,7 @@ START_TEST(d3drm) test_MeshBuilder3(); test_Frame(); test_Light(); + test_frame_transform(); test_d3drm_load();
FreeLibrary(d3drm_handle);