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