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