/* Direct3D Material * Copyright (c) 1998 Lionel ULMER * * This file contains the implementation of Direct3DMaterial2. * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "windef.h" #include "winerror.h" #include "wine/obj_base.h" #include "ddraw.h" #include "d3d.h" #include "wine/debug.h" #include "mesa_private.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable; static ICOM_VTABLE(IDirect3DMaterial) material_vtable; /******************************************************************************* * Matrial2 static functions */ static void activate(IDirect3DMaterial2Impl* This) { TRACE("Activating material %p\n", This); ENTER_GL(); /* First, set the rendering context */ if (This->use_d3d2) This->device.active_device2->set_context(This->device.active_device2); else This->device.active_device1->set_context(This->device.active_device1); /* Set the current Material */ _dump_colorvalue("Diffuse", This->mat.u.diffuse); glMaterialfv(GL_FRONT, GL_DIFFUSE, (float *) &(This->mat.u.diffuse)); _dump_colorvalue("Ambient", This->mat.u1.ambient); glMaterialfv(GL_FRONT, GL_AMBIENT, (float *) &(This->mat.u1.ambient)); _dump_colorvalue("Specular", This->mat.u2.specular); glMaterialfv(GL_FRONT, GL_SPECULAR, (float *) &(This->mat.u2.specular)); _dump_colorvalue("Emissive", This->mat.u3.emissive); glMaterialfv(GL_FRONT, GL_EMISSION, (float *) &(This->mat.u3.emissive)); TRACE("Size : %ld\n", This->mat.dwSize); TRACE("Power : %f\n", This->mat.u4.power); TRACE("Texture handle : %08lx\n", (DWORD)This->mat.hTexture); LEAVE_GL(); return ; } /******************************************************************************* * Matrial2 Creation functions */ LPDIRECT3DMATERIAL2 d3dmaterial2_create(IDirect3D2Impl* d3d2) { IDirect3DMaterial2Impl* mat; mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl)); mat->ref = 1; ICOM_VTBL(mat) = &material2_vtable; mat->use_d3d2 = 1; mat->d3d.d3d2 = d3d2; mat->activate = activate; return (LPDIRECT3DMATERIAL2)mat; } LPDIRECT3DMATERIAL d3dmaterial_create(IDirect3DImpl* d3d1) { IDirect3DMaterial2Impl* mat; mat = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DMaterial2Impl)); mat->ref = 1; ICOM_VTBL(mat) = (ICOM_VTABLE(IDirect3DMaterial2)*)&material_vtable; mat->use_d3d2 = 0; mat->d3d.d3d1 = d3d1; mat->activate = activate; return (LPDIRECT3DMATERIAL) mat; } /******************************************************************************* * IDirect3DMaterial2 methods */ static HRESULT WINAPI IDirect3DMaterial2Impl_QueryInterface(LPDIRECT3DMATERIAL2 iface, REFIID riid, LPVOID* ppvObj) { ICOM_THIS(IDirect3DMaterial2Impl,iface); FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj); return S_OK; } static ULONG WINAPI IDirect3DMaterial2Impl_AddRef(LPDIRECT3DMATERIAL2 iface) { ICOM_THIS(IDirect3DMaterial2Impl,iface); TRACE("(%p)->()incrementing from %lu.\n", This, This->ref ); return ++(This->ref); } static ULONG WINAPI IDirect3DMaterial2Impl_Release(LPDIRECT3DMATERIAL2 iface) { ICOM_THIS(IDirect3DMaterial2Impl,iface); FIXME("(%p)->() decrementing from %lu.\n", This, This->ref ); if (!--(This->ref)) { HeapFree(GetProcessHeap(),0,This); return 0; } return This->ref; } /*** IDirect3DMaterial2 methods ***/ static void dump_material(LPD3DMATERIAL mat) { DPRINTF(" dwSize : %ld\n", mat->dwSize); } static HRESULT WINAPI IDirect3DMaterial2Impl_GetMaterial(LPDIRECT3DMATERIAL2 iface, LPD3DMATERIAL lpMat) { ICOM_THIS(IDirect3DMaterial2Impl,iface); TRACE("(%p)->(%p)\n", This, lpMat); if (TRACE_ON(ddraw)) dump_material(lpMat); /* Copies the material structure */ *lpMat = This->mat; return DD_OK; } static HRESULT WINAPI IDirect3DMaterial2Impl_SetMaterial(LPDIRECT3DMATERIAL2 iface, LPD3DMATERIAL lpMat) { ICOM_THIS(IDirect3DMaterial2Impl,iface); TRACE("(%p)->(%p)\n", This, lpMat); if (TRACE_ON(ddraw)) dump_material(lpMat); /* Stores the material */ This->mat = *lpMat; return DD_OK; } static HRESULT WINAPI IDirect3DMaterial2Impl_GetHandle(LPDIRECT3DMATERIAL2 iface, LPDIRECT3DDEVICE2 lpD3DDevice2, LPD3DMATERIALHANDLE lpMatHandle) { ICOM_THIS(IDirect3DMaterial2Impl,iface); FIXME("(%p)->(%p,%p): stub\n", This, lpD3DDevice2, lpMatHandle); if (This->use_d3d2) This->device.active_device2 = (IDirect3DDevice2Impl*)lpD3DDevice2; else This->device.active_device1 = (IDirect3DDeviceImpl*)lpD3DDevice2; *lpMatHandle = (DWORD) This; /* lpD3DDevice2->store_material(This); */ return DD_OK; } static HRESULT WINAPI IDirect3DMaterialImpl_Reserve(LPDIRECT3DMATERIAL iface) { ICOM_THIS(IDirect3DMaterial2Impl,iface); FIXME("(%p)->(): stub\n", This); return DDERR_INVALIDPARAMS; } static HRESULT WINAPI IDirect3DMaterialImpl_Unreserve(LPDIRECT3DMATERIAL iface) { ICOM_THIS(IDirect3DMaterial2Impl,iface); FIXME("(%p)->(): stub\n", This); return DDERR_INVALIDPARAMS; } static HRESULT WINAPI IDirect3DMaterialImpl_Initialize(LPDIRECT3DMATERIAL iface, LPDIRECT3D lpDirect3D) { ICOM_THIS(IDirect3DMaterial2Impl,iface); TRACE("(%p)->(%p)\n", This, lpDirect3D); return DDERR_ALREADYINITIALIZED; } /******************************************************************************* * IDirect3DMaterial VTable */ #if !defined(__STRICT_ANSI__) && defined(__GNUC__) # define XCAST(fun) (typeof(material_vtable.fun)) #else # define XCAST(fun) (void*) #endif static ICOM_VTABLE(IDirect3DMaterial) material_vtable = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE /*** IUnknown methods ***/ XCAST(QueryInterface)IDirect3DMaterial2Impl_QueryInterface, XCAST(AddRef)IDirect3DMaterial2Impl_AddRef, XCAST(Release)IDirect3DMaterial2Impl_Release, /*** IDirect3DMaterial methods ***/ IDirect3DMaterialImpl_Initialize, XCAST(SetMaterial)IDirect3DMaterial2Impl_SetMaterial, XCAST(GetMaterial)IDirect3DMaterial2Impl_GetMaterial, XCAST(GetHandle)IDirect3DMaterial2Impl_GetHandle, IDirect3DMaterialImpl_Reserve, IDirect3DMaterialImpl_Unreserve }; #if !defined(__STRICT_ANSI__) && defined(__GNUC__) #undef XCAST #endif /******************************************************************************* * IDirect3DMaterial2 VTable */ static ICOM_VTABLE(IDirect3DMaterial2) material2_vtable = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE /*** IUnknown methods ***/ IDirect3DMaterial2Impl_QueryInterface, IDirect3DMaterial2Impl_AddRef, IDirect3DMaterial2Impl_Release, /*** IDirect3DMaterial methods ***/ IDirect3DMaterial2Impl_SetMaterial, IDirect3DMaterial2Impl_GetMaterial, IDirect3DMaterial2Impl_GetHandle };