mshtml: Added better IHTMLWindow2::get_opener stub.
[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     }
1281     else
1282     {
1283         FIXME("Load options %d not supported yet\n", LOFlags);
1284         return E_NOTIMPL;
1285     }
1286
1287     hr = DirectXFileCreate(&pDXFile);
1288     if (hr != DXFILE_OK)
1289         goto end;
1290
1291     hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates));
1292     if (hr != DXFILE_OK)
1293         goto end;
1294
1295     hr = IDirectXFile_CreateEnumObject(pDXFile, ObjSource, load_options, &pEnumObject);
1296     if (hr != DXFILE_OK)
1297         goto end;
1298
1299     hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
1300     if (hr != DXFILE_OK)
1301         goto end;
1302
1303     hr = IDirectXFileData_GetType(pData, &pGuid);
1304     if (hr != DXFILE_OK)
1305         goto end;
1306
1307     TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1308
1309     if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
1310     {
1311         ret = D3DRMERR_BADFILE;
1312         goto end;
1313     }
1314
1315     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
1316     if ((hr != DXFILE_OK) || (size != sizeof(Header)))
1317         goto end;
1318
1319     TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
1320
1321     /* Version must be 1.0.x */
1322     if ((pHeader->major != 1) || (pHeader->minor != 0))
1323     {
1324         ret = D3DRMERR_BADFILE;
1325         goto end;
1326     }
1327
1328     IDirectXFileData_Release(pData);
1329     pData = NULL;
1330
1331     while (1)
1332     {
1333         hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
1334         if (hr == DXFILEERR_NOMOREOBJECTS)
1335         {
1336             TRACE("No more object\n");
1337             break;
1338         }
1339         else if (hr != DXFILE_OK)
1340         {
1341             ret = D3DRMERR_NOTFOUND;
1342             goto end;
1343         }
1344
1345         hr = IDirectXFileData_GetType(pData, &pGuid);
1346         if (hr != DXFILE_OK)
1347             goto end;
1348
1349         TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1350
1351         if (IsEqualGUID(pGuid, &TID_D3DRMMesh))
1352         {
1353             BOOL requested = FALSE;
1354             HRESULT hr;
1355             LPDIRECT3DRMMESHBUILDER3 pMeshBuilder;
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                     requested = TRUE;
1364
1365             if (requested)
1366             {
1367                 FIXME("Load mesh data and notify application\n");
1368
1369                 hr = IDirect3DRM3_CreateMeshBuilder(iface, &pMeshBuilder);
1370                 if (SUCCEEDED(hr))
1371                 {
1372                     LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3;
1373
1374                     hr = IDirect3DRMMeshBuilder3_QueryInterface(pMeshBuilder, &IID_IDirect3DRMMeshBuilder3, (void**)&pMeshBuilder3);
1375                     if (SUCCEEDED(hr))
1376                     {
1377                         hr = load_mesh_data(pMeshBuilder3, pData);
1378                         IDirect3DRMMeshBuilder3_Release(pMeshBuilder3);
1379                     }
1380                     if (SUCCEEDED(hr))
1381                         LoadProc((LPDIRECT3DRMOBJECT)pMeshBuilder3, &IID_IDirect3DRMMeshBuilder, ArgLP);
1382                     IDirect3DRMMeshBuilder_Release(pMeshBuilder3);
1383                 }
1384
1385                 if (FAILED(hr))
1386                     ERR("Cannot process mesh\n");
1387             }
1388         }
1389         else if (IsEqualGUID(pGuid, &TID_D3DRMFrame))
1390         {
1391             BOOL requested = FALSE;
1392             HRESULT hr;
1393             LPDIRECT3DRMFRAME3 frame;
1394
1395             TRACE("Found TID_D3DRMFrame\n");
1396
1397             for (i = 0; i < nb_GUIDs; i++)
1398                 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
1399                     IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
1400                     IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
1401                     requested = TRUE;
1402
1403             if (requested)
1404             {
1405                 FIXME("Fake frame data and notify application\n");
1406
1407                 hr = IDirect3DRM3_CreateFrame(iface, NULL, &frame);
1408                 if (SUCCEEDED(hr))
1409                 {
1410                     LoadProc((LPDIRECT3DRMOBJECT)frame, &IID_IDirect3DRMFrame, ArgLP);
1411                     IDirect3DRMFrame3_Release(frame);
1412                 }
1413
1414                 if (FAILED(hr))
1415                     ERR("Cannot process mesh\n");
1416
1417             }
1418         }
1419         else if (IsEqualGUID(pGuid, &TID_D3DRMMaterial))
1420         {
1421             BOOL requested = FALSE;
1422
1423             TRACE("Found TID_D3DRMMaterial\n");
1424
1425             for (i = 0; i < nb_GUIDs; i++)
1426                 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMaterial) ||
1427                     IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMaterial2))
1428                     requested = TRUE;
1429
1430             if (requested)
1431             {
1432                 FIXME("Processing material not supported yet\n");
1433             }
1434         }
1435         else
1436         {
1437             FIXME("Found unknown TID %s\n", debugstr_guid(pGuid));
1438         }
1439         IDirectXFileData_Release(pData);
1440         pData = NULL;
1441     }
1442
1443     ret = D3DRM_OK;
1444
1445 end:
1446     if (pData)
1447         IDirectXFileData_Release(pData);
1448     if (pEnumObject)
1449         IDirectXFileEnumObject_Release(pEnumObject);
1450     if (pDXFile)
1451         IDirectXFile_Release(pDXFile);
1452
1453     return ret;
1454
1455     return E_NOTIMPL;
1456 }
1457
1458 static HRESULT WINAPI IDirect3DRM3Impl_Tick(IDirect3DRM3* iface, D3DVALUE tick)
1459 {
1460     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1461
1462     FIXME("(%p/%p)->(%f): stub\n", iface, This, tick);
1463
1464     return E_NOTIMPL;
1465 }
1466
1467 static HRESULT WINAPI IDirect3DRM3Impl_CreateProgressiveMesh(IDirect3DRM3* iface,
1468                                                              LPDIRECT3DRMPROGRESSIVEMESH Mesh)
1469 {
1470     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1471
1472     FIXME("(%p/%p)->(%p): stub\n", iface, This, Mesh);
1473
1474     return E_NOTIMPL;
1475 }
1476
1477 static HRESULT WINAPI IDirect3DRM3Impl_RegisterClient(IDirect3DRM3* iface, REFGUID rguid,
1478                                                       LPDWORD id)
1479 {
1480     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1481
1482     FIXME("(%p/%p)->(%s, %p): stub\n", iface, This, debugstr_guid(rguid), id);
1483
1484     return E_NOTIMPL;
1485 }
1486
1487 static HRESULT WINAPI IDirect3DRM3Impl_UnregisterClient(IDirect3DRM3* iface, REFGUID rguid)
1488 {
1489     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1490
1491     FIXME("(%p/%p)->(%s): stub\n", iface, This, debugstr_guid(rguid));
1492
1493     return E_NOTIMPL;
1494 }
1495
1496 static HRESULT WINAPI IDirect3DRM3Impl_CreateClippedVisual(IDirect3DRM3* iface,
1497                                                            LPDIRECT3DRMVISUAL vis,
1498                                                            LPDIRECT3DRMCLIPPEDVISUAL* clippedvis)
1499 {
1500     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1501
1502     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, vis, clippedvis);
1503
1504     return E_NOTIMPL;
1505 }
1506
1507 static HRESULT WINAPI IDirect3DRM3Impl_SetOptions(IDirect3DRM3* iface, DWORD opt)
1508 {
1509     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1510
1511     FIXME("(%p/%p)->(%d): stub\n", iface, This, opt);
1512
1513     return E_NOTIMPL;
1514 }
1515
1516 static HRESULT WINAPI IDirect3DRM3Impl_GetOptions(IDirect3DRM3* iface, LPDWORD opt)
1517 {
1518     IDirect3DRMImpl *This = impl_from_IDirect3DRM3(iface);
1519
1520     FIXME("(%p/%p)->(%p): stub\n", iface, This, opt);
1521
1522     return E_NOTIMPL;
1523 }
1524
1525 static const struct IDirect3DRM3Vtbl Direct3DRM3_Vtbl =
1526 {
1527     IDirect3DRM3Impl_QueryInterface,
1528     IDirect3DRM3Impl_AddRef,
1529     IDirect3DRM3Impl_Release,
1530     IDirect3DRM3Impl_CreateObject,
1531     IDirect3DRM3Impl_CreateFrame,
1532     IDirect3DRM3Impl_CreateMesh,
1533     IDirect3DRM3Impl_CreateMeshBuilder,
1534     IDirect3DRM3Impl_CreateFace,
1535     IDirect3DRM3Impl_CreateAnimation,
1536     IDirect3DRM3Impl_CreateAnimationSet,
1537     IDirect3DRM3Impl_CreateTexture,
1538     IDirect3DRM3Impl_CreateLight,
1539     IDirect3DRM3Impl_CreateLightRGB,
1540     IDirect3DRM3Impl_Material,
1541     IDirect3DRM3Impl_CreateDevice,
1542     IDirect3DRM3Impl_CreateDeviceFromSurface,
1543     IDirect3DRM3Impl_CreateDeviceFromD3D,
1544     IDirect3DRM3Impl_CreateDeviceFromClipper,
1545     IDirect3DRM3Impl_CreateTextureFromSurface,
1546     IDirect3DRM3Impl_CreateShadow,
1547     IDirect3DRM3Impl_CreateViewport,
1548     IDirect3DRM3Impl_CreateWrap,
1549     IDirect3DRM3Impl_CreateUserVisual,
1550     IDirect3DRM3Impl_LoadTexture,
1551     IDirect3DRM3Impl_LoadTextureFromResource,
1552     IDirect3DRM3Impl_SetSearchPath,
1553     IDirect3DRM3Impl_AddSearchPath,
1554     IDirect3DRM3Impl_GetSearchPath,
1555     IDirect3DRM3Impl_SetDefaultTextureColors,
1556     IDirect3DRM3Impl_SetDefaultTextureShades,
1557     IDirect3DRM3Impl_GetDevices,
1558     IDirect3DRM3Impl_GetNamedObject,
1559     IDirect3DRM3Impl_EnumerateObjects,
1560     IDirect3DRM3Impl_Load,
1561     IDirect3DRM3Impl_Tick,
1562     IDirect3DRM3Impl_CreateProgressiveMesh,
1563     IDirect3DRM3Impl_RegisterClient,
1564     IDirect3DRM3Impl_UnregisterClient,
1565     IDirect3DRM3Impl_CreateClippedVisual,
1566     IDirect3DRM3Impl_SetOptions,
1567     IDirect3DRM3Impl_GetOptions
1568 };
1569
1570 HRESULT Direct3DRM_create(IUnknown** ppObj)
1571 {
1572     IDirect3DRMImpl* object;
1573
1574     TRACE("(%p)\n", ppObj);
1575
1576     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMImpl));
1577     if (!object)
1578     {
1579         ERR("Out of memory\n");
1580         return E_OUTOFMEMORY;
1581     }
1582
1583     object->IDirect3DRM_iface.lpVtbl = &Direct3DRM_Vtbl;
1584     object->IDirect3DRM2_iface.lpVtbl = &Direct3DRM2_Vtbl;
1585     object->IDirect3DRM3_iface.lpVtbl = &Direct3DRM3_Vtbl;
1586     object->ref = 1;
1587
1588     *ppObj = (IUnknown*)&object->IDirect3DRM_iface;
1589
1590     return S_OK;
1591 }