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