d3drm: Implement IDirect3DRMMeshImpl_GetGroupMaterial.
[wine] / dlls / d3drm / light.c
1 /*
2  * Implementation of IDirect3DRMLight Interface
3  *
4  * Copyright 2012 AndrĂ© Hentschel
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "wine/debug.h"
22
23 #define COBJMACROS
24
25 #include "winbase.h"
26 #include "wingdi.h"
27
28 #include "d3drm_private.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
31
32 #define D3DCOLOR_ARGB(a,r,g,b)        ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
33
34 typedef struct {
35     IDirect3DRMLight IDirect3DRMLight_iface;
36     LONG ref;
37     D3DRMLIGHTTYPE type;
38     D3DCOLOR color;
39     D3DVALUE range;
40 } IDirect3DRMLightImpl;
41
42 static inline IDirect3DRMLightImpl *impl_from_IDirect3DRMLight(IDirect3DRMLight *iface)
43 {
44     return CONTAINING_RECORD(iface, IDirect3DRMLightImpl, IDirect3DRMLight_iface);
45 }
46
47 /*** IUnknown methods ***/
48 static HRESULT WINAPI IDirect3DRMLightImpl_QueryInterface(IDirect3DRMLight* iface,
49                                                            REFIID riid, void** object)
50 {
51     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
52
53     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
54
55     *object = NULL;
56
57     if(IsEqualGUID(riid, &IID_IUnknown) ||
58        IsEqualGUID(riid, &IID_IDirect3DRMLight))
59     {
60         *object = &This->IDirect3DRMLight_iface;
61     }
62     else
63     {
64         FIXME("interface %s not implemented\n", debugstr_guid(riid));
65         return E_NOINTERFACE;
66     }
67
68     IDirect3DRMLight_AddRef(iface);
69     return S_OK;
70 }
71
72 static ULONG WINAPI IDirect3DRMLightImpl_AddRef(IDirect3DRMLight* iface)
73 {
74     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
75     ULONG ref = InterlockedIncrement(&This->ref);
76
77     TRACE("(%p)->(): new ref = %d\n", iface, ref);
78
79     return ref;
80 }
81
82 static ULONG WINAPI IDirect3DRMLightImpl_Release(IDirect3DRMLight* iface)
83 {
84     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
85     ULONG ref = InterlockedDecrement(&This->ref);
86
87     TRACE("(%p)->(): new ref = %d\n", iface, ref);
88
89     if (!ref)
90         HeapFree(GetProcessHeap(), 0, This);
91
92     return ref;
93 }
94
95 /*** IDirect3DRMObject methods ***/
96 static HRESULT WINAPI IDirect3DRMLightImpl_Clone(IDirect3DRMLight* iface,
97                                                   LPUNKNOWN unkwn, REFIID riid,
98                                                   LPVOID* object)
99 {
100     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
101
102     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
103
104     return E_NOTIMPL;
105 }
106
107 static HRESULT WINAPI IDirect3DRMLightImpl_AddDestroyCallback(IDirect3DRMLight* iface,
108                                                                D3DRMOBJECTCALLBACK cb,
109                                                                LPVOID argument)
110 {
111     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
112
113     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
114
115     return E_NOTIMPL;
116 }
117
118 static HRESULT WINAPI IDirect3DRMLightImpl_DeleteDestroyCallback(IDirect3DRMLight* iface,
119                                                                   D3DRMOBJECTCALLBACK cb,
120                                                                   LPVOID argument)
121 {
122     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
123
124     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
125
126     return E_NOTIMPL;
127 }
128
129 static HRESULT WINAPI IDirect3DRMLightImpl_SetAppData(IDirect3DRMLight* iface,
130                                                        DWORD data)
131 {
132     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
133
134     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
135
136     return E_NOTIMPL;
137 }
138
139 static DWORD WINAPI IDirect3DRMLightImpl_GetAppData(IDirect3DRMLight* iface)
140 {
141     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
142
143     FIXME("(%p/%p)->(): stub\n", iface, This);
144
145     return 0;
146 }
147
148 static HRESULT WINAPI IDirect3DRMLightImpl_SetName(IDirect3DRMLight* iface, LPCSTR name)
149 {
150     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
151
152     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
153
154     return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI IDirect3DRMLightImpl_GetName(IDirect3DRMLight* iface,
158                                                     LPDWORD size, LPSTR name)
159 {
160     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
161
162     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
163
164     return E_NOTIMPL;
165 }
166
167 static HRESULT WINAPI IDirect3DRMLightImpl_GetClassName(IDirect3DRMLight* iface,
168                                                          LPDWORD size, LPSTR name)
169 {
170     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
171
172     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
173
174     return E_NOTIMPL;
175 }
176
177 /*** IDirect3DRMLight methods ***/
178 static HRESULT WINAPI IDirect3DRMLightImpl_SetType(IDirect3DRMLight* iface, D3DRMLIGHTTYPE type)
179 {
180     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
181
182     TRACE("(%p/%p)->(%u)\n", iface, This, type);
183
184     This->type = type;
185
186     return D3DRM_OK;
187 }
188
189 static HRESULT WINAPI IDirect3DRMLightImpl_SetColor(IDirect3DRMLight* iface, D3DCOLOR color)
190 {
191     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
192
193     TRACE("(%p/%p)->(%u)\n", iface, This, color);
194
195     This->color = color;
196
197     return D3DRM_OK;
198 }
199
200 static HRESULT WINAPI IDirect3DRMLightImpl_SetColorRGB(IDirect3DRMLight* iface,
201                                                          D3DVALUE red, D3DVALUE green, D3DVALUE blue)
202 {
203     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
204
205     TRACE("(%p/%p)->(%f,%f,%f)\n", iface, This, red, green, blue);
206
207     This->color = D3DCOLOR_ARGB(0xff, (BYTE)(red   * 255.0f),
208                                       (BYTE)(green * 255.0f),
209                                       (BYTE)(blue  * 255.0f));
210
211     return D3DRM_OK;
212 }
213
214 static HRESULT WINAPI IDirect3DRMLightImpl_SetRange(IDirect3DRMLight* iface, D3DVALUE range)
215 {
216     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
217
218     TRACE("(%p/%p)->(%f)\n", iface, This, range);
219
220     This->range = range;
221
222     return D3DRM_OK;
223 }
224
225 static HRESULT WINAPI IDirect3DRMLightImpl_SetUmbra(IDirect3DRMLight* iface, D3DVALUE umbra)
226 {
227     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
228
229     FIXME("(%p/%p)->(%f): stub\n", iface, This, umbra);
230
231     return E_NOTIMPL;
232 }
233
234 static HRESULT WINAPI IDirect3DRMLightImpl_SetPenumbra(IDirect3DRMLight* iface, D3DVALUE penumbra)
235 {
236     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
237
238     FIXME("(%p/%p)->(%f): stub\n", iface, This, penumbra);
239
240     return E_NOTIMPL;
241 }
242
243 static HRESULT WINAPI IDirect3DRMLightImpl_SetConstantAttenuation(IDirect3DRMLight* iface,
244                                                                     D3DVALUE cattenuation)
245 {
246     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
247
248     FIXME("(%p/%p)->(%f): stub\n", iface, This, cattenuation);
249
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI IDirect3DRMLightImpl_SetLinearAttenuation(IDirect3DRMLight* iface,
254                                                                   D3DVALUE lattenuation)
255 {
256     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
257
258     FIXME("(%p/%p)->(%f): stub\n", iface, This, lattenuation);
259
260     return E_NOTIMPL;
261 }
262
263 static HRESULT WINAPI IDirect3DRMLightImpl_SetQuadraticAttenuation(IDirect3DRMLight* iface,
264                                                                      D3DVALUE qattenuation)
265 {
266     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
267
268     FIXME("(%p/%p)->(%f): stub\n", iface, This, qattenuation);
269
270     return E_NOTIMPL;
271 }
272
273 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetRange(IDirect3DRMLight* iface)
274 {
275     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
276
277     TRACE("(%p/%p)->()\n", iface, This);
278
279     return This->range;
280 }
281
282 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetUmbra(IDirect3DRMLight* iface)
283 {
284     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
285
286     FIXME("(%p/%p)->(): stub\n", iface, This);
287
288     return 0;
289 }
290
291 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetPenumbra(IDirect3DRMLight* iface)
292 {
293     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
294
295     FIXME("(%p/%p)->(): stub\n", iface, This);
296
297     return 0;
298 }
299
300 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetConstantAttenuation(IDirect3DRMLight* iface)
301 {
302     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
303
304     FIXME("(%p/%p)->(): stub\n", iface, This);
305
306     return 0;
307 }
308
309 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetLinearAttenuation(IDirect3DRMLight* iface)
310 {
311     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
312
313     FIXME("(%p/%p)->(): stub\n", iface, This);
314
315     return 0;
316 }
317
318 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetQuadraticAttenuation(IDirect3DRMLight* iface)
319 {
320     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
321
322     FIXME("(%p/%p)->(): stub\n", iface, This);
323
324     return 0;
325 }
326
327 static D3DCOLOR WINAPI IDirect3DRMLightImpl_GetColor(IDirect3DRMLight* iface)
328 {
329     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
330
331     TRACE("(%p/%p)->()\n", iface, This);
332
333     return This->color;
334 }
335
336 static D3DRMLIGHTTYPE WINAPI IDirect3DRMLightImpl_GetType(IDirect3DRMLight* iface)
337 {
338     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
339
340     TRACE("(%p/%p)->()\n", iface, This);
341
342     return This->type;
343 }
344
345 static HRESULT WINAPI IDirect3DRMLightImpl_SetEnableFrame(IDirect3DRMLight* iface,
346                                                             LPDIRECT3DRMFRAME frame)
347 {
348     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
349
350     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
351
352     return E_NOTIMPL;
353 }
354
355 static HRESULT WINAPI IDirect3DRMLightImpl_GetEnableFrame(IDirect3DRMLight* iface,
356                                                             LPDIRECT3DRMFRAME* frame)
357 {
358     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
359
360     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
361
362     return E_NOTIMPL;
363 }
364
365 static const struct IDirect3DRMLightVtbl Direct3DRMLight_Vtbl =
366 {
367     /*** IUnknown methods ***/
368     IDirect3DRMLightImpl_QueryInterface,
369     IDirect3DRMLightImpl_AddRef,
370     IDirect3DRMLightImpl_Release,
371     /*** IDirect3DRMObject methods ***/
372     IDirect3DRMLightImpl_Clone,
373     IDirect3DRMLightImpl_AddDestroyCallback,
374     IDirect3DRMLightImpl_DeleteDestroyCallback,
375     IDirect3DRMLightImpl_SetAppData,
376     IDirect3DRMLightImpl_GetAppData,
377     IDirect3DRMLightImpl_SetName,
378     IDirect3DRMLightImpl_GetName,
379     IDirect3DRMLightImpl_GetClassName,
380     /*** IDirect3DRMLight methods ***/
381     IDirect3DRMLightImpl_SetType,
382     IDirect3DRMLightImpl_SetColor,
383     IDirect3DRMLightImpl_SetColorRGB,
384     IDirect3DRMLightImpl_SetRange,
385     IDirect3DRMLightImpl_SetUmbra,
386     IDirect3DRMLightImpl_SetPenumbra,
387     IDirect3DRMLightImpl_SetConstantAttenuation,
388     IDirect3DRMLightImpl_SetLinearAttenuation,
389     IDirect3DRMLightImpl_SetQuadraticAttenuation,
390     IDirect3DRMLightImpl_GetRange,
391     IDirect3DRMLightImpl_GetUmbra,
392     IDirect3DRMLightImpl_GetPenumbra,
393     IDirect3DRMLightImpl_GetConstantAttenuation,
394     IDirect3DRMLightImpl_GetLinearAttenuation,
395     IDirect3DRMLightImpl_GetQuadraticAttenuation,
396     IDirect3DRMLightImpl_GetColor,
397     IDirect3DRMLightImpl_GetType,
398     IDirect3DRMLightImpl_SetEnableFrame,
399     IDirect3DRMLightImpl_GetEnableFrame
400 };
401
402 HRESULT Direct3DRMLight_create(IUnknown** ppObj)
403 {
404     IDirect3DRMLightImpl* object;
405
406     TRACE("(%p)\n", ppObj);
407
408     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMLightImpl));
409     if (!object)
410     {
411         ERR("Out of memory\n");
412         return E_OUTOFMEMORY;
413     }
414
415     object->IDirect3DRMLight_iface.lpVtbl = &Direct3DRMLight_Vtbl;
416     object->ref = 1;
417
418     *ppObj = (IUnknown*)&object->IDirect3DRMLight_iface;
419
420     return S_OK;
421 }