ReactOS 0.4.17-dev-966-gf06eace
material.c
Go to the documentation of this file.
1/* Direct3D Material
2 * Copyright (c) 2002 Lionel ULMER
3 * Copyright (c) 2006 Stefan DÖSINGER
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20#include "ddraw_private.h"
21
23
24static void dump_material(const D3DMATERIAL *mat)
25{
26 TRACE(" dwSize : %lu\n", mat->dwSize);
27}
28
29static inline struct d3d_material *impl_from_IDirect3DMaterial(IDirect3DMaterial *iface)
30{
32}
33
34static inline struct d3d_material *impl_from_IDirect3DMaterial2(IDirect3DMaterial2 *iface)
35{
37}
38
39static inline struct d3d_material *impl_from_IDirect3DMaterial3(IDirect3DMaterial3 *iface)
40{
42}
43
44/*****************************************************************************
45 * IUnknown Methods.
46 *****************************************************************************/
47
48/*****************************************************************************
49 * IDirect3DMaterial3::QueryInterface
50 *
51 * QueryInterface for IDirect3DMaterial. Can query all IDirect3DMaterial
52 * versions.
53 *
54 * Params:
55 * riid: Interface id queried for
56 * obj: Address to pass the interface pointer back
57 *
58 * Returns:
59 * S_OK on success
60 * E_NOINTERFACE if the requested interface wasn't found
61 *
62 *****************************************************************************/
63static HRESULT WINAPI d3d_material3_QueryInterface(IDirect3DMaterial3 *iface, REFIID riid, void **obp)
64{
65 struct d3d_material *material = impl_from_IDirect3DMaterial3(iface);
66
67 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp);
68
69 *obp = NULL;
70
72 {
74 *obp = iface;
75 TRACE(" Creating IUnknown interface at %p.\n", *obp);
76 return S_OK;
77 }
78 if (IsEqualGUID(&IID_IDirect3DMaterial, riid))
79 {
81 *obp = &material->IDirect3DMaterial_iface;
82 TRACE(" Creating IDirect3DMaterial interface %p\n", *obp);
83 return S_OK;
84 }
85 if (IsEqualGUID(&IID_IDirect3DMaterial2, riid))
86 {
88 *obp = &material->IDirect3DMaterial2_iface;
89 TRACE(" Creating IDirect3DMaterial2 interface %p\n", *obp);
90 return S_OK;
91 }
92 if (IsEqualGUID(&IID_IDirect3DMaterial3, riid))
93 {
95 *obp = &material->IDirect3DMaterial3_iface;
96 TRACE(" Creating IDirect3DMaterial3 interface %p\n", *obp);
97 return S_OK;
98 }
99
100 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
101
102 return E_NOINTERFACE;
103}
104
105/*****************************************************************************
106 * IDirect3DMaterial3::AddRef
107 *
108 * Increases the refcount.
109 *
110 * Returns:
111 * The new refcount
112 *
113 *****************************************************************************/
114static ULONG WINAPI d3d_material3_AddRef(IDirect3DMaterial3 *iface)
115{
116 struct d3d_material *material = impl_from_IDirect3DMaterial3(iface);
117 ULONG ref = InterlockedIncrement(&material->ref);
118
119 TRACE("%p increasing refcount to %lu.\n", material, ref);
120
121 return ref;
122}
123
124/*****************************************************************************
125 * IDirect3DMaterial3::Release
126 *
127 * Reduces the refcount by one. If the refcount falls to 0, the object
128 * is destroyed
129 *
130 * Returns:
131 * The new refcount
132 *
133 *****************************************************************************/
134static ULONG WINAPI d3d_material3_Release(IDirect3DMaterial3 *iface)
135{
136 struct d3d_material *material = impl_from_IDirect3DMaterial3(iface);
137 ULONG ref = InterlockedDecrement(&material->ref);
138
139 TRACE("%p decreasing refcount to %lu.\n", material, ref);
140
141 if (!ref)
142 {
143 if (material->Handle)
144 {
148 }
149
150 free(material);
151 }
152
153 return ref;
154}
155
156/*****************************************************************************
157 * IDirect3DMaterial Methods
158 *****************************************************************************/
159
160/*****************************************************************************
161 * IDirect3DMaterial::Initialize
162 *
163 * A no-op initialization
164 *
165 * Params:
166 * Direct3D: Pointer to a Direct3D interface
167 *
168 * Returns:
169 * D3D_OK
170 *
171 *****************************************************************************/
172static HRESULT WINAPI d3d_material1_Initialize(IDirect3DMaterial *iface, IDirect3D *d3d)
173{
174 TRACE("iface %p, d3d %p.\n", iface, d3d);
175
176 return D3D_OK;
177}
178
179/*****************************************************************************
180 * IDirect3DMaterial::Reserve
181 *
182 * DirectX 5 sdk: "The IDirect3DMaterial2::Reserve method is not implemented"
183 * Odd. They seem to have mixed their interfaces.
184 *
185 * Returns:
186 * DDERR_UNSUPPORTED
187 *
188 *****************************************************************************/
189static HRESULT WINAPI d3d_material1_Reserve(IDirect3DMaterial *iface)
190{
191 TRACE("iface %p.\n", iface);
192
193 return DDERR_UNSUPPORTED;
194}
195
196/*****************************************************************************
197 * IDirect3DMaterial::Unreserve
198 *
199 * Not supported too
200 *
201 * Returns:
202 * DDERR_UNSUPPORTED
203 *
204 *****************************************************************************/
205static HRESULT WINAPI d3d_material1_Unreserve(IDirect3DMaterial *iface)
206{
207 TRACE("iface %p.\n", iface);
208
209 return DDERR_UNSUPPORTED;
210}
211
212/*****************************************************************************
213 * IDirect3DMaterial3::SetMaterial
214 *
215 * Sets the material description
216 *
217 * Params:
218 * Mat: Material to set
219 *
220 * Returns:
221 * D3D_OK on success
222 * DDERR_INVALIDPARAMS if Mat is NULL
223 *
224 *****************************************************************************/
225static HRESULT WINAPI d3d_material3_SetMaterial(IDirect3DMaterial3 *iface, D3DMATERIAL *mat)
226{
227 struct d3d_material *material = impl_from_IDirect3DMaterial3(iface);
228
229 TRACE("iface %p, mat %p.\n", iface, mat);
230 if (TRACE_ON(ddraw))
232
233 /* Stores the material */
235 memset(&material->mat, 0, sizeof(material->mat));
236 memcpy(&material->mat, mat, mat->dwSize);
238
239 return DD_OK;
240}
241
242/*****************************************************************************
243 * IDirect3DMaterial3::GetMaterial
244 *
245 * Returns the material assigned to this interface
246 *
247 * Params:
248 * Mat: Pointer to a D3DMATERIAL structure to store the material description
249 *
250 * Returns:
251 * D3D_OK on success
252 * DDERR_INVALIDPARAMS if Mat is NULL
253 *
254 *****************************************************************************/
255static HRESULT WINAPI d3d_material3_GetMaterial(IDirect3DMaterial3 *iface, D3DMATERIAL *mat)
256{
257 struct d3d_material *material = impl_from_IDirect3DMaterial3(iface);
259
260 TRACE("iface %p, mat %p.\n", iface, mat);
261 if (TRACE_ON(ddraw))
262 {
263 TRACE(" Returning material : ");
264 dump_material(&material->mat);
265 }
266
267 /* Copies the material structure */
269 dwSize = mat->dwSize;
270 memcpy(mat, &material->mat, dwSize);
272
273 return DD_OK;
274}
275
276/*****************************************************************************
277 * IDirect3DMaterial3::GetHandle
278 *
279 * Returns a handle for the material interface. The handle is simply a
280 * pointer to the material implementation
281 *
282 * Params:
283 * Direct3DDevice3: The device this handle is assigned to
284 * Handle: Address to write the handle to
285 *
286 * Returns:
287 * D3D_OK on success
288 * DDERR_INVALIDPARAMS if Handle is NULL
289 *
290 *****************************************************************************/
291static HRESULT WINAPI d3d_material3_GetHandle(IDirect3DMaterial3 *iface,
292 IDirect3DDevice3 *device, D3DMATERIALHANDLE *handle)
293{
294 struct d3d_material *material = impl_from_IDirect3DMaterial3(iface);
296
297 TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
298
300 material->active_device = device_impl;
301 if (!material->Handle)
302 {
304 if (h == DDRAW_INVALID_HANDLE)
305 {
306 ERR("Failed to allocate a material handle.\n");
308 return DDERR_INVALIDPARAMS; /* Unchecked */
309 }
310
311 material->Handle = h + 1;
312 }
313 *handle = material->Handle;
314 TRACE(" returning handle %#lx.\n", *handle);
316
317 return D3D_OK;
318}
319
320static HRESULT WINAPI d3d_material2_GetHandle(IDirect3DMaterial2 *iface,
321 IDirect3DDevice2 *device, D3DMATERIALHANDLE *handle)
322{
323 struct d3d_material *material = impl_from_IDirect3DMaterial2(iface);
325
326 TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
327
328 return d3d_material3_GetHandle(&material->IDirect3DMaterial3_iface,
329 device_impl ? &device_impl->IDirect3DDevice3_iface : NULL, handle);
330}
331
332static HRESULT WINAPI d3d_material1_GetHandle(IDirect3DMaterial *iface,
333 IDirect3DDevice *device, D3DMATERIALHANDLE *handle)
334{
335 struct d3d_material *material = impl_from_IDirect3DMaterial(iface);
337
338 TRACE("iface %p, device %p, handle %p.\n", iface, device, handle);
339
340 return d3d_material3_GetHandle(&material->IDirect3DMaterial3_iface,
341 device_impl ? &device_impl->IDirect3DDevice3_iface : NULL, handle);
342}
343
344static HRESULT WINAPI d3d_material2_QueryInterface(IDirect3DMaterial2 *iface, REFIID riid, void **object)
345{
346 struct d3d_material *material = impl_from_IDirect3DMaterial2(iface);
347
348 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
349
351}
352
353static HRESULT WINAPI d3d_material1_QueryInterface(IDirect3DMaterial *iface, REFIID riid, void **object)
354{
355 struct d3d_material *material = impl_from_IDirect3DMaterial(iface);
356
357 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
358
360}
361
362static ULONG WINAPI d3d_material2_AddRef(IDirect3DMaterial2 *iface)
363{
364 struct d3d_material *material = impl_from_IDirect3DMaterial2(iface);
365
366 TRACE("iface %p.\n", iface);
367
369}
370
371static ULONG WINAPI d3d_material1_AddRef(IDirect3DMaterial *iface)
372{
373 struct d3d_material *material = impl_from_IDirect3DMaterial(iface);
374
375 TRACE("iface %p.\n", iface);
376
378}
379
380static ULONG WINAPI d3d_material2_Release(IDirect3DMaterial2 *iface)
381{
382 struct d3d_material *material = impl_from_IDirect3DMaterial2(iface);
383
384 TRACE("iface %p.\n", iface);
385
387}
388
389static ULONG WINAPI d3d_material1_Release(IDirect3DMaterial *iface)
390{
391 struct d3d_material *material = impl_from_IDirect3DMaterial(iface);
392
393 TRACE("iface %p.\n", iface);
394
396}
397
398static HRESULT WINAPI d3d_material2_SetMaterial(IDirect3DMaterial2 *iface, D3DMATERIAL *mat)
399{
400 struct d3d_material *material = impl_from_IDirect3DMaterial2(iface);
401
402 TRACE("iface %p, material %p.\n", iface, mat);
403
405}
406
407static HRESULT WINAPI d3d_material1_SetMaterial(IDirect3DMaterial *iface, D3DMATERIAL *mat)
408{
409 struct d3d_material *material = impl_from_IDirect3DMaterial(iface);
410
411 TRACE("iface %p, material %p.\n", iface, mat);
412
414}
415
416static HRESULT WINAPI d3d_material2_GetMaterial(IDirect3DMaterial2 *iface, D3DMATERIAL *mat)
417{
418 struct d3d_material *material = impl_from_IDirect3DMaterial2(iface);
419
420 TRACE("iface %p, material %p.\n", iface, mat);
421
423}
424
425static HRESULT WINAPI d3d_material1_GetMaterial(IDirect3DMaterial *iface, D3DMATERIAL *mat)
426{
427 struct d3d_material *material = impl_from_IDirect3DMaterial(iface);
428
429 TRACE("iface %p, material %p.\n", iface, mat);
430
432}
433
434
435/*****************************************************************************
436 * material_activate
437 *
438 * Uses IDirect3DDevice7::SetMaterial to activate the material
439 *
440 * Params:
441 * This: Pointer to the material implementation to activate
442 *
443 *****************************************************************************/
444void material_activate(struct d3d_material *material)
445{
446 D3DMATERIAL7 d3d7mat;
447
448 TRACE("Activating material %p.\n", material);
449
450 d3d7mat.diffuse = material->mat.diffuse;
451 d3d7mat.ambient = material->mat.ambient;
452 d3d7mat.specular = material->mat.specular;
453 d3d7mat.emissive = material->mat.emissive;
454 d3d7mat.power = material->mat.power;
455
456 IDirect3DDevice7_SetMaterial(&material->active_device->IDirect3DDevice7_iface, &d3d7mat);
457}
458
459static const struct IDirect3DMaterial3Vtbl d3d_material3_vtbl =
460{
461 /*** IUnknown Methods ***/
465 /*** IDirect3DMaterial3 Methods ***/
469};
470
471static const struct IDirect3DMaterial2Vtbl d3d_material2_vtbl =
472{
473 /*** IUnknown Methods ***/
477 /*** IDirect3DMaterial2 Methods ***/
481};
482
483static const struct IDirect3DMaterialVtbl d3d_material1_vtbl =
484{
485 /*** IUnknown Methods ***/
489 /*** IDirect3DMaterial1 Methods ***/
496};
497
499{
500 struct d3d_material *material;
501
502 if (!(material = calloc(1, sizeof(*material))))
503 return NULL;
504
508 material->ref = 1;
509 material->ddraw = ddraw;
510
511 return material;
512}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
#define IDirect3DMaterial2_AddRef(p)
Definition: d3d.h:507
#define IDirect3DDevice7_SetMaterial(p, a)
Definition: d3d.h:1359
#define D3D_OK
Definition: d3d.h:106
#define IDirect3DMaterial_AddRef(p)
Definition: d3d.h:463
#define IDirect3DMaterial3_AddRef(p)
Definition: d3d.h:545
DWORD D3DMATERIALHANDLE
Definition: d3dtypes.h:154
static HRESULT WINAPI d3d_material3_GetMaterial(IDirect3DMaterial3 *iface, D3DMATERIAL *mat)
Definition: material.c:255
static ULONG WINAPI d3d_material2_AddRef(IDirect3DMaterial2 *iface)
Definition: material.c:362
static struct d3d_material * impl_from_IDirect3DMaterial(IDirect3DMaterial *iface)
Definition: material.c:29
static const struct IDirect3DMaterial3Vtbl d3d_material3_vtbl
Definition: material.c:459
void material_activate(struct d3d_material *material)
Definition: material.c:444
static struct d3d_material * impl_from_IDirect3DMaterial2(IDirect3DMaterial2 *iface)
Definition: material.c:34
static HRESULT WINAPI d3d_material2_QueryInterface(IDirect3DMaterial2 *iface, REFIID riid, void **object)
Definition: material.c:344
static HRESULT WINAPI d3d_material1_QueryInterface(IDirect3DMaterial *iface, REFIID riid, void **object)
Definition: material.c:353
static const struct IDirect3DMaterialVtbl d3d_material1_vtbl
Definition: material.c:483
static ULONG WINAPI d3d_material3_AddRef(IDirect3DMaterial3 *iface)
Definition: material.c:114
static HRESULT WINAPI d3d_material1_SetMaterial(IDirect3DMaterial *iface, D3DMATERIAL *mat)
Definition: material.c:407
static void dump_material(const D3DMATERIAL *mat)
Definition: material.c:24
static HRESULT WINAPI d3d_material1_GetMaterial(IDirect3DMaterial *iface, D3DMATERIAL *mat)
Definition: material.c:425
static HRESULT WINAPI d3d_material1_GetHandle(IDirect3DMaterial *iface, IDirect3DDevice *device, D3DMATERIALHANDLE *handle)
Definition: material.c:332
static HRESULT WINAPI d3d_material3_SetMaterial(IDirect3DMaterial3 *iface, D3DMATERIAL *mat)
Definition: material.c:225
static ULONG WINAPI d3d_material3_Release(IDirect3DMaterial3 *iface)
Definition: material.c:134
static HRESULT WINAPI d3d_material3_GetHandle(IDirect3DMaterial3 *iface, IDirect3DDevice3 *device, D3DMATERIALHANDLE *handle)
Definition: material.c:291
static HRESULT WINAPI d3d_material1_Reserve(IDirect3DMaterial *iface)
Definition: material.c:189
static HRESULT WINAPI d3d_material2_SetMaterial(IDirect3DMaterial2 *iface, D3DMATERIAL *mat)
Definition: material.c:398
static HRESULT WINAPI d3d_material2_GetMaterial(IDirect3DMaterial2 *iface, D3DMATERIAL *mat)
Definition: material.c:416
static HRESULT WINAPI d3d_material1_Initialize(IDirect3DMaterial *iface, IDirect3D *d3d)
Definition: material.c:172
static HRESULT WINAPI d3d_material1_Unreserve(IDirect3DMaterial *iface)
Definition: material.c:205
struct d3d_material * d3d_material_create(struct ddraw *ddraw)
Definition: material.c:498
static HRESULT WINAPI d3d_material3_QueryInterface(IDirect3DMaterial3 *iface, REFIID riid, void **obp)
Definition: material.c:63
static HRESULT WINAPI d3d_material2_GetHandle(IDirect3DMaterial2 *iface, IDirect3DDevice2 *device, D3DMATERIALHANDLE *handle)
Definition: material.c:320
static struct d3d_material * impl_from_IDirect3DMaterial3(IDirect3DMaterial3 *iface)
Definition: material.c:39
static ULONG WINAPI d3d_material1_AddRef(IDirect3DMaterial *iface)
Definition: material.c:371
static ULONG WINAPI d3d_material2_Release(IDirect3DMaterial2 *iface)
Definition: material.c:380
static ULONG WINAPI d3d_material1_Release(IDirect3DMaterial *iface)
Definition: material.c:389
static const struct IDirect3DMaterial2Vtbl d3d_material2_vtbl
Definition: material.c:471
void * ddraw_free_handle(struct ddraw_handle_table *t, DWORD handle, enum ddraw_handle_type type)
Definition: main.c:184
struct d3d_device * unsafe_impl_from_IDirect3DDevice(IDirect3DDevice *iface)
Definition: device.c:6810
struct d3d_device * unsafe_impl_from_IDirect3DDevice2(IDirect3DDevice2 *iface)
Definition: device.c:6803
#define DDRAW_INVALID_HANDLE
DWORD ddraw_allocate_handle(struct ddraw_handle_table *t, void *object, enum ddraw_handle_type type)
Definition: main.c:138
@ DDRAW_HANDLE_MATERIAL
struct d3d_device * unsafe_impl_from_IDirect3DDevice3(IDirect3DDevice3 *iface)
Definition: device.c:6796
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
#define TRACE_ON(x)
Definition: compat.h:75
unsigned long DWORD
Definition: ntddk_ex.h:95
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static const MAT2 mat
Definition: font.c:51
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define calloc
Definition: rosglue.h:14
#define DD_OK
Definition: ddraw.h:188
#define DDERR_UNSUPPORTED
Definition: ddraw.h:129
#define DDERR_INVALIDPARAMS
Definition: ddraw.h:81
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
D3DCOLORVALUE emissive
Definition: d3dtypes.h:543
D3DCOLORVALUE specular
Definition: d3dtypes.h:539
D3DCOLORVALUE ambient
Definition: d3dtypes.h:535
D3DVALUE power
Definition: d3dtypes.h:547
D3DCOLORVALUE diffuse
Definition: d3dtypes.h:531
D3DCOLORVALUE ambient
Definition: d3dtypes.h:510
D3DCOLORVALUE emissive
Definition: d3dtypes.h:518
D3DVALUE power
Definition: d3dtypes.h:522
D3DCOLORVALUE diffuse
Definition: d3dtypes.h:506
D3DCOLORVALUE specular
Definition: d3dtypes.h:514
IDirect3DDevice3 IDirect3DDevice3_iface
DWORD material
D3DMATERIAL mat
struct d3d_device * active_device
IDirect3DMaterial IDirect3DMaterial_iface
struct ddraw * ddraw
IDirect3DMaterial2 IDirect3DMaterial2_iface
IDirect3DMaterial3 IDirect3DMaterial3_iface
Definition: devices.h:37
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
#define E_NOINTERFACE
Definition: winerror.h:3479