dbghelp: Recognize DW_FORM_flag_present.
[wine.git] / dlls / d3drm / d3drm.c
blob9e8630e966f0c7be735ac1a37622b2e083b52974
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 static HRESULT d3drm_create_texture_object(void **object, IDirect3DRM *d3drm)
56 struct d3drm_texture *texture;
57 HRESULT hr;
59 if (FAILED(hr = d3drm_texture_create(&texture, d3drm)))
60 return hr;
62 *object = &texture->IDirect3DRMTexture_iface;
64 return hr;
67 static HRESULT d3drm_create_device_object(void **object, IDirect3DRM *d3drm)
69 struct d3drm_device *device;
70 HRESULT hr;
72 if (FAILED(hr = d3drm_device_create(&device, d3drm)))
73 return hr;
75 *object = &device->IDirect3DRMDevice_iface;
77 return hr;
80 struct d3drm
82 IDirect3DRM IDirect3DRM_iface;
83 IDirect3DRM2 IDirect3DRM2_iface;
84 IDirect3DRM3 IDirect3DRM3_iface;
85 LONG ref1, ref2, ref3, iface_count;
88 static inline struct d3drm *impl_from_IDirect3DRM(IDirect3DRM *iface)
90 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM_iface);
93 static inline struct d3drm *impl_from_IDirect3DRM2(IDirect3DRM2 *iface)
95 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM2_iface);
98 static inline struct d3drm *impl_from_IDirect3DRM3(IDirect3DRM3 *iface)
100 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM3_iface);
103 static void d3drm_destroy(struct d3drm *d3drm)
105 HeapFree(GetProcessHeap(), 0, d3drm);
106 TRACE("d3drm object %p is being destroyed.\n", d3drm);
109 static HRESULT WINAPI d3drm1_QueryInterface(IDirect3DRM *iface, REFIID riid, void **out)
111 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
113 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
115 if (IsEqualGUID(riid, &IID_IDirect3DRM)
116 || IsEqualGUID(riid, &IID_IUnknown))
118 *out = &d3drm->IDirect3DRM_iface;
120 else if (IsEqualGUID(riid, &IID_IDirect3DRM2))
122 *out = &d3drm->IDirect3DRM2_iface;
124 else if (IsEqualGUID(riid, &IID_IDirect3DRM3))
126 *out = &d3drm->IDirect3DRM3_iface;
128 else
130 *out = NULL;
131 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid));
132 return CLASS_E_CLASSNOTAVAILABLE;
135 IUnknown_AddRef((IUnknown *)*out);
136 return S_OK;
139 static ULONG WINAPI d3drm1_AddRef(IDirect3DRM *iface)
141 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
142 ULONG refcount = InterlockedIncrement(&d3drm->ref1);
144 TRACE("%p increasing refcount to %u.\n", iface, refcount);
146 if (refcount == 1)
147 InterlockedIncrement(&d3drm->iface_count);
149 return refcount;
152 static ULONG WINAPI d3drm1_Release(IDirect3DRM *iface)
154 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
155 ULONG refcount = InterlockedDecrement(&d3drm->ref1);
157 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
159 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
160 d3drm_destroy(d3drm);
162 return refcount;
165 static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
166 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
168 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
170 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
171 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
173 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
176 static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
177 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame **frame)
179 struct d3drm_frame *object;
180 HRESULT hr;
182 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
184 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, iface)))
185 return hr;
187 *frame = &object->IDirect3DRMFrame_iface;
189 return D3DRM_OK;
192 static HRESULT WINAPI d3drm1_CreateMesh(IDirect3DRM *iface, IDirect3DRMMesh **mesh)
194 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
196 TRACE("iface %p, mesh %p.\n", iface, mesh);
198 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
201 static HRESULT WINAPI d3drm1_CreateMeshBuilder(IDirect3DRM *iface, IDirect3DRMMeshBuilder **mesh_builder)
203 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
205 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder, (IUnknown **)mesh_builder);
208 static HRESULT WINAPI d3drm1_CreateFace(IDirect3DRM *iface, IDirect3DRMFace **face)
210 TRACE("iface %p, face %p.\n", iface, face);
212 return Direct3DRMFace_create(&IID_IDirect3DRMFace, (IUnknown **)face);
215 static HRESULT WINAPI d3drm1_CreateAnimation(IDirect3DRM *iface, IDirect3DRMAnimation **animation)
217 FIXME("iface %p, animation %p stub!\n", iface, animation);
219 return E_NOTIMPL;
222 static HRESULT WINAPI d3drm1_CreateAnimationSet(IDirect3DRM *iface, IDirect3DRMAnimationSet **set)
224 FIXME("iface %p, set %p stub!\n", iface, set);
226 return E_NOTIMPL;
229 static HRESULT WINAPI d3drm1_CreateTexture(IDirect3DRM *iface,
230 D3DRMIMAGE *image, IDirect3DRMTexture **texture)
232 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
233 IDirect3DRMTexture3 *texture3;
234 HRESULT hr;
236 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
238 if (!texture)
239 return D3DRMERR_BADVALUE;
241 if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
243 *texture = NULL;
244 return hr;
247 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture);
248 IDirect3DRMTexture3_Release(texture3);
250 return hr;
253 static HRESULT WINAPI d3drm1_CreateLight(IDirect3DRM *iface,
254 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
256 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
258 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
260 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
263 static HRESULT WINAPI d3drm1_CreateLightRGB(IDirect3DRM *iface, D3DRMLIGHTTYPE type,
264 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
266 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
268 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
269 iface, type, red, green, blue, light);
271 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
274 static HRESULT WINAPI d3drm1_CreateMaterial(IDirect3DRM *iface,
275 D3DVALUE power, IDirect3DRMMaterial **material)
277 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
279 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
281 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
284 static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
285 DWORD width, DWORD height, IDirect3DRMDevice **device)
287 struct d3drm_device *object;
288 HRESULT hr;
290 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
292 if (FAILED(hr = d3drm_device_create(&object, iface)))
293 return hr;
295 *device = &object->IDirect3DRMDevice_iface;
297 return D3DRM_OK;
300 static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid,
301 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device)
303 struct d3drm_device *object;
304 HRESULT hr;
306 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
307 iface, debugstr_guid(guid), ddraw, backbuffer, device);
309 if (!device)
310 return D3DRMERR_BADVALUE;
311 *device = NULL;
313 if (!backbuffer || !ddraw)
314 return D3DRMERR_BADDEVICE;
316 if (FAILED(hr = d3drm_device_create(&object, iface)))
317 return hr;
319 if (SUCCEEDED(hr = d3drm_device_init(object, 1, ddraw, backbuffer, TRUE)))
320 *device = &object->IDirect3DRMDevice_iface;
321 else
322 d3drm_device_destroy(object);
324 return hr;
327 static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface,
328 IDirect3D *d3d, IDirect3DDevice *d3d_device, IDirect3DRMDevice **device)
330 struct d3drm_device *object;
331 HRESULT hr;
332 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
333 iface, d3d, d3d_device, device);
335 if (!device)
336 return D3DRMERR_BADVALUE;
337 *device = NULL;
339 if (FAILED(hr = d3drm_device_create(&object, iface)))
340 return hr;
342 if (FAILED(hr = IDirect3DRMDevice_InitFromD3D(&object->IDirect3DRMDevice_iface, d3d, d3d_device)))
344 d3drm_device_destroy(object);
345 return hr;
347 *device = &object->IDirect3DRMDevice_iface;
349 return D3DRM_OK;
352 static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
353 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
354 IDirect3DRMDevice **device)
356 struct d3drm_device *object;
357 IDirectDraw *ddraw;
358 IDirectDrawSurface *render_target;
359 HRESULT hr;
361 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
362 iface, clipper, debugstr_guid(guid), width, height, device);
364 if (!device)
365 return D3DRMERR_BADVALUE;
366 *device = NULL;
368 if (!clipper || !width || !height)
369 return D3DRMERR_BADVALUE;
371 hr = DirectDrawCreate(NULL, &ddraw, NULL);
372 if (FAILED(hr))
373 return hr;
375 if (FAILED(hr = d3drm_device_create(&object, iface)))
377 IDirectDraw_Release(ddraw);
378 return hr;
381 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
382 if (FAILED(hr))
384 IDirectDraw_Release(ddraw);
385 d3drm_device_destroy(object);
386 return hr;
389 hr = d3drm_device_init(object, 1, ddraw, render_target, TRUE);
390 IDirectDraw_Release(ddraw);
391 IDirectDrawSurface_Release(render_target);
392 if (FAILED(hr))
393 d3drm_device_destroy(object);
394 else
395 *device = &object->IDirect3DRMDevice_iface;
397 return hr;
400 static HRESULT WINAPI d3drm1_CreateTextureFromSurface(IDirect3DRM *iface,
401 IDirectDrawSurface *surface, IDirect3DRMTexture **texture)
403 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
405 return E_NOTIMPL;
408 static HRESULT WINAPI d3drm1_CreateShadow(IDirect3DRM *iface, IDirect3DRMVisual *visual,
409 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
410 IDirect3DRMVisual **shadow)
412 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
413 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
415 return E_NOTIMPL;
418 static HRESULT WINAPI d3drm1_CreateViewport(IDirect3DRM *iface, IDirect3DRMDevice *device,
419 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
421 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
423 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
424 iface, device, camera, x, y, width, height, viewport);
426 return IDirect3DRM2_CreateViewport(&d3drm->IDirect3DRM2_iface, device, camera, x, y, width, height, viewport);
429 static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
430 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
431 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
432 IDirect3DRMWrap **wrap)
434 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
435 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
436 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
438 return E_NOTIMPL;
441 static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface,
442 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
444 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface, cb, ctx, visual);
446 return E_NOTIMPL;
449 static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface,
450 const char *filename, IDirect3DRMTexture **texture)
452 struct d3drm_texture *object;
453 HRESULT hr;
455 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
457 if (FAILED(hr = d3drm_texture_create(&object, iface)))
458 return hr;
460 *texture = &object->IDirect3DRMTexture_iface;
462 return D3DRM_OK;
465 static HRESULT WINAPI d3drm1_LoadTextureFromResource(IDirect3DRM *iface,
466 HRSRC resource, IDirect3DRMTexture **texture)
468 struct d3drm_texture *object;
469 HRESULT hr;
471 FIXME("iface %p, resource %p, texture %p stub!\n", iface, resource, texture);
473 if (FAILED(hr = d3drm_texture_create(&object, iface)))
474 return hr;
476 *texture = &object->IDirect3DRMTexture_iface;
478 return D3DRM_OK;
481 static HRESULT WINAPI d3drm1_SetSearchPath(IDirect3DRM *iface, const char *path)
483 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
485 return E_NOTIMPL;
488 static HRESULT WINAPI d3drm1_AddSearchPath(IDirect3DRM *iface, const char *path)
490 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
492 return E_NOTIMPL;
495 static HRESULT WINAPI d3drm1_GetSearchPath(IDirect3DRM *iface, DWORD *size, char *path)
497 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
499 return E_NOTIMPL;
502 static HRESULT WINAPI d3drm1_SetDefaultTextureColors(IDirect3DRM *iface, DWORD color_count)
504 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
506 return E_NOTIMPL;
509 static HRESULT WINAPI d3drm1_SetDefaultTextureShades(IDirect3DRM *iface, DWORD shade_count)
511 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
513 return E_NOTIMPL;
516 static HRESULT WINAPI d3drm1_GetDevices(IDirect3DRM *iface, IDirect3DRMDeviceArray **array)
518 FIXME("iface %p, array %p stub!\n", iface, array);
520 return E_NOTIMPL;
523 static HRESULT WINAPI d3drm1_GetNamedObject(IDirect3DRM *iface,
524 const char *name, IDirect3DRMObject **object)
526 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
528 return E_NOTIMPL;
531 static HRESULT WINAPI d3drm1_EnumerateObjects(IDirect3DRM *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
533 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
535 return E_NOTIMPL;
538 static HRESULT WINAPI d3drm1_Load(IDirect3DRM *iface, void *source, void *object_id, IID **iids,
539 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
540 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
542 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
543 IDirect3DRMFrame3 *parent_frame3 = NULL;
544 HRESULT hr = D3DRM_OK;
546 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
547 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
548 iface, source, object_id, iids, iid_count, flags,
549 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
551 if (parent_frame)
552 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
553 if (SUCCEEDED(hr))
554 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
555 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
556 if (parent_frame3)
557 IDirect3DRMFrame3_Release(parent_frame3);
559 return hr;
562 static HRESULT WINAPI d3drm1_Tick(IDirect3DRM *iface, D3DVALUE tick)
564 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
566 return E_NOTIMPL;
569 static const struct IDirect3DRMVtbl d3drm1_vtbl =
571 d3drm1_QueryInterface,
572 d3drm1_AddRef,
573 d3drm1_Release,
574 d3drm1_CreateObject,
575 d3drm1_CreateFrame,
576 d3drm1_CreateMesh,
577 d3drm1_CreateMeshBuilder,
578 d3drm1_CreateFace,
579 d3drm1_CreateAnimation,
580 d3drm1_CreateAnimationSet,
581 d3drm1_CreateTexture,
582 d3drm1_CreateLight,
583 d3drm1_CreateLightRGB,
584 d3drm1_CreateMaterial,
585 d3drm1_CreateDevice,
586 d3drm1_CreateDeviceFromSurface,
587 d3drm1_CreateDeviceFromD3D,
588 d3drm1_CreateDeviceFromClipper,
589 d3drm1_CreateTextureFromSurface,
590 d3drm1_CreateShadow,
591 d3drm1_CreateViewport,
592 d3drm1_CreateWrap,
593 d3drm1_CreateUserVisual,
594 d3drm1_LoadTexture,
595 d3drm1_LoadTextureFromResource,
596 d3drm1_SetSearchPath,
597 d3drm1_AddSearchPath,
598 d3drm1_GetSearchPath,
599 d3drm1_SetDefaultTextureColors,
600 d3drm1_SetDefaultTextureShades,
601 d3drm1_GetDevices,
602 d3drm1_GetNamedObject,
603 d3drm1_EnumerateObjects,
604 d3drm1_Load,
605 d3drm1_Tick,
608 static HRESULT WINAPI d3drm2_QueryInterface(IDirect3DRM2 *iface, REFIID riid, void **out)
610 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
612 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
615 static ULONG WINAPI d3drm2_AddRef(IDirect3DRM2 *iface)
617 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
618 ULONG refcount = InterlockedIncrement(&d3drm->ref2);
620 TRACE("%p increasing refcount to %u.\n", iface, refcount);
622 if (refcount == 1)
623 InterlockedIncrement(&d3drm->iface_count);
625 return refcount;
628 static ULONG WINAPI d3drm2_Release(IDirect3DRM2 *iface)
630 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
631 ULONG refcount = InterlockedDecrement(&d3drm->ref2);
633 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
635 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
636 d3drm_destroy(d3drm);
638 return refcount;
641 static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
642 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
644 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
646 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
647 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
649 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
652 static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
653 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame2 **frame)
655 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
656 struct d3drm_frame *object;
657 HRESULT hr;
659 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
661 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, &d3drm->IDirect3DRM_iface)))
662 return hr;
664 *frame = &object->IDirect3DRMFrame2_iface;
666 return D3DRM_OK;
669 static HRESULT WINAPI d3drm2_CreateMesh(IDirect3DRM2 *iface, IDirect3DRMMesh **mesh)
671 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
673 TRACE("iface %p, mesh %p.\n", iface, mesh);
675 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
678 static HRESULT WINAPI d3drm2_CreateMeshBuilder(IDirect3DRM2 *iface, IDirect3DRMMeshBuilder2 **mesh_builder)
680 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
682 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder2, (IUnknown **)mesh_builder);
685 static HRESULT WINAPI d3drm2_CreateFace(IDirect3DRM2 *iface, IDirect3DRMFace **face)
687 TRACE("iface %p, face %p.\n", iface, face);
689 return Direct3DRMFace_create(&IID_IDirect3DRMFace, (IUnknown **)face);
692 static HRESULT WINAPI d3drm2_CreateAnimation(IDirect3DRM2 *iface, IDirect3DRMAnimation **animation)
694 FIXME("iface %p, animation %p stub!\n", iface, animation);
696 return E_NOTIMPL;
699 static HRESULT WINAPI d3drm2_CreateAnimationSet(IDirect3DRM2 *iface, IDirect3DRMAnimationSet **set)
701 FIXME("iface %p, set %p stub!\n", iface, set);
703 return E_NOTIMPL;
706 static HRESULT WINAPI d3drm2_CreateTexture(IDirect3DRM2 *iface,
707 D3DRMIMAGE *image, IDirect3DRMTexture2 **texture)
709 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
710 IDirect3DRMTexture3 *texture3;
711 HRESULT hr;
713 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
715 if (!texture)
716 return D3DRMERR_BADVALUE;
718 if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
720 *texture = NULL;
721 return hr;
724 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture);
725 IDirect3DRMTexture3_Release(texture3);
727 return hr;
730 static HRESULT WINAPI d3drm2_CreateLight(IDirect3DRM2 *iface,
731 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
733 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
735 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
737 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
740 static HRESULT WINAPI d3drm2_CreateLightRGB(IDirect3DRM2 *iface, D3DRMLIGHTTYPE type,
741 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
743 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
745 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
746 iface, type, red, green, blue, light);
748 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
751 static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface,
752 D3DVALUE power, IDirect3DRMMaterial **material)
754 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
756 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
758 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
761 static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface,
762 DWORD width, DWORD height, IDirect3DRMDevice2 **device)
764 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
765 struct d3drm_device *object;
766 HRESULT hr;
768 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
770 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
771 return hr;
773 *device = &object->IDirect3DRMDevice2_iface;
775 return D3DRM_OK;
778 static HRESULT WINAPI d3drm2_CreateDeviceFromSurface(IDirect3DRM2 *iface, GUID *guid,
779 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice2 **device)
781 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
782 IDirect3DRMDevice3 *device3;
783 HRESULT hr;
784 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
785 iface, debugstr_guid(guid), ddraw, backbuffer, device);
787 if (!device)
788 return D3DRMERR_BADVALUE;
789 *device = NULL;
790 hr = IDirect3DRM3_CreateDeviceFromSurface(&d3drm->IDirect3DRM3_iface, guid, ddraw, backbuffer, 0, &device3);
791 if (FAILED(hr))
792 return hr;
794 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
795 IDirect3DRMDevice3_Release(device3);
797 return hr;
800 static HRESULT WINAPI d3drm2_CreateDeviceFromD3D(IDirect3DRM2 *iface,
801 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device)
803 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
804 IDirect3DRMDevice3 *device3;
805 HRESULT hr;
807 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
808 iface, d3d, d3d_device, device);
810 if (!device)
811 return D3DRMERR_BADVALUE;
812 *device = NULL;
814 hr = IDirect3DRM3_CreateDeviceFromD3D(&d3drm->IDirect3DRM3_iface, d3d, d3d_device, &device3);
815 if (FAILED(hr))
816 return hr;
818 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void **)device);
819 IDirect3DRMDevice3_Release(device3);
821 return hr;
824 static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface,
825 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
826 IDirect3DRMDevice2 **device)
828 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
829 IDirect3DRMDevice3 *device3;
830 HRESULT hr;
832 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
833 iface, clipper, debugstr_guid(guid), width, height, device);
835 if (!device)
836 return D3DRMERR_BADVALUE;
837 *device = NULL;
838 hr = IDirect3DRM3_CreateDeviceFromClipper(&d3drm->IDirect3DRM3_iface, clipper, guid, width, height, &device3);
839 if (FAILED(hr))
840 return hr;
842 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
843 IDirect3DRMDevice3_Release(device3);
845 return hr;
848 static HRESULT WINAPI d3drm2_CreateTextureFromSurface(IDirect3DRM2 *iface,
849 IDirectDrawSurface *surface, IDirect3DRMTexture2 **texture)
851 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
853 return E_NOTIMPL;
856 static HRESULT WINAPI d3drm2_CreateShadow(IDirect3DRM2 *iface, IDirect3DRMVisual *visual,
857 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
858 IDirect3DRMVisual **shadow)
860 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
861 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
863 return E_NOTIMPL;
866 static HRESULT WINAPI d3drm2_CreateViewport(IDirect3DRM2 *iface, IDirect3DRMDevice *device,
867 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
869 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
870 struct d3drm_viewport *object;
871 HRESULT hr;
873 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
874 iface, device, camera, x, y, width, height, viewport);
876 if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface)))
877 return hr;
879 *viewport = &object->IDirect3DRMViewport_iface;
881 return D3DRM_OK;
884 static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
885 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
886 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
887 IDirect3DRMWrap **wrap)
889 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
890 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
891 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
893 return E_NOTIMPL;
896 static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface,
897 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
899 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
901 return E_NOTIMPL;
904 static HRESULT WINAPI d3drm2_LoadTexture(IDirect3DRM2 *iface,
905 const char *filename, IDirect3DRMTexture2 **texture)
907 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
908 struct d3drm_texture *object;
909 HRESULT hr;
911 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
913 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
914 return hr;
916 *texture = &object->IDirect3DRMTexture2_iface;
918 return hr;
921 static HRESULT WINAPI d3drm2_LoadTextureFromResource(IDirect3DRM2 *iface, HMODULE module,
922 const char *resource_name, const char *resource_type, IDirect3DRMTexture2 **texture)
924 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
925 struct d3drm_texture *object;
926 HRESULT hr;
928 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
929 iface, debugstr_a(resource_name), debugstr_a(resource_type), texture);
931 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
932 return hr;
934 *texture = &object->IDirect3DRMTexture2_iface;
936 return D3DRM_OK;
939 static HRESULT WINAPI d3drm2_SetSearchPath(IDirect3DRM2 *iface, const char *path)
941 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
943 return E_NOTIMPL;
946 static HRESULT WINAPI d3drm2_AddSearchPath(IDirect3DRM2 *iface, const char *path)
948 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
950 return E_NOTIMPL;
953 static HRESULT WINAPI d3drm2_GetSearchPath(IDirect3DRM2 *iface, DWORD *size, char *path)
955 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
957 return E_NOTIMPL;
960 static HRESULT WINAPI d3drm2_SetDefaultTextureColors(IDirect3DRM2 *iface, DWORD color_count)
962 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
964 return E_NOTIMPL;
967 static HRESULT WINAPI d3drm2_SetDefaultTextureShades(IDirect3DRM2 *iface, DWORD shade_count)
969 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
971 return E_NOTIMPL;
974 static HRESULT WINAPI d3drm2_GetDevices(IDirect3DRM2 *iface, IDirect3DRMDeviceArray **array)
976 FIXME("iface %p, array %p stub!\n", iface, array);
978 return E_NOTIMPL;
981 static HRESULT WINAPI d3drm2_GetNamedObject(IDirect3DRM2 *iface,
982 const char *name, IDirect3DRMObject **object)
984 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
986 return E_NOTIMPL;
989 static HRESULT WINAPI d3drm2_EnumerateObjects(IDirect3DRM2 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
991 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
993 return E_NOTIMPL;
996 static HRESULT WINAPI d3drm2_Load(IDirect3DRM2 *iface, void *source, void *object_id, IID **iids,
997 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
998 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
1000 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1001 IDirect3DRMFrame3 *parent_frame3 = NULL;
1002 HRESULT hr = D3DRM_OK;
1004 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1005 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1006 iface, source, object_id, iids, iid_count, flags,
1007 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1009 if (parent_frame)
1010 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
1011 if (SUCCEEDED(hr))
1012 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
1013 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
1014 if (parent_frame3)
1015 IDirect3DRMFrame3_Release(parent_frame3);
1017 return hr;
1020 static HRESULT WINAPI d3drm2_Tick(IDirect3DRM2 *iface, D3DVALUE tick)
1022 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
1024 return E_NOTIMPL;
1027 static HRESULT WINAPI d3drm2_CreateProgressiveMesh(IDirect3DRM2 *iface, IDirect3DRMProgressiveMesh **mesh)
1029 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1031 return E_NOTIMPL;
1034 static const struct IDirect3DRM2Vtbl d3drm2_vtbl =
1036 d3drm2_QueryInterface,
1037 d3drm2_AddRef,
1038 d3drm2_Release,
1039 d3drm2_CreateObject,
1040 d3drm2_CreateFrame,
1041 d3drm2_CreateMesh,
1042 d3drm2_CreateMeshBuilder,
1043 d3drm2_CreateFace,
1044 d3drm2_CreateAnimation,
1045 d3drm2_CreateAnimationSet,
1046 d3drm2_CreateTexture,
1047 d3drm2_CreateLight,
1048 d3drm2_CreateLightRGB,
1049 d3drm2_CreateMaterial,
1050 d3drm2_CreateDevice,
1051 d3drm2_CreateDeviceFromSurface,
1052 d3drm2_CreateDeviceFromD3D,
1053 d3drm2_CreateDeviceFromClipper,
1054 d3drm2_CreateTextureFromSurface,
1055 d3drm2_CreateShadow,
1056 d3drm2_CreateViewport,
1057 d3drm2_CreateWrap,
1058 d3drm2_CreateUserVisual,
1059 d3drm2_LoadTexture,
1060 d3drm2_LoadTextureFromResource,
1061 d3drm2_SetSearchPath,
1062 d3drm2_AddSearchPath,
1063 d3drm2_GetSearchPath,
1064 d3drm2_SetDefaultTextureColors,
1065 d3drm2_SetDefaultTextureShades,
1066 d3drm2_GetDevices,
1067 d3drm2_GetNamedObject,
1068 d3drm2_EnumerateObjects,
1069 d3drm2_Load,
1070 d3drm2_Tick,
1071 d3drm2_CreateProgressiveMesh,
1074 static HRESULT WINAPI d3drm3_QueryInterface(IDirect3DRM3 *iface, REFIID riid, void **out)
1076 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1078 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
1081 static ULONG WINAPI d3drm3_AddRef(IDirect3DRM3 *iface)
1083 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1084 ULONG refcount = InterlockedIncrement(&d3drm->ref3);
1086 TRACE("%p increasing refcount to %u.\n", iface, refcount);
1088 if (refcount == 1)
1089 InterlockedIncrement(&d3drm->iface_count);
1091 return refcount;
1094 static ULONG WINAPI d3drm3_Release(IDirect3DRM3 *iface)
1096 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1097 ULONG refcount = InterlockedDecrement(&d3drm->ref3);
1099 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
1101 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
1102 d3drm_destroy(d3drm);
1104 return refcount;
1107 static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
1108 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
1110 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1111 IUnknown *object;
1112 unsigned int i;
1113 HRESULT hr;
1115 static const struct
1117 const CLSID *clsid;
1118 HRESULT (*create_object)(void **object, IDirect3DRM *d3drm);
1120 object_table[] =
1122 {&CLSID_CDirect3DRMTexture, d3drm_create_texture_object},
1123 {&CLSID_CDirect3DRMDevice, d3drm_create_device_object},
1126 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1127 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
1129 if (!out)
1130 return D3DRMERR_BADVALUE;
1132 if (!clsid || !iid)
1134 *out = NULL;
1135 return D3DRMERR_BADVALUE;
1138 if (outer)
1140 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer);
1141 *out = NULL;
1142 return E_NOTIMPL;
1145 for (i = 0; i < ARRAY_SIZE(object_table); ++i)
1147 if (IsEqualGUID(clsid, object_table[i].clsid))
1149 if (FAILED(hr = object_table[i].create_object((void **)&object, &d3drm->IDirect3DRM_iface)))
1151 *out = NULL;
1152 return hr;
1154 break;
1157 if (i == ARRAY_SIZE(object_table))
1159 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
1160 *out = NULL;
1161 return CLASSFACTORY_E_FIRST;
1164 if (FAILED(hr = IUnknown_QueryInterface(object, iid, out)))
1165 *out = NULL;
1166 IUnknown_Release(object);
1168 return hr;
1171 static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
1172 IDirect3DRMFrame3 *parent, IDirect3DRMFrame3 **frame)
1174 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1175 struct d3drm_frame *object;
1176 HRESULT hr;
1178 TRACE("iface %p, parent %p, frame %p.\n", iface, parent, frame);
1180 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent, &d3drm->IDirect3DRM_iface)))
1181 return hr;
1183 *frame = &object->IDirect3DRMFrame3_iface;
1185 return D3DRM_OK;
1188 static HRESULT WINAPI d3drm3_CreateMesh(IDirect3DRM3 *iface, IDirect3DRMMesh **mesh)
1190 TRACE("iface %p, mesh %p.\n", iface, mesh);
1192 return Direct3DRMMesh_create(mesh);
1195 static HRESULT WINAPI d3drm3_CreateMeshBuilder(IDirect3DRM3 *iface, IDirect3DRMMeshBuilder3 **mesh_builder)
1197 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
1199 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder3, (IUnknown **)mesh_builder);
1202 static HRESULT WINAPI d3drm3_CreateFace(IDirect3DRM3 *iface, IDirect3DRMFace2 **face)
1204 TRACE("iface %p, face %p.\n", iface, face);
1206 return Direct3DRMFace_create(&IID_IDirect3DRMFace2, (IUnknown **)face);
1209 static HRESULT WINAPI d3drm3_CreateAnimation(IDirect3DRM3 *iface, IDirect3DRMAnimation2 **animation)
1211 FIXME("iface %p, animation %p stub!\n", iface, animation);
1213 return E_NOTIMPL;
1216 static HRESULT WINAPI d3drm3_CreateAnimationSet(IDirect3DRM3 *iface, IDirect3DRMAnimationSet2 **set)
1218 FIXME("iface %p, set %p stub!\n", iface, set);
1220 return E_NOTIMPL;
1223 static HRESULT WINAPI d3drm3_CreateTexture(IDirect3DRM3 *iface,
1224 D3DRMIMAGE *image, IDirect3DRMTexture3 **texture)
1226 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1227 struct d3drm_texture *object;
1228 HRESULT hr;
1230 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
1232 if (!texture)
1233 return D3DRMERR_BADVALUE;
1235 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1236 return hr;
1238 *texture = &object->IDirect3DRMTexture3_iface;
1240 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture, image)))
1242 IDirect3DRMTexture3_Release(*texture);
1243 *texture = NULL;
1244 return D3DRMERR_BADVALUE;
1247 return D3DRM_OK;
1250 static HRESULT WINAPI d3drm3_CreateLight(IDirect3DRM3 *iface,
1251 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
1253 HRESULT hr;
1255 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface, type, color, light);
1257 if (SUCCEEDED(hr = Direct3DRMLight_create((IUnknown **)light)))
1259 IDirect3DRMLight_SetType(*light, type);
1260 IDirect3DRMLight_SetColor(*light, color);
1263 return hr;
1266 static HRESULT WINAPI d3drm3_CreateLightRGB(IDirect3DRM3 *iface, D3DRMLIGHTTYPE type,
1267 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
1269 HRESULT hr;
1271 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1272 iface, type, red, green, blue, light);
1274 if (SUCCEEDED(hr = Direct3DRMLight_create((IUnknown **)light)))
1276 IDirect3DRMLight_SetType(*light, type);
1277 IDirect3DRMLight_SetColorRGB(*light, red, green, blue);
1280 return hr;
1283 static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface,
1284 D3DVALUE power, IDirect3DRMMaterial2 **material)
1286 HRESULT hr;
1288 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
1290 if (SUCCEEDED(hr = Direct3DRMMaterial_create(material)))
1291 IDirect3DRMMaterial2_SetPower(*material, power);
1293 return hr;
1296 static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface,
1297 DWORD width, DWORD height, IDirect3DRMDevice3 **device)
1299 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1300 struct d3drm_device *object;
1301 HRESULT hr;
1303 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
1305 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1306 return hr;
1308 *device = &object->IDirect3DRMDevice3_iface;
1310 return D3DRM_OK;
1313 static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *guid,
1314 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, DWORD flags, IDirect3DRMDevice3 **device)
1316 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1317 struct d3drm_device *object;
1318 BOOL use_z_surface;
1319 HRESULT hr;
1321 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1322 iface, debugstr_guid(guid), ddraw, backbuffer, flags, device);
1324 if (!device)
1325 return D3DRMERR_BADVALUE;
1326 *device = NULL;
1328 if (!backbuffer || !ddraw)
1329 return D3DRMERR_BADDEVICE;
1331 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1332 return hr;
1334 use_z_surface = !(flags & D3DRMDEVICE_NOZBUFFER);
1336 if (SUCCEEDED(hr = d3drm_device_init(object, 3, ddraw, backbuffer, use_z_surface)))
1337 *device = &object->IDirect3DRMDevice3_iface;
1338 else
1339 d3drm_device_destroy(object);
1341 return hr;
1344 static HRESULT WINAPI d3drm3_CreateDeviceFromD3D(IDirect3DRM3 *iface,
1345 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device)
1347 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1348 struct d3drm_device *object;
1349 HRESULT hr;
1351 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1352 iface, d3d, d3d_device, device);
1354 if (!device)
1355 return D3DRMERR_BADVALUE;
1356 *device = NULL;
1358 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1359 return hr;
1361 if (FAILED(hr = IDirect3DRMDevice3_InitFromD3D2(&object->IDirect3DRMDevice3_iface, d3d, d3d_device)))
1363 d3drm_device_destroy(object);
1364 return hr;
1366 *device = &object->IDirect3DRMDevice3_iface;
1368 return D3DRM_OK;
1371 static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
1372 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
1373 IDirect3DRMDevice3 **device)
1375 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1376 struct d3drm_device *object;
1377 IDirectDraw *ddraw;
1378 IDirectDrawSurface *render_target;
1379 HRESULT hr;
1381 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1382 iface, clipper, debugstr_guid(guid), width, height, device);
1384 if (!device)
1385 return D3DRMERR_BADVALUE;
1386 *device = NULL;
1388 if (!clipper || !width || !height)
1389 return D3DRMERR_BADVALUE;
1391 hr = DirectDrawCreate(NULL, &ddraw, NULL);
1392 if (FAILED(hr))
1393 return hr;
1395 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1397 IDirectDraw_Release(ddraw);
1398 return hr;
1401 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
1402 if (FAILED(hr))
1404 IDirectDraw_Release(ddraw);
1405 d3drm_device_destroy(object);
1406 return hr;
1409 hr = d3drm_device_init(object, 3, ddraw, render_target, TRUE);
1410 IDirectDraw_Release(ddraw);
1411 IDirectDrawSurface_Release(render_target);
1412 if (FAILED(hr))
1413 d3drm_device_destroy(object);
1414 else
1415 *device = &object->IDirect3DRMDevice3_iface;
1417 return hr;
1420 static HRESULT WINAPI d3drm3_CreateShadow(IDirect3DRM3 *iface, IUnknown *object, IDirect3DRMLight *light,
1421 D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, IDirect3DRMShadow2 **shadow)
1423 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1424 iface, object, light, px, py, pz, nx, ny, nz, shadow);
1426 return E_NOTIMPL;
1429 static HRESULT WINAPI d3drm3_CreateTextureFromSurface(IDirect3DRM3 *iface,
1430 IDirectDrawSurface *surface, IDirect3DRMTexture3 **texture)
1432 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
1434 return E_NOTIMPL;
1437 static HRESULT WINAPI d3drm3_CreateViewport(IDirect3DRM3 *iface, IDirect3DRMDevice3 *device,
1438 IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport2 **viewport)
1440 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1441 struct d3drm_viewport *object;
1442 HRESULT hr;
1444 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
1445 iface, device, camera, x, y, width, height, viewport);
1447 if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface)))
1448 return hr;
1450 *viewport = &object->IDirect3DRMViewport2_iface;
1452 return D3DRM_OK;
1455 static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame3 *frame,
1456 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1457 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
1458 IDirect3DRMWrap **wrap)
1460 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1461 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1462 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
1464 return E_NOTIMPL;
1467 static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,
1468 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
1470 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
1472 return E_NOTIMPL;
1475 static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface,
1476 const char *filename, IDirect3DRMTexture3 **texture)
1478 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1479 struct d3drm_texture *object;
1480 HRESULT hr;
1482 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
1484 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1485 return hr;
1487 *texture = &object->IDirect3DRMTexture3_iface;
1489 return D3DRM_OK;
1492 static HRESULT WINAPI d3drm3_LoadTextureFromResource(IDirect3DRM3 *iface, HMODULE module,
1493 const char *resource_name, const char *resource_type, IDirect3DRMTexture3 **texture)
1495 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1496 struct d3drm_texture *object;
1497 HRESULT hr;
1499 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1500 iface, module, debugstr_a(resource_name), debugstr_a(resource_type), texture);
1502 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1503 return hr;
1505 *texture = &object->IDirect3DRMTexture3_iface;
1507 return D3DRM_OK;
1510 static HRESULT WINAPI d3drm3_SetSearchPath(IDirect3DRM3 *iface, const char *path)
1512 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1514 return E_NOTIMPL;
1517 static HRESULT WINAPI d3drm3_AddSearchPath(IDirect3DRM3 *iface, const char *path)
1519 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1521 return E_NOTIMPL;
1524 static HRESULT WINAPI d3drm3_GetSearchPath(IDirect3DRM3 *iface, DWORD *size, char *path)
1526 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
1528 return E_NOTIMPL;
1531 static HRESULT WINAPI d3drm3_SetDefaultTextureColors(IDirect3DRM3 *iface, DWORD color_count)
1533 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
1535 return E_NOTIMPL;
1538 static HRESULT WINAPI d3drm3_SetDefaultTextureShades(IDirect3DRM3 *iface, DWORD shade_count)
1540 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
1542 return E_NOTIMPL;
1545 static HRESULT WINAPI d3drm3_GetDevices(IDirect3DRM3 *iface, IDirect3DRMDeviceArray **array)
1547 FIXME("iface %p, array %p stub!\n", iface, array);
1549 return E_NOTIMPL;
1552 static HRESULT WINAPI d3drm3_GetNamedObject(IDirect3DRM3 *iface,
1553 const char *name, IDirect3DRMObject **object)
1555 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
1557 return E_NOTIMPL;
1560 static HRESULT WINAPI d3drm3_EnumerateObjects(IDirect3DRM3 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
1562 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1564 return E_NOTIMPL;
1567 static HRESULT load_data(IDirect3DRM3 *iface, IDirectXFileData *data_object, IID **GUIDs, DWORD nb_GUIDs, D3DRMLOADCALLBACK LoadProc,
1568 void *ArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc, void *ArgLTP, IDirect3DRMFrame3 *parent_frame)
1570 HRESULT ret = D3DRMERR_BADOBJECT;
1571 HRESULT hr;
1572 const GUID* guid;
1573 DWORD i;
1574 BOOL requested = FALSE;
1576 hr = IDirectXFileData_GetType(data_object, &guid);
1577 if (hr != DXFILE_OK)
1578 goto end;
1580 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1582 /* Load object only if it is top level and requested or if it is part of another object */
1584 if (IsEqualGUID(guid, &TID_D3DRMMesh))
1586 TRACE("Found TID_D3DRMMesh\n");
1588 for (i = 0; i < nb_GUIDs; i++)
1589 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder) ||
1590 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder2) ||
1591 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder3))
1593 requested = TRUE;
1594 break;
1597 if (requested || parent_frame)
1599 IDirect3DRMMeshBuilder3 *meshbuilder;
1601 TRACE("Load mesh data\n");
1603 hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
1604 if (SUCCEEDED(hr))
1606 hr = load_mesh_data(meshbuilder, data_object, LoadTextureProc, ArgLTP);
1607 if (SUCCEEDED(hr))
1609 /* Only top level objects are notified */
1610 if (!parent_frame)
1612 IDirect3DRMObject *object;
1614 hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
1615 if (SUCCEEDED(hr))
1617 LoadProc(object, GUIDs[i], ArgLP);
1618 IDirect3DRMObject_Release(object);
1621 else
1623 IDirect3DRMFrame3_AddVisual(parent_frame, (IUnknown*)meshbuilder);
1626 IDirect3DRMMeshBuilder3_Release(meshbuilder);
1629 if (FAILED(hr))
1630 ERR("Cannot process mesh\n");
1633 else if (IsEqualGUID(guid, &TID_D3DRMFrame))
1635 TRACE("Found TID_D3DRMFrame\n");
1637 for (i = 0; i < nb_GUIDs; i++)
1638 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
1639 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
1640 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
1642 requested = TRUE;
1643 break;
1646 if (requested || parent_frame)
1648 IDirect3DRMFrame3 *frame;
1650 TRACE("Load frame data\n");
1652 hr = IDirect3DRM3_CreateFrame(iface, parent_frame, &frame);
1653 if (SUCCEEDED(hr))
1655 IDirectXFileObject *child;
1657 while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(data_object, &child)))
1659 IDirectXFileData *data;
1660 IDirectXFileDataReference *reference;
1661 IDirectXFileBinary *binary;
1663 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1664 &IID_IDirectXFileBinary, (void **)&binary)))
1666 FIXME("Binary Object not supported yet\n");
1667 IDirectXFileBinary_Release(binary);
1669 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1670 &IID_IDirectXFileData, (void **)&data)))
1672 TRACE("Found Data Object\n");
1673 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
1674 IDirectXFileData_Release(data);
1676 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1677 &IID_IDirectXFileDataReference, (void **)&reference)))
1679 TRACE("Found Data Object Reference\n");
1680 IDirectXFileDataReference_Resolve(reference, &data);
1681 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
1682 IDirectXFileData_Release(data);
1683 IDirectXFileDataReference_Release(reference);
1685 IDirectXFileObject_Release(child);
1688 if (hr != DXFILEERR_NOMOREOBJECTS)
1690 IDirect3DRMFrame3_Release(frame);
1691 goto end;
1693 hr = S_OK;
1695 /* Only top level objects are notified */
1696 if (!parent_frame)
1698 IDirect3DRMObject *object;
1700 hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
1701 if (SUCCEEDED(hr))
1703 LoadProc(object, GUIDs[i], ArgLP);
1704 IDirect3DRMObject_Release(object);
1707 IDirect3DRMFrame3_Release(frame);
1710 if (FAILED(hr))
1711 ERR("Cannot process frame\n");
1714 else if (IsEqualGUID(guid, &TID_D3DRMMaterial))
1716 TRACE("Found TID_D3DRMMaterial\n");
1718 /* Cannot be requested so nothing to do */
1720 else if (IsEqualGUID(guid, &TID_D3DRMFrameTransformMatrix))
1722 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
1724 /* Cannot be requested */
1725 if (parent_frame)
1727 D3DRMMATRIX4D *matrix;
1728 DWORD size;
1730 TRACE("Load Frame Transform Matrix data\n");
1732 hr = IDirectXFileData_GetData(data_object, NULL, &size, (void**)&matrix);
1733 if ((hr != DXFILE_OK) || (size != sizeof(matrix)))
1734 goto end;
1736 hr = IDirect3DRMFrame3_AddTransform(parent_frame, D3DRMCOMBINE_REPLACE, *matrix);
1737 if (FAILED(hr))
1738 goto end;
1741 else
1743 FIXME("Found unknown TID %s\n", debugstr_guid(guid));
1746 ret = D3DRM_OK;
1748 end:
1750 return ret;
1753 static HRESULT WINAPI d3drm3_Load(IDirect3DRM3 *iface, void *source, void *object_id, IID **iids,
1754 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
1755 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame3 *parent_frame)
1757 DXFILELOADOPTIONS load_options;
1758 IDirectXFile *file = NULL;
1759 IDirectXFileEnumObject *enum_object = NULL;
1760 IDirectXFileData *data = NULL;
1761 HRESULT hr;
1762 const GUID* pGuid;
1763 DWORD size;
1764 struct d3drm_file_header *header;
1765 HRESULT ret = D3DRMERR_BADOBJECT;
1766 DWORD i;
1768 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1769 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1770 iface, source, object_id, iids, iid_count, flags,
1771 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1773 TRACE("Looking for GUIDs:\n");
1774 for (i = 0; i < iid_count; ++i)
1775 TRACE("- %s (%s)\n", debugstr_guid(iids[i]), get_IID_string(iids[i]));
1777 if (flags == D3DRMLOAD_FROMMEMORY)
1779 load_options = DXFILELOAD_FROMMEMORY;
1781 else if (flags == D3DRMLOAD_FROMFILE)
1783 load_options = DXFILELOAD_FROMFILE;
1784 TRACE("Loading from file %s\n", debugstr_a(source));
1786 else
1788 FIXME("Load options %#x not supported yet.\n", flags);
1789 return E_NOTIMPL;
1792 hr = DirectXFileCreate(&file);
1793 if (hr != DXFILE_OK)
1794 goto end;
1796 hr = IDirectXFile_RegisterTemplates(file, templates, strlen(templates));
1797 if (hr != DXFILE_OK)
1798 goto end;
1800 hr = IDirectXFile_CreateEnumObject(file, source, load_options, &enum_object);
1801 if (hr != DXFILE_OK)
1802 goto end;
1804 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
1805 if (hr != DXFILE_OK)
1806 goto end;
1808 hr = IDirectXFileData_GetType(data, &pGuid);
1809 if (hr != DXFILE_OK)
1810 goto end;
1812 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1814 if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
1816 ret = D3DRMERR_BADFILE;
1817 goto end;
1820 hr = IDirectXFileData_GetData(data, NULL, &size, (void **)&header);
1821 if ((hr != DXFILE_OK) || (size != sizeof(*header)))
1822 goto end;
1824 TRACE("Version is %u.%u, flags %#x.\n", header->major, header->minor, header->flags);
1826 /* Version must be 1.0.x */
1827 if ((header->major != 1) || (header->minor != 0))
1829 ret = D3DRMERR_BADFILE;
1830 goto end;
1833 IDirectXFileData_Release(data);
1834 data = NULL;
1836 while (1)
1838 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
1839 if (hr == DXFILEERR_NOMOREOBJECTS)
1841 TRACE("No more object\n");
1842 break;
1844 else if (hr != DXFILE_OK)
1846 ret = D3DRMERR_BADFILE;
1847 goto end;
1850 ret = load_data(iface, data, iids, iid_count, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1851 if (ret != D3DRM_OK)
1852 goto end;
1854 IDirectXFileData_Release(data);
1855 data = NULL;
1858 ret = D3DRM_OK;
1860 end:
1861 if (data)
1862 IDirectXFileData_Release(data);
1863 if (enum_object)
1864 IDirectXFileEnumObject_Release(enum_object);
1865 if (file)
1866 IDirectXFile_Release(file);
1868 return ret;
1871 static HRESULT WINAPI d3drm3_Tick(IDirect3DRM3 *iface, D3DVALUE tick)
1873 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
1875 return E_NOTIMPL;
1878 static HRESULT WINAPI d3drm3_CreateProgressiveMesh(IDirect3DRM3 *iface, IDirect3DRMProgressiveMesh **mesh)
1880 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1882 return E_NOTIMPL;
1885 static HRESULT WINAPI d3drm3_RegisterClient(IDirect3DRM3 *iface, REFGUID guid, DWORD *id)
1887 FIXME("iface %p, guid %s, id %p stub!\n", iface, debugstr_guid(guid), id);
1889 return E_NOTIMPL;
1892 static HRESULT WINAPI d3drm3_UnregisterClient(IDirect3DRM3 *iface, REFGUID guid)
1894 FIXME("iface %p, guid %s stub!\n", iface, debugstr_guid(guid));
1896 return E_NOTIMPL;
1899 static HRESULT WINAPI d3drm3_CreateClippedVisual(IDirect3DRM3 *iface,
1900 IDirect3DRMVisual *visual, IDirect3DRMClippedVisual **clipped_visual)
1902 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface, visual, clipped_visual);
1904 return E_NOTIMPL;
1907 static HRESULT WINAPI d3drm3_SetOptions(IDirect3DRM3 *iface, DWORD flags)
1909 FIXME("iface %p, flags %#x stub!\n", iface, flags);
1911 return E_NOTIMPL;
1914 static HRESULT WINAPI d3drm3_GetOptions(IDirect3DRM3 *iface, DWORD *flags)
1916 FIXME("iface %p, flags %p stub!\n", iface, flags);
1918 return E_NOTIMPL;
1921 static const struct IDirect3DRM3Vtbl d3drm3_vtbl =
1923 d3drm3_QueryInterface,
1924 d3drm3_AddRef,
1925 d3drm3_Release,
1926 d3drm3_CreateObject,
1927 d3drm3_CreateFrame,
1928 d3drm3_CreateMesh,
1929 d3drm3_CreateMeshBuilder,
1930 d3drm3_CreateFace,
1931 d3drm3_CreateAnimation,
1932 d3drm3_CreateAnimationSet,
1933 d3drm3_CreateTexture,
1934 d3drm3_CreateLight,
1935 d3drm3_CreateLightRGB,
1936 d3drm3_CreateMaterial,
1937 d3drm3_CreateDevice,
1938 d3drm3_CreateDeviceFromSurface,
1939 d3drm3_CreateDeviceFromD3D,
1940 d3drm3_CreateDeviceFromClipper,
1941 d3drm3_CreateTextureFromSurface,
1942 d3drm3_CreateShadow,
1943 d3drm3_CreateViewport,
1944 d3drm3_CreateWrap,
1945 d3drm3_CreateUserVisual,
1946 d3drm3_LoadTexture,
1947 d3drm3_LoadTextureFromResource,
1948 d3drm3_SetSearchPath,
1949 d3drm3_AddSearchPath,
1950 d3drm3_GetSearchPath,
1951 d3drm3_SetDefaultTextureColors,
1952 d3drm3_SetDefaultTextureShades,
1953 d3drm3_GetDevices,
1954 d3drm3_GetNamedObject,
1955 d3drm3_EnumerateObjects,
1956 d3drm3_Load,
1957 d3drm3_Tick,
1958 d3drm3_CreateProgressiveMesh,
1959 d3drm3_RegisterClient,
1960 d3drm3_UnregisterClient,
1961 d3drm3_CreateClippedVisual,
1962 d3drm3_SetOptions,
1963 d3drm3_GetOptions,
1966 HRESULT WINAPI Direct3DRMCreate(IDirect3DRM **d3drm)
1968 struct d3drm *object;
1970 TRACE("d3drm %p.\n", d3drm);
1972 if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
1973 return E_OUTOFMEMORY;
1975 object->IDirect3DRM_iface.lpVtbl = &d3drm1_vtbl;
1976 object->IDirect3DRM2_iface.lpVtbl = &d3drm2_vtbl;
1977 object->IDirect3DRM3_iface.lpVtbl = &d3drm3_vtbl;
1978 object->ref1 = 1;
1979 object->iface_count = 1;
1981 *d3drm = &object->IDirect3DRM_iface;
1983 return S_OK;
1986 HRESULT WINAPI DllCanUnloadNow(void)
1988 return S_FALSE;
1991 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
1993 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
1995 if(!ppv)
1996 return E_INVALIDARG;
1998 return CLASS_E_CLASSNOTAVAILABLE;