[PATCH] d3drm: Implement IDirect3DRMFrameX_GetTransform.
Christian Costa
titan.costa at gmail.com
Thu Apr 12 01:37:05 CDT 2012
---
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 9688a4e..7a90dc6 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -37,6 +37,13 @@ typedef struct {
LPDIRECT3DRMFRAME* frames;
} IDirect3DRMFrameArrayImpl;
+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 }
+};
+
HRESULT Direct3DRMFrameArray_create(IDirect3DRMFrameArray** obj);
typedef struct {
@@ -46,6 +53,7 @@ typedef struct {
LPDIRECT3DRMFRAME3 parent;
ULONG nb_children;
IDirect3DRMFrame3** children;
+ D3DRMMATRIX4D transform;
} IDirect3DRMFrameImpl;
static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
@@ -410,9 +418,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,
@@ -1334,9 +1344,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,
@@ -2082,6 +2097,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 d6a4bad..f01829a 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"
@@ -614,6 +621,26 @@ static void test_Frame(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[] =
{
@@ -657,6 +684,7 @@ START_TEST(d3drm)
test_MeshBuilder();
test_MeshBuilder3();
test_Frame();
+ test_frame_transform();
test_d3drm_load();
FreeLibrary(d3drm_handle);
More information about the wine-patches
mailing list