/* * Implementation of IDirect3DRMLight Interface * * Copyright 2012 André Hentschel * * 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 { IDirect3DRMLight IDirect3DRMLight_iface; LONG ref; D3DRMLIGHTTYPE type; D3DCOLOR color; D3DVALUE range; D3DVALUE cattenuation; D3DVALUE lattenuation; D3DVALUE qattenuation; D3DVALUE umbra; D3DVALUE penumbra; } IDirect3DRMLightImpl; static inline IDirect3DRMLightImpl *impl_from_IDirect3DRMLight(IDirect3DRMLight *iface) { return CONTAINING_RECORD(iface, IDirect3DRMLightImpl, IDirect3DRMLight_iface); } /*** IUnknown methods ***/ static HRESULT WINAPI IDirect3DRMLightImpl_QueryInterface(IDirect3DRMLight* iface, REFIID riid, void** object) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object); *object = NULL; if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirect3DRMLight)) { *object = &This->IDirect3DRMLight_iface; } else { FIXME("interface %s not implemented\n", debugstr_guid(riid)); return E_NOINTERFACE; } IDirect3DRMLight_AddRef(iface); return S_OK; } static ULONG WINAPI IDirect3DRMLightImpl_AddRef(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p)->(): new ref = %d\n", iface, ref); return ref; } static ULONG WINAPI IDirect3DRMLightImpl_Release(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(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 IDirect3DRMLightImpl_Clone(IDirect3DRMLight* iface, LPUNKNOWN unkwn, REFIID riid, LPVOID* object) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object); return E_NOTIMPL; } static HRESULT WINAPI IDirect3DRMLightImpl_AddDestroyCallback(IDirect3DRMLight* iface, D3DRMOBJECTCALLBACK cb, LPVOID argument) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument); return E_NOTIMPL; } static HRESULT WINAPI IDirect3DRMLightImpl_DeleteDestroyCallback(IDirect3DRMLight* iface, D3DRMOBJECTCALLBACK cb, LPVOID argument) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument); return E_NOTIMPL; } static HRESULT WINAPI IDirect3DRMLightImpl_SetAppData(IDirect3DRMLight* iface, DWORD data) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%u): stub\n", iface, This, data); return E_NOTIMPL; } static DWORD WINAPI IDirect3DRMLightImpl_GetAppData(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(): stub\n", iface, This); return 0; } static HRESULT WINAPI IDirect3DRMLightImpl_SetName(IDirect3DRMLight* iface, LPCSTR name) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%s): stub\n", iface, This, name); return E_NOTIMPL; } static HRESULT WINAPI IDirect3DRMLightImpl_GetName(IDirect3DRMLight* iface, LPDWORD size, LPSTR name) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name); return E_NOTIMPL; } static HRESULT WINAPI IDirect3DRMLightImpl_GetClassName(IDirect3DRMLight* iface, LPDWORD size, LPSTR name) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name); return E_NOTIMPL; } /*** IDirect3DRMLight methods ***/ static HRESULT WINAPI IDirect3DRMLightImpl_SetType(IDirect3DRMLight* iface, D3DRMLIGHTTYPE type) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%u)\n", iface, This, type); This->type = type; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetColor(IDirect3DRMLight* iface, D3DCOLOR color) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%u)\n", iface, This, color); This->color = color; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetColorRGB(IDirect3DRMLight* iface, D3DVALUE red, D3DVALUE green, D3DVALUE blue) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f,%f,%f)\n", iface, This, red, green, blue); This->color = D3DCOLOR_ARGB(0xff, (BYTE)(red * 255.0f), (BYTE)(green * 255.0f), (BYTE)(blue * 255.0f)); return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetRange(IDirect3DRMLight* iface, D3DVALUE range) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f)\n", iface, This, range); This->range = range; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetUmbra(IDirect3DRMLight* iface, D3DVALUE umbra) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f)\n", iface, This, umbra); This->umbra = umbra; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetPenumbra(IDirect3DRMLight* iface, D3DVALUE penumbra) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f)\n", iface, This, penumbra); This->penumbra = penumbra; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetConstantAttenuation(IDirect3DRMLight* iface, D3DVALUE cattenuation) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f)\n", iface, This, cattenuation); This->cattenuation = cattenuation; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetLinearAttenuation(IDirect3DRMLight* iface, D3DVALUE lattenuation) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f)\n", iface, This, lattenuation); This->lattenuation = lattenuation; return D3DRM_OK; } static HRESULT WINAPI IDirect3DRMLightImpl_SetQuadraticAttenuation(IDirect3DRMLight* iface, D3DVALUE qattenuation) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->(%f)\n", iface, This, qattenuation); This->qattenuation = qattenuation; return D3DRM_OK; } static D3DVALUE WINAPI IDirect3DRMLightImpl_GetRange(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->range; } static D3DVALUE WINAPI IDirect3DRMLightImpl_GetUmbra(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->umbra; } static D3DVALUE WINAPI IDirect3DRMLightImpl_GetPenumbra(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->penumbra; } static D3DVALUE WINAPI IDirect3DRMLightImpl_GetConstantAttenuation(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->cattenuation; } static D3DVALUE WINAPI IDirect3DRMLightImpl_GetLinearAttenuation(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->lattenuation; } static D3DVALUE WINAPI IDirect3DRMLightImpl_GetQuadraticAttenuation(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->qattenuation; } static D3DCOLOR WINAPI IDirect3DRMLightImpl_GetColor(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->color; } static D3DRMLIGHTTYPE WINAPI IDirect3DRMLightImpl_GetType(IDirect3DRMLight* iface) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); TRACE("(%p/%p)->()\n", iface, This); return This->type; } static HRESULT WINAPI IDirect3DRMLightImpl_SetEnableFrame(IDirect3DRMLight* iface, LPDIRECT3DRMFRAME frame) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p): stub\n", iface, This, frame); return E_NOTIMPL; } static HRESULT WINAPI IDirect3DRMLightImpl_GetEnableFrame(IDirect3DRMLight* iface, LPDIRECT3DRMFRAME* frame) { IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface); FIXME("(%p/%p)->(%p): stub\n", iface, This, frame); return E_NOTIMPL; } static const struct IDirect3DRMLightVtbl Direct3DRMLight_Vtbl = { /*** IUnknown methods ***/ IDirect3DRMLightImpl_QueryInterface, IDirect3DRMLightImpl_AddRef, IDirect3DRMLightImpl_Release, /*** IDirect3DRMObject methods ***/ IDirect3DRMLightImpl_Clone, IDirect3DRMLightImpl_AddDestroyCallback, IDirect3DRMLightImpl_DeleteDestroyCallback, IDirect3DRMLightImpl_SetAppData, IDirect3DRMLightImpl_GetAppData, IDirect3DRMLightImpl_SetName, IDirect3DRMLightImpl_GetName, IDirect3DRMLightImpl_GetClassName, /*** IDirect3DRMLight methods ***/ IDirect3DRMLightImpl_SetType, IDirect3DRMLightImpl_SetColor, IDirect3DRMLightImpl_SetColorRGB, IDirect3DRMLightImpl_SetRange, IDirect3DRMLightImpl_SetUmbra, IDirect3DRMLightImpl_SetPenumbra, IDirect3DRMLightImpl_SetConstantAttenuation, IDirect3DRMLightImpl_SetLinearAttenuation, IDirect3DRMLightImpl_SetQuadraticAttenuation, IDirect3DRMLightImpl_GetRange, IDirect3DRMLightImpl_GetUmbra, IDirect3DRMLightImpl_GetPenumbra, IDirect3DRMLightImpl_GetConstantAttenuation, IDirect3DRMLightImpl_GetLinearAttenuation, IDirect3DRMLightImpl_GetQuadraticAttenuation, IDirect3DRMLightImpl_GetColor, IDirect3DRMLightImpl_GetType, IDirect3DRMLightImpl_SetEnableFrame, IDirect3DRMLightImpl_GetEnableFrame }; HRESULT Direct3DRMLight_create(IUnknown** ppObj) { IDirect3DRMLightImpl* object; TRACE("(%p)\n", ppObj); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMLightImpl)); if (!object) { ERR("Out of memory\n"); return E_OUTOFMEMORY; } object->IDirect3DRMLight_iface.lpVtbl = &Direct3DRMLight_Vtbl; object->ref = 1; *ppObj = (IUnknown*)&object->IDirect3DRMLight_iface; return S_OK; }