winealsa: Fix AudioRenderClient Get/ReleaseBuffer protocol.
[wine] / dlls / d3drm / d3drm.c
1 /*
2  * Implementation of IDirect3DRM Interface
3  *
4  * Copyright 2010 Christian Costa
5  * Copyright 2011 AndrĂ© Hentschel
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include "wine/debug.h"
23
24 #define COBJMACROS
25
26 #include "winbase.h"
27 #include "wingdi.h"
28
29 #include "d3drm_private.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
32
33 typedef struct {
34     IDirect3DRM IDirect3DRM_iface;
35     IDirect3DRM2 IDirect3DRM2_iface;
36     IDirect3DRM3 IDirect3DRM3_iface;
37     LONG ref;
38 } IDirect3DRMImpl;
39
40 static const struct IDirect3DRMVtbl Direct3DRM_Vtbl;
41 static const struct IDirect3DRM2Vtbl Direct3DRM2_Vtbl;
42 static const struct IDirect3DRM3Vtbl Direct3DRM3_Vtbl;
43
44 static inline IDirect3DRMImpl *impl_from_IDirect3DRM(IDirect3DRM *iface)
45 {
46     return CONTAINING_RECORD(iface, IDirect3DRMImpl, IDirect3DRM_iface);
47 }
48
49 static inline IDirect3DRMImpl *impl_from_IDirect3DRM2(IDirect3DRM2 *iface)
50 {
51     return CONTAINING_RECORD(iface, IDirect3DRMImpl, IDirect3DRM2_iface);
52 }
53
54 static inline IDirect3DRMImpl *impl_from_IDirect3DRM3(IDirect3DRM3 *iface)
55 {
56     return CONTAINING_RECORD(iface, IDirect3DRMImpl, IDirect3DRM3_iface);
57 }
58
59 HRESULT Direct3DRM_create(IUnknown** ppObj)
60 {
61     IDirect3DRMImpl* object;
62
63     TRACE("(%p)\n", ppObj);
64
65     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMImpl));
66     if (!object)
67     {
68         ERR("Out of memory\n");
69         return E_OUTOFMEMORY;
70     }
71
72     object->IDirect3DRM_iface.lpVtbl = &Direct3DRM_Vtbl;
73     object->IDirect3DRM2_iface.lpVtbl = &Direct3DRM2_Vtbl;
74     object->IDirect3DRM3_iface.lpVtbl = &Direct3DRM3_Vtbl;
75     object->ref = 1;
76
77     *ppObj = (IUnknown*)&object->IDirect3DRM_iface;
78
79     return S_OK;
80 }
81
82 /*** IUnknown methods ***/
83 static HRESULT WINAPI IDirect3DRMImpl_QueryInterface(IDirect3DRM* iface, REFIID riid, void** ppvObject)
84 {
85     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
86
87     TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject);
88
89     *ppvObject = NULL;
90
91     if(IsEqualGUID(riid, &IID_IUnknown) ||
92        IsEqualGUID(riid, &IID_IDirect3DRM))
93     {
94         *ppvObject = &This->IDirect3DRM_iface;
95     }
96     else if(IsEqualGUID(riid, &IID_IDirect3DRM2))
97     {
98         *ppvObject = &This->IDirect3DRM2_iface;
99     }
100     else if(IsEqualGUID(riid, &IID_IDirect3DRM3))
101     {
102         *ppvObject = &This->IDirect3DRM3_iface;
103     }
104     else
105     {
106         FIXME("interface %s not implemented\n", debugstr_guid(riid));
107         return E_NOINTERFACE;
108     }
109
110     IDirect3DRM_AddRef(iface);
111     return S_OK;
112 }
113
114 static ULONG WINAPI IDirect3DRMImpl_AddRef(IDirect3DRM* iface)
115 {
116     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
117
118     TRACE("(%p/%p)\n", iface, This);
119
120     return InterlockedIncrement(&This->ref);
121 }
122
123 static ULONG WINAPI IDirect3DRMImpl_Release(IDirect3DRM* iface)
124 {
125     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
126     ULONG ref = InterlockedDecrement(&This->ref);
127
128     TRACE("(%p/%p)\n", iface, This);
129
130     if (!ref)
131         HeapFree(GetProcessHeap(), 0, This);
132
133     return ref;
134 }
135
136 /*** IDirect3DRM methods ***/
137 static HRESULT WINAPI IDirect3DRMImpl_CreateObject(IDirect3DRM* iface, REFCLSID rclsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj)
138 {
139     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
140
141     FIXME("(%p/%p)->(%s,%p,%s,%p): stub\n", iface, This, debugstr_guid(rclsid), pUnkOuter, debugstr_guid(riid), ppvObj);
142
143     return E_NOTIMPL;
144 }
145
146 static HRESULT WINAPI IDirect3DRMImpl_CreateFrame(IDirect3DRM* iface, LPDIRECT3DRMFRAME pFrameParent, LPDIRECT3DRMFRAME * ppFrame)
147 {
148     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
149
150     TRACE("(%p/%p)->(%p,%p)\n", iface, This, pFrameParent, ppFrame);
151
152     if (pFrameParent)
153         FIXME("(%p/%p): Parent frame not yet supported\n", iface, This);
154
155     return Direct3DRMFrame_create(&IID_IDirect3DRMFrame, (IUnknown**)ppFrame);
156 }
157
158 static HRESULT WINAPI IDirect3DRMImpl_CreateMesh(IDirect3DRM* iface, LPDIRECT3DRMMESH * ppMesh)
159 {
160     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
161
162     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppMesh);
163
164     return E_NOTIMPL;
165 }
166
167 static HRESULT WINAPI IDirect3DRMImpl_CreateMeshBuilder(IDirect3DRM* iface, LPDIRECT3DRMMESHBUILDER * ppMeshBuilder)
168 {
169     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
170
171     TRACE("(%p/%p)->(%p)\n", iface, This, ppMeshBuilder);
172
173     return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder, (IUnknown**)ppMeshBuilder);
174 }
175
176 static HRESULT WINAPI IDirect3DRMImpl_CreateFace(IDirect3DRM* iface, LPDIRECT3DRMFACE * ppFace)
177 {
178     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
179
180     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppFace);
181
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI IDirect3DRMImpl_CreateAnimation(IDirect3DRM* iface, LPDIRECT3DRMANIMATION * ppAnimation)
186 {
187     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
188
189     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppAnimation);
190
191     return E_NOTIMPL;
192 }
193
194 static HRESULT WINAPI IDirect3DRMImpl_CreateAnimationSet(IDirect3DRM* iface, LPDIRECT3DRMANIMATIONSET * ppAnimationSet)
195 {
196     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
197
198     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppAnimationSet);
199
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI IDirect3DRMImpl_CreateTexture(IDirect3DRM* iface, LPD3DRMIMAGE pImage, LPDIRECT3DRMTEXTURE * ppTexture)
204 {
205     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
206
207     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, pImage, ppTexture);
208
209     return E_NOTIMPL;
210 }
211
212 static HRESULT WINAPI IDirect3DRMImpl_CreateLight(IDirect3DRM* iface, D3DRMLIGHTTYPE type, D3DCOLOR color, LPDIRECT3DRMLIGHT * ppLight)
213 {
214     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
215
216     FIXME("(%p/%p)->(%d,%d,%p): stub\n", iface, This, type, color, ppLight);
217
218     return E_NOTIMPL;
219 }
220
221 static HRESULT WINAPI IDirect3DRMImpl_CreateLightRGB(IDirect3DRM* iface, D3DRMLIGHTTYPE type,  D3DVALUE red, D3DVALUE green, D3DVALUE blue, LPDIRECT3DRMLIGHT * ppLight)
222 {
223     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
224
225     FIXME("(%p/%p)->(%d,%f,%f,%f,%p): stub\n", iface, This, type, red, green, blue, ppLight);
226
227     return E_NOTIMPL;
228 }
229
230 static HRESULT WINAPI IDirect3DRMImpl_Material(IDirect3DRM* iface, D3DVALUE m, LPDIRECT3DRMMATERIAL * ppMaterial)
231 {
232     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
233
234     FIXME("(%p/%p)->(%f,%p): stub\n", iface, This, m, ppMaterial);
235
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI IDirect3DRMImpl_CreateDevice(IDirect3DRM* iface, DWORD width, DWORD height, LPDIRECT3DRMDEVICE * ppDevice)
240 {
241     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
242
243     FIXME("(%p/%p)->(%d,%d,%p): stub\n", iface, This, width, height, ppDevice);
244
245     return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI IDirect3DRMImpl_CreateDeviceFromSurface(IDirect3DRM* iface, LPGUID pGUID, LPDIRECTDRAW pDD, LPDIRECTDRAWSURFACE pDDSBack, LPDIRECT3DRMDEVICE * ppDevice)
249 {
250     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
251
252     FIXME("(%p/%p)->(%s,%p,%p,%p): stub\n", iface, This, debugstr_guid(pGUID), pDD, pDDSBack, ppDevice);
253
254     return E_NOTIMPL;
255 }
256
257 static HRESULT WINAPI IDirect3DRMImpl_CreateDeviceFromD3D(IDirect3DRM* iface, LPDIRECT3D pD3D, LPDIRECT3DDEVICE pD3DDev, LPDIRECT3DRMDEVICE * ppDevice)
258 {
259     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
260
261     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, pD3D, pD3DDev, ppDevice);
262
263     return E_NOTIMPL;
264 }
265
266 static HRESULT WINAPI IDirect3DRMImpl_CreateDeviceFromClipper(IDirect3DRM* iface, LPDIRECTDRAWCLIPPER pDDClipper, LPGUID pGUID, int width, int height, LPDIRECT3DRMDEVICE * ppDevice)
267 {
268     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
269
270     FIXME("(%p/%p)->(%p,%s,%d,%d,%p): stub\n", iface, This, pDDClipper, debugstr_guid(pGUID), width, height, ppDevice);
271
272     return E_NOTIMPL;
273 }
274
275 static HRESULT WINAPI IDirect3DRMImpl_CreateTextureFromSurface(IDirect3DRM* iface, LPDIRECTDRAWSURFACE pDDS, LPDIRECT3DRMTEXTURE * ppTexture)
276 {
277     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
278
279     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, pDDS, ppTexture);
280
281     return E_NOTIMPL;
282 }
283
284 static HRESULT WINAPI IDirect3DRMImpl_CreateShadow(IDirect3DRM* iface, LPDIRECT3DRMVISUAL pVisual, LPDIRECT3DRMLIGHT pLight, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, LPDIRECT3DRMVISUAL * ppVisual)
285 {
286     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
287
288     FIXME("(%p/%p)->(%p,%p,%f,%f,%f,%f,%f,%f,%p): stub\n", iface, This, pVisual, pLight, px, py, pz, nx, ny, nz, ppVisual);
289
290     return E_NOTIMPL;
291 }
292
293 static HRESULT WINAPI IDirect3DRMImpl_CreateViewport(IDirect3DRM* iface, LPDIRECT3DRMDEVICE pDevice, LPDIRECT3DRMFRAME pFrame, DWORD xpos, DWORD ypos, DWORD width, DWORD height, LPDIRECT3DRMVIEWPORT * ppViewport)
294 {
295     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
296
297     FIXME("(%p/%p)->(%p,%p,%d,%d,%d,%d,%p): stub\n", iface, This, pDevice, pFrame, xpos, ypos, width, height, ppViewport);
298
299     return E_NOTIMPL;
300 }
301
302 static HRESULT WINAPI IDirect3DRMImpl_CreateWrap(IDirect3DRM* iface, D3DRMWRAPTYPE type, LPDIRECT3DRMFRAME pFrame, D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv, LPDIRECT3DRMWRAP * ppWrap)
303 {
304     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
305
306     FIXME("(%p/%p)->(%d,%p,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%p): stub\n", iface, This, type, pFrame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, ppWrap);
307
308     return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI IDirect3DRMImpl_CreateUserVisual(IDirect3DRM* iface, D3DRMUSERVISUALCALLBACK cb, LPVOID pArg, LPDIRECT3DRMUSERVISUAL * ppUserVisual)
312 {
313     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
314
315     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, cb, pArg, ppUserVisual);
316
317     return E_NOTIMPL;
318 }
319
320 static HRESULT WINAPI IDirect3DRMImpl_LoadTexture(IDirect3DRM* iface, const char * filename, LPDIRECT3DRMTEXTURE * ppTexture)
321 {
322     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
323
324     FIXME("(%p/%p)->(%s,%p): stub\n", iface, This, filename, ppTexture);
325
326     return E_NOTIMPL;
327 }
328
329 static HRESULT WINAPI IDirect3DRMImpl_LoadTextureFromResource(IDirect3DRM* iface, HRSRC rs, LPDIRECT3DRMTEXTURE * ppTexture)
330 {
331     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
332
333     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, rs, ppTexture);
334
335     return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI IDirect3DRMImpl_SetSearchPath(IDirect3DRM* iface, LPCSTR path)
339 {
340     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
341
342     FIXME("(%p/%p)->(%s): stub\n", iface, This, path);
343
344     return E_NOTIMPL;
345 }
346
347 static HRESULT WINAPI IDirect3DRMImpl_AddSearchPath(IDirect3DRM* iface, LPCSTR path)
348 {
349     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
350
351     FIXME("(%p/%p)->(%s): stub\n", iface, This, path);
352
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI IDirect3DRMImpl_GetSearchPath(IDirect3DRM* iface, DWORD *size_return, LPSTR path_return)
357 {
358     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
359
360     FIXME("(%p/%p)->(%p,%s): stub\n", iface, This, size_return, path_return);
361
362     return E_NOTIMPL;
363 }
364
365 static HRESULT WINAPI IDirect3DRMImpl_SetDefaultTextureColors(IDirect3DRM* iface, DWORD nb_colors)
366 {
367     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
368
369     FIXME("(%p/%p)->(%d): stub\n", iface, This, nb_colors);
370
371     return E_NOTIMPL;
372 }
373
374 static HRESULT WINAPI IDirect3DRMImpl_SetDefaultTextureShades(IDirect3DRM* iface, DWORD nb_shades)
375 {
376     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
377
378     FIXME("(%p/%p)->(%d): stub\n", iface, This, nb_shades);
379
380     return E_NOTIMPL;
381 }
382
383 static HRESULT WINAPI IDirect3DRMImpl_GetDevices(IDirect3DRM* iface, LPDIRECT3DRMDEVICEARRAY * ppDeviceArray)
384 {
385     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
386
387     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppDeviceArray);
388
389     return E_NOTIMPL;
390 }
391
392 static HRESULT WINAPI IDirect3DRMImpl_GetNamedObject(IDirect3DRM* iface, const char * pName, LPDIRECT3DRMOBJECT * ppObject)
393 {
394     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
395
396     FIXME("(%p/%p)->(%s,%p): stub\n", iface, This, pName, ppObject);
397
398     return E_NOTIMPL;
399 }
400
401 static HRESULT WINAPI IDirect3DRMImpl_EnumerateObjects(IDirect3DRM* iface, D3DRMOBJECTCALLBACK cb, LPVOID pArg)
402 {
403     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
404
405     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, pArg);
406
407     return E_NOTIMPL;
408 }
409
410 static HRESULT WINAPI IDirect3DRMImpl_Load(IDirect3DRM* iface, LPVOID pObjSource, LPVOID pObjID, LPIID * ppGUIDs, DWORD nb_GUIDs, D3DRMLOADOPTIONS LOFlags, D3DRMLOADCALLBACK LoadProc, LPVOID pArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc, LPVOID pArgLTP, LPDIRECT3DRMFRAME pParentFrame)
411 {
412     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
413
414     FIXME("(%p/%p)->(%p,%p,%p,%d,%d,%p,%p,%p,%p,%p): stub\n", iface, This, pObjSource, pObjID, ppGUIDs, nb_GUIDs, LOFlags, LoadProc, pArgLP, LoadTextureProc, pArgLTP, pParentFrame);
415
416     return E_NOTIMPL;
417 }
418
419 static HRESULT WINAPI IDirect3DRMImpl_Tick(IDirect3DRM* iface, D3DVALUE tick)
420 {
421     IDirect3DRMImpl *This = impl_from_IDirect3DRM(iface);
422
423     FIXME("(%p/%p)->(%f): stub\n", iface, This, tick);
424
425     return E_NOTIMPL;
426 }
427
428 static const struct IDirect3DRMVtbl Direct3DRM_Vtbl =
429 {
430     IDirect3DRMImpl_QueryInterface,
431     IDirect3DRMImpl_AddRef,
432     IDirect3DRMImpl_Release,
433     IDirect3DRMImpl_CreateObject,
434     IDirect3DRMImpl_CreateFrame,
435     IDirect3DRMImpl_CreateMesh,
436     IDirect3DRMImpl_CreateMeshBuilder,
437     IDirect3DRMImpl_CreateFace,
438     IDirect3DRMImpl_CreateAnimation,
439     IDirect3DRMImpl_CreateAnimationSet,
440     IDirect3DRMImpl_CreateTexture,
441     IDirect3DRMImpl_CreateLight,
442     IDirect3DRMImpl_CreateLightRGB,
443     IDirect3DRMImpl_Material,
444     IDirect3DRMImpl_CreateDevice,
445     IDirect3DRMImpl_CreateDeviceFromSurface,
446     IDirect3DRMImpl_CreateDeviceFromD3D,
447     IDirect3DRMImpl_CreateDeviceFromClipper,
448     IDirect3DRMImpl_CreateTextureFromSurface,
449     IDirect3DRMImpl_CreateShadow,
450     IDirect3DRMImpl_CreateViewport,
451     IDirect3DRMImpl_CreateWrap,
452     IDirect3DRMImpl_CreateUserVisual,
453     IDirect3DRMImpl_LoadTexture,
454     IDirect3DRMImpl_LoadTextureFromResource,
455     IDirect3DRMImpl_SetSearchPath,
456     IDirect3DRMImpl_AddSearchPath,
457     IDirect3DRMImpl_GetSearchPath,
458     IDirect3DRMImpl_SetDefaultTextureColors,
459     IDirect3DRMImpl_SetDefaultTextureShades,
460     IDirect3DRMImpl_GetDevices,
461     IDirect3DRMImpl_GetNamedObject,
462     IDirect3DRMImpl_EnumerateObjects,
463     IDirect3DRMImpl_Load,
464     IDirect3DRMImpl_Tick
465 };
466
467
468 /*** IUnknown methods ***/
469 static HRESULT WINAPI IDirect3DRM2Impl_QueryInterface(IDirect3DRM2* iface, REFIID riid,
470                                                       void** ppvObject)
471 {
472     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
473     return IDirect3DRM_QueryInterface(&This->IDirect3DRM_iface, riid, ppvObject);
474 }
475
476 static ULONG WINAPI IDirect3DRM2Impl_AddRef(IDirect3DRM2* iface)
477 {
478     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
479
480     TRACE("(%p/%p)\n", iface, This);
481
482     return InterlockedIncrement(&This->ref);
483 }
484
485 static ULONG WINAPI IDirect3DRM2Impl_Release(IDirect3DRM2* iface)
486 {
487     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
488     ULONG ref = InterlockedDecrement(&This->ref);
489
490     TRACE("(%p/%p)\n", iface, This);
491
492     if (!ref)
493         HeapFree(GetProcessHeap(), 0, This);
494
495     return ref;
496 }
497
498 /*** IDirect3DRM2 methods ***/
499 static HRESULT WINAPI IDirect3DRM2Impl_CreateObject(IDirect3DRM2* iface, REFCLSID rclsid,
500                                                     LPUNKNOWN pUnkOuter, REFIID riid,
501                                                     LPVOID *ppvObj)
502 {
503     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
504
505     FIXME("(%p/%p)->(%s,%p,%s,%p): stub\n", iface, This, debugstr_guid(rclsid), pUnkOuter,
506                                             debugstr_guid(riid), ppvObj);
507
508     return E_NOTIMPL;
509 }
510
511 static HRESULT WINAPI IDirect3DRM2Impl_CreateFrame(IDirect3DRM2* iface,
512                                                    LPDIRECT3DRMFRAME pFrameParent,
513                                                    LPDIRECT3DRMFRAME2 * ppFrame)
514 {
515     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
516
517     TRACE("(%p/%p)->(%p,%p)\n", iface, This, pFrameParent, ppFrame);
518
519     if (pFrameParent)
520         FIXME("(%p/%p): Parent frame not yet supported\n", iface, This);
521
522     return Direct3DRMFrame_create(&IID_IDirect3DRMFrame2, (IUnknown**)ppFrame);
523 }
524
525 static HRESULT WINAPI IDirect3DRM2Impl_CreateMesh(IDirect3DRM2* iface, LPDIRECT3DRMMESH * ppMesh)
526 {
527     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
528
529     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppMesh);
530
531     return E_NOTIMPL;
532 }
533
534 static HRESULT WINAPI IDirect3DRM2Impl_CreateMeshBuilder(IDirect3DRM2* iface,
535                                                          LPDIRECT3DRMMESHBUILDER2 * ppMeshBuilder)
536 {
537     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
538
539     TRACE("(%p/%p)->(%p)\n", iface, This, ppMeshBuilder);
540
541     return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder2, (IUnknown**)ppMeshBuilder);
542 }
543
544 static HRESULT WINAPI IDirect3DRM2Impl_CreateFace(IDirect3DRM2* iface, LPDIRECT3DRMFACE * ppFace)
545 {
546     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
547
548     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppFace);
549
550     return E_NOTIMPL;
551 }
552
553 static HRESULT WINAPI IDirect3DRM2Impl_CreateAnimation(IDirect3DRM2* iface,
554                                                        LPDIRECT3DRMANIMATION * ppAnimation)
555 {
556     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
557
558     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppAnimation);
559
560     return E_NOTIMPL;
561 }
562
563 static HRESULT WINAPI IDirect3DRM2Impl_CreateAnimationSet(IDirect3DRM2* iface,
564                                                           LPDIRECT3DRMANIMATIONSET * ppAnimationSet)
565 {
566     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
567
568     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppAnimationSet);
569
570     return E_NOTIMPL;
571 }
572
573 static HRESULT WINAPI IDirect3DRM2Impl_CreateTexture(IDirect3DRM2* iface, LPD3DRMIMAGE pImage,
574                                                      LPDIRECT3DRMTEXTURE2 * ppTexture)
575 {
576     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
577
578     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, pImage, ppTexture);
579
580     return E_NOTIMPL;
581 }
582
583 static HRESULT WINAPI IDirect3DRM2Impl_CreateLight(IDirect3DRM2* iface, D3DRMLIGHTTYPE type,
584                                                    D3DCOLOR color, LPDIRECT3DRMLIGHT * ppLight)
585 {
586     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
587
588     FIXME("(%p/%p)->(%d,%d,%p): stub\n", iface, This, type, color, ppLight);
589
590     return E_NOTIMPL;
591 }
592
593 static HRESULT WINAPI IDirect3DRM2Impl_CreateLightRGB(IDirect3DRM2* iface, D3DRMLIGHTTYPE type,
594                                                       D3DVALUE red, D3DVALUE green, D3DVALUE blue,
595                                                       LPDIRECT3DRMLIGHT * ppLight)
596 {
597     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
598
599     FIXME("(%p/%p)->(%d,%f,%f,%f,%p): stub\n", iface, This, type, red, green, blue, ppLight);
600
601     return E_NOTIMPL;
602 }
603
604 static HRESULT WINAPI IDirect3DRM2Impl_Material(IDirect3DRM2* iface, D3DVALUE m,
605                                                 LPDIRECT3DRMMATERIAL * ppMaterial)
606 {
607     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
608
609     FIXME("(%p/%p)->(%f,%p): stub\n", iface, This, m, ppMaterial);
610
611     return E_NOTIMPL;
612 }
613
614 static HRESULT WINAPI IDirect3DRM2Impl_CreateDevice(IDirect3DRM2* iface, DWORD width, DWORD height,
615                                                     LPDIRECT3DRMDEVICE2 * ppDevice)
616 {
617     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
618
619     FIXME("(%p/%p)->(%d,%d,%p): stub\n", iface, This, width, height, ppDevice);
620
621     return E_NOTIMPL;
622 }
623
624 static HRESULT WINAPI IDirect3DRM2Impl_CreateDeviceFromSurface(IDirect3DRM2* iface, LPGUID pGUID,
625                                                                LPDIRECTDRAW pDD,
626                                                                LPDIRECTDRAWSURFACE pDDSBack,
627                                                                LPDIRECT3DRMDEVICE2 * ppDevice)
628 {
629     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
630
631     FIXME("(%p/%p)->(%s,%p,%p,%p): stub\n", iface, This, debugstr_guid(pGUID), pDD, pDDSBack, ppDevice);
632
633     return E_NOTIMPL;
634 }
635
636 static HRESULT WINAPI IDirect3DRM2Impl_CreateDeviceFromD3D(IDirect3DRM2* iface, LPDIRECT3D2 pD3D,
637                                                            LPDIRECT3DDEVICE2 pD3DDev,
638                                                            LPDIRECT3DRMDEVICE2 * ppDevice)
639 {
640     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
641
642     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, pD3D, pD3DDev, ppDevice);
643
644     return E_NOTIMPL;
645 }
646
647 static HRESULT WINAPI IDirect3DRM2Impl_CreateDeviceFromClipper(IDirect3DRM2* iface,
648                                                                LPDIRECTDRAWCLIPPER pDDClipper,
649                                                                LPGUID pGUID, int width, int height,
650                                                                LPDIRECT3DRMDEVICE2 * ppDevice)
651 {
652     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
653
654     FIXME("(%p/%p)->(%p,%s,%d,%d,%p): stub\n", iface, This, pDDClipper, debugstr_guid(pGUID), width,
655                                                height, ppDevice);
656
657     return E_NOTIMPL;
658 }
659
660 static HRESULT WINAPI IDirect3DRM2Impl_CreateTextureFromSurface(IDirect3DRM2* iface,
661                                                                 LPDIRECTDRAWSURFACE pDDS,
662                                                                 LPDIRECT3DRMTEXTURE2 * ppTexture)
663 {
664     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
665
666     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, pDDS, ppTexture);
667
668     return E_NOTIMPL;
669 }
670
671 static HRESULT WINAPI IDirect3DRM2Impl_CreateShadow(IDirect3DRM2* iface, LPDIRECT3DRMVISUAL pVisual,
672                                                     LPDIRECT3DRMLIGHT pLight,
673                                                     D3DVALUE px, D3DVALUE py, D3DVALUE pz,
674                                                     D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
675                                                     LPDIRECT3DRMVISUAL * ppVisual)
676 {
677     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
678
679     FIXME("(%p/%p)->(%p,%p,%f,%f,%f,%f,%f,%f,%p): stub\n", iface, This, pVisual, pLight, px, py, pz,
680                                                            nx, ny, nz, ppVisual);
681
682     return E_NOTIMPL;
683 }
684
685 static HRESULT WINAPI IDirect3DRM2Impl_CreateViewport(IDirect3DRM2* iface,
686                                                       LPDIRECT3DRMDEVICE pDevice,
687                                                       LPDIRECT3DRMFRAME pFrame,
688                                                       DWORD xpos, DWORD ypos,
689                                                       DWORD width, DWORD height,
690                                                       LPDIRECT3DRMVIEWPORT * ppViewport)
691 {
692     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
693
694     FIXME("(%p/%p)->(%p,%p,%d,%d,%d,%d,%p): stub\n", iface, This, pDevice, pFrame, xpos, ypos,
695                                                      width, height, ppViewport);
696
697     return E_NOTIMPL;
698 }
699
700 static HRESULT WINAPI IDirect3DRM2Impl_CreateWrap(IDirect3DRM2* iface, D3DRMWRAPTYPE type,
701                                                   LPDIRECT3DRMFRAME pFrame,
702                                                   D3DVALUE ox, D3DVALUE oy, D3DVALUE oz,
703                                                   D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
704                                                   D3DVALUE ux, D3DVALUE uy, D3DVALUE uz,
705                                                   D3DVALUE ou, D3DVALUE ov, D3DVALUE su,
706                                                   D3DVALUE sv, LPDIRECT3DRMWRAP * ppWrap)
707 {
708     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
709
710     FIXME("(%p/%p)->(%d,%p,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%p): stub\n", iface, This, type,
711           pFrame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, ppWrap);
712
713     return E_NOTIMPL;
714 }
715
716 static HRESULT WINAPI IDirect3DRM2Impl_CreateUserVisual(IDirect3DRM2* iface,
717                                                         D3DRMUSERVISUALCALLBACK cb, LPVOID pArg,
718                                                         LPDIRECT3DRMUSERVISUAL * ppUserVisual)
719 {
720     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
721
722     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, cb, pArg, ppUserVisual);
723
724     return E_NOTIMPL;
725 }
726
727 static HRESULT WINAPI IDirect3DRM2Impl_LoadTexture(IDirect3DRM2* iface, const char * filename,
728                                                    LPDIRECT3DRMTEXTURE2 * ppTexture)
729 {
730     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
731
732     FIXME("(%p/%p)->(%s,%p): stub\n", iface, This, filename, ppTexture);
733
734     return E_NOTIMPL;
735 }
736
737 static HRESULT WINAPI IDirect3DRM2Impl_LoadTextureFromResource(IDirect3DRM2* iface, HMODULE hModule,
738                                                                LPCSTR strName, LPCSTR strType,
739                                                                LPDIRECT3DRMTEXTURE2 * ppTexture)
740 {
741     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
742
743     FIXME("(%p/%p)->(%p,%p,%p,%p): stub\n", iface, This, hModule, strName, strType, ppTexture);
744
745     return E_NOTIMPL;
746 }
747
748 static HRESULT WINAPI IDirect3DRM2Impl_SetSearchPath(IDirect3DRM2* iface, LPCSTR path)
749 {
750     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
751
752     FIXME("(%p/%p)->(%s): stub\n", iface, This, path);
753
754     return E_NOTIMPL;
755 }
756
757 static HRESULT WINAPI IDirect3DRM2Impl_AddSearchPath(IDirect3DRM2* iface, LPCSTR path)
758 {
759     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
760
761     FIXME("(%p/%p)->(%s): stub\n", iface, This, path);
762
763     return E_NOTIMPL;
764 }
765
766 static HRESULT WINAPI IDirect3DRM2Impl_GetSearchPath(IDirect3DRM2* iface, DWORD *size_return,
767                                                      LPSTR path_return)
768 {
769     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
770
771     FIXME("(%p/%p)->(%p,%s): stub\n", iface, This, size_return, path_return);
772
773     return E_NOTIMPL;
774 }
775
776 static HRESULT WINAPI IDirect3DRM2Impl_SetDefaultTextureColors(IDirect3DRM2* iface, DWORD nb_colors)
777 {
778     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
779
780     FIXME("(%p/%p)->(%d): stub\n", iface, This, nb_colors);
781
782     return E_NOTIMPL;
783 }
784
785 static HRESULT WINAPI IDirect3DRM2Impl_SetDefaultTextureShades(IDirect3DRM2* iface, DWORD nb_shades)
786 {
787     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
788
789     FIXME("(%p/%p)->(%d): stub\n", iface, This, nb_shades);
790
791     return E_NOTIMPL;
792 }
793
794 static HRESULT WINAPI IDirect3DRM2Impl_GetDevices(IDirect3DRM2* iface,
795                                                   LPDIRECT3DRMDEVICEARRAY * ppDeviceArray)
796 {
797     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
798
799     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppDeviceArray);
800
801     return E_NOTIMPL;
802 }
803
804 static HRESULT WINAPI IDirect3DRM2Impl_GetNamedObject(IDirect3DRM2* iface, const char * pName,
805                                                       LPDIRECT3DRMOBJECT * ppObject)
806 {
807     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
808
809     FIXME("(%p/%p)->(%s,%p): stub\n", iface, This, pName, ppObject);
810
811     return E_NOTIMPL;
812 }
813
814 static HRESULT WINAPI IDirect3DRM2Impl_EnumerateObjects(IDirect3DRM2* iface, D3DRMOBJECTCALLBACK cb,
815                                                         LPVOID pArg)
816 {
817     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
818
819     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, pArg);
820
821     return E_NOTIMPL;
822 }
823
824 static HRESULT WINAPI IDirect3DRM2Impl_Load(IDirect3DRM2* iface, LPVOID pObjSource, LPVOID pObjID,
825                                             LPIID * ppGUIDs, DWORD nb_GUIDs,
826                                             D3DRMLOADOPTIONS LOFlags, D3DRMLOADCALLBACK LoadProc,
827                                             LPVOID pArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc,
828                                             LPVOID pArgLTP, LPDIRECT3DRMFRAME pParentFrame)
829 {
830     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
831
832     FIXME("(%p/%p)->(%p,%p,%p,%d,%d,%p,%p,%p,%p,%p): stub\n", iface, This, pObjSource, pObjID,
833           ppGUIDs, nb_GUIDs, LOFlags, LoadProc, pArgLP, LoadTextureProc, pArgLTP, pParentFrame);
834
835     return E_NOTIMPL;
836 }
837
838 static HRESULT WINAPI IDirect3DRM2Impl_Tick(IDirect3DRM2* iface, D3DVALUE tick)
839 {
840     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
841
842     FIXME("(%p/%p)->(%f): stub\n", iface, This, tick);
843
844     return E_NOTIMPL;
845 }
846
847 static HRESULT WINAPI IDirect3DRM2Impl_CreateProgressiveMesh(IDirect3DRM2* iface,
848                                                              LPDIRECT3DRMPROGRESSIVEMESH * ppMesh)
849 {
850     IDirect3DRMImpl *This = impl_from_IDirect3DRM2(iface);
851
852     FIXME("(%p/%p)->(%p): stub\n", iface, This, ppMesh);
853
854     return E_NOTIMPL;
855 }
856
857 static const struct IDirect3DRM2Vtbl Direct3DRM2_Vtbl =
858 {
859     IDirect3DRM2Impl_QueryInterface,
860     IDirect3DRM2Impl_AddRef,
861     IDirect3DRM2Impl_Release,
862     IDirect3DRM2Impl_CreateObject,
863     IDirect3DRM2Impl_CreateFrame,
864     IDirect3DRM2Impl_CreateMesh,
865     IDirect3DRM2Impl_CreateMeshBuilder,
866     IDirect3DRM2Impl_CreateFace,
867     IDirect3DRM2Impl_CreateAnimation,
868     IDirect3DRM2Impl_CreateAnimationSet,
869     IDirect3DRM2Impl_CreateTexture,
870     IDirect3DRM2Impl_CreateLight,
871     IDirect3DRM2Impl_CreateLightRGB,
872     IDirect3DRM2Impl_Material,
873     IDirect3DRM2Impl_CreateDevice,
874     IDirect3DRM2Impl_CreateDeviceFromSurface,
875     IDirect3DRM2Impl_CreateDeviceFromD3D,
876     IDirect3DRM2Impl_CreateDeviceFromClipper,
877     IDirect3DRM2Impl_CreateTextureFromSurface,
878     IDirect3DRM2Impl_CreateShadow,
879     IDirect3DRM2Impl_CreateViewport,
880     IDirect3DRM2Impl_CreateWrap,
881     IDirect3DRM2Impl_CreateUserVisual,
882     IDirect3DRM2Impl_LoadTexture,
883     IDirect3DRM2Impl_LoadTextureFromResource,
884     IDirect3DRM2Impl_SetSearchPath,
885     IDirect3DRM2Impl_AddSearchPath,
886     IDirect3DRM2Impl_GetSearchPath,
887     IDirect3DRM2Impl_SetDefaultTextureColors,
888     IDirect3DRM2Impl_SetDefaultTextureShades,
889     IDirect3DRM2Impl_GetDevices,
890     IDirect3DRM2Impl_GetNamedObject,
891     IDirect3DRM2Impl_EnumerateObjects,
892     IDirect3DRM2Impl_Load,
893     IDirect3DRM2Impl_Tick,
894     IDirect3DRM2Impl_CreateProgressiveMesh
895 };
896
897
898 /*** IUnknown methods ***/
899 static HRESULT WINAPI IDirect3DRM3Impl_QueryInterface(IDirect3DRM3* iface, REFIID riid,
900                                                       void** ppvObject)
901 {
902     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
903     return IDirect3DRM_QueryInterface(&This->IDirect3DRM_iface, riid, ppvObject);
904 }
905
906 static ULONG WINAPI IDirect3DRM3Impl_AddRef(IDirect3DRM3* iface)
907 {
908     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
909
910     TRACE("(%p/%p)\n", iface, This);
911
912     return InterlockedIncrement(&This->ref);
913 }
914
915 static ULONG WINAPI IDirect3DRM3Impl_Release(IDirect3DRM3* iface)
916 {
917     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
918     ULONG ref = InterlockedDecrement(&This->ref);
919
920     TRACE("(%p/%p)\n", iface, This);
921
922     if (!ref)
923         HeapFree(GetProcessHeap(), 0, This);
924
925     return ref;
926 }
927
928 /*** IDirect3DRM3 methods ***/
929 static HRESULT WINAPI IDirect3DRM3Impl_CreateObject(IDirect3DRM3* iface, REFCLSID rclsid,
930                                                     LPUNKNOWN unkwn, REFIID riid, LPVOID* object)
931 {
932     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
933
934     FIXME("(%p/%p)->(%s,%p,%s,%p): stub\n", iface, This, debugstr_guid(rclsid), unkwn,
935           debugstr_guid(riid), object);
936
937     return E_NOTIMPL;
938 }
939
940 static HRESULT WINAPI IDirect3DRM3Impl_CreateFrame(IDirect3DRM3* iface,
941                                                    LPDIRECT3DRMFRAME3 FrameParent,
942                                                    LPDIRECT3DRMFRAME3* Frame)
943 {
944     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
945
946     TRACE("(%p/%p)->(%p,%p)\n", iface, This, FrameParent, Frame);
947
948     if (FrameParent)
949         FIXME("(%p/%p): Parent frame not yet supported\n", iface, This);
950
951     return Direct3DRMFrame_create(&IID_IDirect3DRMFrame3, (IUnknown**)Frame);
952 }
953
954 static HRESULT WINAPI IDirect3DRM3Impl_CreateMesh(IDirect3DRM3* iface, LPDIRECT3DRMMESH* Mesh)
955 {
956     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
957
958     FIXME("(%p/%p)->(%p): stub\n", iface, This, Mesh);
959
960     return E_NOTIMPL;
961 }
962
963 static HRESULT WINAPI IDirect3DRM3Impl_CreateMeshBuilder(IDirect3DRM3* iface,
964                                                          LPDIRECT3DRMMESHBUILDER3* ppMeshBuilder)
965 {
966     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
967
968     TRACE("(%p/%p)->(%p)\n", iface, This, ppMeshBuilder);
969
970     return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder3, (IUnknown**)ppMeshBuilder);
971 }
972
973 static HRESULT WINAPI IDirect3DRM3Impl_CreateFace(IDirect3DRM3* iface, LPDIRECT3DRMFACE2* Face)
974 {
975     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
976
977     FIXME("(%p/%p)->(%p): stub\n", iface, This, Face);
978
979     return E_NOTIMPL;
980 }
981
982 static HRESULT WINAPI IDirect3DRM3Impl_CreateAnimation(IDirect3DRM3* iface,
983                                                        LPDIRECT3DRMANIMATION2* Animation)
984 {
985     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
986
987     FIXME("(%p/%p)->(%p): stub\n", iface, This, Animation);
988
989     return E_NOTIMPL;
990 }
991
992 static HRESULT WINAPI IDirect3DRM3Impl_CreateAnimationSet(IDirect3DRM3* iface,
993                                                           LPDIRECT3DRMANIMATIONSET2* AnimationSet)
994 {
995     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
996
997     FIXME("(%p/%p)->(%p): stub\n", iface, This, AnimationSet);
998
999     return E_NOTIMPL;
1000 }
1001
1002 static HRESULT WINAPI IDirect3DRM3Impl_CreateTexture(IDirect3DRM3* iface, LPD3DRMIMAGE Image,
1003                                                      LPDIRECT3DRMTEXTURE3* Texture)
1004 {
1005     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1006
1007     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, Image, Texture);
1008
1009     return E_NOTIMPL;
1010 }
1011
1012 static HRESULT WINAPI IDirect3DRM3Impl_CreateLight(IDirect3DRM3* iface, D3DRMLIGHTTYPE type,
1013                                                    D3DCOLOR color, LPDIRECT3DRMLIGHT* Light)
1014 {
1015     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1016
1017     FIXME("(%p/%p)->(%d,%d,%p): stub\n", iface, This, type, color, Light);
1018
1019     return E_NOTIMPL;
1020 }
1021
1022 static HRESULT WINAPI IDirect3DRM3Impl_CreateLightRGB(IDirect3DRM3* iface, D3DRMLIGHTTYPE type,
1023                                                       D3DVALUE red, D3DVALUE green, D3DVALUE blue,
1024                                                       LPDIRECT3DRMLIGHT* Light)
1025 {
1026     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1027
1028     FIXME("(%p/%p)->(%d,%f,%f,%f,%p): stub\n", iface, This, type, red, green, blue, Light);
1029
1030     return E_NOTIMPL;
1031 }
1032
1033 static HRESULT WINAPI IDirect3DRM3Impl_Material(IDirect3DRM3* iface, D3DVALUE m,
1034                                                 LPDIRECT3DRMMATERIAL2* Material)
1035 {
1036     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1037
1038     FIXME("(%p/%p)->(%f,%p): stub\n", iface, This, m, Material);
1039
1040     return E_NOTIMPL;
1041 }
1042
1043 static HRESULT WINAPI IDirect3DRM3Impl_CreateDevice(IDirect3DRM3* iface, DWORD width, DWORD height,
1044                                                     LPDIRECT3DRMDEVICE3* device)
1045 {
1046     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1047
1048     FIXME("(%p/%p)->(%d,%d,%p): stub\n", iface, This, width, height, device);
1049
1050     return E_NOTIMPL;
1051 }
1052
1053 static HRESULT WINAPI IDirect3DRM3Impl_CreateDeviceFromSurface(IDirect3DRM3* iface, LPGUID pGUID,
1054                                                                LPDIRECTDRAW dd,
1055                                                                LPDIRECTDRAWSURFACE back,
1056                                                                LPDIRECT3DRMDEVICE3* device)
1057 {
1058     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1059
1060     FIXME("(%p/%p)->(%s,%p,%p,%p): stub\n", iface, This, debugstr_guid(pGUID), dd, back, device);
1061
1062     return E_NOTIMPL;
1063 }
1064
1065 static HRESULT WINAPI IDirect3DRM3Impl_CreateDeviceFromD3D(IDirect3DRM3* iface, LPDIRECT3D2 d3d,
1066                                                            LPDIRECT3DDEVICE2 d3ddev,
1067                                                            LPDIRECT3DRMDEVICE3* device)
1068 {
1069     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1070
1071     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, d3d, d3ddev, device);
1072
1073     return E_NOTIMPL;
1074 }
1075
1076 static HRESULT WINAPI IDirect3DRM3Impl_CreateDeviceFromClipper(IDirect3DRM3* iface,
1077                                                                LPDIRECTDRAWCLIPPER clipper,
1078                                                                LPGUID GUID, int width, int height,
1079                                                                LPDIRECT3DRMDEVICE3* device)
1080 {
1081     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1082
1083     FIXME("(%p/%p)->(%p,%s,%d,%d,%p): stub\n", iface, This, clipper, debugstr_guid(GUID),
1084           width, height, device);
1085
1086     return E_NOTIMPL;
1087 }
1088
1089 static HRESULT WINAPI IDirect3DRM3Impl_CreateShadow(IDirect3DRM3* iface, LPUNKNOWN Visual1,
1090                                                     LPDIRECT3DRMLIGHT Light, D3DVALUE px,
1091                                                     D3DVALUE py, D3DVALUE pz, D3DVALUE nx,
1092                                                     D3DVALUE ny, D3DVALUE nz,
1093                                                     LPDIRECT3DRMSHADOW2* Visual2)
1094 {
1095     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1096
1097     FIXME("(%p/%p)->(%p,%p,%f,%f,%f,%f,%f,%f,%p): stub\n", iface, This, Visual1, Light, px, py, pz,
1098           nx, ny, nz, Visual2);
1099
1100     return E_NOTIMPL;
1101 }
1102
1103 static HRESULT WINAPI IDirect3DRM3Impl_CreateTextureFromSurface(IDirect3DRM3* iface,
1104                                                                 LPDIRECTDRAWSURFACE surface,
1105                                                                 LPDIRECT3DRMTEXTURE3* texture)
1106 {
1107     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1108
1109     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, surface, texture);
1110
1111     return E_NOTIMPL;
1112 }
1113
1114 static HRESULT WINAPI IDirect3DRM3Impl_CreateViewport(IDirect3DRM3* iface,
1115                                                       LPDIRECT3DRMDEVICE3 Device,
1116                                                       LPDIRECT3DRMFRAME3 frame, DWORD xpos,
1117                                                       DWORD ypos, DWORD width, DWORD height,
1118                                                       LPDIRECT3DRMVIEWPORT2* viewport)
1119 {
1120     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1121
1122     FIXME("(%p/%p)->(%p,%p,%d,%d,%d,%d,%p): stub\n", iface, This, Device, frame, xpos, ypos, width,
1123           height, viewport);
1124
1125     return E_NOTIMPL;
1126 }
1127
1128 static HRESULT WINAPI IDirect3DRM3Impl_CreateWrap(IDirect3DRM3* iface, D3DRMWRAPTYPE type,
1129                                                   LPDIRECT3DRMFRAME3 frame,
1130                                                   D3DVALUE ox, D3DVALUE oy, D3DVALUE oz,
1131                                                   D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1132                                                   D3DVALUE ux, D3DVALUE uy, D3DVALUE uz,
1133                                                   D3DVALUE ou, D3DVALUE ov, D3DVALUE su,
1134                                                   D3DVALUE sv, LPDIRECT3DRMWRAP* wrap)
1135 {
1136     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1137
1138     FIXME("(%p/%p)->(%d,%p,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%p): stub\n", iface, This, type,
1139           frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
1140
1141     return E_NOTIMPL;
1142 }
1143
1144 static HRESULT WINAPI IDirect3DRM3Impl_CreateUserVisual(IDirect3DRM3* iface,
1145                                                         D3DRMUSERVISUALCALLBACK cb, LPVOID arg,
1146                                                         LPDIRECT3DRMUSERVISUAL* UserVisual)
1147 {
1148     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1149
1150     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, cb, arg, UserVisual);
1151
1152     return E_NOTIMPL;
1153 }
1154
1155 static HRESULT WINAPI IDirect3DRM3Impl_LoadTexture(IDirect3DRM3* iface, const char* filename,
1156                                                    LPDIRECT3DRMTEXTURE3* Texture)
1157 {
1158     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1159
1160     FIXME("(%p/%p)->(%s,%p): stub\n", iface, This, filename, Texture);
1161
1162     return E_NOTIMPL;
1163 }
1164
1165 static HRESULT WINAPI IDirect3DRM3Impl_LoadTextureFromResource(IDirect3DRM3* iface, HMODULE mod,
1166                                                                LPCSTR strName, LPCSTR strType,
1167                                                                LPDIRECT3DRMTEXTURE3 * ppTexture)
1168 {
1169     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1170
1171     FIXME("(%p/%p)->(%p,%p,%p,%p): stub\n", iface, This, mod, strName, strType, ppTexture);
1172
1173     return E_NOTIMPL;
1174 }
1175
1176 static HRESULT WINAPI IDirect3DRM3Impl_SetSearchPath(IDirect3DRM3* iface, LPCSTR path)
1177 {
1178     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1179
1180     FIXME("(%p/%p)->(%s): stub\n", iface, This, path);
1181
1182     return E_NOTIMPL;
1183 }
1184
1185 static HRESULT WINAPI IDirect3DRM3Impl_AddSearchPath(IDirect3DRM3* iface, LPCSTR path)
1186 {
1187     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1188
1189     FIXME("(%p/%p)->(%s): stub\n", iface, This, path);
1190
1191     return E_NOTIMPL;
1192 }
1193
1194 static HRESULT WINAPI IDirect3DRM3Impl_GetSearchPath(IDirect3DRM3* iface, DWORD* size_return,
1195                                                      LPSTR path_return)
1196 {
1197     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1198
1199     FIXME("(%p/%p)->(%p,%s): stub\n", iface, This, size_return, path_return);
1200
1201     return E_NOTIMPL;
1202 }
1203
1204 static HRESULT WINAPI IDirect3DRM3Impl_SetDefaultTextureColors(IDirect3DRM3* iface, DWORD nb_colors)
1205 {
1206     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1207
1208     FIXME("(%p/%p)->(%d): stub\n", iface, This, nb_colors);
1209
1210     return E_NOTIMPL;
1211 }
1212
1213 static HRESULT WINAPI IDirect3DRM3Impl_SetDefaultTextureShades(IDirect3DRM3* iface, DWORD nb_shades)
1214 {
1215     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1216
1217     FIXME("(%p/%p)->(%d): stub\n", iface, This, nb_shades);
1218
1219     return E_NOTIMPL;
1220 }
1221
1222 static HRESULT WINAPI IDirect3DRM3Impl_GetDevices(IDirect3DRM3* iface,
1223                                                   LPDIRECT3DRMDEVICEARRAY* DeviceArray)
1224 {
1225     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1226
1227     FIXME("(%p/%p)->(%p): stub\n", iface, This, DeviceArray);
1228
1229     return E_NOTIMPL;
1230 }
1231
1232 static HRESULT WINAPI IDirect3DRM3Impl_GetNamedObject(IDirect3DRM3* iface, const char* Name,
1233                                                       LPDIRECT3DRMOBJECT* Object)
1234 {
1235     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1236
1237     FIXME("(%p/%p)->(%s,%p): stub\n", iface, This, Name, Object);
1238
1239     return E_NOTIMPL;
1240 }
1241
1242 static HRESULT WINAPI IDirect3DRM3Impl_EnumerateObjects(IDirect3DRM3* iface, D3DRMOBJECTCALLBACK cb,
1243                                                         LPVOID arg)
1244 {
1245     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1246
1247     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, arg);
1248
1249     return E_NOTIMPL;
1250 }
1251
1252 static HRESULT WINAPI IDirect3DRM3Impl_Load(IDirect3DRM3* iface, LPVOID ObjSource, LPVOID ObjID,
1253                                             LPIID* GUIDs, DWORD nb_GUIDs, D3DRMLOADOPTIONS LOFlags,
1254                                             D3DRMLOADCALLBACK LoadProc, LPVOID ArgLP,
1255                                             D3DRMLOADTEXTURECALLBACK LoadTextureProc, LPVOID ArgLTP,
1256                                             LPDIRECT3DRMFRAME3 ParentFrame)
1257 {
1258     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1259
1260     FIXME("(%p/%p)->(%p,%p,%p,%d,%d,%p,%p,%p,%p,%p): stub\n", iface, This, ObjSource, ObjID, GUIDs,
1261           nb_GUIDs, LOFlags, LoadProc, ArgLP, LoadTextureProc, ArgLTP, ParentFrame);
1262
1263     return E_NOTIMPL;
1264 }
1265
1266 static HRESULT WINAPI IDirect3DRM3Impl_Tick(IDirect3DRM3* iface, D3DVALUE tick)
1267 {
1268     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1269
1270     FIXME("(%p/%p)->(%f): stub\n", iface, This, tick);
1271
1272     return E_NOTIMPL;
1273 }
1274
1275 static HRESULT WINAPI IDirect3DRM3Impl_CreateProgressiveMesh(IDirect3DRM3* iface,
1276                                                              LPDIRECT3DRMPROGRESSIVEMESH Mesh)
1277 {
1278     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1279
1280     FIXME("(%p/%p)->(%p): stub\n", iface, This, Mesh);
1281
1282     return E_NOTIMPL;
1283 }
1284
1285 static HRESULT WINAPI IDirect3DRM3Impl_RegisterClient(IDirect3DRM3* iface, REFGUID rguid,
1286                                                       LPDWORD id)
1287 {
1288     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1289
1290     FIXME("(%p/%p)->(%s, %p): stub\n", iface, This, debugstr_guid(rguid), id);
1291
1292     return E_NOTIMPL;
1293 }
1294
1295 static HRESULT WINAPI IDirect3DRM3Impl_UnregisterClient(IDirect3DRM3* iface, REFGUID rguid)
1296 {
1297     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1298
1299     FIXME("(%p/%p)->(%s): stub\n", iface, This, debugstr_guid(rguid));
1300
1301     return E_NOTIMPL;
1302 }
1303
1304 static HRESULT WINAPI IDirect3DRM3Impl_CreateClippedVisual(IDirect3DRM3* iface,
1305                                                            LPDIRECT3DRMVISUAL vis,
1306                                                            LPDIRECT3DRMCLIPPEDVISUAL* clippedvis)
1307 {
1308     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1309
1310     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, vis, clippedvis);
1311
1312     return E_NOTIMPL;
1313 }
1314
1315 static HRESULT WINAPI IDirect3DRM3Impl_SetOptions(IDirect3DRM3* iface, DWORD opt)
1316 {
1317     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1318
1319     FIXME("(%p/%p)->(%d): stub\n", iface, This, opt);
1320
1321     return E_NOTIMPL;
1322 }
1323
1324 static HRESULT WINAPI IDirect3DRM3Impl_GetOptions(IDirect3DRM3* iface, LPDWORD opt)
1325 {
1326     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1327
1328     FIXME("(%p/%p)->(%p): stub\n", iface, This, opt);
1329
1330     return E_NOTIMPL;
1331 }
1332
1333 static const struct IDirect3DRM3Vtbl Direct3DRM3_Vtbl =
1334 {
1335     IDirect3DRM3Impl_QueryInterface,
1336     IDirect3DRM3Impl_AddRef,
1337     IDirect3DRM3Impl_Release,
1338     IDirect3DRM3Impl_CreateObject,
1339     IDirect3DRM3Impl_CreateFrame,
1340     IDirect3DRM3Impl_CreateMesh,
1341     IDirect3DRM3Impl_CreateMeshBuilder,
1342     IDirect3DRM3Impl_CreateFace,
1343     IDirect3DRM3Impl_CreateAnimation,
1344     IDirect3DRM3Impl_CreateAnimationSet,
1345     IDirect3DRM3Impl_CreateTexture,
1346     IDirect3DRM3Impl_CreateLight,
1347     IDirect3DRM3Impl_CreateLightRGB,
1348     IDirect3DRM3Impl_Material,
1349     IDirect3DRM3Impl_CreateDevice,
1350     IDirect3DRM3Impl_CreateDeviceFromSurface,
1351     IDirect3DRM3Impl_CreateDeviceFromD3D,
1352     IDirect3DRM3Impl_CreateDeviceFromClipper,
1353     IDirect3DRM3Impl_CreateTextureFromSurface,
1354     IDirect3DRM3Impl_CreateShadow,
1355     IDirect3DRM3Impl_CreateViewport,
1356     IDirect3DRM3Impl_CreateWrap,
1357     IDirect3DRM3Impl_CreateUserVisual,
1358     IDirect3DRM3Impl_LoadTexture,
1359     IDirect3DRM3Impl_LoadTextureFromResource,
1360     IDirect3DRM3Impl_SetSearchPath,
1361     IDirect3DRM3Impl_AddSearchPath,
1362     IDirect3DRM3Impl_GetSearchPath,
1363     IDirect3DRM3Impl_SetDefaultTextureColors,
1364     IDirect3DRM3Impl_SetDefaultTextureShades,
1365     IDirect3DRM3Impl_GetDevices,
1366     IDirect3DRM3Impl_GetNamedObject,
1367     IDirect3DRM3Impl_EnumerateObjects,
1368     IDirect3DRM3Impl_Load,
1369     IDirect3DRM3Impl_Tick,
1370     IDirect3DRM3Impl_CreateProgressiveMesh,
1371     IDirect3DRM3Impl_RegisterClient,
1372     IDirect3DRM3Impl_UnregisterClient,
1373     IDirect3DRM3Impl_CreateClippedVisual,
1374     IDirect3DRM3Impl_SetOptions,
1375     IDirect3DRM3Impl_GetOptions
1376 };