ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

material.c
Go to the documentation of this file.
00001 /* Direct3D Material
00002  * Copyright (c) 2002 Lionel ULMER
00003  * Copyright (c) 2006 Stefan DÖSINGER
00004  *
00005  * This file contains the implementation of Direct3DMaterial.
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include "config.h"
00023 #include "wine/port.h"
00024 
00025 #include "ddraw_private.h"
00026 
00027 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
00028 
00029 static void dump_material(const D3DMATERIAL *mat)
00030 {
00031     TRACE("  dwSize : %d\n", mat->dwSize);
00032 }
00033 
00034 static inline IDirect3DMaterialImpl *impl_from_IDirect3DMaterial(IDirect3DMaterial *iface)
00035 {
00036     return CONTAINING_RECORD(iface, IDirect3DMaterialImpl, IDirect3DMaterial_iface);
00037 }
00038 
00039 static inline IDirect3DMaterialImpl *impl_from_IDirect3DMaterial2(IDirect3DMaterial2 *iface)
00040 {
00041     return CONTAINING_RECORD(iface, IDirect3DMaterialImpl, IDirect3DMaterial2_iface);
00042 }
00043 
00044 static inline IDirect3DMaterialImpl *impl_from_IDirect3DMaterial3(IDirect3DMaterial3 *iface)
00045 {
00046     return CONTAINING_RECORD(iface, IDirect3DMaterialImpl, IDirect3DMaterial3_iface);
00047 }
00048 
00049 /*****************************************************************************
00050  * IUnknown Methods.
00051  *****************************************************************************/
00052 
00053 /*****************************************************************************
00054  * IDirect3DMaterial3::QueryInterface
00055  *
00056  * QueryInterface for IDirect3DMaterial. Can query all IDirect3DMaterial
00057  * versions.
00058  *
00059  * Params:
00060  *  riid: Interface id queried for
00061  *  obj: Address to pass the interface pointer back
00062  *
00063  * Returns:
00064  *  S_OK on success
00065  *  E_NOINTERFACE if the requested interface wasn't found
00066  *
00067  *****************************************************************************/
00068 static HRESULT WINAPI IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface, REFIID riid,
00069         void **obp)
00070 {
00071     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
00072 
00073     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
00074 
00075     *obp = NULL;
00076 
00077     if ( IsEqualGUID( &IID_IUnknown,  riid ) ) {
00078         IUnknown_AddRef(iface);
00079         *obp = iface;
00080         TRACE("  Creating IUnknown interface at %p.\n", *obp);
00081         return S_OK;
00082     }
00083     if ( IsEqualGUID( &IID_IDirect3DMaterial, riid ) ) {
00084         IDirect3DMaterial_AddRef(&This->IDirect3DMaterial_iface);
00085         *obp = &This->IDirect3DMaterial_iface;
00086         TRACE("  Creating IDirect3DMaterial interface %p\n", *obp);
00087         return S_OK;
00088     }
00089     if ( IsEqualGUID( &IID_IDirect3DMaterial2, riid ) ) {
00090         IDirect3DMaterial_AddRef(&This->IDirect3DMaterial2_iface);
00091         *obp = &This->IDirect3DMaterial2_iface;
00092         TRACE("  Creating IDirect3DMaterial2 interface %p\n", *obp);
00093         return S_OK;
00094     }
00095     if ( IsEqualGUID( &IID_IDirect3DMaterial3, riid ) ) {
00096         IDirect3DMaterial3_AddRef(&This->IDirect3DMaterial3_iface);
00097         *obp = This;
00098         TRACE("  Creating IDirect3DMaterial3 interface %p\n", *obp);
00099         return S_OK;
00100     }
00101     FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid));
00102     return E_NOINTERFACE;
00103 }
00104 
00105 /*****************************************************************************
00106  * IDirect3DMaterial3::AddRef
00107  *
00108  * Increases the refcount.
00109  *
00110  * Returns:
00111  *  The new refcount
00112  *
00113  *****************************************************************************/
00114 static ULONG WINAPI IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface)
00115 {
00116     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
00117     ULONG ref = InterlockedIncrement(&This->ref);
00118 
00119     TRACE("%p increasing refcount to %u.\n", This, ref);
00120 
00121     return ref;
00122 }
00123 
00124 /*****************************************************************************
00125  * IDirect3DMaterial3::Release
00126  *
00127  * Reduces the refcount by one. If the refcount falls to 0, the object
00128  * is destroyed
00129  *
00130  * Returns:
00131  *  The new refcount
00132  *
00133  *****************************************************************************/
00134 static ULONG WINAPI IDirect3DMaterialImpl_Release(IDirect3DMaterial3 *iface)
00135 {
00136     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
00137     ULONG ref = InterlockedDecrement(&This->ref);
00138 
00139     TRACE("%p decreasing refcount to %u.\n", This, ref);
00140 
00141     if (!ref)
00142     {
00143         if(This->Handle)
00144         {
00145             wined3d_mutex_lock();
00146             ddraw_free_handle(&This->ddraw->d3ddevice->handle_table, This->Handle - 1, DDRAW_HANDLE_MATERIAL);
00147             wined3d_mutex_unlock();
00148         }
00149 
00150         HeapFree(GetProcessHeap(), 0, This);
00151         return 0;
00152     }
00153     return ref;
00154 }
00155 
00156 /*****************************************************************************
00157  * IDirect3DMaterial Methods
00158  *****************************************************************************/
00159 
00160 /*****************************************************************************
00161  * IDirect3DMaterial::Initialize
00162  *
00163  * A no-op initialization
00164  *
00165  * Params:
00166  *  Direct3D: Pointer to a Direct3D interface
00167  *
00168  * Returns:
00169  *  D3D_OK
00170  *
00171  *****************************************************************************/
00172 static HRESULT WINAPI
00173 IDirect3DMaterialImpl_Initialize(IDirect3DMaterial *iface,
00174                                   IDirect3D *Direct3D)
00175 {
00176     TRACE("iface %p, d3d %p.\n", iface, Direct3D);
00177 
00178     return D3D_OK;
00179 }
00180 
00181 /*****************************************************************************
00182  * IDirect3DMaterial::Reserve
00183  *
00184  * DirectX 5 sdk: "The IDirect3DMaterial2::Reserve method is not implemented"
00185  * Odd. They seem to have mixed their interfaces.
00186  *
00187  * Returns:
00188  *  DDERR_UNSUPPORTED
00189  *
00190  *****************************************************************************/
00191 static HRESULT WINAPI
00192 IDirect3DMaterialImpl_Reserve(IDirect3DMaterial *iface)
00193 {
00194     TRACE("iface %p.\n", iface);
00195 
00196     return DDERR_UNSUPPORTED;
00197 }
00198 
00199 /*****************************************************************************
00200  * IDirect3DMaterial::Unreserve
00201  *
00202  * Not supported too
00203  *
00204  * Returns:
00205  *  DDERR_UNSUPPORTED
00206  *
00207  *****************************************************************************/
00208 static HRESULT WINAPI
00209 IDirect3DMaterialImpl_Unreserve(IDirect3DMaterial *iface)
00210 {
00211     TRACE("iface %p.\n", iface);
00212 
00213     return DDERR_UNSUPPORTED;
00214 }
00215 
00216 /*****************************************************************************
00217  * IDirect3DMaterial3::SetMaterial
00218  *
00219  * Sets the material description
00220  *
00221  * Params:
00222  *  Mat: Material to set
00223  *
00224  * Returns:
00225  *  D3D_OK on success
00226  *  DDERR_INVALIDPARAMS if Mat is NULL
00227  *
00228  *****************************************************************************/
00229 static HRESULT WINAPI IDirect3DMaterialImpl_SetMaterial(IDirect3DMaterial3 *iface,
00230         D3DMATERIAL *lpMat)
00231 {
00232     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
00233 
00234     TRACE("iface %p, material %p.\n", iface, lpMat);
00235     if (TRACE_ON(ddraw))
00236         dump_material(lpMat);
00237 
00238     /* Stores the material */
00239     wined3d_mutex_lock();
00240     memset(&This->mat, 0, sizeof(This->mat));
00241     memcpy(&This->mat, lpMat, lpMat->dwSize);
00242     wined3d_mutex_unlock();
00243 
00244     return DD_OK;
00245 }
00246 
00247 /*****************************************************************************
00248  * IDirect3DMaterial3::GetMaterial
00249  *
00250  * Returns the material assigned to this interface
00251  *
00252  * Params:
00253  *  Mat: Pointer to a D3DMATERIAL structure to store the material description
00254  *
00255  * Returns:
00256  *  D3D_OK on success
00257  *  DDERR_INVALIDPARAMS if Mat is NULL
00258  *
00259  *****************************************************************************/
00260 static HRESULT WINAPI IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
00261         D3DMATERIAL *lpMat)
00262 {
00263     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
00264     DWORD dwSize;
00265 
00266     TRACE("iface %p, material %p.\n", iface, lpMat);
00267     if (TRACE_ON(ddraw))
00268     {
00269         TRACE("  Returning material : ");
00270         dump_material(&This->mat);
00271     }
00272 
00273     /* Copies the material structure */
00274     wined3d_mutex_lock();
00275     dwSize = lpMat->dwSize;
00276     memcpy(lpMat, &This->mat, dwSize);
00277     wined3d_mutex_unlock();
00278 
00279     return DD_OK;
00280 }
00281 
00282 /*****************************************************************************
00283  * IDirect3DMaterial3::GetHandle
00284  *
00285  * Returns a handle for the material interface. The handle is simply a
00286  * pointer to the material implementation
00287  *
00288  * Params:
00289  *  Direct3DDevice3: The device this handle is assigned to
00290  *  Handle: Address to write the handle to
00291  *
00292  * Returns:
00293  *  D3D_OK on success
00294  *  DDERR_INVALIDPARAMS if Handle is NULL
00295  *
00296  *****************************************************************************/
00297 static HRESULT WINAPI IDirect3DMaterialImpl_GetHandle(IDirect3DMaterial3 *iface,
00298         IDirect3DDevice3 *device, D3DMATERIALHANDLE *handle)
00299 {
00300     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial3(iface);
00301     IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice3(device);
00302 
00303     TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
00304 
00305     wined3d_mutex_lock();
00306     This->active_device = device_impl;
00307     if(!This->Handle)
00308     {
00309         DWORD h = ddraw_allocate_handle(&device_impl->handle_table, This, DDRAW_HANDLE_MATERIAL);
00310         if (h == DDRAW_INVALID_HANDLE)
00311         {
00312             ERR("Failed to allocate a material handle.\n");
00313             wined3d_mutex_unlock();
00314             return DDERR_INVALIDPARAMS;   /* Unchecked */
00315         }
00316 
00317         This->Handle = h + 1;
00318     }
00319     *handle = This->Handle;
00320     TRACE(" returning handle %08x.\n", *handle);
00321     wined3d_mutex_unlock();
00322 
00323     return D3D_OK;
00324 }
00325 
00326 static HRESULT WINAPI IDirect3DMaterialImpl_2_GetHandle(IDirect3DMaterial2 *iface,
00327         IDirect3DDevice2 *device, D3DMATERIALHANDLE *handle)
00328 {
00329     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
00330     IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice2(device);
00331 
00332     TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
00333 
00334     return IDirect3DMaterial3_GetHandle(&This->IDirect3DMaterial3_iface, device_impl ?
00335             &device_impl->IDirect3DDevice3_iface : NULL, handle);
00336 }
00337 
00338 static HRESULT WINAPI IDirect3DMaterialImpl_1_GetHandle(IDirect3DMaterial *iface,
00339         IDirect3DDevice *device, D3DMATERIALHANDLE *handle)
00340 {
00341     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
00342     IDirect3DDeviceImpl *device_impl = unsafe_impl_from_IDirect3DDevice(device);
00343 
00344     TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
00345 
00346     return IDirect3DMaterial3_GetHandle(&This->IDirect3DMaterial3_iface, device_impl ?
00347             &device_impl->IDirect3DDevice3_iface : NULL, handle);
00348 }
00349 
00350 static HRESULT WINAPI IDirect3DMaterialImpl_2_QueryInterface(IDirect3DMaterial2 *iface, REFIID riid,
00351         void **obp)
00352 {
00353     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
00354 
00355     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
00356 
00357     return IDirect3DMaterial3_QueryInterface(&This->IDirect3DMaterial3_iface, riid, obp);
00358 }
00359 
00360 static HRESULT WINAPI IDirect3DMaterialImpl_1_QueryInterface(IDirect3DMaterial *iface, REFIID riid,
00361         void **obp)
00362 {
00363     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
00364 
00365     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
00366 
00367     return IDirect3DMaterial3_QueryInterface(&This->IDirect3DMaterial3_iface, riid, obp);
00368 }
00369 
00370 static ULONG WINAPI IDirect3DMaterialImpl_2_AddRef(IDirect3DMaterial2 *iface)
00371 {
00372     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
00373 
00374     TRACE("iface %p.\n", iface);
00375 
00376     return IDirect3DMaterial3_AddRef(&This->IDirect3DMaterial3_iface);
00377 }
00378 
00379 static ULONG WINAPI IDirect3DMaterialImpl_1_AddRef(IDirect3DMaterial *iface)
00380 {
00381     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
00382 
00383     TRACE("iface %p.\n", iface);
00384 
00385     return IDirect3DMaterial3_AddRef(&This->IDirect3DMaterial3_iface);
00386 }
00387 
00388 static ULONG WINAPI IDirect3DMaterialImpl_2_Release(IDirect3DMaterial2 *iface)
00389 {
00390     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
00391 
00392     TRACE("iface %p.\n", iface);
00393 
00394     return IDirect3DMaterial3_Release(&This->IDirect3DMaterial3_iface);
00395 }
00396 
00397 static ULONG WINAPI IDirect3DMaterialImpl_1_Release(IDirect3DMaterial *iface)
00398 {
00399     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
00400 
00401     TRACE("iface %p.\n", iface);
00402 
00403     return IDirect3DMaterial3_Release(&This->IDirect3DMaterial3_iface);
00404 }
00405 
00406 static HRESULT WINAPI IDirect3DMaterialImpl_2_SetMaterial(IDirect3DMaterial2 *iface,
00407         LPD3DMATERIAL lpMat)
00408 {
00409     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
00410 
00411     TRACE("iface %p, material %p.\n", iface, lpMat);
00412 
00413     return IDirect3DMaterial3_SetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
00414 }
00415 
00416 static HRESULT WINAPI IDirect3DMaterialImpl_1_SetMaterial(IDirect3DMaterial *iface,
00417         LPD3DMATERIAL lpMat)
00418 {
00419     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
00420 
00421     TRACE("iface %p, material %p.\n", iface, lpMat);
00422 
00423     return IDirect3DMaterial3_SetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
00424 }
00425 
00426 static HRESULT WINAPI IDirect3DMaterialImpl_2_GetMaterial(IDirect3DMaterial2 *iface,
00427         LPD3DMATERIAL lpMat)
00428 {
00429     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial2(iface);
00430 
00431     TRACE("iface %p, material %p.\n", iface, lpMat);
00432 
00433     return IDirect3DMaterial3_GetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
00434 }
00435 
00436 static HRESULT WINAPI IDirect3DMaterialImpl_1_GetMaterial(IDirect3DMaterial *iface,
00437         LPD3DMATERIAL lpMat)
00438 {
00439     IDirect3DMaterialImpl *This = impl_from_IDirect3DMaterial(iface);
00440 
00441     TRACE("iface %p, material %p.\n", iface, lpMat);
00442 
00443     return IDirect3DMaterial3_GetMaterial(&This->IDirect3DMaterial3_iface, lpMat);
00444 }
00445 
00446 
00447 /*****************************************************************************
00448  * material_activate
00449  *
00450  * Uses IDirect3DDevice7::SetMaterial to activate the material
00451  *
00452  * Params:
00453  *  This: Pointer to the material implementation to activate
00454  *
00455  *****************************************************************************/
00456 void material_activate(IDirect3DMaterialImpl* This)
00457 {
00458     D3DMATERIAL7 d3d7mat;
00459 
00460     TRACE("Activating material %p\n", This);
00461     d3d7mat.u.diffuse = This->mat.u.diffuse;
00462     d3d7mat.u1.ambient = This->mat.u1.ambient;
00463     d3d7mat.u2.specular = This->mat.u2.specular;
00464     d3d7mat.u3.emissive = This->mat.u3.emissive;
00465     d3d7mat.u4.power = This->mat.u4.power;
00466 
00467     IDirect3DDevice7_SetMaterial(&This->active_device->IDirect3DDevice7_iface, &d3d7mat);
00468 }
00469 
00470 static const struct IDirect3DMaterial3Vtbl d3d_material3_vtbl =
00471 {
00472     /*** IUnknown Methods ***/
00473     IDirect3DMaterialImpl_QueryInterface,
00474     IDirect3DMaterialImpl_AddRef,
00475     IDirect3DMaterialImpl_Release,
00476     /*** IDirect3DMaterial3 Methods ***/
00477     IDirect3DMaterialImpl_SetMaterial,
00478     IDirect3DMaterialImpl_GetMaterial,
00479     IDirect3DMaterialImpl_GetHandle,
00480 };
00481 
00482 static const struct IDirect3DMaterial2Vtbl d3d_material2_vtbl =
00483 {
00484     /*** IUnknown Methods ***/
00485     IDirect3DMaterialImpl_2_QueryInterface,
00486     IDirect3DMaterialImpl_2_AddRef,
00487     IDirect3DMaterialImpl_2_Release,
00488     /*** IDirect3DMaterial2 Methods ***/
00489     IDirect3DMaterialImpl_2_SetMaterial,
00490     IDirect3DMaterialImpl_2_GetMaterial,
00491     IDirect3DMaterialImpl_2_GetHandle,
00492 };
00493 
00494 static const struct IDirect3DMaterialVtbl d3d_material1_vtbl =
00495 {
00496     /*** IUnknown Methods ***/
00497     IDirect3DMaterialImpl_1_QueryInterface,
00498     IDirect3DMaterialImpl_1_AddRef,
00499     IDirect3DMaterialImpl_1_Release,
00500     /*** IDirect3DMaterial1 Methods ***/
00501     IDirect3DMaterialImpl_Initialize,
00502     IDirect3DMaterialImpl_1_SetMaterial,
00503     IDirect3DMaterialImpl_1_GetMaterial,
00504     IDirect3DMaterialImpl_1_GetHandle,
00505     IDirect3DMaterialImpl_Reserve,
00506     IDirect3DMaterialImpl_Unreserve
00507 };
00508 
00509 IDirect3DMaterialImpl *d3d_material_create(IDirectDrawImpl *ddraw)
00510 {
00511     IDirect3DMaterialImpl *material;
00512 
00513     material = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*material));
00514     if (!material)
00515         return NULL;
00516 
00517     material->IDirect3DMaterial3_iface.lpVtbl = &d3d_material3_vtbl;
00518     material->IDirect3DMaterial2_iface.lpVtbl = &d3d_material2_vtbl;
00519     material->IDirect3DMaterial_iface.lpVtbl = &d3d_material1_vtbl;
00520     material->ref = 1;
00521     material->ddraw = ddraw;
00522 
00523     return material;
00524 }

Generated on Sun May 27 2012 04:22:15 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.