From 5b11bd8bacdc548114510ce995f40409f338502c Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Tue, 22 May 2012 22:05:24 +0200 Subject: [PATCH] d3drm: Implement IDirect3DRMMaterial2 interface. --- dlls/d3drm/Makefile.in | 1 + dlls/d3drm/material.c | 320 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 321 insertions(+) create mode 100644 dlls/d3drm/material.c diff --git a/dlls/d3drm/Makefile.in b/dlls/d3drm/Makefile.in index 895afc799e5..9c1d1a5b30c 100644 --- a/dlls/d3drm/Makefile.in +++ b/dlls/d3drm/Makefile.in @@ -8,6 +8,7 @@ C_SRCS = \ device.c \ frame.c \ light.c \ + material.c \ math.c \ meshbuilder.c \ viewport.c diff --git a/dlls/d3drm/material.c b/dlls/d3drm/material.c new file mode 100644 index 00000000000..1eb04a97559 --- /dev/null +++ b/dlls/d3drm/material.c @@ -0,0 +1,320 @@ +/* + * Implementation of IDirect3DRMMaterial2 interface + * + * Copyright 2012 Christian Costa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/debug.h" + +#define COBJMACROS + +#include "winbase.h" +#include "wingdi.h" + +#include "d3drm_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3drm); + +typedef struct +{ + D3DVALUE r; + D3DVALUE g; + D3DVALUE b; +} color_rgb; + +typedef struct { + IDirect3DRMMaterial2 IDirect3DRMMaterial2_iface; + LONG ref; + color_rgb emissive; + color_rgb specular; + D3DVALUE power; + color_rgb ambient; +} IDirect3DRMMaterialImpl; + +static inline IDirect3DRMMaterialImpl *impl_from_IDirect3DRMMaterial2(IDirect3DRMMaterial2 *iface) +{ + return CONTAINING_RECORD(iface, IDirect3DRMMaterialImpl, IDirect3DRMMaterial2_iface); +} + +/*** IUnknown methods ***/ +static HRESULT WINAPI IDirect3DRMMaterial2Impl_QueryInterface(IDirect3DRMMaterial2* iface, + REFIID riid, void** ret_iface) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ret_iface); + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IDirect3DRMMaterial) || + IsEqualGUID(riid, &IID_IDirect3DRMMaterial2)) + { + *ret_iface = &This->IDirect3DRMMaterial2_iface; + } + else + { + *ret_iface = NULL; + FIXME("Interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IDirect3DRMMaterial_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI IDirect3DRMMaterial2Impl_AddRef(IDirect3DRMMaterial2* iface) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(): new ref = %d\n", iface, ref); + + return ref; +} + +static ULONG WINAPI IDirect3DRMMaterial2Impl_Release(IDirect3DRMMaterial2* iface) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(): new ref = %d\n", iface, ref); + + if (!ref) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +/*** IDirect3DRMObject methods ***/ +static HRESULT WINAPI IDirect3DRMMaterial2Impl_Clone(IDirect3DRMMaterial2* iface, + LPUNKNOWN unknown, REFIID riid, + LPVOID* object) +{ + FIXME("(%p)->(%p, %s, %p): stub\n", iface, unknown, debugstr_guid(riid), object); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_AddDestroyCallback(IDirect3DRMMaterial2* iface, + D3DRMOBJECTCALLBACK cb, + LPVOID argument) +{ + FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_DeleteDestroyCallback(IDirect3DRMMaterial2* iface, + D3DRMOBJECTCALLBACK cb, + LPVOID argument) +{ + FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetAppData(IDirect3DRMMaterial2* iface, + DWORD data) +{ + FIXME("(%p)->(%u): stub\n", iface, data); + + return E_NOTIMPL; +} + +static DWORD WINAPI IDirect3DRMMaterial2Impl_GetAppData(IDirect3DRMMaterial2* iface) +{ + FIXME("(%p)->(): stub\n", iface); + + return 0; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetName(IDirect3DRMMaterial2* iface, LPCSTR name) +{ + FIXME("(%p)->(%s): stub\n", iface, name); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetName(IDirect3DRMMaterial2* iface, + LPDWORD size, LPSTR name) +{ + FIXME("(%p)->(%p, %p): stub\n", iface, size, name); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetClassName(IDirect3DRMMaterial2* iface, + LPDWORD size, LPSTR name) +{ + FIXME("(%p)->(%p, %p): stub\n", iface, size, name); + + return E_NOTIMPL; +} + +/*** IDirect3DRMMaterial methods ***/ +static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetPower(IDirect3DRMMaterial2* iface, D3DVALUE power) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%f)\n", iface, power); + + This->power = power; + + return D3DRM_OK; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetSpecular(IDirect3DRMMaterial2* iface, + D3DVALUE r, D3DVALUE g, D3DVALUE b) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%f, %f, %f)\n", iface, r, g, b); + + This->specular.r = r; + This->specular.g = g; + This->specular.b = b; + + return D3DRM_OK; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetEmissive(IDirect3DRMMaterial2* iface, + D3DVALUE r, D3DVALUE g, D3DVALUE b) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%f, %f, %f)\n", iface, r, g, b); + + This->emissive.r = r; + This->emissive.g = g; + This->emissive.b = b; + + return D3DRM_OK; +} + +static D3DVALUE WINAPI IDirect3DRMMaterial2Impl_GetPower(IDirect3DRMMaterial2* iface) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->()\n", iface); + + return This->power; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetSpecular(IDirect3DRMMaterial2* iface, + D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%p, %p, %p)\n", iface, r, g, b); + + *r = This->specular.r; + *g = This->specular.g; + *b = This->specular.b; + + return D3DRM_OK; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetEmissive(IDirect3DRMMaterial2* iface, + D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%p, %p, %p)\n", iface, r, g, b); + + *r = This->emissive.r; + *g = This->emissive.g; + *b = This->emissive.b; + + return D3DRM_OK; +} + +/*** IDirect3DRMMaterial2 methods ***/ +static HRESULT WINAPI IDirect3DRMMaterial2Impl_GetAmbient(IDirect3DRMMaterial2* iface, + D3DVALUE* r, D3DVALUE* g, D3DVALUE* b) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%p, %p, %p)\n", iface, r, g, b); + + *r = This->ambient.r; + *g = This->ambient.g; + *b = This->ambient.b; + + return D3DRM_OK; +} + +static HRESULT WINAPI IDirect3DRMMaterial2Impl_SetAmbient(IDirect3DRMMaterial2* iface, + D3DVALUE r, D3DVALUE g, D3DVALUE b) +{ + IDirect3DRMMaterialImpl *This = impl_from_IDirect3DRMMaterial2(iface); + + TRACE("(%p)->(%f, %f, %f)\n", iface, r, g, b); + + This->ambient.r = r; + This->ambient.g = g; + This->ambient.b = b; + + return D3DRM_OK; +} + +static const struct IDirect3DRMMaterial2Vtbl Direct3DRMMaterial2_Vtbl = +{ + /*** IUnknown methods ***/ + IDirect3DRMMaterial2Impl_QueryInterface, + IDirect3DRMMaterial2Impl_AddRef, + IDirect3DRMMaterial2Impl_Release, + /*** IDirect3DRMObject methods ***/ + IDirect3DRMMaterial2Impl_Clone, + IDirect3DRMMaterial2Impl_AddDestroyCallback, + IDirect3DRMMaterial2Impl_DeleteDestroyCallback, + IDirect3DRMMaterial2Impl_SetAppData, + IDirect3DRMMaterial2Impl_GetAppData, + IDirect3DRMMaterial2Impl_SetName, + IDirect3DRMMaterial2Impl_GetName, + IDirect3DRMMaterial2Impl_GetClassName, + /*** IDirect3DRMMaterial methods ***/ + IDirect3DRMMaterial2Impl_SetPower, + IDirect3DRMMaterial2Impl_SetSpecular, + IDirect3DRMMaterial2Impl_SetEmissive, + IDirect3DRMMaterial2Impl_GetPower, + IDirect3DRMMaterial2Impl_GetSpecular, + IDirect3DRMMaterial2Impl_GetEmissive, + /*** IDirect3DRMMaterial2 methods ***/ + IDirect3DRMMaterial2Impl_GetAmbient, + IDirect3DRMMaterial2Impl_SetAmbient +}; + +HRESULT Direct3DRMMaterial_create(IDirect3DRMMaterial2** ret_iface) +{ + IDirect3DRMMaterialImpl* object; + + TRACE("(%p)\n", ret_iface); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMaterialImpl)); + if (!object) + { + ERR("Out of memory\n"); + return E_OUTOFMEMORY; + } + + object->IDirect3DRMMaterial2_iface.lpVtbl = &Direct3DRMMaterial2_Vtbl; + object->ref = 1; + + *ret_iface = &object->IDirect3DRMMaterial2_iface; + + return S_OK; +} -- 2.11.4.GIT