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