d3drm: Implement IDirect3DRMMesh_GetGroupColor.
[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 typedef struct {
33     IDirect3DRMLight IDirect3DRMLight_iface;
34     LONG ref;
35     D3DRMLIGHTTYPE type;
36     D3DCOLOR color;
37     D3DVALUE range;
38 } IDirect3DRMLightImpl;
39
40 static inline IDirect3DRMLightImpl *impl_from_IDirect3DRMLight(IDirect3DRMLight *iface)
41 {
42     return CONTAINING_RECORD(iface, IDirect3DRMLightImpl, IDirect3DRMLight_iface);
43 }
44
45 /*** IUnknown methods ***/
46 static HRESULT WINAPI IDirect3DRMLightImpl_QueryInterface(IDirect3DRMLight* iface,
47                                                            REFIID riid, void** object)
48 {
49     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
50
51     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
52
53     *object = NULL;
54
55     if(IsEqualGUID(riid, &IID_IUnknown) ||
56        IsEqualGUID(riid, &IID_IDirect3DRMLight))
57     {
58         *object = &This->IDirect3DRMLight_iface;
59     }
60     else
61     {
62         FIXME("interface %s not implemented\n", debugstr_guid(riid));
63         return E_NOINTERFACE;
64     }
65
66     IDirect3DRMLight_AddRef(iface);
67     return S_OK;
68 }
69
70 static ULONG WINAPI IDirect3DRMLightImpl_AddRef(IDirect3DRMLight* iface)
71 {
72     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
73     ULONG ref = InterlockedIncrement(&This->ref);
74
75     TRACE("(%p)->(): new ref = %d\n", iface, ref);
76
77     return ref;
78 }
79
80 static ULONG WINAPI IDirect3DRMLightImpl_Release(IDirect3DRMLight* iface)
81 {
82     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
83     ULONG ref = InterlockedDecrement(&This->ref);
84
85     TRACE("(%p)->(): new ref = %d\n", iface, ref);
86
87     if (!ref)
88         HeapFree(GetProcessHeap(), 0, This);
89
90     return ref;
91 }
92
93 /*** IDirect3DRMObject methods ***/
94 static HRESULT WINAPI IDirect3DRMLightImpl_Clone(IDirect3DRMLight* iface,
95                                                   LPUNKNOWN unkwn, REFIID riid,
96                                                   LPVOID* object)
97 {
98     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
99
100     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
101
102     return E_NOTIMPL;
103 }
104
105 static HRESULT WINAPI IDirect3DRMLightImpl_AddDestroyCallback(IDirect3DRMLight* iface,
106                                                                D3DRMOBJECTCALLBACK cb,
107                                                                LPVOID argument)
108 {
109     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
110
111     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
112
113     return E_NOTIMPL;
114 }
115
116 static HRESULT WINAPI IDirect3DRMLightImpl_DeleteDestroyCallback(IDirect3DRMLight* iface,
117                                                                   D3DRMOBJECTCALLBACK cb,
118                                                                   LPVOID argument)
119 {
120     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
121
122     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
123
124     return E_NOTIMPL;
125 }
126
127 static HRESULT WINAPI IDirect3DRMLightImpl_SetAppData(IDirect3DRMLight* iface,
128                                                        DWORD data)
129 {
130     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
131
132     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
133
134     return E_NOTIMPL;
135 }
136
137 static DWORD WINAPI IDirect3DRMLightImpl_GetAppData(IDirect3DRMLight* iface)
138 {
139     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
140
141     FIXME("(%p/%p)->(): stub\n", iface, This);
142
143     return 0;
144 }
145
146 static HRESULT WINAPI IDirect3DRMLightImpl_SetName(IDirect3DRMLight* iface, LPCSTR name)
147 {
148     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
149
150     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
151
152     return E_NOTIMPL;
153 }
154
155 static HRESULT WINAPI IDirect3DRMLightImpl_GetName(IDirect3DRMLight* iface,
156                                                     LPDWORD size, LPSTR name)
157 {
158     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
159
160     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
161
162     return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI IDirect3DRMLightImpl_GetClassName(IDirect3DRMLight* iface,
166                                                          LPDWORD size, LPSTR name)
167 {
168     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
169
170     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
171
172     return E_NOTIMPL;
173 }
174
175 /*** IDirect3DRMLight methods ***/
176 static HRESULT WINAPI IDirect3DRMLightImpl_SetType(IDirect3DRMLight* iface, D3DRMLIGHTTYPE type)
177 {
178     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
179
180     TRACE("(%p/%p)->(%u)\n", iface, This, type);
181
182     This->type = type;
183
184     return D3DRM_OK;
185 }
186
187 static HRESULT WINAPI IDirect3DRMLightImpl_SetColor(IDirect3DRMLight* iface, D3DCOLOR color)
188 {
189     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
190
191     TRACE("(%p/%p)->(%u)\n", iface, This, color);
192
193     This->color = color;
194
195     return D3DRM_OK;
196 }
197
198 static HRESULT WINAPI IDirect3DRMLightImpl_SetColorRGB(IDirect3DRMLight* iface,
199                                                          D3DVALUE red, D3DVALUE green, D3DVALUE blue)
200 {
201     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
202
203     TRACE("(%p/%p)->(%f,%f,%f)\n", iface, This, red, green, blue);
204
205     This->color = D3DCOLOR_ARGB(0xff, (BYTE)(red   * 255.0f),
206                                       (BYTE)(green * 255.0f),
207                                       (BYTE)(blue  * 255.0f));
208
209     return D3DRM_OK;
210 }
211
212 static HRESULT WINAPI IDirect3DRMLightImpl_SetRange(IDirect3DRMLight* iface, D3DVALUE range)
213 {
214     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
215
216     TRACE("(%p/%p)->(%f)\n", iface, This, range);
217
218     This->range = range;
219
220     return D3DRM_OK;
221 }
222
223 static HRESULT WINAPI IDirect3DRMLightImpl_SetUmbra(IDirect3DRMLight* iface, D3DVALUE umbra)
224 {
225     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
226
227     FIXME("(%p/%p)->(%f): stub\n", iface, This, umbra);
228
229     return E_NOTIMPL;
230 }
231
232 static HRESULT WINAPI IDirect3DRMLightImpl_SetPenumbra(IDirect3DRMLight* iface, D3DVALUE penumbra)
233 {
234     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
235
236     FIXME("(%p/%p)->(%f): stub\n", iface, This, penumbra);
237
238     return E_NOTIMPL;
239 }
240
241 static HRESULT WINAPI IDirect3DRMLightImpl_SetConstantAttenuation(IDirect3DRMLight* iface,
242                                                                     D3DVALUE cattenuation)
243 {
244     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
245
246     FIXME("(%p/%p)->(%f): stub\n", iface, This, cattenuation);
247
248     return E_NOTIMPL;
249 }
250
251 static HRESULT WINAPI IDirect3DRMLightImpl_SetLinearAttenuation(IDirect3DRMLight* iface,
252                                                                   D3DVALUE lattenuation)
253 {
254     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
255
256     FIXME("(%p/%p)->(%f): stub\n", iface, This, lattenuation);
257
258     return E_NOTIMPL;
259 }
260
261 static HRESULT WINAPI IDirect3DRMLightImpl_SetQuadraticAttenuation(IDirect3DRMLight* iface,
262                                                                      D3DVALUE qattenuation)
263 {
264     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
265
266     FIXME("(%p/%p)->(%f): stub\n", iface, This, qattenuation);
267
268     return E_NOTIMPL;
269 }
270
271 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetRange(IDirect3DRMLight* iface)
272 {
273     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
274
275     TRACE("(%p/%p)->()\n", iface, This);
276
277     return This->range;
278 }
279
280 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetUmbra(IDirect3DRMLight* iface)
281 {
282     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
283
284     FIXME("(%p/%p)->(): stub\n", iface, This);
285
286     return 0;
287 }
288
289 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetPenumbra(IDirect3DRMLight* iface)
290 {
291     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
292
293     FIXME("(%p/%p)->(): stub\n", iface, This);
294
295     return 0;
296 }
297
298 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetConstantAttenuation(IDirect3DRMLight* iface)
299 {
300     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
301
302     FIXME("(%p/%p)->(): stub\n", iface, This);
303
304     return 0;
305 }
306
307 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetLinearAttenuation(IDirect3DRMLight* iface)
308 {
309     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
310
311     FIXME("(%p/%p)->(): stub\n", iface, This);
312
313     return 0;
314 }
315
316 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetQuadraticAttenuation(IDirect3DRMLight* iface)
317 {
318     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
319
320     FIXME("(%p/%p)->(): stub\n", iface, This);
321
322     return 0;
323 }
324
325 static D3DCOLOR WINAPI IDirect3DRMLightImpl_GetColor(IDirect3DRMLight* iface)
326 {
327     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
328
329     TRACE("(%p/%p)->()\n", iface, This);
330
331     return This->color;
332 }
333
334 static D3DRMLIGHTTYPE WINAPI IDirect3DRMLightImpl_GetType(IDirect3DRMLight* iface)
335 {
336     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
337
338     TRACE("(%p/%p)->()\n", iface, This);
339
340     return This->type;
341 }
342
343 static HRESULT WINAPI IDirect3DRMLightImpl_SetEnableFrame(IDirect3DRMLight* iface,
344                                                             LPDIRECT3DRMFRAME frame)
345 {
346     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
347
348     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
349
350     return E_NOTIMPL;
351 }
352
353 static HRESULT WINAPI IDirect3DRMLightImpl_GetEnableFrame(IDirect3DRMLight* iface,
354                                                             LPDIRECT3DRMFRAME* frame)
355 {
356     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
357
358     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
359
360     return E_NOTIMPL;
361 }
362
363 static const struct IDirect3DRMLightVtbl Direct3DRMLight_Vtbl =
364 {
365     /*** IUnknown methods ***/
366     IDirect3DRMLightImpl_QueryInterface,
367     IDirect3DRMLightImpl_AddRef,
368     IDirect3DRMLightImpl_Release,
369     /*** IDirect3DRMObject methods ***/
370     IDirect3DRMLightImpl_Clone,
371     IDirect3DRMLightImpl_AddDestroyCallback,
372     IDirect3DRMLightImpl_DeleteDestroyCallback,
373     IDirect3DRMLightImpl_SetAppData,
374     IDirect3DRMLightImpl_GetAppData,
375     IDirect3DRMLightImpl_SetName,
376     IDirect3DRMLightImpl_GetName,
377     IDirect3DRMLightImpl_GetClassName,
378     /*** IDirect3DRMLight methods ***/
379     IDirect3DRMLightImpl_SetType,
380     IDirect3DRMLightImpl_SetColor,
381     IDirect3DRMLightImpl_SetColorRGB,
382     IDirect3DRMLightImpl_SetRange,
383     IDirect3DRMLightImpl_SetUmbra,
384     IDirect3DRMLightImpl_SetPenumbra,
385     IDirect3DRMLightImpl_SetConstantAttenuation,
386     IDirect3DRMLightImpl_SetLinearAttenuation,
387     IDirect3DRMLightImpl_SetQuadraticAttenuation,
388     IDirect3DRMLightImpl_GetRange,
389     IDirect3DRMLightImpl_GetUmbra,
390     IDirect3DRMLightImpl_GetPenumbra,
391     IDirect3DRMLightImpl_GetConstantAttenuation,
392     IDirect3DRMLightImpl_GetLinearAttenuation,
393     IDirect3DRMLightImpl_GetQuadraticAttenuation,
394     IDirect3DRMLightImpl_GetColor,
395     IDirect3DRMLightImpl_GetType,
396     IDirect3DRMLightImpl_SetEnableFrame,
397     IDirect3DRMLightImpl_GetEnableFrame
398 };
399
400 HRESULT Direct3DRMLight_create(IUnknown** ppObj)
401 {
402     IDirect3DRMLightImpl* object;
403
404     TRACE("(%p)\n", ppObj);
405
406     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMLightImpl));
407     if (!object)
408     {
409         ERR("Out of memory\n");
410         return E_OUTOFMEMORY;
411     }
412
413     object->IDirect3DRMLight_iface.lpVtbl = &Direct3DRMLight_Vtbl;
414     object->ref = 1;
415
416     *ppObj = (IUnknown*)&object->IDirect3DRMLight_iface;
417
418     return S_OK;
419 }