Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmaterial.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
1.7.6.1
|