d3drm: Fix viewport object creation.
[wine.git] / dlls / d3drm / d3drm.c
blob8d054b5fdb7ac9d0ec9171b3b60be4bcc5aa567d
1 /*
2 * Implementation of IDirect3DRM Interface
4 * Copyright 2010, 2012 Christian Costa
5 * Copyright 2011 André Hentschel
6 * Copyright 2016 Aaryaman Vasishta
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/debug.h"
25 #define COBJMACROS
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "dxfile.h"
30 #include "rmxfguid.h"
32 #include "d3drm_private.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
36 static const char* get_IID_string(const GUID* guid)
38 if (IsEqualGUID(guid, &IID_IDirect3DRMFrame))
39 return "IID_IDirect3DRMFrame";
40 else if (IsEqualGUID(guid, &IID_IDirect3DRMFrame2))
41 return "IID_IDirect3DRMFrame2";
42 else if (IsEqualGUID(guid, &IID_IDirect3DRMFrame3))
43 return "IID_IDirect3DRMFrame3";
44 else if (IsEqualGUID(guid, &IID_IDirect3DRMMeshBuilder))
45 return "IID_IDirect3DRMMeshBuilder";
46 else if (IsEqualGUID(guid, &IID_IDirect3DRMMeshBuilder2))
47 return "IID_IDirect3DRMMeshBuilder2";
48 else if (IsEqualGUID(guid, &IID_IDirect3DRMMeshBuilder3))
49 return "IID_IDirect3DRMMeshBuilder3";
51 return "?";
54 struct d3drm
56 IDirect3DRM IDirect3DRM_iface;
57 IDirect3DRM2 IDirect3DRM2_iface;
58 IDirect3DRM3 IDirect3DRM3_iface;
59 LONG ref1, ref2, ref3, iface_count;
62 static inline struct d3drm *impl_from_IDirect3DRM(IDirect3DRM *iface)
64 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM_iface);
67 static inline struct d3drm *impl_from_IDirect3DRM2(IDirect3DRM2 *iface)
69 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM2_iface);
72 static inline struct d3drm *impl_from_IDirect3DRM3(IDirect3DRM3 *iface)
74 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM3_iface);
77 static void d3drm_destroy(struct d3drm *d3drm)
79 HeapFree(GetProcessHeap(), 0, d3drm);
80 TRACE("d3drm object %p is being destroyed.\n", d3drm);
83 static HRESULT WINAPI d3drm1_QueryInterface(IDirect3DRM *iface, REFIID riid, void **out)
85 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
87 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
89 if (IsEqualGUID(riid, &IID_IDirect3DRM)
90 || IsEqualGUID(riid, &IID_IUnknown))
92 *out = &d3drm->IDirect3DRM_iface;
94 else if (IsEqualGUID(riid, &IID_IDirect3DRM2))
96 *out = &d3drm->IDirect3DRM2_iface;
98 else if (IsEqualGUID(riid, &IID_IDirect3DRM3))
100 *out = &d3drm->IDirect3DRM3_iface;
102 else
104 *out = NULL;
105 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid));
106 return CLASS_E_CLASSNOTAVAILABLE;
109 IUnknown_AddRef((IUnknown *)*out);
110 return S_OK;
113 static ULONG WINAPI d3drm1_AddRef(IDirect3DRM *iface)
115 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
116 ULONG refcount = InterlockedIncrement(&d3drm->ref1);
118 TRACE("%p increasing refcount to %u.\n", iface, refcount);
120 if (refcount == 1)
121 InterlockedIncrement(&d3drm->iface_count);
123 return refcount;
126 static ULONG WINAPI d3drm1_Release(IDirect3DRM *iface)
128 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
129 ULONG refcount = InterlockedDecrement(&d3drm->ref1);
131 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
133 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
134 d3drm_destroy(d3drm);
136 return refcount;
139 static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
140 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
142 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
144 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
145 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
147 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
150 static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
151 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame **frame)
153 struct d3drm_frame *object;
154 HRESULT hr;
156 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
158 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, iface)))
159 return hr;
161 *frame = &object->IDirect3DRMFrame_iface;
163 return D3DRM_OK;
166 static HRESULT WINAPI d3drm1_CreateMesh(IDirect3DRM *iface, IDirect3DRMMesh **mesh)
168 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
170 TRACE("iface %p, mesh %p.\n", iface, mesh);
172 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
175 static HRESULT WINAPI d3drm1_CreateMeshBuilder(IDirect3DRM *iface, IDirect3DRMMeshBuilder **mesh_builder)
177 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
179 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder, (IUnknown **)mesh_builder);
182 static HRESULT WINAPI d3drm1_CreateFace(IDirect3DRM *iface, IDirect3DRMFace **face)
184 TRACE("iface %p, face %p.\n", iface, face);
186 return Direct3DRMFace_create(&IID_IDirect3DRMFace, (IUnknown **)face);
189 static HRESULT WINAPI d3drm1_CreateAnimation(IDirect3DRM *iface, IDirect3DRMAnimation **animation)
191 FIXME("iface %p, animation %p stub!\n", iface, animation);
193 return E_NOTIMPL;
196 static HRESULT WINAPI d3drm1_CreateAnimationSet(IDirect3DRM *iface, IDirect3DRMAnimationSet **set)
198 FIXME("iface %p, set %p stub!\n", iface, set);
200 return E_NOTIMPL;
203 static HRESULT WINAPI d3drm1_CreateTexture(IDirect3DRM *iface,
204 D3DRMIMAGE *image, IDirect3DRMTexture **texture)
206 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
207 IDirect3DRMTexture3 *texture3;
208 HRESULT hr;
210 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
212 if (!texture)
213 return D3DRMERR_BADVALUE;
215 if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
217 *texture = NULL;
218 return hr;
221 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture);
222 IDirect3DRMTexture3_Release(texture3);
224 return hr;
227 static HRESULT WINAPI d3drm1_CreateLight(IDirect3DRM *iface,
228 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
230 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
232 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
234 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
237 static HRESULT WINAPI d3drm1_CreateLightRGB(IDirect3DRM *iface, D3DRMLIGHTTYPE type,
238 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
240 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
242 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
243 iface, type, red, green, blue, light);
245 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
248 static HRESULT WINAPI d3drm1_CreateMaterial(IDirect3DRM *iface,
249 D3DVALUE power, IDirect3DRMMaterial **material)
251 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
253 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
255 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
258 static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
259 DWORD width, DWORD height, IDirect3DRMDevice **device)
261 struct d3drm_device *object;
262 HRESULT hr;
263 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
265 hr = d3drm_device_create(&object);
266 if (FAILED(hr))
267 return hr;
269 *device = IDirect3DRMDevice_from_impl(object);
271 return D3DRM_OK;
274 static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid,
275 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device)
277 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
278 struct d3drm_device *object;
279 HRESULT hr;
281 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
282 iface, debugstr_guid(guid), ddraw, backbuffer, device);
284 if (!device)
285 return D3DRMERR_BADVALUE;
286 *device = NULL;
288 if (!backbuffer || !ddraw)
289 return D3DRMERR_BADDEVICE;
291 hr = d3drm_device_create(&object);
292 if (FAILED(hr))
293 return hr;
295 hr = d3drm_device_init(object, 1, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, TRUE);
296 if (SUCCEEDED(hr))
297 *device = IDirect3DRMDevice_from_impl(object);
298 else
299 d3drm_device_destroy(object);
301 return hr;
304 static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface,
305 IDirect3D *d3d, IDirect3DDevice *d3d_device, IDirect3DRMDevice **device)
307 struct d3drm_device *object;
308 HRESULT hr;
309 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
310 iface, d3d, d3d_device, device);
312 if (!device)
313 return D3DRMERR_BADVALUE;
314 *device = NULL;
315 if (!d3d || !d3d_device)
316 return D3DRMERR_BADVALUE;
318 hr = d3drm_device_create(&object);
319 if (FAILED(hr))
320 return hr;
322 hr = d3drm_device_set_ddraw_device_d3d(object, iface, d3d, d3d_device);
323 if (FAILED(hr))
325 d3drm_device_destroy(object);
326 return hr;
328 *device = IDirect3DRMDevice_from_impl(object);
330 return D3DRM_OK;
333 static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
334 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
335 IDirect3DRMDevice **device)
337 struct d3drm_device *object;
338 IDirectDraw *ddraw;
339 IDirectDrawSurface *render_target;
340 HRESULT hr;
342 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
343 iface, clipper, debugstr_guid(guid), width, height, device);
345 if (!device)
346 return D3DRMERR_BADVALUE;
347 *device = NULL;
349 if (!clipper || !width || !height)
350 return D3DRMERR_BADVALUE;
352 hr = DirectDrawCreate(NULL, &ddraw, NULL);
353 if (FAILED(hr))
354 return hr;
356 hr = d3drm_device_create(&object);
357 if (FAILED(hr))
359 IDirectDraw_Release(ddraw);
360 return hr;
363 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
364 if (FAILED(hr))
366 IDirectDraw_Release(ddraw);
367 d3drm_device_destroy(object);
368 return hr;
371 hr = d3drm_device_init(object, 1, iface, ddraw, render_target, TRUE);
372 IDirectDraw_Release(ddraw);
373 IDirectDrawSurface_Release(render_target);
374 if (FAILED(hr))
375 d3drm_device_destroy(object);
376 else
377 *device = IDirect3DRMDevice_from_impl(object);
379 return hr;
382 static HRESULT WINAPI d3drm1_CreateTextureFromSurface(IDirect3DRM *iface,
383 IDirectDrawSurface *surface, IDirect3DRMTexture **texture)
385 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
387 return E_NOTIMPL;
390 static HRESULT WINAPI d3drm1_CreateShadow(IDirect3DRM *iface, IDirect3DRMVisual *visual,
391 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
392 IDirect3DRMVisual **shadow)
394 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
395 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
397 return E_NOTIMPL;
400 static HRESULT WINAPI d3drm1_CreateViewport(IDirect3DRM *iface, IDirect3DRMDevice *device,
401 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
403 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
405 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
406 iface, device, camera, x, y, width, height, viewport);
408 return IDirect3DRM2_CreateViewport(&d3drm->IDirect3DRM2_iface, device, camera, x, y, width, height, viewport);
411 static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
412 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
413 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
414 IDirect3DRMWrap **wrap)
416 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
417 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
418 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
420 return E_NOTIMPL;
423 static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface,
424 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
426 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface, cb, ctx, visual);
428 return E_NOTIMPL;
431 static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface,
432 const char *filename, IDirect3DRMTexture **texture)
434 struct d3drm_texture *object;
435 HRESULT hr;
437 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
439 if (FAILED(hr = d3drm_texture_create(&object, iface)))
440 return hr;
442 *texture = &object->IDirect3DRMTexture_iface;
444 return D3DRM_OK;
447 static HRESULT WINAPI d3drm1_LoadTextureFromResource(IDirect3DRM *iface,
448 HRSRC resource, IDirect3DRMTexture **texture)
450 struct d3drm_texture *object;
451 HRESULT hr;
453 FIXME("iface %p, resource %p, texture %p stub!\n", iface, resource, texture);
455 if (FAILED(hr = d3drm_texture_create(&object, iface)))
456 return hr;
458 *texture = &object->IDirect3DRMTexture_iface;
460 return D3DRM_OK;
463 static HRESULT WINAPI d3drm1_SetSearchPath(IDirect3DRM *iface, const char *path)
465 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
467 return E_NOTIMPL;
470 static HRESULT WINAPI d3drm1_AddSearchPath(IDirect3DRM *iface, const char *path)
472 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
474 return E_NOTIMPL;
477 static HRESULT WINAPI d3drm1_GetSearchPath(IDirect3DRM *iface, DWORD *size, char *path)
479 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
481 return E_NOTIMPL;
484 static HRESULT WINAPI d3drm1_SetDefaultTextureColors(IDirect3DRM *iface, DWORD color_count)
486 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
488 return E_NOTIMPL;
491 static HRESULT WINAPI d3drm1_SetDefaultTextureShades(IDirect3DRM *iface, DWORD shade_count)
493 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
495 return E_NOTIMPL;
498 static HRESULT WINAPI d3drm1_GetDevices(IDirect3DRM *iface, IDirect3DRMDeviceArray **array)
500 FIXME("iface %p, array %p stub!\n", iface, array);
502 return E_NOTIMPL;
505 static HRESULT WINAPI d3drm1_GetNamedObject(IDirect3DRM *iface,
506 const char *name, IDirect3DRMObject **object)
508 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
510 return E_NOTIMPL;
513 static HRESULT WINAPI d3drm1_EnumerateObjects(IDirect3DRM *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
515 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
517 return E_NOTIMPL;
520 static HRESULT WINAPI d3drm1_Load(IDirect3DRM *iface, void *source, void *object_id, IID **iids,
521 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
522 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
524 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
525 IDirect3DRMFrame3 *parent_frame3 = NULL;
526 HRESULT hr = D3DRM_OK;
528 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
529 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
530 iface, source, object_id, iids, iid_count, flags,
531 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
533 if (parent_frame)
534 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
535 if (SUCCEEDED(hr))
536 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
537 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
538 if (parent_frame3)
539 IDirect3DRMFrame3_Release(parent_frame3);
541 return hr;
544 static HRESULT WINAPI d3drm1_Tick(IDirect3DRM *iface, D3DVALUE tick)
546 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
548 return E_NOTIMPL;
551 static const struct IDirect3DRMVtbl d3drm1_vtbl =
553 d3drm1_QueryInterface,
554 d3drm1_AddRef,
555 d3drm1_Release,
556 d3drm1_CreateObject,
557 d3drm1_CreateFrame,
558 d3drm1_CreateMesh,
559 d3drm1_CreateMeshBuilder,
560 d3drm1_CreateFace,
561 d3drm1_CreateAnimation,
562 d3drm1_CreateAnimationSet,
563 d3drm1_CreateTexture,
564 d3drm1_CreateLight,
565 d3drm1_CreateLightRGB,
566 d3drm1_CreateMaterial,
567 d3drm1_CreateDevice,
568 d3drm1_CreateDeviceFromSurface,
569 d3drm1_CreateDeviceFromD3D,
570 d3drm1_CreateDeviceFromClipper,
571 d3drm1_CreateTextureFromSurface,
572 d3drm1_CreateShadow,
573 d3drm1_CreateViewport,
574 d3drm1_CreateWrap,
575 d3drm1_CreateUserVisual,
576 d3drm1_LoadTexture,
577 d3drm1_LoadTextureFromResource,
578 d3drm1_SetSearchPath,
579 d3drm1_AddSearchPath,
580 d3drm1_GetSearchPath,
581 d3drm1_SetDefaultTextureColors,
582 d3drm1_SetDefaultTextureShades,
583 d3drm1_GetDevices,
584 d3drm1_GetNamedObject,
585 d3drm1_EnumerateObjects,
586 d3drm1_Load,
587 d3drm1_Tick,
590 static HRESULT WINAPI d3drm2_QueryInterface(IDirect3DRM2 *iface, REFIID riid, void **out)
592 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
594 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
597 static ULONG WINAPI d3drm2_AddRef(IDirect3DRM2 *iface)
599 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
600 ULONG refcount = InterlockedIncrement(&d3drm->ref2);
602 TRACE("%p increasing refcount to %u.\n", iface, refcount);
604 if (refcount == 1)
605 InterlockedIncrement(&d3drm->iface_count);
607 return refcount;
610 static ULONG WINAPI d3drm2_Release(IDirect3DRM2 *iface)
612 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
613 ULONG refcount = InterlockedDecrement(&d3drm->ref2);
615 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
617 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
618 d3drm_destroy(d3drm);
620 return refcount;
623 static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
624 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
626 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
628 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
629 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
631 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
634 static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
635 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame2 **frame)
637 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
638 struct d3drm_frame *object;
639 HRESULT hr;
641 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
643 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, &d3drm->IDirect3DRM_iface)))
644 return hr;
646 *frame = &object->IDirect3DRMFrame2_iface;
648 return D3DRM_OK;
651 static HRESULT WINAPI d3drm2_CreateMesh(IDirect3DRM2 *iface, IDirect3DRMMesh **mesh)
653 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
655 TRACE("iface %p, mesh %p.\n", iface, mesh);
657 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
660 static HRESULT WINAPI d3drm2_CreateMeshBuilder(IDirect3DRM2 *iface, IDirect3DRMMeshBuilder2 **mesh_builder)
662 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
664 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder2, (IUnknown **)mesh_builder);
667 static HRESULT WINAPI d3drm2_CreateFace(IDirect3DRM2 *iface, IDirect3DRMFace **face)
669 TRACE("iface %p, face %p.\n", iface, face);
671 return Direct3DRMFace_create(&IID_IDirect3DRMFace, (IUnknown **)face);
674 static HRESULT WINAPI d3drm2_CreateAnimation(IDirect3DRM2 *iface, IDirect3DRMAnimation **animation)
676 FIXME("iface %p, animation %p stub!\n", iface, animation);
678 return E_NOTIMPL;
681 static HRESULT WINAPI d3drm2_CreateAnimationSet(IDirect3DRM2 *iface, IDirect3DRMAnimationSet **set)
683 FIXME("iface %p, set %p stub!\n", iface, set);
685 return E_NOTIMPL;
688 static HRESULT WINAPI d3drm2_CreateTexture(IDirect3DRM2 *iface,
689 D3DRMIMAGE *image, IDirect3DRMTexture2 **texture)
691 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
692 IDirect3DRMTexture3 *texture3;
693 HRESULT hr;
695 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
697 if (!texture)
698 return D3DRMERR_BADVALUE;
700 if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
702 *texture = NULL;
703 return hr;
706 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture);
707 IDirect3DRMTexture3_Release(texture3);
709 return hr;
712 static HRESULT WINAPI d3drm2_CreateLight(IDirect3DRM2 *iface,
713 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
715 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
717 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
719 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
722 static HRESULT WINAPI d3drm2_CreateLightRGB(IDirect3DRM2 *iface, D3DRMLIGHTTYPE type,
723 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
725 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
727 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
728 iface, type, red, green, blue, light);
730 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
733 static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface,
734 D3DVALUE power, IDirect3DRMMaterial **material)
736 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
738 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
740 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
743 static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface,
744 DWORD width, DWORD height, IDirect3DRMDevice2 **device)
746 struct d3drm_device *object;
747 HRESULT hr;
748 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
750 hr = d3drm_device_create(&object);
751 if (FAILED(hr))
752 return hr;
754 *device = IDirect3DRMDevice2_from_impl(object);
756 return D3DRM_OK;
759 static HRESULT WINAPI d3drm2_CreateDeviceFromSurface(IDirect3DRM2 *iface, GUID *guid,
760 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice2 **device)
762 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
763 IDirect3DRMDevice3 *device3;
764 HRESULT hr;
765 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
766 iface, debugstr_guid(guid), ddraw, backbuffer, device);
768 if (!device)
769 return D3DRMERR_BADVALUE;
770 *device = NULL;
771 hr = IDirect3DRM3_CreateDeviceFromSurface(&d3drm->IDirect3DRM3_iface, guid, ddraw, backbuffer, 0, &device3);
772 if (FAILED(hr))
773 return hr;
775 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
776 IDirect3DRMDevice3_Release(device3);
778 return hr;
781 static HRESULT WINAPI d3drm2_CreateDeviceFromD3D(IDirect3DRM2 *iface,
782 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device)
784 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
785 IDirect3D *d3d1;
786 IDirect3DDevice *d3d_device1;
787 IDirect3DRMDevice *device1;
788 HRESULT hr;
789 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
790 iface, d3d, d3d_device, device);
792 if (!device)
793 return D3DRMERR_BADVALUE;
794 *device = NULL;
795 if (!d3d || !d3d_device)
796 return D3DRMERR_BADVALUE;
798 hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1);
799 if (FAILED(hr))
800 return hr;
802 hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1);
803 if (FAILED(hr))
805 IDirect3D_Release(d3d1);
806 return hr;
809 hr = IDirect3DRM_CreateDeviceFromD3D(&d3drm->IDirect3DRM_iface, d3d1, d3d_device1, &device1);
810 IDirect3D_Release(d3d1);
811 IDirect3DDevice_Release(d3d_device1);
812 if (FAILED(hr))
813 return hr;
815 hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice2, (void **)device);
816 IDirect3DRMDevice_Release(device1);
818 return hr;
821 static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface,
822 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
823 IDirect3DRMDevice2 **device)
825 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
826 IDirect3DRMDevice3 *device3;
827 HRESULT hr;
829 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
830 iface, clipper, debugstr_guid(guid), width, height, device);
832 if (!device)
833 return D3DRMERR_BADVALUE;
834 *device = NULL;
835 hr = IDirect3DRM3_CreateDeviceFromClipper(&d3drm->IDirect3DRM3_iface, clipper, guid, width, height, &device3);
836 if (FAILED(hr))
837 return hr;
839 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
840 IDirect3DRMDevice3_Release(device3);
842 return hr;
845 static HRESULT WINAPI d3drm2_CreateTextureFromSurface(IDirect3DRM2 *iface,
846 IDirectDrawSurface *surface, IDirect3DRMTexture2 **texture)
848 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
850 return E_NOTIMPL;
853 static HRESULT WINAPI d3drm2_CreateShadow(IDirect3DRM2 *iface, IDirect3DRMVisual *visual,
854 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
855 IDirect3DRMVisual **shadow)
857 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
858 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
860 return E_NOTIMPL;
863 static HRESULT WINAPI d3drm2_CreateViewport(IDirect3DRM2 *iface, IDirect3DRMDevice *device,
864 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
866 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
867 struct d3drm_viewport *object;
868 HRESULT hr;
870 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
871 iface, device, camera, x, y, width, height, viewport);
873 if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface)))
874 return hr;
876 *viewport = &object->IDirect3DRMViewport_iface;
878 return D3DRM_OK;
881 static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
882 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
883 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
884 IDirect3DRMWrap **wrap)
886 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
887 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
888 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
890 return E_NOTIMPL;
893 static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface,
894 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
896 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
898 return E_NOTIMPL;
901 static HRESULT WINAPI d3drm2_LoadTexture(IDirect3DRM2 *iface,
902 const char *filename, IDirect3DRMTexture2 **texture)
904 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
905 struct d3drm_texture *object;
906 HRESULT hr;
908 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
910 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
911 return hr;
913 *texture = &object->IDirect3DRMTexture2_iface;
915 return hr;
918 static HRESULT WINAPI d3drm2_LoadTextureFromResource(IDirect3DRM2 *iface, HMODULE module,
919 const char *resource_name, const char *resource_type, IDirect3DRMTexture2 **texture)
921 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
922 struct d3drm_texture *object;
923 HRESULT hr;
925 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
926 iface, debugstr_a(resource_name), debugstr_a(resource_type), texture);
928 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
929 return hr;
931 *texture = &object->IDirect3DRMTexture2_iface;
933 return D3DRM_OK;
936 static HRESULT WINAPI d3drm2_SetSearchPath(IDirect3DRM2 *iface, const char *path)
938 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
940 return E_NOTIMPL;
943 static HRESULT WINAPI d3drm2_AddSearchPath(IDirect3DRM2 *iface, const char *path)
945 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
947 return E_NOTIMPL;
950 static HRESULT WINAPI d3drm2_GetSearchPath(IDirect3DRM2 *iface, DWORD *size, char *path)
952 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
954 return E_NOTIMPL;
957 static HRESULT WINAPI d3drm2_SetDefaultTextureColors(IDirect3DRM2 *iface, DWORD color_count)
959 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
961 return E_NOTIMPL;
964 static HRESULT WINAPI d3drm2_SetDefaultTextureShades(IDirect3DRM2 *iface, DWORD shade_count)
966 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
968 return E_NOTIMPL;
971 static HRESULT WINAPI d3drm2_GetDevices(IDirect3DRM2 *iface, IDirect3DRMDeviceArray **array)
973 FIXME("iface %p, array %p stub!\n", iface, array);
975 return E_NOTIMPL;
978 static HRESULT WINAPI d3drm2_GetNamedObject(IDirect3DRM2 *iface,
979 const char *name, IDirect3DRMObject **object)
981 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
983 return E_NOTIMPL;
986 static HRESULT WINAPI d3drm2_EnumerateObjects(IDirect3DRM2 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
988 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
990 return E_NOTIMPL;
993 static HRESULT WINAPI d3drm2_Load(IDirect3DRM2 *iface, void *source, void *object_id, IID **iids,
994 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
995 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
997 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
998 IDirect3DRMFrame3 *parent_frame3 = NULL;
999 HRESULT hr = D3DRM_OK;
1001 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1002 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1003 iface, source, object_id, iids, iid_count, flags,
1004 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1006 if (parent_frame)
1007 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
1008 if (SUCCEEDED(hr))
1009 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
1010 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
1011 if (parent_frame3)
1012 IDirect3DRMFrame3_Release(parent_frame3);
1014 return hr;
1017 static HRESULT WINAPI d3drm2_Tick(IDirect3DRM2 *iface, D3DVALUE tick)
1019 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
1021 return E_NOTIMPL;
1024 static HRESULT WINAPI d3drm2_CreateProgressiveMesh(IDirect3DRM2 *iface, IDirect3DRMProgressiveMesh **mesh)
1026 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1028 return E_NOTIMPL;
1031 static const struct IDirect3DRM2Vtbl d3drm2_vtbl =
1033 d3drm2_QueryInterface,
1034 d3drm2_AddRef,
1035 d3drm2_Release,
1036 d3drm2_CreateObject,
1037 d3drm2_CreateFrame,
1038 d3drm2_CreateMesh,
1039 d3drm2_CreateMeshBuilder,
1040 d3drm2_CreateFace,
1041 d3drm2_CreateAnimation,
1042 d3drm2_CreateAnimationSet,
1043 d3drm2_CreateTexture,
1044 d3drm2_CreateLight,
1045 d3drm2_CreateLightRGB,
1046 d3drm2_CreateMaterial,
1047 d3drm2_CreateDevice,
1048 d3drm2_CreateDeviceFromSurface,
1049 d3drm2_CreateDeviceFromD3D,
1050 d3drm2_CreateDeviceFromClipper,
1051 d3drm2_CreateTextureFromSurface,
1052 d3drm2_CreateShadow,
1053 d3drm2_CreateViewport,
1054 d3drm2_CreateWrap,
1055 d3drm2_CreateUserVisual,
1056 d3drm2_LoadTexture,
1057 d3drm2_LoadTextureFromResource,
1058 d3drm2_SetSearchPath,
1059 d3drm2_AddSearchPath,
1060 d3drm2_GetSearchPath,
1061 d3drm2_SetDefaultTextureColors,
1062 d3drm2_SetDefaultTextureShades,
1063 d3drm2_GetDevices,
1064 d3drm2_GetNamedObject,
1065 d3drm2_EnumerateObjects,
1066 d3drm2_Load,
1067 d3drm2_Tick,
1068 d3drm2_CreateProgressiveMesh,
1071 static HRESULT WINAPI d3drm3_QueryInterface(IDirect3DRM3 *iface, REFIID riid, void **out)
1073 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1075 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
1078 static ULONG WINAPI d3drm3_AddRef(IDirect3DRM3 *iface)
1080 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1081 ULONG refcount = InterlockedIncrement(&d3drm->ref3);
1083 TRACE("%p increasing refcount to %u.\n", iface, refcount);
1085 if (refcount == 1)
1086 InterlockedIncrement(&d3drm->iface_count);
1088 return refcount;
1091 static ULONG WINAPI d3drm3_Release(IDirect3DRM3 *iface)
1093 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1094 ULONG refcount = InterlockedDecrement(&d3drm->ref3);
1096 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
1098 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
1099 d3drm_destroy(d3drm);
1101 return refcount;
1104 static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
1105 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
1107 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1108 IUnknown *object;
1109 HRESULT hr;
1111 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1112 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
1114 if (!out)
1115 return D3DRMERR_BADVALUE;
1117 if (!clsid || !iid)
1119 *out = NULL;
1120 return D3DRMERR_BADVALUE;
1123 if (outer)
1125 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer);
1126 *out = NULL;
1127 return E_NOTIMPL;
1130 if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture))
1132 struct d3drm_texture *texture;
1133 if (FAILED(hr = d3drm_texture_create(&texture, &d3drm->IDirect3DRM_iface)))
1135 *out = NULL;
1136 return hr;
1138 object = (IUnknown *)&texture->IDirect3DRMTexture3_iface;
1140 else
1142 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
1143 *out = NULL;
1144 return CLASSFACTORY_E_FIRST;
1147 if (FAILED(hr = IUnknown_QueryInterface(object, iid, out)))
1148 *out = NULL;
1149 IUnknown_Release(object);
1151 return hr;
1154 static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
1155 IDirect3DRMFrame3 *parent, IDirect3DRMFrame3 **frame)
1157 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1158 struct d3drm_frame *object;
1159 HRESULT hr;
1161 TRACE("iface %p, parent %p, frame %p.\n", iface, parent, frame);
1163 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent, &d3drm->IDirect3DRM_iface)))
1164 return hr;
1166 *frame = &object->IDirect3DRMFrame3_iface;
1168 return D3DRM_OK;
1171 static HRESULT WINAPI d3drm3_CreateMesh(IDirect3DRM3 *iface, IDirect3DRMMesh **mesh)
1173 TRACE("iface %p, mesh %p.\n", iface, mesh);
1175 return Direct3DRMMesh_create(mesh);
1178 static HRESULT WINAPI d3drm3_CreateMeshBuilder(IDirect3DRM3 *iface, IDirect3DRMMeshBuilder3 **mesh_builder)
1180 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
1182 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder3, (IUnknown **)mesh_builder);
1185 static HRESULT WINAPI d3drm3_CreateFace(IDirect3DRM3 *iface, IDirect3DRMFace2 **face)
1187 TRACE("iface %p, face %p.\n", iface, face);
1189 return Direct3DRMFace_create(&IID_IDirect3DRMFace2, (IUnknown **)face);
1192 static HRESULT WINAPI d3drm3_CreateAnimation(IDirect3DRM3 *iface, IDirect3DRMAnimation2 **animation)
1194 FIXME("iface %p, animation %p stub!\n", iface, animation);
1196 return E_NOTIMPL;
1199 static HRESULT WINAPI d3drm3_CreateAnimationSet(IDirect3DRM3 *iface, IDirect3DRMAnimationSet2 **set)
1201 FIXME("iface %p, set %p stub!\n", iface, set);
1203 return E_NOTIMPL;
1206 static HRESULT WINAPI d3drm3_CreateTexture(IDirect3DRM3 *iface,
1207 D3DRMIMAGE *image, IDirect3DRMTexture3 **texture)
1209 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1210 struct d3drm_texture *object;
1211 HRESULT hr;
1213 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
1215 if (!texture)
1216 return D3DRMERR_BADVALUE;
1218 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1219 return hr;
1221 *texture = &object->IDirect3DRMTexture3_iface;
1223 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture, image)))
1225 IDirect3DRMTexture3_Release(*texture);
1226 *texture = NULL;
1227 return D3DRMERR_BADVALUE;
1230 return D3DRM_OK;
1233 static HRESULT WINAPI d3drm3_CreateLight(IDirect3DRM3 *iface,
1234 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
1236 HRESULT hr;
1238 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface, type, color, light);
1240 if (SUCCEEDED(hr = Direct3DRMLight_create((IUnknown **)light)))
1242 IDirect3DRMLight_SetType(*light, type);
1243 IDirect3DRMLight_SetColor(*light, color);
1246 return hr;
1249 static HRESULT WINAPI d3drm3_CreateLightRGB(IDirect3DRM3 *iface, D3DRMLIGHTTYPE type,
1250 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
1252 HRESULT hr;
1254 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1255 iface, type, red, green, blue, light);
1257 if (SUCCEEDED(hr = Direct3DRMLight_create((IUnknown **)light)))
1259 IDirect3DRMLight_SetType(*light, type);
1260 IDirect3DRMLight_SetColorRGB(*light, red, green, blue);
1263 return hr;
1266 static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface,
1267 D3DVALUE power, IDirect3DRMMaterial2 **material)
1269 HRESULT hr;
1271 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
1273 if (SUCCEEDED(hr = Direct3DRMMaterial_create(material)))
1274 IDirect3DRMMaterial2_SetPower(*material, power);
1276 return hr;
1279 static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface,
1280 DWORD width, DWORD height, IDirect3DRMDevice3 **device)
1282 struct d3drm_device *object;
1283 HRESULT hr;
1284 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
1286 hr = d3drm_device_create(&object);
1287 if (FAILED(hr))
1288 return hr;
1290 *device = IDirect3DRMDevice3_from_impl(object);
1292 return D3DRM_OK;
1295 static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *guid,
1296 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, DWORD flags, IDirect3DRMDevice3 **device)
1298 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1299 struct d3drm_device *object;
1300 BOOL use_z_surface;
1301 HRESULT hr;
1303 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1304 iface, debugstr_guid(guid), ddraw, backbuffer, flags, device);
1306 if (!device)
1307 return D3DRMERR_BADVALUE;
1308 *device = NULL;
1310 if (!backbuffer || !ddraw)
1311 return D3DRMERR_BADDEVICE;
1313 hr = d3drm_device_create(&object);
1314 if (FAILED(hr))
1315 return hr;
1317 use_z_surface = !(flags & D3DRMDEVICE_NOZBUFFER);
1319 hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, use_z_surface);
1320 if (SUCCEEDED(hr))
1321 *device = IDirect3DRMDevice3_from_impl(object);
1322 else
1323 d3drm_device_destroy(object);
1325 return hr;
1328 static HRESULT WINAPI d3drm3_CreateDeviceFromD3D(IDirect3DRM3 *iface,
1329 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device)
1331 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1332 IDirect3D *d3d1;
1333 IDirect3DDevice *d3d_device1;
1334 IDirect3DRMDevice *device1;
1335 HRESULT hr;
1336 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1337 iface, d3d, d3d_device, device);
1339 if (!device)
1340 return D3DRMERR_BADVALUE;
1341 *device = NULL;
1342 if (!d3d || !d3d_device)
1343 return D3DRMERR_BADVALUE;
1345 hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1);
1346 if (FAILED(hr))
1347 return hr;
1348 hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1);
1349 if (FAILED(hr))
1351 IDirect3D_Release(d3d1);
1352 return hr;
1355 hr = IDirect3DRM_CreateDeviceFromD3D(&d3drm->IDirect3DRM_iface, d3d1, d3d_device1, &device1);
1356 IDirect3D_Release(d3d1);
1357 IDirect3DDevice_Release(d3d_device1);
1358 if (FAILED(hr))
1359 return hr;
1361 hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice3, (void **)device);
1362 IDirect3DRMDevice_Release(device1);
1364 return hr;
1367 static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
1368 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
1369 IDirect3DRMDevice3 **device)
1371 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1372 struct d3drm_device *object;
1373 IDirectDraw *ddraw;
1374 IDirectDrawSurface *render_target;
1375 HRESULT hr;
1377 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1378 iface, clipper, debugstr_guid(guid), width, height, device);
1380 if (!device)
1381 return D3DRMERR_BADVALUE;
1382 *device = NULL;
1384 if (!clipper || !width || !height)
1385 return D3DRMERR_BADVALUE;
1387 hr = DirectDrawCreate(NULL, &ddraw, NULL);
1388 if (FAILED(hr))
1389 return hr;
1391 hr = d3drm_device_create(&object);
1392 if (FAILED(hr))
1394 IDirectDraw_Release(ddraw);
1395 return hr;
1398 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
1399 if (FAILED(hr))
1401 IDirectDraw_Release(ddraw);
1402 d3drm_device_destroy(object);
1403 return hr;
1406 hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, render_target, TRUE);
1407 IDirectDraw_Release(ddraw);
1408 IDirectDrawSurface_Release(render_target);
1409 if (FAILED(hr))
1410 d3drm_device_destroy(object);
1411 else
1412 *device = IDirect3DRMDevice3_from_impl(object);
1414 return hr;
1417 static HRESULT WINAPI d3drm3_CreateShadow(IDirect3DRM3 *iface, IUnknown *object, IDirect3DRMLight *light,
1418 D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, IDirect3DRMShadow2 **shadow)
1420 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1421 iface, object, light, px, py, pz, nx, ny, nz, shadow);
1423 return E_NOTIMPL;
1426 static HRESULT WINAPI d3drm3_CreateTextureFromSurface(IDirect3DRM3 *iface,
1427 IDirectDrawSurface *surface, IDirect3DRMTexture3 **texture)
1429 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
1431 return E_NOTIMPL;
1434 static HRESULT WINAPI d3drm3_CreateViewport(IDirect3DRM3 *iface, IDirect3DRMDevice3 *device,
1435 IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport2 **viewport)
1437 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1438 struct d3drm_viewport *object;
1439 HRESULT hr;
1441 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
1442 iface, device, camera, x, y, width, height, viewport);
1444 if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface)))
1445 return hr;
1447 *viewport = &object->IDirect3DRMViewport2_iface;
1449 return D3DRM_OK;
1452 static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame3 *frame,
1453 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1454 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
1455 IDirect3DRMWrap **wrap)
1457 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1458 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1459 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
1461 return E_NOTIMPL;
1464 static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,
1465 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
1467 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
1469 return E_NOTIMPL;
1472 static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface,
1473 const char *filename, IDirect3DRMTexture3 **texture)
1475 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1476 struct d3drm_texture *object;
1477 HRESULT hr;
1479 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
1481 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1482 return hr;
1484 *texture = &object->IDirect3DRMTexture3_iface;
1486 return D3DRM_OK;
1489 static HRESULT WINAPI d3drm3_LoadTextureFromResource(IDirect3DRM3 *iface, HMODULE module,
1490 const char *resource_name, const char *resource_type, IDirect3DRMTexture3 **texture)
1492 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1493 struct d3drm_texture *object;
1494 HRESULT hr;
1496 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1497 iface, module, debugstr_a(resource_name), debugstr_a(resource_type), texture);
1499 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1500 return hr;
1502 *texture = &object->IDirect3DRMTexture3_iface;
1504 return D3DRM_OK;
1507 static HRESULT WINAPI d3drm3_SetSearchPath(IDirect3DRM3 *iface, const char *path)
1509 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1511 return E_NOTIMPL;
1514 static HRESULT WINAPI d3drm3_AddSearchPath(IDirect3DRM3 *iface, const char *path)
1516 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1518 return E_NOTIMPL;
1521 static HRESULT WINAPI d3drm3_GetSearchPath(IDirect3DRM3 *iface, DWORD *size, char *path)
1523 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
1525 return E_NOTIMPL;
1528 static HRESULT WINAPI d3drm3_SetDefaultTextureColors(IDirect3DRM3 *iface, DWORD color_count)
1530 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
1532 return E_NOTIMPL;
1535 static HRESULT WINAPI d3drm3_SetDefaultTextureShades(IDirect3DRM3 *iface, DWORD shade_count)
1537 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
1539 return E_NOTIMPL;
1542 static HRESULT WINAPI d3drm3_GetDevices(IDirect3DRM3 *iface, IDirect3DRMDeviceArray **array)
1544 FIXME("iface %p, array %p stub!\n", iface, array);
1546 return E_NOTIMPL;
1549 static HRESULT WINAPI d3drm3_GetNamedObject(IDirect3DRM3 *iface,
1550 const char *name, IDirect3DRMObject **object)
1552 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
1554 return E_NOTIMPL;
1557 static HRESULT WINAPI d3drm3_EnumerateObjects(IDirect3DRM3 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
1559 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1561 return E_NOTIMPL;
1564 static HRESULT load_data(IDirect3DRM3 *iface, IDirectXFileData *data_object, IID **GUIDs, DWORD nb_GUIDs, D3DRMLOADCALLBACK LoadProc,
1565 void *ArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc, void *ArgLTP, IDirect3DRMFrame3 *parent_frame)
1567 HRESULT ret = D3DRMERR_BADOBJECT;
1568 HRESULT hr;
1569 const GUID* guid;
1570 DWORD i;
1571 BOOL requested = FALSE;
1573 hr = IDirectXFileData_GetType(data_object, &guid);
1574 if (hr != DXFILE_OK)
1575 goto end;
1577 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1579 /* Load object only if it is top level and requested or if it is part of another object */
1581 if (IsEqualGUID(guid, &TID_D3DRMMesh))
1583 TRACE("Found TID_D3DRMMesh\n");
1585 for (i = 0; i < nb_GUIDs; i++)
1586 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder) ||
1587 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder2) ||
1588 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder3))
1590 requested = TRUE;
1591 break;
1594 if (requested || parent_frame)
1596 IDirect3DRMMeshBuilder3 *meshbuilder;
1598 TRACE("Load mesh data\n");
1600 hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
1601 if (SUCCEEDED(hr))
1603 hr = load_mesh_data(meshbuilder, data_object, LoadTextureProc, ArgLTP);
1604 if (SUCCEEDED(hr))
1606 /* Only top level objects are notified */
1607 if (!parent_frame)
1609 IDirect3DRMObject *object;
1611 hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
1612 if (SUCCEEDED(hr))
1614 LoadProc(object, GUIDs[i], ArgLP);
1615 IDirect3DRMObject_Release(object);
1618 else
1620 IDirect3DRMFrame3_AddVisual(parent_frame, (IUnknown*)meshbuilder);
1623 IDirect3DRMMeshBuilder3_Release(meshbuilder);
1626 if (FAILED(hr))
1627 ERR("Cannot process mesh\n");
1630 else if (IsEqualGUID(guid, &TID_D3DRMFrame))
1632 TRACE("Found TID_D3DRMFrame\n");
1634 for (i = 0; i < nb_GUIDs; i++)
1635 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
1636 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
1637 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
1639 requested = TRUE;
1640 break;
1643 if (requested || parent_frame)
1645 IDirect3DRMFrame3 *frame;
1647 TRACE("Load frame data\n");
1649 hr = IDirect3DRM3_CreateFrame(iface, parent_frame, &frame);
1650 if (SUCCEEDED(hr))
1652 IDirectXFileObject *child;
1654 while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(data_object, &child)))
1656 IDirectXFileData *data;
1657 IDirectXFileDataReference *reference;
1658 IDirectXFileBinary *binary;
1660 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1661 &IID_IDirectXFileBinary, (void **)&binary)))
1663 FIXME("Binary Object not supported yet\n");
1664 IDirectXFileBinary_Release(binary);
1666 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1667 &IID_IDirectXFileData, (void **)&data)))
1669 TRACE("Found Data Object\n");
1670 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
1671 IDirectXFileData_Release(data);
1673 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1674 &IID_IDirectXFileDataReference, (void **)&reference)))
1676 TRACE("Found Data Object Reference\n");
1677 IDirectXFileDataReference_Resolve(reference, &data);
1678 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
1679 IDirectXFileData_Release(data);
1680 IDirectXFileDataReference_Release(reference);
1682 IDirectXFileObject_Release(child);
1685 if (hr != DXFILEERR_NOMOREOBJECTS)
1687 IDirect3DRMFrame3_Release(frame);
1688 goto end;
1690 hr = S_OK;
1692 /* Only top level objects are notified */
1693 if (!parent_frame)
1695 IDirect3DRMObject *object;
1697 hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
1698 if (SUCCEEDED(hr))
1700 LoadProc(object, GUIDs[i], ArgLP);
1701 IDirect3DRMObject_Release(object);
1704 IDirect3DRMFrame3_Release(frame);
1707 if (FAILED(hr))
1708 ERR("Cannot process frame\n");
1711 else if (IsEqualGUID(guid, &TID_D3DRMMaterial))
1713 TRACE("Found TID_D3DRMMaterial\n");
1715 /* Cannot be requested so nothing to do */
1717 else if (IsEqualGUID(guid, &TID_D3DRMFrameTransformMatrix))
1719 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
1721 /* Cannot be requested */
1722 if (parent_frame)
1724 D3DRMMATRIX4D *matrix;
1725 DWORD size;
1727 TRACE("Load Frame Transform Matrix data\n");
1729 hr = IDirectXFileData_GetData(data_object, NULL, &size, (void**)&matrix);
1730 if ((hr != DXFILE_OK) || (size != sizeof(matrix)))
1731 goto end;
1733 hr = IDirect3DRMFrame3_AddTransform(parent_frame, D3DRMCOMBINE_REPLACE, *matrix);
1734 if (FAILED(hr))
1735 goto end;
1738 else
1740 FIXME("Found unknown TID %s\n", debugstr_guid(guid));
1743 ret = D3DRM_OK;
1745 end:
1747 return ret;
1750 static HRESULT WINAPI d3drm3_Load(IDirect3DRM3 *iface, void *source, void *object_id, IID **iids,
1751 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
1752 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame3 *parent_frame)
1754 DXFILELOADOPTIONS load_options;
1755 IDirectXFile *file = NULL;
1756 IDirectXFileEnumObject *enum_object = NULL;
1757 IDirectXFileData *data = NULL;
1758 HRESULT hr;
1759 const GUID* pGuid;
1760 DWORD size;
1761 struct d3drm_file_header *header;
1762 HRESULT ret = D3DRMERR_BADOBJECT;
1763 DWORD i;
1765 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1766 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1767 iface, source, object_id, iids, iid_count, flags,
1768 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1770 TRACE("Looking for GUIDs:\n");
1771 for (i = 0; i < iid_count; ++i)
1772 TRACE("- %s (%s)\n", debugstr_guid(iids[i]), get_IID_string(iids[i]));
1774 if (flags == D3DRMLOAD_FROMMEMORY)
1776 load_options = DXFILELOAD_FROMMEMORY;
1778 else if (flags == D3DRMLOAD_FROMFILE)
1780 load_options = DXFILELOAD_FROMFILE;
1781 TRACE("Loading from file %s\n", debugstr_a(source));
1783 else
1785 FIXME("Load options %#x not supported yet.\n", flags);
1786 return E_NOTIMPL;
1789 hr = DirectXFileCreate(&file);
1790 if (hr != DXFILE_OK)
1791 goto end;
1793 hr = IDirectXFile_RegisterTemplates(file, templates, strlen(templates));
1794 if (hr != DXFILE_OK)
1795 goto end;
1797 hr = IDirectXFile_CreateEnumObject(file, source, load_options, &enum_object);
1798 if (hr != DXFILE_OK)
1799 goto end;
1801 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
1802 if (hr != DXFILE_OK)
1803 goto end;
1805 hr = IDirectXFileData_GetType(data, &pGuid);
1806 if (hr != DXFILE_OK)
1807 goto end;
1809 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1811 if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
1813 ret = D3DRMERR_BADFILE;
1814 goto end;
1817 hr = IDirectXFileData_GetData(data, NULL, &size, (void **)&header);
1818 if ((hr != DXFILE_OK) || (size != sizeof(*header)))
1819 goto end;
1821 TRACE("Version is %u.%u, flags %#x.\n", header->major, header->minor, header->flags);
1823 /* Version must be 1.0.x */
1824 if ((header->major != 1) || (header->minor != 0))
1826 ret = D3DRMERR_BADFILE;
1827 goto end;
1830 IDirectXFileData_Release(data);
1831 data = NULL;
1833 while (1)
1835 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
1836 if (hr == DXFILEERR_NOMOREOBJECTS)
1838 TRACE("No more object\n");
1839 break;
1841 else if (hr != DXFILE_OK)
1843 ret = D3DRMERR_BADFILE;
1844 goto end;
1847 ret = load_data(iface, data, iids, iid_count, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1848 if (ret != D3DRM_OK)
1849 goto end;
1851 IDirectXFileData_Release(data);
1852 data = NULL;
1855 ret = D3DRM_OK;
1857 end:
1858 if (data)
1859 IDirectXFileData_Release(data);
1860 if (enum_object)
1861 IDirectXFileEnumObject_Release(enum_object);
1862 if (file)
1863 IDirectXFile_Release(file);
1865 return ret;
1868 static HRESULT WINAPI d3drm3_Tick(IDirect3DRM3 *iface, D3DVALUE tick)
1870 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
1872 return E_NOTIMPL;
1875 static HRESULT WINAPI d3drm3_CreateProgressiveMesh(IDirect3DRM3 *iface, IDirect3DRMProgressiveMesh **mesh)
1877 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1879 return E_NOTIMPL;
1882 static HRESULT WINAPI d3drm3_RegisterClient(IDirect3DRM3 *iface, REFGUID guid, DWORD *id)
1884 FIXME("iface %p, guid %s, id %p stub!\n", iface, debugstr_guid(guid), id);
1886 return E_NOTIMPL;
1889 static HRESULT WINAPI d3drm3_UnregisterClient(IDirect3DRM3 *iface, REFGUID guid)
1891 FIXME("iface %p, guid %s stub!\n", iface, debugstr_guid(guid));
1893 return E_NOTIMPL;
1896 static HRESULT WINAPI d3drm3_CreateClippedVisual(IDirect3DRM3 *iface,
1897 IDirect3DRMVisual *visual, IDirect3DRMClippedVisual **clipped_visual)
1899 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface, visual, clipped_visual);
1901 return E_NOTIMPL;
1904 static HRESULT WINAPI d3drm3_SetOptions(IDirect3DRM3 *iface, DWORD flags)
1906 FIXME("iface %p, flags %#x stub!\n", iface, flags);
1908 return E_NOTIMPL;
1911 static HRESULT WINAPI d3drm3_GetOptions(IDirect3DRM3 *iface, DWORD *flags)
1913 FIXME("iface %p, flags %p stub!\n", iface, flags);
1915 return E_NOTIMPL;
1918 static const struct IDirect3DRM3Vtbl d3drm3_vtbl =
1920 d3drm3_QueryInterface,
1921 d3drm3_AddRef,
1922 d3drm3_Release,
1923 d3drm3_CreateObject,
1924 d3drm3_CreateFrame,
1925 d3drm3_CreateMesh,
1926 d3drm3_CreateMeshBuilder,
1927 d3drm3_CreateFace,
1928 d3drm3_CreateAnimation,
1929 d3drm3_CreateAnimationSet,
1930 d3drm3_CreateTexture,
1931 d3drm3_CreateLight,
1932 d3drm3_CreateLightRGB,
1933 d3drm3_CreateMaterial,
1934 d3drm3_CreateDevice,
1935 d3drm3_CreateDeviceFromSurface,
1936 d3drm3_CreateDeviceFromD3D,
1937 d3drm3_CreateDeviceFromClipper,
1938 d3drm3_CreateTextureFromSurface,
1939 d3drm3_CreateShadow,
1940 d3drm3_CreateViewport,
1941 d3drm3_CreateWrap,
1942 d3drm3_CreateUserVisual,
1943 d3drm3_LoadTexture,
1944 d3drm3_LoadTextureFromResource,
1945 d3drm3_SetSearchPath,
1946 d3drm3_AddSearchPath,
1947 d3drm3_GetSearchPath,
1948 d3drm3_SetDefaultTextureColors,
1949 d3drm3_SetDefaultTextureShades,
1950 d3drm3_GetDevices,
1951 d3drm3_GetNamedObject,
1952 d3drm3_EnumerateObjects,
1953 d3drm3_Load,
1954 d3drm3_Tick,
1955 d3drm3_CreateProgressiveMesh,
1956 d3drm3_RegisterClient,
1957 d3drm3_UnregisterClient,
1958 d3drm3_CreateClippedVisual,
1959 d3drm3_SetOptions,
1960 d3drm3_GetOptions,
1963 HRESULT WINAPI Direct3DRMCreate(IDirect3DRM **d3drm)
1965 struct d3drm *object;
1967 TRACE("d3drm %p.\n", d3drm);
1969 if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
1970 return E_OUTOFMEMORY;
1972 object->IDirect3DRM_iface.lpVtbl = &d3drm1_vtbl;
1973 object->IDirect3DRM2_iface.lpVtbl = &d3drm2_vtbl;
1974 object->IDirect3DRM3_iface.lpVtbl = &d3drm3_vtbl;
1975 object->ref1 = 1;
1976 object->iface_count = 1;
1978 *d3drm = &object->IDirect3DRM_iface;
1980 return S_OK;
1983 HRESULT WINAPI DllCanUnloadNow(void)
1985 return S_FALSE;
1988 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
1990 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
1992 if(!ppv)
1993 return E_INVALIDARG;
1995 return CLASS_E_CLASSNOTAVAILABLE;