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