ntdll: Translate signal to trap when trap code is 0 on ARM.
[wine.git] / dlls / d3drm / d3drm.c
blobd0f20235a8f1d78ee047aadb29657368710a77f8
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 "config.h"
24 #include "wine/port.h"
26 #include "d3drm_private.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
30 static const char* get_IID_string(const GUID* guid)
32 if (IsEqualGUID(guid, &IID_IDirect3DRMFrame))
33 return "IID_IDirect3DRMFrame";
34 else if (IsEqualGUID(guid, &IID_IDirect3DRMFrame2))
35 return "IID_IDirect3DRMFrame2";
36 else if (IsEqualGUID(guid, &IID_IDirect3DRMFrame3))
37 return "IID_IDirect3DRMFrame3";
38 else if (IsEqualGUID(guid, &IID_IDirect3DRMMeshBuilder))
39 return "IID_IDirect3DRMMeshBuilder";
40 else if (IsEqualGUID(guid, &IID_IDirect3DRMMeshBuilder2))
41 return "IID_IDirect3DRMMeshBuilder2";
42 else if (IsEqualGUID(guid, &IID_IDirect3DRMMeshBuilder3))
43 return "IID_IDirect3DRMMeshBuilder3";
45 return "?";
48 static HRESULT d3drm_create_texture_object(void **object, IDirect3DRM *d3drm)
50 struct d3drm_texture *texture;
51 HRESULT hr;
53 if (FAILED(hr = d3drm_texture_create(&texture, d3drm)))
54 return hr;
56 *object = &texture->IDirect3DRMTexture_iface;
58 return hr;
61 static HRESULT d3drm_create_device_object(void **object, IDirect3DRM *d3drm)
63 struct d3drm_device *device;
64 HRESULT hr;
66 if (FAILED(hr = d3drm_device_create(&device, d3drm)))
67 return hr;
69 *object = &device->IDirect3DRMDevice_iface;
71 return hr;
74 static HRESULT d3drm_create_viewport_object(void **object, IDirect3DRM *d3drm)
76 struct d3drm_viewport *viewport;
77 HRESULT hr;
79 if (FAILED(hr = d3drm_viewport_create(&viewport, d3drm)))
80 return hr;
82 *object = &viewport->IDirect3DRMViewport_iface;
84 return hr;
87 static HRESULT d3drm_create_face_object(void **object, IDirect3DRM *d3drm)
89 struct d3drm_face *face;
90 HRESULT hr;
92 if (FAILED(hr = d3drm_face_create(&face)))
93 return hr;
95 *object = &face->IDirect3DRMFace_iface;
97 return hr;
100 static HRESULT d3drm_create_mesh_builder_object(void **object, IDirect3DRM *d3drm)
102 struct d3drm_mesh_builder *mesh_builder;
103 HRESULT hr;
105 if (FAILED(hr = d3drm_mesh_builder_create(&mesh_builder, d3drm)))
106 return hr;
108 *object = &mesh_builder->IDirect3DRMMeshBuilder2_iface;
110 return hr;
113 static HRESULT d3drm_create_frame_object(void **object, IDirect3DRM *d3drm)
115 struct d3drm_frame *frame;
116 HRESULT hr;
118 if (FAILED(hr = d3drm_frame_create(&frame, NULL, d3drm)))
119 return hr;
121 *object = &frame->IDirect3DRMFrame_iface;
123 return hr;
126 static HRESULT d3drm_create_light_object(void **object, IDirect3DRM *d3drm)
128 struct d3drm_light *light;
129 HRESULT hr;
131 if (FAILED(hr = d3drm_light_create(&light, d3drm)))
132 return hr;
134 *object = &light->IDirect3DRMLight_iface;
136 return hr;
139 static HRESULT d3drm_create_material_object(void **object, IDirect3DRM *d3drm)
141 struct d3drm_material *material;
142 HRESULT hr;
144 if (FAILED(hr = d3drm_material_create(&material, d3drm)))
145 return hr;
147 *object = &material->IDirect3DRMMaterial2_iface;
149 return hr;
152 static HRESULT d3drm_create_mesh_object(void **object, IDirect3DRM *d3drm)
154 struct d3drm_mesh *mesh;
155 HRESULT hr;
157 if (FAILED(hr = d3drm_mesh_create(&mesh, d3drm)))
158 return hr;
160 *object = &mesh->IDirect3DRMMesh_iface;
162 return hr;
165 static HRESULT d3drm_create_animation_object(void **object, IDirect3DRM *d3drm)
167 struct d3drm_animation *animation;
168 HRESULT hr;
170 if (FAILED(hr = d3drm_animation_create(&animation, d3drm)))
171 return hr;
173 *object = &animation->IDirect3DRMAnimation_iface;
175 return hr;
178 static HRESULT d3drm_create_wrap_object(void **object, IDirect3DRM *d3drm)
180 struct d3drm_wrap *wrap;
181 HRESULT hr;
183 if (FAILED(hr = d3drm_wrap_create(&wrap, d3drm)))
184 return hr;
186 *object = &wrap->IDirect3DRMWrap_iface;
188 return hr;
191 struct d3drm
193 IDirect3DRM IDirect3DRM_iface;
194 IDirect3DRM2 IDirect3DRM2_iface;
195 IDirect3DRM3 IDirect3DRM3_iface;
196 LONG ref1, ref2, ref3, iface_count;
199 static inline struct d3drm *impl_from_IDirect3DRM(IDirect3DRM *iface)
201 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM_iface);
204 static inline struct d3drm *impl_from_IDirect3DRM2(IDirect3DRM2 *iface)
206 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM2_iface);
209 static inline struct d3drm *impl_from_IDirect3DRM3(IDirect3DRM3 *iface)
211 return CONTAINING_RECORD(iface, struct d3drm, IDirect3DRM3_iface);
214 static void d3drm_destroy(struct d3drm *d3drm)
216 heap_free(d3drm);
217 TRACE("d3drm object %p is being destroyed.\n", d3drm);
220 static HRESULT WINAPI d3drm1_QueryInterface(IDirect3DRM *iface, REFIID riid, void **out)
222 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
224 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
226 if (IsEqualGUID(riid, &IID_IDirect3DRM)
227 || IsEqualGUID(riid, &IID_IUnknown))
229 *out = &d3drm->IDirect3DRM_iface;
231 else if (IsEqualGUID(riid, &IID_IDirect3DRM2))
233 *out = &d3drm->IDirect3DRM2_iface;
235 else if (IsEqualGUID(riid, &IID_IDirect3DRM3))
237 *out = &d3drm->IDirect3DRM3_iface;
239 else
241 *out = NULL;
242 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid));
243 return CLASS_E_CLASSNOTAVAILABLE;
246 IUnknown_AddRef((IUnknown *)*out);
247 return S_OK;
250 static ULONG WINAPI d3drm1_AddRef(IDirect3DRM *iface)
252 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
253 ULONG refcount = InterlockedIncrement(&d3drm->ref1);
255 TRACE("%p increasing refcount to %u.\n", iface, refcount);
257 if (refcount == 1)
258 InterlockedIncrement(&d3drm->iface_count);
260 return refcount;
263 static ULONG WINAPI d3drm1_Release(IDirect3DRM *iface)
265 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
266 ULONG refcount = InterlockedDecrement(&d3drm->ref1);
268 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
270 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
271 d3drm_destroy(d3drm);
273 return refcount;
276 static HRESULT WINAPI d3drm1_CreateObject(IDirect3DRM *iface,
277 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
279 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
281 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
282 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
284 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
287 static HRESULT WINAPI d3drm1_CreateFrame(IDirect3DRM *iface,
288 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame **frame)
290 struct d3drm_frame *object;
291 HRESULT hr;
293 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
295 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, iface)))
296 return hr;
298 *frame = &object->IDirect3DRMFrame_iface;
300 return D3DRM_OK;
303 static HRESULT WINAPI d3drm1_CreateMesh(IDirect3DRM *iface, IDirect3DRMMesh **mesh)
305 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
307 TRACE("iface %p, mesh %p.\n", iface, mesh);
309 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
312 static HRESULT WINAPI d3drm1_CreateMeshBuilder(IDirect3DRM *iface, IDirect3DRMMeshBuilder **mesh_builder)
314 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
316 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
318 return IDirect3DRM2_CreateMeshBuilder(&d3drm->IDirect3DRM2_iface, (IDirect3DRMMeshBuilder2 **)mesh_builder);
321 static HRESULT WINAPI d3drm1_CreateFace(IDirect3DRM *iface, IDirect3DRMFace **face)
323 struct d3drm_face *object;
324 HRESULT hr;
326 TRACE("iface %p, face %p.\n", iface, face);
328 if (FAILED(hr = d3drm_face_create(&object)))
329 return hr;
331 *face = &object->IDirect3DRMFace_iface;
333 return S_OK;
336 static HRESULT WINAPI d3drm1_CreateAnimation(IDirect3DRM *iface, IDirect3DRMAnimation **animation)
338 struct d3drm_animation *object;
339 HRESULT hr;
341 TRACE("iface %p, animation %p.\n", iface, animation);
343 if (!animation)
344 return D3DRMERR_BADVALUE;
346 if (FAILED(hr = d3drm_animation_create(&object, iface)))
347 return hr;
349 *animation = &object->IDirect3DRMAnimation_iface;
351 return S_OK;
354 static HRESULT WINAPI d3drm1_CreateAnimationSet(IDirect3DRM *iface, IDirect3DRMAnimationSet **set)
356 FIXME("iface %p, set %p stub!\n", iface, set);
358 return E_NOTIMPL;
361 static HRESULT WINAPI d3drm1_CreateTexture(IDirect3DRM *iface,
362 D3DRMIMAGE *image, IDirect3DRMTexture **texture)
364 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
365 IDirect3DRMTexture3 *texture3;
366 HRESULT hr;
368 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
370 if (!texture)
371 return D3DRMERR_BADVALUE;
373 if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
375 *texture = NULL;
376 return hr;
379 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture);
380 IDirect3DRMTexture3_Release(texture3);
382 return hr;
385 static HRESULT WINAPI d3drm1_CreateLight(IDirect3DRM *iface,
386 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
388 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
390 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
392 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
395 static HRESULT WINAPI d3drm1_CreateLightRGB(IDirect3DRM *iface, D3DRMLIGHTTYPE type,
396 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
398 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
400 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
401 iface, type, red, green, blue, light);
403 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
406 static HRESULT WINAPI d3drm1_CreateMaterial(IDirect3DRM *iface,
407 D3DVALUE power, IDirect3DRMMaterial **material)
409 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
411 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
413 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
416 static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
417 DWORD width, DWORD height, IDirect3DRMDevice **device)
419 struct d3drm_device *object;
420 HRESULT hr;
422 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
424 if (FAILED(hr = d3drm_device_create(&object, iface)))
425 return hr;
427 *device = &object->IDirect3DRMDevice_iface;
429 return D3DRM_OK;
432 static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid,
433 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device)
435 struct d3drm_device *object;
436 HRESULT hr;
438 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
439 iface, debugstr_guid(guid), ddraw, backbuffer, device);
441 if (!device)
442 return D3DRMERR_BADVALUE;
443 *device = NULL;
445 if (!backbuffer || !ddraw)
446 return D3DRMERR_BADDEVICE;
448 if (FAILED(hr = d3drm_device_create(&object, iface)))
449 return hr;
451 if (SUCCEEDED(hr = d3drm_device_init(object, 1, ddraw, backbuffer, TRUE)))
452 *device = &object->IDirect3DRMDevice_iface;
453 else
454 d3drm_device_destroy(object);
456 return hr;
459 static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface,
460 IDirect3D *d3d, IDirect3DDevice *d3d_device, IDirect3DRMDevice **device)
462 struct d3drm_device *object;
463 HRESULT hr;
464 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
465 iface, d3d, d3d_device, device);
467 if (!device)
468 return D3DRMERR_BADVALUE;
469 *device = NULL;
471 if (FAILED(hr = d3drm_device_create(&object, iface)))
472 return hr;
474 if (FAILED(hr = IDirect3DRMDevice_InitFromD3D(&object->IDirect3DRMDevice_iface, d3d, d3d_device)))
476 d3drm_device_destroy(object);
477 return hr;
479 *device = &object->IDirect3DRMDevice_iface;
481 return D3DRM_OK;
484 static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
485 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
486 IDirect3DRMDevice **device)
488 struct d3drm_device *object;
489 IDirectDraw *ddraw;
490 IDirectDrawSurface *render_target;
491 HRESULT hr;
493 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
494 iface, clipper, debugstr_guid(guid), width, height, device);
496 if (!device)
497 return D3DRMERR_BADVALUE;
498 *device = NULL;
500 if (!clipper || !width || !height)
501 return D3DRMERR_BADVALUE;
503 hr = DirectDrawCreate(NULL, &ddraw, NULL);
504 if (FAILED(hr))
505 return hr;
507 if (FAILED(hr = d3drm_device_create(&object, iface)))
509 IDirectDraw_Release(ddraw);
510 return hr;
513 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
514 if (FAILED(hr))
516 IDirectDraw_Release(ddraw);
517 d3drm_device_destroy(object);
518 return hr;
521 hr = d3drm_device_init(object, 1, ddraw, render_target, TRUE);
522 IDirectDraw_Release(ddraw);
523 IDirectDrawSurface_Release(render_target);
524 if (FAILED(hr))
525 d3drm_device_destroy(object);
526 else
527 *device = &object->IDirect3DRMDevice_iface;
529 return hr;
532 static HRESULT WINAPI d3drm1_CreateTextureFromSurface(IDirect3DRM *iface,
533 IDirectDrawSurface *surface, IDirect3DRMTexture **texture)
535 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
536 IDirect3DRMTexture3 *texture3;
537 HRESULT hr;
539 TRACE("iface %p, surface %p, texture %p.\n", iface, surface, texture);
541 if (!texture)
542 return D3DRMERR_BADVALUE;
544 if (FAILED(hr = IDirect3DRM3_CreateTextureFromSurface(&d3drm->IDirect3DRM3_iface, surface, &texture3)))
546 *texture = NULL;
547 return hr;
550 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture);
551 IDirect3DRMTexture3_Release(texture3);
553 return hr;
556 static HRESULT WINAPI d3drm1_CreateShadow(IDirect3DRM *iface, IDirect3DRMVisual *visual,
557 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
558 IDirect3DRMVisual **shadow)
560 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
561 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
563 return E_NOTIMPL;
566 static HRESULT WINAPI d3drm1_CreateViewport(IDirect3DRM *iface, IDirect3DRMDevice *device,
567 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
569 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
570 IDirect3DRMDevice3 *device3;
571 IDirect3DRMFrame3 *camera3;
572 IDirect3DRMViewport2 *viewport2;
573 HRESULT hr;
575 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
576 iface, device, camera, x, y, width, height, viewport);
578 if (!device || !camera)
579 return D3DRMERR_BADOBJECT;
580 if (!viewport)
581 return D3DRMERR_BADVALUE;
583 if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3)))
584 return hr;
586 if (FAILED(hr = IDirect3DRMFrame_QueryInterface(camera, &IID_IDirect3DRMFrame3, (void **)&camera3)))
588 IDirect3DRMDevice3_Release(device3);
589 return hr;
592 hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, width, height, &viewport2);
593 IDirect3DRMDevice3_Release(device3);
594 IDirect3DRMFrame3_Release(camera3);
595 if (FAILED(hr))
596 return hr;
598 hr = IDirect3DRMViewport2_QueryInterface(viewport2, &IID_IDirect3DRMViewport, (void **)viewport);
599 IDirect3DRMViewport2_Release(viewport2);
601 return hr;
604 static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
605 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
606 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
607 IDirect3DRMWrap **wrap)
609 struct d3drm_wrap *object;
610 HRESULT hr;
612 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
613 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n",
614 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
616 if (!wrap)
617 return D3DRMERR_BADVALUE;
619 if (FAILED(hr = d3drm_wrap_create(&object, iface)))
620 return hr;
622 *wrap = &object->IDirect3DRMWrap_iface;
624 return S_OK;
627 static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface,
628 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
630 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface, cb, ctx, visual);
632 return E_NOTIMPL;
635 static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface,
636 const char *filename, IDirect3DRMTexture **texture)
638 struct d3drm_texture *object;
639 HRESULT hr;
641 TRACE("iface %p, filename %s, texture %p.\n", iface, debugstr_a(filename), texture);
643 if (!texture)
644 return D3DRMERR_BADVALUE;
646 if (FAILED(hr = d3drm_texture_create(&object, iface)))
647 return hr;
649 *texture = &object->IDirect3DRMTexture_iface;
650 if (FAILED(hr = IDirect3DRMTexture_InitFromFile(*texture, filename)))
652 IDirect3DRMTexture_Release(*texture);
653 *texture = NULL;
654 if (!filename)
655 return D3DRMERR_BADVALUE;
657 return hr == D3DRMERR_BADOBJECT ? D3DRMERR_FILENOTFOUND : hr;
660 return D3DRM_OK;
663 static HRESULT WINAPI d3drm1_LoadTextureFromResource(IDirect3DRM *iface,
664 HRSRC resource, IDirect3DRMTexture **texture)
666 struct d3drm_texture *object;
667 HRESULT hr;
669 FIXME("iface %p, resource %p, texture %p stub!\n", iface, resource, texture);
671 if (FAILED(hr = d3drm_texture_create(&object, iface)))
672 return hr;
674 *texture = &object->IDirect3DRMTexture_iface;
676 return D3DRM_OK;
679 static HRESULT WINAPI d3drm1_SetSearchPath(IDirect3DRM *iface, const char *path)
681 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
683 return E_NOTIMPL;
686 static HRESULT WINAPI d3drm1_AddSearchPath(IDirect3DRM *iface, const char *path)
688 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
690 return E_NOTIMPL;
693 static HRESULT WINAPI d3drm1_GetSearchPath(IDirect3DRM *iface, DWORD *size, char *path)
695 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
697 return E_NOTIMPL;
700 static HRESULT WINAPI d3drm1_SetDefaultTextureColors(IDirect3DRM *iface, DWORD color_count)
702 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
704 return E_NOTIMPL;
707 static HRESULT WINAPI d3drm1_SetDefaultTextureShades(IDirect3DRM *iface, DWORD shade_count)
709 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
711 return E_NOTIMPL;
714 static HRESULT WINAPI d3drm1_GetDevices(IDirect3DRM *iface, IDirect3DRMDeviceArray **array)
716 FIXME("iface %p, array %p stub!\n", iface, array);
718 return E_NOTIMPL;
721 static HRESULT WINAPI d3drm1_GetNamedObject(IDirect3DRM *iface,
722 const char *name, IDirect3DRMObject **object)
724 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
726 return E_NOTIMPL;
729 static HRESULT WINAPI d3drm1_EnumerateObjects(IDirect3DRM *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
731 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
733 return E_NOTIMPL;
736 static HRESULT WINAPI d3drm1_Load(IDirect3DRM *iface, void *source, void *object_id, IID **iids,
737 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
738 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
740 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
741 IDirect3DRMFrame3 *parent_frame3 = NULL;
742 HRESULT hr = D3DRM_OK;
744 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
745 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
746 iface, source, object_id, iids, iid_count, flags,
747 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
749 if (parent_frame)
750 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
751 if (SUCCEEDED(hr))
752 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
753 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
754 if (parent_frame3)
755 IDirect3DRMFrame3_Release(parent_frame3);
757 return hr;
760 static HRESULT WINAPI d3drm1_Tick(IDirect3DRM *iface, D3DVALUE tick)
762 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
764 return E_NOTIMPL;
767 static const struct IDirect3DRMVtbl d3drm1_vtbl =
769 d3drm1_QueryInterface,
770 d3drm1_AddRef,
771 d3drm1_Release,
772 d3drm1_CreateObject,
773 d3drm1_CreateFrame,
774 d3drm1_CreateMesh,
775 d3drm1_CreateMeshBuilder,
776 d3drm1_CreateFace,
777 d3drm1_CreateAnimation,
778 d3drm1_CreateAnimationSet,
779 d3drm1_CreateTexture,
780 d3drm1_CreateLight,
781 d3drm1_CreateLightRGB,
782 d3drm1_CreateMaterial,
783 d3drm1_CreateDevice,
784 d3drm1_CreateDeviceFromSurface,
785 d3drm1_CreateDeviceFromD3D,
786 d3drm1_CreateDeviceFromClipper,
787 d3drm1_CreateTextureFromSurface,
788 d3drm1_CreateShadow,
789 d3drm1_CreateViewport,
790 d3drm1_CreateWrap,
791 d3drm1_CreateUserVisual,
792 d3drm1_LoadTexture,
793 d3drm1_LoadTextureFromResource,
794 d3drm1_SetSearchPath,
795 d3drm1_AddSearchPath,
796 d3drm1_GetSearchPath,
797 d3drm1_SetDefaultTextureColors,
798 d3drm1_SetDefaultTextureShades,
799 d3drm1_GetDevices,
800 d3drm1_GetNamedObject,
801 d3drm1_EnumerateObjects,
802 d3drm1_Load,
803 d3drm1_Tick,
806 static HRESULT WINAPI d3drm2_QueryInterface(IDirect3DRM2 *iface, REFIID riid, void **out)
808 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
810 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
813 static ULONG WINAPI d3drm2_AddRef(IDirect3DRM2 *iface)
815 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
816 ULONG refcount = InterlockedIncrement(&d3drm->ref2);
818 TRACE("%p increasing refcount to %u.\n", iface, refcount);
820 if (refcount == 1)
821 InterlockedIncrement(&d3drm->iface_count);
823 return refcount;
826 static ULONG WINAPI d3drm2_Release(IDirect3DRM2 *iface)
828 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
829 ULONG refcount = InterlockedDecrement(&d3drm->ref2);
831 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
833 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
834 d3drm_destroy(d3drm);
836 return refcount;
839 static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
840 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
842 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
844 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
845 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
847 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
850 static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
851 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame2 **frame)
853 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
854 struct d3drm_frame *object;
855 HRESULT hr;
857 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
859 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent_frame, &d3drm->IDirect3DRM_iface)))
860 return hr;
862 *frame = &object->IDirect3DRMFrame2_iface;
864 return D3DRM_OK;
867 static HRESULT WINAPI d3drm2_CreateMesh(IDirect3DRM2 *iface, IDirect3DRMMesh **mesh)
869 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
871 TRACE("iface %p, mesh %p.\n", iface, mesh);
873 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
876 static HRESULT WINAPI d3drm2_CreateMeshBuilder(IDirect3DRM2 *iface, IDirect3DRMMeshBuilder2 **mesh_builder)
878 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
879 struct d3drm_mesh_builder *object;
880 HRESULT hr;
882 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
884 if (FAILED(hr = d3drm_mesh_builder_create(&object, &d3drm->IDirect3DRM_iface)))
885 return hr;
887 *mesh_builder = &object->IDirect3DRMMeshBuilder2_iface;
889 return S_OK;
892 static HRESULT WINAPI d3drm2_CreateFace(IDirect3DRM2 *iface, IDirect3DRMFace **face)
894 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
896 TRACE("iface %p, face %p.\n", iface, face);
898 return IDirect3DRM_CreateFace(&d3drm->IDirect3DRM_iface, face);
901 static HRESULT WINAPI d3drm2_CreateAnimation(IDirect3DRM2 *iface, IDirect3DRMAnimation **animation)
903 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
905 TRACE("iface %p, animation %p.\n", iface, animation);
907 return IDirect3DRM_CreateAnimation(&d3drm->IDirect3DRM_iface, animation);
910 static HRESULT WINAPI d3drm2_CreateAnimationSet(IDirect3DRM2 *iface, IDirect3DRMAnimationSet **set)
912 FIXME("iface %p, set %p stub!\n", iface, set);
914 return E_NOTIMPL;
917 static HRESULT WINAPI d3drm2_CreateTexture(IDirect3DRM2 *iface,
918 D3DRMIMAGE *image, IDirect3DRMTexture2 **texture)
920 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
921 IDirect3DRMTexture3 *texture3;
922 HRESULT hr;
924 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
926 if (!texture)
927 return D3DRMERR_BADVALUE;
929 if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3)))
931 *texture = NULL;
932 return hr;
935 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture);
936 IDirect3DRMTexture3_Release(texture3);
938 return hr;
941 static HRESULT WINAPI d3drm2_CreateLight(IDirect3DRM2 *iface,
942 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
944 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
946 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
948 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
951 static HRESULT WINAPI d3drm2_CreateLightRGB(IDirect3DRM2 *iface, D3DRMLIGHTTYPE type,
952 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
954 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
956 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
957 iface, type, red, green, blue, light);
959 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
962 static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface,
963 D3DVALUE power, IDirect3DRMMaterial **material)
965 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
967 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
969 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
972 static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface,
973 DWORD width, DWORD height, IDirect3DRMDevice2 **device)
975 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
976 struct d3drm_device *object;
977 HRESULT hr;
979 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
981 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
982 return hr;
984 *device = &object->IDirect3DRMDevice2_iface;
986 return D3DRM_OK;
989 static HRESULT WINAPI d3drm2_CreateDeviceFromSurface(IDirect3DRM2 *iface, GUID *guid,
990 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice2 **device)
992 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
993 IDirect3DRMDevice3 *device3;
994 HRESULT hr;
995 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
996 iface, debugstr_guid(guid), ddraw, backbuffer, device);
998 if (!device)
999 return D3DRMERR_BADVALUE;
1000 *device = NULL;
1001 hr = IDirect3DRM3_CreateDeviceFromSurface(&d3drm->IDirect3DRM3_iface, guid, ddraw, backbuffer, 0, &device3);
1002 if (FAILED(hr))
1003 return hr;
1005 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
1006 IDirect3DRMDevice3_Release(device3);
1008 return hr;
1011 static HRESULT WINAPI d3drm2_CreateDeviceFromD3D(IDirect3DRM2 *iface,
1012 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device)
1014 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1015 IDirect3DRMDevice3 *device3;
1016 HRESULT hr;
1018 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1019 iface, d3d, d3d_device, device);
1021 if (!device)
1022 return D3DRMERR_BADVALUE;
1023 *device = NULL;
1025 hr = IDirect3DRM3_CreateDeviceFromD3D(&d3drm->IDirect3DRM3_iface, d3d, d3d_device, &device3);
1026 if (FAILED(hr))
1027 return hr;
1029 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void **)device);
1030 IDirect3DRMDevice3_Release(device3);
1032 return hr;
1035 static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface,
1036 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
1037 IDirect3DRMDevice2 **device)
1039 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1040 IDirect3DRMDevice3 *device3;
1041 HRESULT hr;
1043 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1044 iface, clipper, debugstr_guid(guid), width, height, device);
1046 if (!device)
1047 return D3DRMERR_BADVALUE;
1048 *device = NULL;
1049 hr = IDirect3DRM3_CreateDeviceFromClipper(&d3drm->IDirect3DRM3_iface, clipper, guid, width, height, &device3);
1050 if (FAILED(hr))
1051 return hr;
1053 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
1054 IDirect3DRMDevice3_Release(device3);
1056 return hr;
1059 static HRESULT WINAPI d3drm2_CreateTextureFromSurface(IDirect3DRM2 *iface,
1060 IDirectDrawSurface *surface, IDirect3DRMTexture2 **texture)
1062 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1063 IDirect3DRMTexture3 *texture3;
1064 HRESULT hr;
1066 TRACE("iface %p, surface %p, texture %p.\n", iface, surface, texture);
1068 if (!texture)
1069 return D3DRMERR_BADVALUE;
1071 if (FAILED(hr = IDirect3DRM3_CreateTextureFromSurface(&d3drm->IDirect3DRM3_iface, surface, &texture3)))
1073 *texture = NULL;
1074 return hr;
1077 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture);
1078 IDirect3DRMTexture3_Release(texture3);
1080 return hr;
1083 static HRESULT WINAPI d3drm2_CreateShadow(IDirect3DRM2 *iface, IDirect3DRMVisual *visual,
1084 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
1085 IDirect3DRMVisual **shadow)
1087 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1088 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
1090 return E_NOTIMPL;
1093 static HRESULT WINAPI d3drm2_CreateViewport(IDirect3DRM2 *iface, IDirect3DRMDevice *device,
1094 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
1096 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1097 IDirect3DRMDevice3 *device3;
1098 IDirect3DRMFrame3 *camera3;
1099 IDirect3DRMViewport2 *viewport2;
1100 HRESULT hr;
1102 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
1103 iface, device, camera, x, y, width, height, viewport);
1105 if (!device || !camera)
1106 return D3DRMERR_BADOBJECT;
1107 if (!viewport)
1108 return D3DRMERR_BADVALUE;
1110 if (FAILED(hr = IDirect3DRMDevice_QueryInterface(device, &IID_IDirect3DRMDevice3, (void **)&device3)))
1111 return hr;
1113 if (FAILED(hr = IDirect3DRMFrame_QueryInterface(camera, &IID_IDirect3DRMFrame3, (void **)&camera3)))
1115 IDirect3DRMDevice3_Release(device3);
1116 return hr;
1119 hr = IDirect3DRM3_CreateViewport(&d3drm->IDirect3DRM3_iface, device3, camera3, x, y, width, height, &viewport2);
1120 IDirect3DRMDevice3_Release(device3);
1121 IDirect3DRMFrame3_Release(camera3);
1122 if (FAILED(hr))
1123 return hr;
1125 hr = IDirect3DRMViewport2_QueryInterface(viewport2, &IID_IDirect3DRMViewport, (void **)viewport);
1126 IDirect3DRMViewport2_Release(viewport2);
1128 return hr;
1131 static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
1132 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1133 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
1134 IDirect3DRMWrap **wrap)
1136 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1138 TRACE("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1139 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p.\n",
1140 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
1142 return IDirect3DRM_CreateWrap(&d3drm->IDirect3DRM_iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz,
1143 ou, ov, su, sv, wrap);
1146 static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface,
1147 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
1149 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
1151 return E_NOTIMPL;
1154 static HRESULT WINAPI d3drm2_LoadTexture(IDirect3DRM2 *iface,
1155 const char *filename, IDirect3DRMTexture2 **texture)
1157 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1158 IDirect3DRMTexture3 *texture3;
1159 HRESULT hr;
1161 TRACE("iface %p, filename %s, texture %p.\n", iface, debugstr_a(filename), texture);
1163 if (!texture)
1164 return D3DRMERR_BADVALUE;
1166 if (FAILED(hr = IDirect3DRM3_LoadTexture(&d3drm->IDirect3DRM3_iface, filename, &texture3)))
1168 *texture = NULL;
1169 return hr;
1172 hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture);
1173 IDirect3DRMTexture3_Release(texture3);
1175 return hr;
1178 static HRESULT WINAPI d3drm2_LoadTextureFromResource(IDirect3DRM2 *iface, HMODULE module,
1179 const char *resource_name, const char *resource_type, IDirect3DRMTexture2 **texture)
1181 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1182 struct d3drm_texture *object;
1183 HRESULT hr;
1185 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
1186 iface, debugstr_a(resource_name), debugstr_a(resource_type), texture);
1188 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1189 return hr;
1191 *texture = &object->IDirect3DRMTexture2_iface;
1193 return D3DRM_OK;
1196 static HRESULT WINAPI d3drm2_SetSearchPath(IDirect3DRM2 *iface, const char *path)
1198 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1200 return E_NOTIMPL;
1203 static HRESULT WINAPI d3drm2_AddSearchPath(IDirect3DRM2 *iface, const char *path)
1205 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1207 return E_NOTIMPL;
1210 static HRESULT WINAPI d3drm2_GetSearchPath(IDirect3DRM2 *iface, DWORD *size, char *path)
1212 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
1214 return E_NOTIMPL;
1217 static HRESULT WINAPI d3drm2_SetDefaultTextureColors(IDirect3DRM2 *iface, DWORD color_count)
1219 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
1221 return E_NOTIMPL;
1224 static HRESULT WINAPI d3drm2_SetDefaultTextureShades(IDirect3DRM2 *iface, DWORD shade_count)
1226 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
1228 return E_NOTIMPL;
1231 static HRESULT WINAPI d3drm2_GetDevices(IDirect3DRM2 *iface, IDirect3DRMDeviceArray **array)
1233 FIXME("iface %p, array %p stub!\n", iface, array);
1235 return E_NOTIMPL;
1238 static HRESULT WINAPI d3drm2_GetNamedObject(IDirect3DRM2 *iface,
1239 const char *name, IDirect3DRMObject **object)
1241 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
1243 return E_NOTIMPL;
1246 static HRESULT WINAPI d3drm2_EnumerateObjects(IDirect3DRM2 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
1248 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1250 return E_NOTIMPL;
1253 static HRESULT WINAPI d3drm2_Load(IDirect3DRM2 *iface, void *source, void *object_id, IID **iids,
1254 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
1255 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
1257 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
1258 IDirect3DRMFrame3 *parent_frame3 = NULL;
1259 HRESULT hr = D3DRM_OK;
1261 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1262 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1263 iface, source, object_id, iids, iid_count, flags,
1264 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1266 if (parent_frame)
1267 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
1268 if (SUCCEEDED(hr))
1269 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
1270 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
1271 if (parent_frame3)
1272 IDirect3DRMFrame3_Release(parent_frame3);
1274 return hr;
1277 static HRESULT WINAPI d3drm2_Tick(IDirect3DRM2 *iface, D3DVALUE tick)
1279 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
1281 return E_NOTIMPL;
1284 static HRESULT WINAPI d3drm2_CreateProgressiveMesh(IDirect3DRM2 *iface, IDirect3DRMProgressiveMesh **mesh)
1286 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1288 return E_NOTIMPL;
1291 static const struct IDirect3DRM2Vtbl d3drm2_vtbl =
1293 d3drm2_QueryInterface,
1294 d3drm2_AddRef,
1295 d3drm2_Release,
1296 d3drm2_CreateObject,
1297 d3drm2_CreateFrame,
1298 d3drm2_CreateMesh,
1299 d3drm2_CreateMeshBuilder,
1300 d3drm2_CreateFace,
1301 d3drm2_CreateAnimation,
1302 d3drm2_CreateAnimationSet,
1303 d3drm2_CreateTexture,
1304 d3drm2_CreateLight,
1305 d3drm2_CreateLightRGB,
1306 d3drm2_CreateMaterial,
1307 d3drm2_CreateDevice,
1308 d3drm2_CreateDeviceFromSurface,
1309 d3drm2_CreateDeviceFromD3D,
1310 d3drm2_CreateDeviceFromClipper,
1311 d3drm2_CreateTextureFromSurface,
1312 d3drm2_CreateShadow,
1313 d3drm2_CreateViewport,
1314 d3drm2_CreateWrap,
1315 d3drm2_CreateUserVisual,
1316 d3drm2_LoadTexture,
1317 d3drm2_LoadTextureFromResource,
1318 d3drm2_SetSearchPath,
1319 d3drm2_AddSearchPath,
1320 d3drm2_GetSearchPath,
1321 d3drm2_SetDefaultTextureColors,
1322 d3drm2_SetDefaultTextureShades,
1323 d3drm2_GetDevices,
1324 d3drm2_GetNamedObject,
1325 d3drm2_EnumerateObjects,
1326 d3drm2_Load,
1327 d3drm2_Tick,
1328 d3drm2_CreateProgressiveMesh,
1331 static HRESULT WINAPI d3drm3_QueryInterface(IDirect3DRM3 *iface, REFIID riid, void **out)
1333 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1335 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
1338 static ULONG WINAPI d3drm3_AddRef(IDirect3DRM3 *iface)
1340 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1341 ULONG refcount = InterlockedIncrement(&d3drm->ref3);
1343 TRACE("%p increasing refcount to %u.\n", iface, refcount);
1345 if (refcount == 1)
1346 InterlockedIncrement(&d3drm->iface_count);
1348 return refcount;
1351 static ULONG WINAPI d3drm3_Release(IDirect3DRM3 *iface)
1353 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1354 ULONG refcount = InterlockedDecrement(&d3drm->ref3);
1356 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
1358 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
1359 d3drm_destroy(d3drm);
1361 return refcount;
1364 static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
1365 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
1367 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1368 IUnknown *object;
1369 unsigned int i;
1370 HRESULT hr;
1372 static const struct
1374 const CLSID *clsid;
1375 HRESULT (*create_object)(void **object, IDirect3DRM *d3drm);
1377 object_table[] =
1379 {&CLSID_CDirect3DRMTexture, d3drm_create_texture_object},
1380 {&CLSID_CDirect3DRMDevice, d3drm_create_device_object},
1381 {&CLSID_CDirect3DRMViewport, d3drm_create_viewport_object},
1382 {&CLSID_CDirect3DRMFace, d3drm_create_face_object},
1383 {&CLSID_CDirect3DRMMeshBuilder, d3drm_create_mesh_builder_object},
1384 {&CLSID_CDirect3DRMFrame, d3drm_create_frame_object},
1385 {&CLSID_CDirect3DRMLight, d3drm_create_light_object},
1386 {&CLSID_CDirect3DRMMaterial, d3drm_create_material_object},
1387 {&CLSID_CDirect3DRMMesh, d3drm_create_mesh_object},
1388 {&CLSID_CDirect3DRMAnimation, d3drm_create_animation_object},
1389 {&CLSID_CDirect3DRMWrap, d3drm_create_wrap_object},
1392 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1393 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
1395 if (!out)
1396 return D3DRMERR_BADVALUE;
1398 if (!clsid || !iid)
1400 *out = NULL;
1401 return D3DRMERR_BADVALUE;
1404 if (outer)
1406 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer);
1407 *out = NULL;
1408 return E_NOTIMPL;
1411 for (i = 0; i < ARRAY_SIZE(object_table); ++i)
1413 if (IsEqualGUID(clsid, object_table[i].clsid))
1415 if (FAILED(hr = object_table[i].create_object((void **)&object, &d3drm->IDirect3DRM_iface)))
1417 *out = NULL;
1418 return hr;
1420 break;
1423 if (i == ARRAY_SIZE(object_table))
1425 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
1426 *out = NULL;
1427 return CLASSFACTORY_E_FIRST;
1430 if (FAILED(hr = IUnknown_QueryInterface(object, iid, out)))
1431 *out = NULL;
1432 IUnknown_Release(object);
1434 return hr;
1437 static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
1438 IDirect3DRMFrame3 *parent, IDirect3DRMFrame3 **frame)
1440 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1441 struct d3drm_frame *object;
1442 HRESULT hr;
1444 TRACE("iface %p, parent %p, frame %p.\n", iface, parent, frame);
1446 if (FAILED(hr = d3drm_frame_create(&object, (IUnknown *)parent, &d3drm->IDirect3DRM_iface)))
1447 return hr;
1449 *frame = &object->IDirect3DRMFrame3_iface;
1451 return D3DRM_OK;
1454 static HRESULT WINAPI d3drm3_CreateMesh(IDirect3DRM3 *iface, IDirect3DRMMesh **mesh)
1456 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1457 struct d3drm_mesh *object;
1458 HRESULT hr;
1460 TRACE("iface %p, mesh %p.\n", iface, mesh);
1462 if (FAILED(hr = d3drm_mesh_create(&object, &d3drm->IDirect3DRM_iface)))
1463 return hr;
1465 *mesh = &object->IDirect3DRMMesh_iface;
1467 return S_OK;
1470 static HRESULT WINAPI d3drm3_CreateMeshBuilder(IDirect3DRM3 *iface, IDirect3DRMMeshBuilder3 **mesh_builder)
1472 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1473 struct d3drm_mesh_builder *object;
1474 HRESULT hr;
1476 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
1478 if (FAILED(hr = d3drm_mesh_builder_create(&object, &d3drm->IDirect3DRM_iface)))
1479 return hr;
1481 *mesh_builder = &object->IDirect3DRMMeshBuilder3_iface;
1483 return S_OK;
1486 static HRESULT WINAPI d3drm3_CreateFace(IDirect3DRM3 *iface, IDirect3DRMFace2 **face)
1488 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1489 IDirect3DRMFace *face1;
1490 HRESULT hr;
1492 TRACE("iface %p, face %p.\n", iface, face);
1494 if (FAILED(hr = IDirect3DRM_CreateFace(&d3drm->IDirect3DRM_iface, &face1)))
1495 return hr;
1497 hr = IDirect3DRMFace_QueryInterface(face1, &IID_IDirect3DRMFace2, (void **)face);
1498 IDirect3DRMFace_Release(face1);
1500 return hr;
1503 static HRESULT WINAPI d3drm3_CreateAnimation(IDirect3DRM3 *iface, IDirect3DRMAnimation2 **animation)
1505 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1506 struct d3drm_animation *object;
1507 HRESULT hr;
1509 TRACE("iface %p, animation %p.\n", iface, animation);
1511 if (FAILED(hr = d3drm_animation_create(&object, &d3drm->IDirect3DRM_iface)))
1512 return hr;
1514 *animation = &object->IDirect3DRMAnimation2_iface;
1516 return hr;
1519 static HRESULT WINAPI d3drm3_CreateAnimationSet(IDirect3DRM3 *iface, IDirect3DRMAnimationSet2 **set)
1521 FIXME("iface %p, set %p stub!\n", iface, set);
1523 return E_NOTIMPL;
1526 static HRESULT WINAPI d3drm3_CreateTexture(IDirect3DRM3 *iface,
1527 D3DRMIMAGE *image, IDirect3DRMTexture3 **texture)
1529 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1530 struct d3drm_texture *object;
1531 HRESULT hr;
1533 TRACE("iface %p, image %p, texture %p.\n", iface, image, texture);
1535 if (!texture)
1536 return D3DRMERR_BADVALUE;
1538 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1539 return hr;
1541 *texture = &object->IDirect3DRMTexture3_iface;
1543 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture, image)))
1545 IDirect3DRMTexture3_Release(*texture);
1546 *texture = NULL;
1547 return D3DRMERR_BADVALUE;
1550 return D3DRM_OK;
1553 static HRESULT WINAPI d3drm3_CreateLight(IDirect3DRM3 *iface,
1554 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
1556 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1557 struct d3drm_light *object;
1558 HRESULT hr;
1560 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface, type, color, light);
1562 if (SUCCEEDED(hr = d3drm_light_create(&object, &d3drm->IDirect3DRM_iface)))
1564 IDirect3DRMLight_SetType(&object->IDirect3DRMLight_iface, type);
1565 IDirect3DRMLight_SetColor(&object->IDirect3DRMLight_iface, color);
1568 *light = &object->IDirect3DRMLight_iface;
1570 return hr;
1573 static HRESULT WINAPI d3drm3_CreateLightRGB(IDirect3DRM3 *iface, D3DRMLIGHTTYPE type,
1574 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
1576 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1577 struct d3drm_light *object;
1578 HRESULT hr;
1580 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1581 iface, type, red, green, blue, light);
1583 if (SUCCEEDED(hr = d3drm_light_create(&object, &d3drm->IDirect3DRM_iface)))
1585 IDirect3DRMLight_SetType(&object->IDirect3DRMLight_iface, type);
1586 IDirect3DRMLight_SetColorRGB(&object->IDirect3DRMLight_iface, red, green, blue);
1589 *light = &object->IDirect3DRMLight_iface;
1591 return hr;
1594 static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface,
1595 D3DVALUE power, IDirect3DRMMaterial2 **material)
1597 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1598 struct d3drm_material *object;
1599 HRESULT hr;
1601 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
1603 if (SUCCEEDED(hr = d3drm_material_create(&object, &d3drm->IDirect3DRM_iface)))
1604 IDirect3DRMMaterial2_SetPower(&object->IDirect3DRMMaterial2_iface, power);
1606 *material = &object->IDirect3DRMMaterial2_iface;
1608 return hr;
1611 static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface,
1612 DWORD width, DWORD height, IDirect3DRMDevice3 **device)
1614 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1615 struct d3drm_device *object;
1616 HRESULT hr;
1618 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
1620 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1621 return hr;
1623 *device = &object->IDirect3DRMDevice3_iface;
1625 return D3DRM_OK;
1628 static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *guid,
1629 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, DWORD flags, IDirect3DRMDevice3 **device)
1631 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1632 struct d3drm_device *object;
1633 BOOL use_z_surface;
1634 HRESULT hr;
1636 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1637 iface, debugstr_guid(guid), ddraw, backbuffer, flags, device);
1639 if (!device)
1640 return D3DRMERR_BADVALUE;
1641 *device = NULL;
1643 if (!backbuffer || !ddraw)
1644 return D3DRMERR_BADDEVICE;
1646 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1647 return hr;
1649 use_z_surface = !(flags & D3DRMDEVICE_NOZBUFFER);
1651 if (SUCCEEDED(hr = d3drm_device_init(object, 3, ddraw, backbuffer, use_z_surface)))
1652 *device = &object->IDirect3DRMDevice3_iface;
1653 else
1654 d3drm_device_destroy(object);
1656 return hr;
1659 static HRESULT WINAPI d3drm3_CreateDeviceFromD3D(IDirect3DRM3 *iface,
1660 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device)
1662 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1663 struct d3drm_device *object;
1664 HRESULT hr;
1666 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1667 iface, d3d, d3d_device, device);
1669 if (!device)
1670 return D3DRMERR_BADVALUE;
1671 *device = NULL;
1673 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1674 return hr;
1676 if (FAILED(hr = IDirect3DRMDevice3_InitFromD3D2(&object->IDirect3DRMDevice3_iface, d3d, d3d_device)))
1678 d3drm_device_destroy(object);
1679 return hr;
1681 *device = &object->IDirect3DRMDevice3_iface;
1683 return D3DRM_OK;
1686 static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
1687 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
1688 IDirect3DRMDevice3 **device)
1690 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1691 struct d3drm_device *object;
1692 IDirectDraw *ddraw;
1693 IDirectDrawSurface *render_target;
1694 HRESULT hr;
1696 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1697 iface, clipper, debugstr_guid(guid), width, height, device);
1699 if (!device)
1700 return D3DRMERR_BADVALUE;
1701 *device = NULL;
1703 if (!clipper || !width || !height)
1704 return D3DRMERR_BADVALUE;
1706 hr = DirectDrawCreate(NULL, &ddraw, NULL);
1707 if (FAILED(hr))
1708 return hr;
1710 if (FAILED(hr = d3drm_device_create(&object, &d3drm->IDirect3DRM_iface)))
1712 IDirectDraw_Release(ddraw);
1713 return hr;
1716 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
1717 if (FAILED(hr))
1719 IDirectDraw_Release(ddraw);
1720 d3drm_device_destroy(object);
1721 return hr;
1724 hr = d3drm_device_init(object, 3, ddraw, render_target, TRUE);
1725 IDirectDraw_Release(ddraw);
1726 IDirectDrawSurface_Release(render_target);
1727 if (FAILED(hr))
1728 d3drm_device_destroy(object);
1729 else
1730 *device = &object->IDirect3DRMDevice3_iface;
1732 return hr;
1735 static HRESULT WINAPI d3drm3_CreateShadow(IDirect3DRM3 *iface, IUnknown *object, IDirect3DRMLight *light,
1736 D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, IDirect3DRMShadow2 **shadow)
1738 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1739 iface, object, light, px, py, pz, nx, ny, nz, shadow);
1741 return E_NOTIMPL;
1744 static HRESULT WINAPI d3drm3_CreateTextureFromSurface(IDirect3DRM3 *iface,
1745 IDirectDrawSurface *surface, IDirect3DRMTexture3 **texture)
1747 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1748 struct d3drm_texture *object;
1749 HRESULT hr;
1751 TRACE("iface %p, surface %p, texture %p.\n", iface, surface, texture);
1753 if (!texture)
1754 return D3DRMERR_BADVALUE;
1756 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1757 return hr;
1759 *texture = &object->IDirect3DRMTexture3_iface;
1761 if (FAILED(IDirect3DRMTexture3_InitFromSurface(*texture, surface)))
1763 IDirect3DRMTexture3_Release(*texture);
1764 *texture = NULL;
1765 return D3DRMERR_BADVALUE;
1768 return D3DRM_OK;
1771 static HRESULT WINAPI d3drm3_CreateViewport(IDirect3DRM3 *iface, IDirect3DRMDevice3 *device,
1772 IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport2 **viewport)
1774 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1775 struct d3drm_viewport *object;
1776 HRESULT hr;
1778 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
1779 iface, device, camera, x, y, width, height, viewport);
1781 if (!device || !camera)
1782 return D3DRMERR_BADOBJECT;
1783 if (!viewport)
1784 return D3DRMERR_BADVALUE;
1786 if (FAILED(hr = d3drm_viewport_create(&object, &d3drm->IDirect3DRM_iface)))
1787 return hr;
1789 *viewport = &object->IDirect3DRMViewport2_iface;
1791 if (FAILED(hr = IDirect3DRMViewport2_Init(*viewport, device, camera, x, y, width, height)))
1793 IDirect3DRMViewport2_Release(*viewport);
1794 *viewport = NULL;
1795 return D3DRMERR_BADVALUE;
1798 return D3DRM_OK;
1801 static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame3 *frame,
1802 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1803 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
1804 IDirect3DRMWrap **wrap)
1806 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1807 struct d3drm_wrap *object;
1808 HRESULT hr;
1810 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1811 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n",
1812 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
1814 if (!wrap)
1815 return D3DRMERR_BADVALUE;
1817 if (FAILED(hr = d3drm_wrap_create(&object, &d3drm->IDirect3DRM_iface)))
1818 return hr;
1820 *wrap = &object->IDirect3DRMWrap_iface;
1822 return S_OK;
1825 static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,
1826 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
1828 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
1830 return E_NOTIMPL;
1833 static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface,
1834 const char *filename, IDirect3DRMTexture3 **texture)
1836 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1837 struct d3drm_texture *object;
1838 HRESULT hr;
1840 TRACE("iface %p, filename %s, texture %p.\n", iface, debugstr_a(filename), texture);
1842 if (!texture)
1843 return D3DRMERR_BADVALUE;
1845 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1846 return hr;
1848 *texture = &object->IDirect3DRMTexture3_iface;
1849 if (FAILED(hr = IDirect3DRMTexture3_InitFromFile(*texture, filename)))
1851 IDirect3DRMTexture3_Release(*texture);
1852 *texture = NULL;
1853 return hr == D3DRMERR_BADOBJECT ? D3DRMERR_FILENOTFOUND : hr;
1856 return D3DRM_OK;
1859 static HRESULT WINAPI d3drm3_LoadTextureFromResource(IDirect3DRM3 *iface, HMODULE module,
1860 const char *resource_name, const char *resource_type, IDirect3DRMTexture3 **texture)
1862 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1863 struct d3drm_texture *object;
1864 HRESULT hr;
1866 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1867 iface, module, debugstr_a(resource_name), debugstr_a(resource_type), texture);
1869 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1870 return hr;
1872 *texture = &object->IDirect3DRMTexture3_iface;
1874 return D3DRM_OK;
1877 static HRESULT WINAPI d3drm3_SetSearchPath(IDirect3DRM3 *iface, const char *path)
1879 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1881 return E_NOTIMPL;
1884 static HRESULT WINAPI d3drm3_AddSearchPath(IDirect3DRM3 *iface, const char *path)
1886 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1888 return E_NOTIMPL;
1891 static HRESULT WINAPI d3drm3_GetSearchPath(IDirect3DRM3 *iface, DWORD *size, char *path)
1893 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
1895 return E_NOTIMPL;
1898 static HRESULT WINAPI d3drm3_SetDefaultTextureColors(IDirect3DRM3 *iface, DWORD color_count)
1900 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
1902 return E_NOTIMPL;
1905 static HRESULT WINAPI d3drm3_SetDefaultTextureShades(IDirect3DRM3 *iface, DWORD shade_count)
1907 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
1909 return E_NOTIMPL;
1912 static HRESULT WINAPI d3drm3_GetDevices(IDirect3DRM3 *iface, IDirect3DRMDeviceArray **array)
1914 FIXME("iface %p, array %p stub!\n", iface, array);
1916 return E_NOTIMPL;
1919 static HRESULT WINAPI d3drm3_GetNamedObject(IDirect3DRM3 *iface,
1920 const char *name, IDirect3DRMObject **object)
1922 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
1924 return E_NOTIMPL;
1927 static HRESULT WINAPI d3drm3_EnumerateObjects(IDirect3DRM3 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
1929 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1931 return E_NOTIMPL;
1934 static HRESULT load_data(IDirect3DRM3 *iface, IDirectXFileData *data_object, IID **GUIDs, DWORD nb_GUIDs, D3DRMLOADCALLBACK LoadProc,
1935 void *ArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc, void *ArgLTP, IDirect3DRMFrame3 *parent_frame)
1937 HRESULT ret = D3DRMERR_BADOBJECT;
1938 HRESULT hr;
1939 const GUID* guid;
1940 DWORD i;
1941 BOOL requested = FALSE;
1943 hr = IDirectXFileData_GetType(data_object, &guid);
1944 if (hr != DXFILE_OK)
1945 goto end;
1947 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1949 /* Load object only if it is top level and requested or if it is part of another object */
1951 if (IsEqualGUID(guid, &TID_D3DRMMesh))
1953 TRACE("Found TID_D3DRMMesh\n");
1955 for (i = 0; i < nb_GUIDs; i++)
1956 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder) ||
1957 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder2) ||
1958 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder3))
1960 requested = TRUE;
1961 break;
1964 if (requested || parent_frame)
1966 IDirect3DRMMeshBuilder3 *meshbuilder;
1968 TRACE("Load mesh data\n");
1970 hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
1971 if (SUCCEEDED(hr))
1973 hr = load_mesh_data(meshbuilder, data_object, LoadTextureProc, ArgLTP);
1974 if (SUCCEEDED(hr))
1976 /* Only top level objects are notified */
1977 if (!parent_frame)
1979 IDirect3DRMObject *object;
1981 hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
1982 if (SUCCEEDED(hr))
1984 LoadProc(object, GUIDs[i], ArgLP);
1985 IDirect3DRMObject_Release(object);
1988 else
1990 IDirect3DRMFrame3_AddVisual(parent_frame, (IUnknown*)meshbuilder);
1993 IDirect3DRMMeshBuilder3_Release(meshbuilder);
1996 if (FAILED(hr))
1997 ERR("Cannot process mesh\n");
2000 else if (IsEqualGUID(guid, &TID_D3DRMFrame))
2002 TRACE("Found TID_D3DRMFrame\n");
2004 for (i = 0; i < nb_GUIDs; i++)
2005 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
2006 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
2007 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
2009 requested = TRUE;
2010 break;
2013 if (requested || parent_frame)
2015 IDirect3DRMFrame3 *frame;
2017 TRACE("Load frame data\n");
2019 hr = IDirect3DRM3_CreateFrame(iface, parent_frame, &frame);
2020 if (SUCCEEDED(hr))
2022 IDirectXFileObject *child;
2024 while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(data_object, &child)))
2026 IDirectXFileData *data;
2027 IDirectXFileDataReference *reference;
2028 IDirectXFileBinary *binary;
2030 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
2031 &IID_IDirectXFileBinary, (void **)&binary)))
2033 FIXME("Binary Object not supported yet\n");
2034 IDirectXFileBinary_Release(binary);
2036 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
2037 &IID_IDirectXFileData, (void **)&data)))
2039 TRACE("Found Data Object\n");
2040 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
2041 IDirectXFileData_Release(data);
2043 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
2044 &IID_IDirectXFileDataReference, (void **)&reference)))
2046 TRACE("Found Data Object Reference\n");
2047 IDirectXFileDataReference_Resolve(reference, &data);
2048 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
2049 IDirectXFileData_Release(data);
2050 IDirectXFileDataReference_Release(reference);
2052 IDirectXFileObject_Release(child);
2055 if (hr != DXFILEERR_NOMOREOBJECTS)
2057 IDirect3DRMFrame3_Release(frame);
2058 goto end;
2060 hr = S_OK;
2062 /* Only top level objects are notified */
2063 if (!parent_frame)
2065 IDirect3DRMObject *object;
2067 hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
2068 if (SUCCEEDED(hr))
2070 LoadProc(object, GUIDs[i], ArgLP);
2071 IDirect3DRMObject_Release(object);
2074 IDirect3DRMFrame3_Release(frame);
2077 if (FAILED(hr))
2078 ERR("Cannot process frame\n");
2081 else if (IsEqualGUID(guid, &TID_D3DRMMaterial))
2083 TRACE("Found TID_D3DRMMaterial\n");
2085 /* Cannot be requested so nothing to do */
2087 else if (IsEqualGUID(guid, &TID_D3DRMFrameTransformMatrix))
2089 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
2091 /* Cannot be requested */
2092 if (parent_frame)
2094 D3DRMMATRIX4D *matrix;
2095 DWORD size;
2097 TRACE("Load Frame Transform Matrix data\n");
2099 hr = IDirectXFileData_GetData(data_object, NULL, &size, (void**)&matrix);
2100 if ((hr != DXFILE_OK) || (size != sizeof(matrix)))
2101 goto end;
2103 hr = IDirect3DRMFrame3_AddTransform(parent_frame, D3DRMCOMBINE_REPLACE, *matrix);
2104 if (FAILED(hr))
2105 goto end;
2108 else
2110 FIXME("Found unknown TID %s\n", debugstr_guid(guid));
2113 ret = D3DRM_OK;
2115 end:
2117 return ret;
2120 static HRESULT WINAPI d3drm3_Load(IDirect3DRM3 *iface, void *source, void *object_id, IID **iids,
2121 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
2122 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame3 *parent_frame)
2124 DXFILELOADOPTIONS load_options;
2125 IDirectXFile *file = NULL;
2126 IDirectXFileEnumObject *enum_object = NULL;
2127 IDirectXFileData *data = NULL;
2128 HRESULT hr;
2129 const GUID* pGuid;
2130 DWORD size;
2131 struct d3drm_file_header *header;
2132 HRESULT ret = D3DRMERR_BADOBJECT;
2133 DWORD i;
2135 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
2136 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
2137 iface, source, object_id, iids, iid_count, flags,
2138 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
2140 TRACE("Looking for GUIDs:\n");
2141 for (i = 0; i < iid_count; ++i)
2142 TRACE("- %s (%s)\n", debugstr_guid(iids[i]), get_IID_string(iids[i]));
2144 if (flags == D3DRMLOAD_FROMMEMORY)
2146 load_options = DXFILELOAD_FROMMEMORY;
2148 else if (flags == D3DRMLOAD_FROMFILE)
2150 load_options = DXFILELOAD_FROMFILE;
2151 TRACE("Loading from file %s\n", debugstr_a(source));
2153 else
2155 FIXME("Load options %#x not supported yet.\n", flags);
2156 return E_NOTIMPL;
2159 hr = DirectXFileCreate(&file);
2160 if (hr != DXFILE_OK)
2161 goto end;
2163 hr = IDirectXFile_RegisterTemplates(file, templates, strlen(templates));
2164 if (hr != DXFILE_OK)
2165 goto end;
2167 hr = IDirectXFile_CreateEnumObject(file, source, load_options, &enum_object);
2168 if (hr != DXFILE_OK)
2169 goto end;
2171 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
2172 if (hr != DXFILE_OK)
2173 goto end;
2175 hr = IDirectXFileData_GetType(data, &pGuid);
2176 if (hr != DXFILE_OK)
2177 goto end;
2179 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
2181 if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
2183 ret = D3DRMERR_BADFILE;
2184 goto end;
2187 hr = IDirectXFileData_GetData(data, NULL, &size, (void **)&header);
2188 if ((hr != DXFILE_OK) || (size != sizeof(*header)))
2189 goto end;
2191 TRACE("Version is %u.%u, flags %#x.\n", header->major, header->minor, header->flags);
2193 /* Version must be 1.0.x */
2194 if ((header->major != 1) || (header->minor != 0))
2196 ret = D3DRMERR_BADFILE;
2197 goto end;
2200 IDirectXFileData_Release(data);
2201 data = NULL;
2203 while (1)
2205 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
2206 if (hr == DXFILEERR_NOMOREOBJECTS)
2208 TRACE("No more object\n");
2209 break;
2211 else if (hr != DXFILE_OK)
2213 ret = D3DRMERR_BADFILE;
2214 goto end;
2217 ret = load_data(iface, data, iids, iid_count, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
2218 if (ret != D3DRM_OK)
2219 goto end;
2221 IDirectXFileData_Release(data);
2222 data = NULL;
2225 ret = D3DRM_OK;
2227 end:
2228 if (data)
2229 IDirectXFileData_Release(data);
2230 if (enum_object)
2231 IDirectXFileEnumObject_Release(enum_object);
2232 if (file)
2233 IDirectXFile_Release(file);
2235 return ret;
2238 static HRESULT WINAPI d3drm3_Tick(IDirect3DRM3 *iface, D3DVALUE tick)
2240 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
2242 return E_NOTIMPL;
2245 static HRESULT WINAPI d3drm3_CreateProgressiveMesh(IDirect3DRM3 *iface, IDirect3DRMProgressiveMesh **mesh)
2247 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
2249 return E_NOTIMPL;
2252 static HRESULT WINAPI d3drm3_RegisterClient(IDirect3DRM3 *iface, REFGUID guid, DWORD *id)
2254 FIXME("iface %p, guid %s, id %p stub!\n", iface, debugstr_guid(guid), id);
2256 return E_NOTIMPL;
2259 static HRESULT WINAPI d3drm3_UnregisterClient(IDirect3DRM3 *iface, REFGUID guid)
2261 FIXME("iface %p, guid %s stub!\n", iface, debugstr_guid(guid));
2263 return E_NOTIMPL;
2266 static HRESULT WINAPI d3drm3_CreateClippedVisual(IDirect3DRM3 *iface,
2267 IDirect3DRMVisual *visual, IDirect3DRMClippedVisual **clipped_visual)
2269 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface, visual, clipped_visual);
2271 return E_NOTIMPL;
2274 static HRESULT WINAPI d3drm3_SetOptions(IDirect3DRM3 *iface, DWORD flags)
2276 FIXME("iface %p, flags %#x stub!\n", iface, flags);
2278 return E_NOTIMPL;
2281 static HRESULT WINAPI d3drm3_GetOptions(IDirect3DRM3 *iface, DWORD *flags)
2283 FIXME("iface %p, flags %p stub!\n", iface, flags);
2285 return E_NOTIMPL;
2288 static const struct IDirect3DRM3Vtbl d3drm3_vtbl =
2290 d3drm3_QueryInterface,
2291 d3drm3_AddRef,
2292 d3drm3_Release,
2293 d3drm3_CreateObject,
2294 d3drm3_CreateFrame,
2295 d3drm3_CreateMesh,
2296 d3drm3_CreateMeshBuilder,
2297 d3drm3_CreateFace,
2298 d3drm3_CreateAnimation,
2299 d3drm3_CreateAnimationSet,
2300 d3drm3_CreateTexture,
2301 d3drm3_CreateLight,
2302 d3drm3_CreateLightRGB,
2303 d3drm3_CreateMaterial,
2304 d3drm3_CreateDevice,
2305 d3drm3_CreateDeviceFromSurface,
2306 d3drm3_CreateDeviceFromD3D,
2307 d3drm3_CreateDeviceFromClipper,
2308 d3drm3_CreateTextureFromSurface,
2309 d3drm3_CreateShadow,
2310 d3drm3_CreateViewport,
2311 d3drm3_CreateWrap,
2312 d3drm3_CreateUserVisual,
2313 d3drm3_LoadTexture,
2314 d3drm3_LoadTextureFromResource,
2315 d3drm3_SetSearchPath,
2316 d3drm3_AddSearchPath,
2317 d3drm3_GetSearchPath,
2318 d3drm3_SetDefaultTextureColors,
2319 d3drm3_SetDefaultTextureShades,
2320 d3drm3_GetDevices,
2321 d3drm3_GetNamedObject,
2322 d3drm3_EnumerateObjects,
2323 d3drm3_Load,
2324 d3drm3_Tick,
2325 d3drm3_CreateProgressiveMesh,
2326 d3drm3_RegisterClient,
2327 d3drm3_UnregisterClient,
2328 d3drm3_CreateClippedVisual,
2329 d3drm3_SetOptions,
2330 d3drm3_GetOptions,
2333 HRESULT WINAPI Direct3DRMCreate(IDirect3DRM **d3drm)
2335 struct d3drm *object;
2337 TRACE("d3drm %p.\n", d3drm);
2339 if (!(object = heap_alloc_zero(sizeof(*object))))
2340 return E_OUTOFMEMORY;
2342 object->IDirect3DRM_iface.lpVtbl = &d3drm1_vtbl;
2343 object->IDirect3DRM2_iface.lpVtbl = &d3drm2_vtbl;
2344 object->IDirect3DRM3_iface.lpVtbl = &d3drm3_vtbl;
2345 object->ref1 = 1;
2346 object->iface_count = 1;
2348 *d3drm = &object->IDirect3DRM_iface;
2350 return S_OK;
2353 HRESULT WINAPI DllCanUnloadNow(void)
2355 return S_FALSE;
2358 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
2360 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
2362 if(!ppv)
2363 return E_INVALIDARG;
2365 return CLASS_E_CLASSNOTAVAILABLE;