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 "d3drm_private.h"
25 static const char* get_IID_string(const GUID
* guid
)
27 if (IsEqualGUID(guid
, &IID_IDirect3DRMFrame
))
28 return "IID_IDirect3DRMFrame";
29 else if (IsEqualGUID(guid
, &IID_IDirect3DRMFrame2
))
30 return "IID_IDirect3DRMFrame2";
31 else if (IsEqualGUID(guid
, &IID_IDirect3DRMFrame3
))
32 return "IID_IDirect3DRMFrame3";
33 else if (IsEqualGUID(guid
, &IID_IDirect3DRMMeshBuilder
))
34 return "IID_IDirect3DRMMeshBuilder";
35 else if (IsEqualGUID(guid
, &IID_IDirect3DRMMeshBuilder2
))
36 return "IID_IDirect3DRMMeshBuilder2";
37 else if (IsEqualGUID(guid
, &IID_IDirect3DRMMeshBuilder3
))
38 return "IID_IDirect3DRMMeshBuilder3";
43 static HRESULT
d3drm_create_texture_object(void **object
, IDirect3DRM
*d3drm
)
45 struct d3drm_texture
*texture
;
48 if (FAILED(hr
= d3drm_texture_create(&texture
, d3drm
)))
51 *object
= &texture
->IDirect3DRMTexture_iface
;
56 static HRESULT
d3drm_create_device_object(void **object
, IDirect3DRM
*d3drm
)
58 struct d3drm_device
*device
;
61 if (FAILED(hr
= d3drm_device_create(&device
, d3drm
)))
64 *object
= &device
->IDirect3DRMDevice_iface
;
69 static HRESULT
d3drm_create_viewport_object(void **object
, IDirect3DRM
*d3drm
)
71 struct d3drm_viewport
*viewport
;
74 if (FAILED(hr
= d3drm_viewport_create(&viewport
, d3drm
)))
77 *object
= &viewport
->IDirect3DRMViewport_iface
;
82 static HRESULT
d3drm_create_face_object(void **object
, IDirect3DRM
*d3drm
)
84 struct d3drm_face
*face
;
87 if (FAILED(hr
= d3drm_face_create(&face
)))
90 *object
= &face
->IDirect3DRMFace_iface
;
95 static HRESULT
d3drm_create_mesh_builder_object(void **object
, IDirect3DRM
*d3drm
)
97 struct d3drm_mesh_builder
*mesh_builder
;
100 if (FAILED(hr
= d3drm_mesh_builder_create(&mesh_builder
, d3drm
)))
103 *object
= &mesh_builder
->IDirect3DRMMeshBuilder2_iface
;
108 static HRESULT
d3drm_create_frame_object(void **object
, IDirect3DRM
*d3drm
)
110 struct d3drm_frame
*frame
;
113 if (FAILED(hr
= d3drm_frame_create(&frame
, NULL
, d3drm
)))
116 *object
= &frame
->IDirect3DRMFrame_iface
;
121 static HRESULT
d3drm_create_light_object(void **object
, IDirect3DRM
*d3drm
)
123 struct d3drm_light
*light
;
126 if (FAILED(hr
= d3drm_light_create(&light
, d3drm
)))
129 *object
= &light
->IDirect3DRMLight_iface
;
134 static HRESULT
d3drm_create_material_object(void **object
, IDirect3DRM
*d3drm
)
136 struct d3drm_material
*material
;
139 if (FAILED(hr
= d3drm_material_create(&material
, d3drm
)))
142 *object
= &material
->IDirect3DRMMaterial2_iface
;
147 static HRESULT
d3drm_create_mesh_object(void **object
, IDirect3DRM
*d3drm
)
149 struct d3drm_mesh
*mesh
;
152 if (FAILED(hr
= d3drm_mesh_create(&mesh
, d3drm
)))
155 *object
= &mesh
->IDirect3DRMMesh_iface
;
160 static HRESULT
d3drm_create_animation_object(void **object
, IDirect3DRM
*d3drm
)
162 struct d3drm_animation
*animation
;
165 if (FAILED(hr
= d3drm_animation_create(&animation
, d3drm
)))
168 *object
= &animation
->IDirect3DRMAnimation_iface
;
173 static HRESULT
d3drm_create_wrap_object(void **object
, IDirect3DRM
*d3drm
)
175 struct d3drm_wrap
*wrap
;
178 if (FAILED(hr
= d3drm_wrap_create(&wrap
, d3drm
)))
181 *object
= &wrap
->IDirect3DRMWrap_iface
;
188 IDirect3DRM IDirect3DRM_iface
;
189 IDirect3DRM2 IDirect3DRM2_iface
;
190 IDirect3DRM3 IDirect3DRM3_iface
;
191 LONG ref1
, ref2
, ref3
, iface_count
;
194 static inline struct d3drm
*impl_from_IDirect3DRM(IDirect3DRM
*iface
)
196 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM_iface
);
199 static inline struct d3drm
*impl_from_IDirect3DRM2(IDirect3DRM2
*iface
)
201 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM2_iface
);
204 static inline struct d3drm
*impl_from_IDirect3DRM3(IDirect3DRM3
*iface
)
206 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM3_iface
);
209 static void d3drm_destroy(struct d3drm
*d3drm
)
211 HeapFree(GetProcessHeap(), 0, d3drm
);
212 TRACE("d3drm object %p is being destroyed.\n", d3drm
);
215 static HRESULT WINAPI
d3drm1_QueryInterface(IDirect3DRM
*iface
, REFIID riid
, void **out
)
217 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
219 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
221 if (IsEqualGUID(riid
, &IID_IDirect3DRM
)
222 || IsEqualGUID(riid
, &IID_IUnknown
))
224 *out
= &d3drm
->IDirect3DRM_iface
;
226 else if (IsEqualGUID(riid
, &IID_IDirect3DRM2
))
228 *out
= &d3drm
->IDirect3DRM2_iface
;
230 else if (IsEqualGUID(riid
, &IID_IDirect3DRM3
))
232 *out
= &d3drm
->IDirect3DRM3_iface
;
237 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
238 return CLASS_E_CLASSNOTAVAILABLE
;
241 IUnknown_AddRef((IUnknown
*)*out
);
245 static ULONG WINAPI
d3drm1_AddRef(IDirect3DRM
*iface
)
247 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
248 ULONG refcount
= InterlockedIncrement(&d3drm
->ref1
);
250 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
253 InterlockedIncrement(&d3drm
->iface_count
);
258 static ULONG WINAPI
d3drm1_Release(IDirect3DRM
*iface
)
260 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
261 ULONG refcount
= InterlockedDecrement(&d3drm
->ref1
);
263 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
265 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
266 d3drm_destroy(d3drm
);
271 static HRESULT WINAPI
d3drm1_CreateObject(IDirect3DRM
*iface
,
272 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
274 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
276 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
277 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
279 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
282 static HRESULT WINAPI
d3drm1_CreateFrame(IDirect3DRM
*iface
,
283 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame
**frame
)
285 struct d3drm_frame
*object
;
288 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
290 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, iface
)))
293 *frame
= &object
->IDirect3DRMFrame_iface
;
298 static HRESULT WINAPI
d3drm1_CreateMesh(IDirect3DRM
*iface
, IDirect3DRMMesh
**mesh
)
300 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
302 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
304 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
307 static HRESULT WINAPI
d3drm1_CreateMeshBuilder(IDirect3DRM
*iface
, IDirect3DRMMeshBuilder
**mesh_builder
)
309 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
311 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
313 return IDirect3DRM2_CreateMeshBuilder(&d3drm
->IDirect3DRM2_iface
, (IDirect3DRMMeshBuilder2
**)mesh_builder
);
316 static HRESULT WINAPI
d3drm1_CreateFace(IDirect3DRM
*iface
, IDirect3DRMFace
**face
)
318 struct d3drm_face
*object
;
321 TRACE("iface %p, face %p.\n", iface
, face
);
323 if (FAILED(hr
= d3drm_face_create(&object
)))
326 *face
= &object
->IDirect3DRMFace_iface
;
331 static HRESULT WINAPI
d3drm1_CreateAnimation(IDirect3DRM
*iface
, IDirect3DRMAnimation
**animation
)
333 struct d3drm_animation
*object
;
336 TRACE("iface %p, animation %p.\n", iface
, animation
);
339 return D3DRMERR_BADVALUE
;
341 if (FAILED(hr
= d3drm_animation_create(&object
, iface
)))
344 *animation
= &object
->IDirect3DRMAnimation_iface
;
349 static HRESULT WINAPI
d3drm1_CreateAnimationSet(IDirect3DRM
*iface
, IDirect3DRMAnimationSet
**set
)
351 FIXME("iface %p, set %p stub!\n", iface
, set
);
356 static HRESULT WINAPI
d3drm1_CreateTexture(IDirect3DRM
*iface
,
357 D3DRMIMAGE
*image
, IDirect3DRMTexture
**texture
)
359 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
360 IDirect3DRMTexture3
*texture3
;
363 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
366 return D3DRMERR_BADVALUE
;
368 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
374 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
375 IDirect3DRMTexture3_Release(texture3
);
380 static HRESULT WINAPI
d3drm1_CreateLight(IDirect3DRM
*iface
,
381 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
383 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
385 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
387 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
390 static HRESULT WINAPI
d3drm1_CreateLightRGB(IDirect3DRM
*iface
, D3DRMLIGHTTYPE type
,
391 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
393 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
395 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
396 iface
, type
, red
, green
, blue
, light
);
398 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
401 static HRESULT WINAPI
d3drm1_CreateMaterial(IDirect3DRM
*iface
,
402 D3DVALUE power
, IDirect3DRMMaterial
**material
)
404 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
406 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
408 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
411 static HRESULT WINAPI
d3drm1_CreateDevice(IDirect3DRM
*iface
,
412 DWORD width
, DWORD height
, IDirect3DRMDevice
**device
)
414 struct d3drm_device
*object
;
417 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
419 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
422 *device
= &object
->IDirect3DRMDevice_iface
;
427 static HRESULT WINAPI
d3drm1_CreateDeviceFromSurface(IDirect3DRM
*iface
, GUID
*guid
,
428 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice
**device
)
430 struct d3drm_device
*object
;
433 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
434 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
437 return D3DRMERR_BADVALUE
;
440 if (!backbuffer
|| !ddraw
)
441 return D3DRMERR_BADDEVICE
;
443 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
446 if (SUCCEEDED(hr
= d3drm_device_init(object
, 1, ddraw
, backbuffer
, TRUE
)))
447 *device
= &object
->IDirect3DRMDevice_iface
;
449 d3drm_device_destroy(object
);
454 static HRESULT WINAPI
d3drm1_CreateDeviceFromD3D(IDirect3DRM
*iface
,
455 IDirect3D
*d3d
, IDirect3DDevice
*d3d_device
, IDirect3DRMDevice
**device
)
457 struct d3drm_device
*object
;
459 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
460 iface
, d3d
, d3d_device
, device
);
463 return D3DRMERR_BADVALUE
;
466 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
469 if (FAILED(hr
= IDirect3DRMDevice_InitFromD3D(&object
->IDirect3DRMDevice_iface
, d3d
, d3d_device
)))
471 d3drm_device_destroy(object
);
474 *device
= &object
->IDirect3DRMDevice_iface
;
479 static HRESULT WINAPI
d3drm1_CreateDeviceFromClipper(IDirect3DRM
*iface
,
480 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
481 IDirect3DRMDevice
**device
)
483 struct d3drm_device
*object
;
485 IDirectDrawSurface
*render_target
;
488 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
489 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
492 return D3DRMERR_BADVALUE
;
495 if (!clipper
|| !width
|| !height
)
496 return D3DRMERR_BADVALUE
;
498 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
502 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
504 IDirectDraw_Release(ddraw
);
508 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
511 IDirectDraw_Release(ddraw
);
512 d3drm_device_destroy(object
);
516 hr
= d3drm_device_init(object
, 1, ddraw
, render_target
, TRUE
);
517 IDirectDraw_Release(ddraw
);
518 IDirectDrawSurface_Release(render_target
);
520 d3drm_device_destroy(object
);
522 *device
= &object
->IDirect3DRMDevice_iface
;
527 static HRESULT WINAPI
d3drm1_CreateTextureFromSurface(IDirect3DRM
*iface
,
528 IDirectDrawSurface
*surface
, IDirect3DRMTexture
**texture
)
530 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
531 IDirect3DRMTexture3
*texture3
;
534 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
537 return D3DRMERR_BADVALUE
;
539 if (FAILED(hr
= IDirect3DRM3_CreateTextureFromSurface(&d3drm
->IDirect3DRM3_iface
, surface
, &texture3
)))
545 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
546 IDirect3DRMTexture3_Release(texture3
);
551 static HRESULT WINAPI
d3drm1_CreateShadow(IDirect3DRM
*iface
, IDirect3DRMVisual
*visual
,
552 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
553 IDirect3DRMVisual
**shadow
)
555 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
556 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
561 static HRESULT WINAPI
d3drm1_CreateViewport(IDirect3DRM
*iface
, IDirect3DRMDevice
*device
,
562 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
564 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
565 IDirect3DRMDevice3
*device3
;
566 IDirect3DRMFrame3
*camera3
;
567 IDirect3DRMViewport2
*viewport2
;
570 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
571 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
573 if (!device
|| !camera
)
574 return D3DRMERR_BADOBJECT
;
576 return D3DRMERR_BADVALUE
;
578 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
581 if (FAILED(hr
= IDirect3DRMFrame_QueryInterface(camera
, &IID_IDirect3DRMFrame3
, (void **)&camera3
)))
583 IDirect3DRMDevice3_Release(device3
);
587 hr
= IDirect3DRM3_CreateViewport(&d3drm
->IDirect3DRM3_iface
, device3
, camera3
, x
, y
, width
, height
, &viewport2
);
588 IDirect3DRMDevice3_Release(device3
);
589 IDirect3DRMFrame3_Release(camera3
);
593 hr
= IDirect3DRMViewport2_QueryInterface(viewport2
, &IID_IDirect3DRMViewport
, (void **)viewport
);
594 IDirect3DRMViewport2_Release(viewport2
);
599 static HRESULT WINAPI
d3drm1_CreateWrap(IDirect3DRM
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
600 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
601 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
602 IDirect3DRMWrap
**wrap
)
604 struct d3drm_wrap
*object
;
607 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
608 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n",
609 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
612 return D3DRMERR_BADVALUE
;
614 if (FAILED(hr
= d3drm_wrap_create(&object
, iface
)))
617 *wrap
= &object
->IDirect3DRMWrap_iface
;
622 static HRESULT WINAPI
d3drm1_CreateUserVisual(IDirect3DRM
*iface
,
623 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
625 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface
, cb
, ctx
, visual
);
630 static HRESULT WINAPI
d3drm1_LoadTexture(IDirect3DRM
*iface
,
631 const char *filename
, IDirect3DRMTexture
**texture
)
633 struct d3drm_texture
*object
;
636 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
638 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
641 *texture
= &object
->IDirect3DRMTexture_iface
;
646 static HRESULT WINAPI
d3drm1_LoadTextureFromResource(IDirect3DRM
*iface
,
647 HRSRC resource
, IDirect3DRMTexture
**texture
)
649 struct d3drm_texture
*object
;
652 FIXME("iface %p, resource %p, texture %p stub!\n", iface
, resource
, texture
);
654 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
657 *texture
= &object
->IDirect3DRMTexture_iface
;
662 static HRESULT WINAPI
d3drm1_SetSearchPath(IDirect3DRM
*iface
, const char *path
)
664 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
669 static HRESULT WINAPI
d3drm1_AddSearchPath(IDirect3DRM
*iface
, const char *path
)
671 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
676 static HRESULT WINAPI
d3drm1_GetSearchPath(IDirect3DRM
*iface
, DWORD
*size
, char *path
)
678 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
683 static HRESULT WINAPI
d3drm1_SetDefaultTextureColors(IDirect3DRM
*iface
, DWORD color_count
)
685 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
690 static HRESULT WINAPI
d3drm1_SetDefaultTextureShades(IDirect3DRM
*iface
, DWORD shade_count
)
692 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
697 static HRESULT WINAPI
d3drm1_GetDevices(IDirect3DRM
*iface
, IDirect3DRMDeviceArray
**array
)
699 FIXME("iface %p, array %p stub!\n", iface
, array
);
704 static HRESULT WINAPI
d3drm1_GetNamedObject(IDirect3DRM
*iface
,
705 const char *name
, IDirect3DRMObject
**object
)
707 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
712 static HRESULT WINAPI
d3drm1_EnumerateObjects(IDirect3DRM
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
714 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
719 static HRESULT WINAPI
d3drm1_Load(IDirect3DRM
*iface
, void *source
, void *object_id
, IID
**iids
,
720 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
721 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
723 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
724 IDirect3DRMFrame3
*parent_frame3
= NULL
;
725 HRESULT hr
= D3DRM_OK
;
727 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
728 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
729 iface
, source
, object_id
, iids
, iid_count
, flags
,
730 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
733 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
735 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
736 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
738 IDirect3DRMFrame3_Release(parent_frame3
);
743 static HRESULT WINAPI
d3drm1_Tick(IDirect3DRM
*iface
, D3DVALUE tick
)
745 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
750 static const struct IDirect3DRMVtbl d3drm1_vtbl
=
752 d3drm1_QueryInterface
,
758 d3drm1_CreateMeshBuilder
,
760 d3drm1_CreateAnimation
,
761 d3drm1_CreateAnimationSet
,
762 d3drm1_CreateTexture
,
764 d3drm1_CreateLightRGB
,
765 d3drm1_CreateMaterial
,
767 d3drm1_CreateDeviceFromSurface
,
768 d3drm1_CreateDeviceFromD3D
,
769 d3drm1_CreateDeviceFromClipper
,
770 d3drm1_CreateTextureFromSurface
,
772 d3drm1_CreateViewport
,
774 d3drm1_CreateUserVisual
,
776 d3drm1_LoadTextureFromResource
,
777 d3drm1_SetSearchPath
,
778 d3drm1_AddSearchPath
,
779 d3drm1_GetSearchPath
,
780 d3drm1_SetDefaultTextureColors
,
781 d3drm1_SetDefaultTextureShades
,
783 d3drm1_GetNamedObject
,
784 d3drm1_EnumerateObjects
,
789 static HRESULT WINAPI
d3drm2_QueryInterface(IDirect3DRM2
*iface
, REFIID riid
, void **out
)
791 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
793 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
796 static ULONG WINAPI
d3drm2_AddRef(IDirect3DRM2
*iface
)
798 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
799 ULONG refcount
= InterlockedIncrement(&d3drm
->ref2
);
801 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
804 InterlockedIncrement(&d3drm
->iface_count
);
809 static ULONG WINAPI
d3drm2_Release(IDirect3DRM2
*iface
)
811 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
812 ULONG refcount
= InterlockedDecrement(&d3drm
->ref2
);
814 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
816 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
817 d3drm_destroy(d3drm
);
822 static HRESULT WINAPI
d3drm2_CreateObject(IDirect3DRM2
*iface
,
823 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
825 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
827 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
828 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
830 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
833 static HRESULT WINAPI
d3drm2_CreateFrame(IDirect3DRM2
*iface
,
834 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame2
**frame
)
836 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
837 struct d3drm_frame
*object
;
840 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
842 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, &d3drm
->IDirect3DRM_iface
)))
845 *frame
= &object
->IDirect3DRMFrame2_iface
;
850 static HRESULT WINAPI
d3drm2_CreateMesh(IDirect3DRM2
*iface
, IDirect3DRMMesh
**mesh
)
852 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
854 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
856 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
859 static HRESULT WINAPI
d3drm2_CreateMeshBuilder(IDirect3DRM2
*iface
, IDirect3DRMMeshBuilder2
**mesh_builder
)
861 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
862 struct d3drm_mesh_builder
*object
;
865 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
867 if (FAILED(hr
= d3drm_mesh_builder_create(&object
, &d3drm
->IDirect3DRM_iface
)))
870 *mesh_builder
= &object
->IDirect3DRMMeshBuilder2_iface
;
875 static HRESULT WINAPI
d3drm2_CreateFace(IDirect3DRM2
*iface
, IDirect3DRMFace
**face
)
877 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
879 TRACE("iface %p, face %p.\n", iface
, face
);
881 return IDirect3DRM_CreateFace(&d3drm
->IDirect3DRM_iface
, face
);
884 static HRESULT WINAPI
d3drm2_CreateAnimation(IDirect3DRM2
*iface
, IDirect3DRMAnimation
**animation
)
886 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
888 TRACE("iface %p, animation %p.\n", iface
, animation
);
890 return IDirect3DRM_CreateAnimation(&d3drm
->IDirect3DRM_iface
, animation
);
893 static HRESULT WINAPI
d3drm2_CreateAnimationSet(IDirect3DRM2
*iface
, IDirect3DRMAnimationSet
**set
)
895 FIXME("iface %p, set %p stub!\n", iface
, set
);
900 static HRESULT WINAPI
d3drm2_CreateTexture(IDirect3DRM2
*iface
,
901 D3DRMIMAGE
*image
, IDirect3DRMTexture2
**texture
)
903 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
904 IDirect3DRMTexture3
*texture3
;
907 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
910 return D3DRMERR_BADVALUE
;
912 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
918 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture2
, (void **)texture
);
919 IDirect3DRMTexture3_Release(texture3
);
924 static HRESULT WINAPI
d3drm2_CreateLight(IDirect3DRM2
*iface
,
925 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
927 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
929 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
931 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
934 static HRESULT WINAPI
d3drm2_CreateLightRGB(IDirect3DRM2
*iface
, D3DRMLIGHTTYPE type
,
935 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
937 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
939 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
940 iface
, type
, red
, green
, blue
, light
);
942 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
945 static HRESULT WINAPI
d3drm2_CreateMaterial(IDirect3DRM2
*iface
,
946 D3DVALUE power
, IDirect3DRMMaterial
**material
)
948 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
950 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
952 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
955 static HRESULT WINAPI
d3drm2_CreateDevice(IDirect3DRM2
*iface
,
956 DWORD width
, DWORD height
, IDirect3DRMDevice2
**device
)
958 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
959 struct d3drm_device
*object
;
962 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
964 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
967 *device
= &object
->IDirect3DRMDevice2_iface
;
972 static HRESULT WINAPI
d3drm2_CreateDeviceFromSurface(IDirect3DRM2
*iface
, GUID
*guid
,
973 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice2
**device
)
975 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
976 IDirect3DRMDevice3
*device3
;
978 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
979 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
982 return D3DRMERR_BADVALUE
;
984 hr
= IDirect3DRM3_CreateDeviceFromSurface(&d3drm
->IDirect3DRM3_iface
, guid
, ddraw
, backbuffer
, 0, &device3
);
988 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
989 IDirect3DRMDevice3_Release(device3
);
994 static HRESULT WINAPI
d3drm2_CreateDeviceFromD3D(IDirect3DRM2
*iface
,
995 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice2
**device
)
997 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
998 IDirect3DRMDevice3
*device3
;
1001 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1002 iface
, d3d
, d3d_device
, device
);
1005 return D3DRMERR_BADVALUE
;
1008 hr
= IDirect3DRM3_CreateDeviceFromD3D(&d3drm
->IDirect3DRM3_iface
, d3d
, d3d_device
, &device3
);
1012 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void **)device
);
1013 IDirect3DRMDevice3_Release(device3
);
1018 static HRESULT WINAPI
d3drm2_CreateDeviceFromClipper(IDirect3DRM2
*iface
,
1019 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
1020 IDirect3DRMDevice2
**device
)
1022 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1023 IDirect3DRMDevice3
*device3
;
1026 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1027 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1030 return D3DRMERR_BADVALUE
;
1032 hr
= IDirect3DRM3_CreateDeviceFromClipper(&d3drm
->IDirect3DRM3_iface
, clipper
, guid
, width
, height
, &device3
);
1036 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
1037 IDirect3DRMDevice3_Release(device3
);
1042 static HRESULT WINAPI
d3drm2_CreateTextureFromSurface(IDirect3DRM2
*iface
,
1043 IDirectDrawSurface
*surface
, IDirect3DRMTexture2
**texture
)
1045 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1046 IDirect3DRMTexture3
*texture3
;
1049 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
1052 return D3DRMERR_BADVALUE
;
1054 if (FAILED(hr
= IDirect3DRM3_CreateTextureFromSurface(&d3drm
->IDirect3DRM3_iface
, surface
, &texture3
)))
1060 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
1061 IDirect3DRMTexture3_Release(texture3
);
1066 static HRESULT WINAPI
d3drm2_CreateShadow(IDirect3DRM2
*iface
, IDirect3DRMVisual
*visual
,
1067 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
1068 IDirect3DRMVisual
**shadow
)
1070 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1071 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
1076 static HRESULT WINAPI
d3drm2_CreateViewport(IDirect3DRM2
*iface
, IDirect3DRMDevice
*device
,
1077 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
1079 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1080 IDirect3DRMDevice3
*device3
;
1081 IDirect3DRMFrame3
*camera3
;
1082 IDirect3DRMViewport2
*viewport2
;
1085 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
1086 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
1088 if (!device
|| !camera
)
1089 return D3DRMERR_BADOBJECT
;
1091 return D3DRMERR_BADVALUE
;
1093 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
1096 if (FAILED(hr
= IDirect3DRMFrame_QueryInterface(camera
, &IID_IDirect3DRMFrame3
, (void **)&camera3
)))
1098 IDirect3DRMDevice3_Release(device3
);
1102 hr
= IDirect3DRM3_CreateViewport(&d3drm
->IDirect3DRM3_iface
, device3
, camera3
, x
, y
, width
, height
, &viewport2
);
1103 IDirect3DRMDevice3_Release(device3
);
1104 IDirect3DRMFrame3_Release(camera3
);
1108 hr
= IDirect3DRMViewport2_QueryInterface(viewport2
, &IID_IDirect3DRMViewport
, (void **)viewport
);
1109 IDirect3DRMViewport2_Release(viewport2
);
1114 static HRESULT WINAPI
d3drm2_CreateWrap(IDirect3DRM2
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
1115 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
1116 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
1117 IDirect3DRMWrap
**wrap
)
1119 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1121 TRACE("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1122 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p.\n",
1123 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
1125 return IDirect3DRM_CreateWrap(&d3drm
->IDirect3DRM_iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
,
1126 ou
, ov
, su
, sv
, wrap
);
1129 static HRESULT WINAPI
d3drm2_CreateUserVisual(IDirect3DRM2
*iface
,
1130 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
1132 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
1137 static HRESULT WINAPI
d3drm2_LoadTexture(IDirect3DRM2
*iface
,
1138 const char *filename
, IDirect3DRMTexture2
**texture
)
1140 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1141 struct d3drm_texture
*object
;
1144 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
1146 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1149 *texture
= &object
->IDirect3DRMTexture2_iface
;
1154 static HRESULT WINAPI
d3drm2_LoadTextureFromResource(IDirect3DRM2
*iface
, HMODULE module
,
1155 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture2
**texture
)
1157 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1158 struct d3drm_texture
*object
;
1161 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
1162 iface
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
1164 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1167 *texture
= &object
->IDirect3DRMTexture2_iface
;
1172 static HRESULT WINAPI
d3drm2_SetSearchPath(IDirect3DRM2
*iface
, const char *path
)
1174 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1179 static HRESULT WINAPI
d3drm2_AddSearchPath(IDirect3DRM2
*iface
, const char *path
)
1181 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1186 static HRESULT WINAPI
d3drm2_GetSearchPath(IDirect3DRM2
*iface
, DWORD
*size
, char *path
)
1188 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
1193 static HRESULT WINAPI
d3drm2_SetDefaultTextureColors(IDirect3DRM2
*iface
, DWORD color_count
)
1195 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1200 static HRESULT WINAPI
d3drm2_SetDefaultTextureShades(IDirect3DRM2
*iface
, DWORD shade_count
)
1202 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1207 static HRESULT WINAPI
d3drm2_GetDevices(IDirect3DRM2
*iface
, IDirect3DRMDeviceArray
**array
)
1209 FIXME("iface %p, array %p stub!\n", iface
, array
);
1214 static HRESULT WINAPI
d3drm2_GetNamedObject(IDirect3DRM2
*iface
,
1215 const char *name
, IDirect3DRMObject
**object
)
1217 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
1222 static HRESULT WINAPI
d3drm2_EnumerateObjects(IDirect3DRM2
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
1224 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
1229 static HRESULT WINAPI
d3drm2_Load(IDirect3DRM2
*iface
, void *source
, void *object_id
, IID
**iids
,
1230 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
1231 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
1233 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1234 IDirect3DRMFrame3
*parent_frame3
= NULL
;
1235 HRESULT hr
= D3DRM_OK
;
1237 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1238 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1239 iface
, source
, object_id
, iids
, iid_count
, flags
,
1240 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1243 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
1245 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
1246 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
1248 IDirect3DRMFrame3_Release(parent_frame3
);
1253 static HRESULT WINAPI
d3drm2_Tick(IDirect3DRM2
*iface
, D3DVALUE tick
)
1255 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1260 static HRESULT WINAPI
d3drm2_CreateProgressiveMesh(IDirect3DRM2
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1262 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1267 static const struct IDirect3DRM2Vtbl d3drm2_vtbl
=
1269 d3drm2_QueryInterface
,
1272 d3drm2_CreateObject
,
1275 d3drm2_CreateMeshBuilder
,
1277 d3drm2_CreateAnimation
,
1278 d3drm2_CreateAnimationSet
,
1279 d3drm2_CreateTexture
,
1281 d3drm2_CreateLightRGB
,
1282 d3drm2_CreateMaterial
,
1283 d3drm2_CreateDevice
,
1284 d3drm2_CreateDeviceFromSurface
,
1285 d3drm2_CreateDeviceFromD3D
,
1286 d3drm2_CreateDeviceFromClipper
,
1287 d3drm2_CreateTextureFromSurface
,
1288 d3drm2_CreateShadow
,
1289 d3drm2_CreateViewport
,
1291 d3drm2_CreateUserVisual
,
1293 d3drm2_LoadTextureFromResource
,
1294 d3drm2_SetSearchPath
,
1295 d3drm2_AddSearchPath
,
1296 d3drm2_GetSearchPath
,
1297 d3drm2_SetDefaultTextureColors
,
1298 d3drm2_SetDefaultTextureShades
,
1300 d3drm2_GetNamedObject
,
1301 d3drm2_EnumerateObjects
,
1304 d3drm2_CreateProgressiveMesh
,
1307 static HRESULT WINAPI
d3drm3_QueryInterface(IDirect3DRM3
*iface
, REFIID riid
, void **out
)
1309 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1311 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
1314 static ULONG WINAPI
d3drm3_AddRef(IDirect3DRM3
*iface
)
1316 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1317 ULONG refcount
= InterlockedIncrement(&d3drm
->ref3
);
1319 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
1322 InterlockedIncrement(&d3drm
->iface_count
);
1327 static ULONG WINAPI
d3drm3_Release(IDirect3DRM3
*iface
)
1329 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1330 ULONG refcount
= InterlockedDecrement(&d3drm
->ref3
);
1332 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
1334 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
1335 d3drm_destroy(d3drm
);
1340 static HRESULT WINAPI
d3drm3_CreateObject(IDirect3DRM3
*iface
,
1341 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
1343 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1351 HRESULT (*create_object
)(void **object
, IDirect3DRM
*d3drm
);
1355 {&CLSID_CDirect3DRMTexture
, d3drm_create_texture_object
},
1356 {&CLSID_CDirect3DRMDevice
, d3drm_create_device_object
},
1357 {&CLSID_CDirect3DRMViewport
, d3drm_create_viewport_object
},
1358 {&CLSID_CDirect3DRMFace
, d3drm_create_face_object
},
1359 {&CLSID_CDirect3DRMMeshBuilder
, d3drm_create_mesh_builder_object
},
1360 {&CLSID_CDirect3DRMFrame
, d3drm_create_frame_object
},
1361 {&CLSID_CDirect3DRMLight
, d3drm_create_light_object
},
1362 {&CLSID_CDirect3DRMMaterial
, d3drm_create_material_object
},
1363 {&CLSID_CDirect3DRMMesh
, d3drm_create_mesh_object
},
1364 {&CLSID_CDirect3DRMAnimation
, d3drm_create_animation_object
},
1365 {&CLSID_CDirect3DRMWrap
, d3drm_create_wrap_object
},
1368 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1369 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
1372 return D3DRMERR_BADVALUE
;
1377 return D3DRMERR_BADVALUE
;
1382 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer
);
1387 for (i
= 0; i
< ARRAY_SIZE(object_table
); ++i
)
1389 if (IsEqualGUID(clsid
, object_table
[i
].clsid
))
1391 if (FAILED(hr
= object_table
[i
].create_object((void **)&object
, &d3drm
->IDirect3DRM_iface
)))
1399 if (i
== ARRAY_SIZE(object_table
))
1401 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid
));
1403 return CLASSFACTORY_E_FIRST
;
1406 if (FAILED(hr
= IUnknown_QueryInterface(object
, iid
, out
)))
1408 IUnknown_Release(object
);
1413 static HRESULT WINAPI
d3drm3_CreateFrame(IDirect3DRM3
*iface
,
1414 IDirect3DRMFrame3
*parent
, IDirect3DRMFrame3
**frame
)
1416 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1417 struct d3drm_frame
*object
;
1420 TRACE("iface %p, parent %p, frame %p.\n", iface
, parent
, frame
);
1422 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent
, &d3drm
->IDirect3DRM_iface
)))
1425 *frame
= &object
->IDirect3DRMFrame3_iface
;
1430 static HRESULT WINAPI
d3drm3_CreateMesh(IDirect3DRM3
*iface
, IDirect3DRMMesh
**mesh
)
1432 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1433 struct d3drm_mesh
*object
;
1436 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
1438 if (FAILED(hr
= d3drm_mesh_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1441 *mesh
= &object
->IDirect3DRMMesh_iface
;
1446 static HRESULT WINAPI
d3drm3_CreateMeshBuilder(IDirect3DRM3
*iface
, IDirect3DRMMeshBuilder3
**mesh_builder
)
1448 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1449 struct d3drm_mesh_builder
*object
;
1452 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
1454 if (FAILED(hr
= d3drm_mesh_builder_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1457 *mesh_builder
= &object
->IDirect3DRMMeshBuilder3_iface
;
1462 static HRESULT WINAPI
d3drm3_CreateFace(IDirect3DRM3
*iface
, IDirect3DRMFace2
**face
)
1464 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1465 IDirect3DRMFace
*face1
;
1468 TRACE("iface %p, face %p.\n", iface
, face
);
1470 if (FAILED(hr
= IDirect3DRM_CreateFace(&d3drm
->IDirect3DRM_iface
, &face1
)))
1473 hr
= IDirect3DRMFace_QueryInterface(face1
, &IID_IDirect3DRMFace2
, (void **)face
);
1474 IDirect3DRMFace_Release(face1
);
1479 static HRESULT WINAPI
d3drm3_CreateAnimation(IDirect3DRM3
*iface
, IDirect3DRMAnimation2
**animation
)
1481 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1482 struct d3drm_animation
*object
;
1485 TRACE("iface %p, animation %p.\n", iface
, animation
);
1487 if (FAILED(hr
= d3drm_animation_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1490 *animation
= &object
->IDirect3DRMAnimation2_iface
;
1495 static HRESULT WINAPI
d3drm3_CreateAnimationSet(IDirect3DRM3
*iface
, IDirect3DRMAnimationSet2
**set
)
1497 FIXME("iface %p, set %p stub!\n", iface
, set
);
1502 static HRESULT WINAPI
d3drm3_CreateTexture(IDirect3DRM3
*iface
,
1503 D3DRMIMAGE
*image
, IDirect3DRMTexture3
**texture
)
1505 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1506 struct d3drm_texture
*object
;
1509 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
1512 return D3DRMERR_BADVALUE
;
1514 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1517 *texture
= &object
->IDirect3DRMTexture3_iface
;
1519 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture
, image
)))
1521 IDirect3DRMTexture3_Release(*texture
);
1523 return D3DRMERR_BADVALUE
;
1529 static HRESULT WINAPI
d3drm3_CreateLight(IDirect3DRM3
*iface
,
1530 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
1532 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1533 struct d3drm_light
*object
;
1536 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface
, type
, color
, light
);
1538 if (SUCCEEDED(hr
= d3drm_light_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1540 IDirect3DRMLight_SetType(&object
->IDirect3DRMLight_iface
, type
);
1541 IDirect3DRMLight_SetColor(&object
->IDirect3DRMLight_iface
, color
);
1544 *light
= &object
->IDirect3DRMLight_iface
;
1549 static HRESULT WINAPI
d3drm3_CreateLightRGB(IDirect3DRM3
*iface
, D3DRMLIGHTTYPE type
,
1550 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
1552 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1553 struct d3drm_light
*object
;
1556 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1557 iface
, type
, red
, green
, blue
, light
);
1559 if (SUCCEEDED(hr
= d3drm_light_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1561 IDirect3DRMLight_SetType(&object
->IDirect3DRMLight_iface
, type
);
1562 IDirect3DRMLight_SetColorRGB(&object
->IDirect3DRMLight_iface
, red
, green
, blue
);
1565 *light
= &object
->IDirect3DRMLight_iface
;
1570 static HRESULT WINAPI
d3drm3_CreateMaterial(IDirect3DRM3
*iface
,
1571 D3DVALUE power
, IDirect3DRMMaterial2
**material
)
1573 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1574 struct d3drm_material
*object
;
1577 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
1579 if (SUCCEEDED(hr
= d3drm_material_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1580 IDirect3DRMMaterial2_SetPower(&object
->IDirect3DRMMaterial2_iface
, power
);
1582 *material
= &object
->IDirect3DRMMaterial2_iface
;
1587 static HRESULT WINAPI
d3drm3_CreateDevice(IDirect3DRM3
*iface
,
1588 DWORD width
, DWORD height
, IDirect3DRMDevice3
**device
)
1590 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1591 struct d3drm_device
*object
;
1594 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
1596 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1599 *device
= &object
->IDirect3DRMDevice3_iface
;
1604 static HRESULT WINAPI
d3drm3_CreateDeviceFromSurface(IDirect3DRM3
*iface
, GUID
*guid
,
1605 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, DWORD flags
, IDirect3DRMDevice3
**device
)
1607 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1608 struct d3drm_device
*object
;
1612 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1613 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, flags
, device
);
1616 return D3DRMERR_BADVALUE
;
1619 if (!backbuffer
|| !ddraw
)
1620 return D3DRMERR_BADDEVICE
;
1622 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1625 use_z_surface
= !(flags
& D3DRMDEVICE_NOZBUFFER
);
1627 if (SUCCEEDED(hr
= d3drm_device_init(object
, 3, ddraw
, backbuffer
, use_z_surface
)))
1628 *device
= &object
->IDirect3DRMDevice3_iface
;
1630 d3drm_device_destroy(object
);
1635 static HRESULT WINAPI
d3drm3_CreateDeviceFromD3D(IDirect3DRM3
*iface
,
1636 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice3
**device
)
1638 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1639 struct d3drm_device
*object
;
1642 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1643 iface
, d3d
, d3d_device
, device
);
1646 return D3DRMERR_BADVALUE
;
1649 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1652 if (FAILED(hr
= IDirect3DRMDevice3_InitFromD3D2(&object
->IDirect3DRMDevice3_iface
, d3d
, d3d_device
)))
1654 d3drm_device_destroy(object
);
1657 *device
= &object
->IDirect3DRMDevice3_iface
;
1662 static HRESULT WINAPI
d3drm3_CreateDeviceFromClipper(IDirect3DRM3
*iface
,
1663 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
1664 IDirect3DRMDevice3
**device
)
1666 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1667 struct d3drm_device
*object
;
1669 IDirectDrawSurface
*render_target
;
1672 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1673 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1676 return D3DRMERR_BADVALUE
;
1679 if (!clipper
|| !width
|| !height
)
1680 return D3DRMERR_BADVALUE
;
1682 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
1686 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1688 IDirectDraw_Release(ddraw
);
1692 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
1695 IDirectDraw_Release(ddraw
);
1696 d3drm_device_destroy(object
);
1700 hr
= d3drm_device_init(object
, 3, ddraw
, render_target
, TRUE
);
1701 IDirectDraw_Release(ddraw
);
1702 IDirectDrawSurface_Release(render_target
);
1704 d3drm_device_destroy(object
);
1706 *device
= &object
->IDirect3DRMDevice3_iface
;
1711 static HRESULT WINAPI
d3drm3_CreateShadow(IDirect3DRM3
*iface
, IUnknown
*object
, IDirect3DRMLight
*light
,
1712 D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
, IDirect3DRMShadow2
**shadow
)
1714 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1715 iface
, object
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
1720 static HRESULT WINAPI
d3drm3_CreateTextureFromSurface(IDirect3DRM3
*iface
,
1721 IDirectDrawSurface
*surface
, IDirect3DRMTexture3
**texture
)
1723 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1724 struct d3drm_texture
*object
;
1727 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
1730 return D3DRMERR_BADVALUE
;
1732 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1735 *texture
= &object
->IDirect3DRMTexture3_iface
;
1737 if (FAILED(IDirect3DRMTexture3_InitFromSurface(*texture
, surface
)))
1739 IDirect3DRMTexture3_Release(*texture
);
1741 return D3DRMERR_BADVALUE
;
1747 static HRESULT WINAPI
d3drm3_CreateViewport(IDirect3DRM3
*iface
, IDirect3DRMDevice3
*device
,
1748 IDirect3DRMFrame3
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport2
**viewport
)
1750 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1751 struct d3drm_viewport
*object
;
1754 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
1755 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
1757 if (!device
|| !camera
)
1758 return D3DRMERR_BADOBJECT
;
1760 return D3DRMERR_BADVALUE
;
1762 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1765 *viewport
= &object
->IDirect3DRMViewport2_iface
;
1767 if (FAILED(hr
= IDirect3DRMViewport2_Init(*viewport
, device
, camera
, x
, y
, width
, height
)))
1769 IDirect3DRMViewport2_Release(*viewport
);
1771 return D3DRMERR_BADVALUE
;
1777 static HRESULT WINAPI
d3drm3_CreateWrap(IDirect3DRM3
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame3
*frame
,
1778 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
1779 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
1780 IDirect3DRMWrap
**wrap
)
1782 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1783 struct d3drm_wrap
*object
;
1786 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1787 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p, semi-stub.\n",
1788 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
1791 return D3DRMERR_BADVALUE
;
1793 if (FAILED(hr
= d3drm_wrap_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1796 *wrap
= &object
->IDirect3DRMWrap_iface
;
1801 static HRESULT WINAPI
d3drm3_CreateUserVisual(IDirect3DRM3
*iface
,
1802 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
1804 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
1809 static HRESULT WINAPI
d3drm3_LoadTexture(IDirect3DRM3
*iface
,
1810 const char *filename
, IDirect3DRMTexture3
**texture
)
1812 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1813 struct d3drm_texture
*object
;
1816 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
1818 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1821 *texture
= &object
->IDirect3DRMTexture3_iface
;
1826 static HRESULT WINAPI
d3drm3_LoadTextureFromResource(IDirect3DRM3
*iface
, HMODULE module
,
1827 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture3
**texture
)
1829 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1830 struct d3drm_texture
*object
;
1833 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1834 iface
, module
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
1836 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1839 *texture
= &object
->IDirect3DRMTexture3_iface
;
1844 static HRESULT WINAPI
d3drm3_SetSearchPath(IDirect3DRM3
*iface
, const char *path
)
1846 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1851 static HRESULT WINAPI
d3drm3_AddSearchPath(IDirect3DRM3
*iface
, const char *path
)
1853 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1858 static HRESULT WINAPI
d3drm3_GetSearchPath(IDirect3DRM3
*iface
, DWORD
*size
, char *path
)
1860 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
1865 static HRESULT WINAPI
d3drm3_SetDefaultTextureColors(IDirect3DRM3
*iface
, DWORD color_count
)
1867 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1872 static HRESULT WINAPI
d3drm3_SetDefaultTextureShades(IDirect3DRM3
*iface
, DWORD shade_count
)
1874 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1879 static HRESULT WINAPI
d3drm3_GetDevices(IDirect3DRM3
*iface
, IDirect3DRMDeviceArray
**array
)
1881 FIXME("iface %p, array %p stub!\n", iface
, array
);
1886 static HRESULT WINAPI
d3drm3_GetNamedObject(IDirect3DRM3
*iface
,
1887 const char *name
, IDirect3DRMObject
**object
)
1889 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
1894 static HRESULT WINAPI
d3drm3_EnumerateObjects(IDirect3DRM3
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
1896 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
1901 static HRESULT
load_data(IDirect3DRM3
*iface
, IDirectXFileData
*data_object
, IID
**GUIDs
, DWORD nb_GUIDs
, D3DRMLOADCALLBACK LoadProc
,
1902 void *ArgLP
, D3DRMLOADTEXTURECALLBACK LoadTextureProc
, void *ArgLTP
, IDirect3DRMFrame3
*parent_frame
)
1904 HRESULT ret
= D3DRMERR_BADOBJECT
;
1908 BOOL requested
= FALSE
;
1910 hr
= IDirectXFileData_GetType(data_object
, &guid
);
1911 if (hr
!= DXFILE_OK
)
1914 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid
));
1916 /* Load object only if it is top level and requested or if it is part of another object */
1918 if (IsEqualGUID(guid
, &TID_D3DRMMesh
))
1920 TRACE("Found TID_D3DRMMesh\n");
1922 for (i
= 0; i
< nb_GUIDs
; i
++)
1923 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder
) ||
1924 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder2
) ||
1925 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder3
))
1931 if (requested
|| parent_frame
)
1933 IDirect3DRMMeshBuilder3
*meshbuilder
;
1935 TRACE("Load mesh data\n");
1937 hr
= IDirect3DRM3_CreateMeshBuilder(iface
, &meshbuilder
);
1940 hr
= load_mesh_data(meshbuilder
, data_object
, LoadTextureProc
, ArgLTP
);
1943 /* Only top level objects are notified */
1946 IDirect3DRMObject
*object
;
1948 hr
= IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder
, GUIDs
[i
], (void**)&object
);
1951 LoadProc(object
, GUIDs
[i
], ArgLP
);
1952 IDirect3DRMObject_Release(object
);
1957 IDirect3DRMFrame3_AddVisual(parent_frame
, (IUnknown
*)meshbuilder
);
1960 IDirect3DRMMeshBuilder3_Release(meshbuilder
);
1964 ERR("Cannot process mesh\n");
1967 else if (IsEqualGUID(guid
, &TID_D3DRMFrame
))
1969 TRACE("Found TID_D3DRMFrame\n");
1971 for (i
= 0; i
< nb_GUIDs
; i
++)
1972 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame
) ||
1973 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame2
) ||
1974 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame3
))
1980 if (requested
|| parent_frame
)
1982 IDirect3DRMFrame3
*frame
;
1984 TRACE("Load frame data\n");
1986 hr
= IDirect3DRM3_CreateFrame(iface
, parent_frame
, &frame
);
1989 IDirectXFileObject
*child
;
1991 while (SUCCEEDED(hr
= IDirectXFileData_GetNextObject(data_object
, &child
)))
1993 IDirectXFileData
*data
;
1994 IDirectXFileDataReference
*reference
;
1995 IDirectXFileBinary
*binary
;
1997 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1998 &IID_IDirectXFileBinary
, (void **)&binary
)))
2000 FIXME("Binary Object not supported yet\n");
2001 IDirectXFileBinary_Release(binary
);
2003 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
2004 &IID_IDirectXFileData
, (void **)&data
)))
2006 TRACE("Found Data Object\n");
2007 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
2008 IDirectXFileData_Release(data
);
2010 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
2011 &IID_IDirectXFileDataReference
, (void **)&reference
)))
2013 TRACE("Found Data Object Reference\n");
2014 IDirectXFileDataReference_Resolve(reference
, &data
);
2015 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
2016 IDirectXFileData_Release(data
);
2017 IDirectXFileDataReference_Release(reference
);
2019 IDirectXFileObject_Release(child
);
2022 if (hr
!= DXFILEERR_NOMOREOBJECTS
)
2024 IDirect3DRMFrame3_Release(frame
);
2029 /* Only top level objects are notified */
2032 IDirect3DRMObject
*object
;
2034 hr
= IDirect3DRMFrame3_QueryInterface(frame
, GUIDs
[i
], (void**)&object
);
2037 LoadProc(object
, GUIDs
[i
], ArgLP
);
2038 IDirect3DRMObject_Release(object
);
2041 IDirect3DRMFrame3_Release(frame
);
2045 ERR("Cannot process frame\n");
2048 else if (IsEqualGUID(guid
, &TID_D3DRMMaterial
))
2050 TRACE("Found TID_D3DRMMaterial\n");
2052 /* Cannot be requested so nothing to do */
2054 else if (IsEqualGUID(guid
, &TID_D3DRMFrameTransformMatrix
))
2056 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
2058 /* Cannot be requested */
2061 D3DRMMATRIX4D
*matrix
;
2064 TRACE("Load Frame Transform Matrix data\n");
2066 hr
= IDirectXFileData_GetData(data_object
, NULL
, &size
, (void**)&matrix
);
2067 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(matrix
)))
2070 hr
= IDirect3DRMFrame3_AddTransform(parent_frame
, D3DRMCOMBINE_REPLACE
, *matrix
);
2077 FIXME("Found unknown TID %s\n", debugstr_guid(guid
));
2087 static HRESULT WINAPI
d3drm3_Load(IDirect3DRM3
*iface
, void *source
, void *object_id
, IID
**iids
,
2088 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
2089 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame3
*parent_frame
)
2091 DXFILELOADOPTIONS load_options
;
2092 IDirectXFile
*file
= NULL
;
2093 IDirectXFileEnumObject
*enum_object
= NULL
;
2094 IDirectXFileData
*data
= NULL
;
2098 struct d3drm_file_header
*header
;
2099 HRESULT ret
= D3DRMERR_BADOBJECT
;
2102 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
2103 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
2104 iface
, source
, object_id
, iids
, iid_count
, flags
,
2105 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
2107 TRACE("Looking for GUIDs:\n");
2108 for (i
= 0; i
< iid_count
; ++i
)
2109 TRACE("- %s (%s)\n", debugstr_guid(iids
[i
]), get_IID_string(iids
[i
]));
2111 if (flags
== D3DRMLOAD_FROMMEMORY
)
2113 load_options
= DXFILELOAD_FROMMEMORY
;
2115 else if (flags
== D3DRMLOAD_FROMFILE
)
2117 load_options
= DXFILELOAD_FROMFILE
;
2118 TRACE("Loading from file %s\n", debugstr_a(source
));
2122 FIXME("Load options %#x not supported yet.\n", flags
);
2126 hr
= DirectXFileCreate(&file
);
2127 if (hr
!= DXFILE_OK
)
2130 hr
= IDirectXFile_RegisterTemplates(file
, templates
, strlen(templates
));
2131 if (hr
!= DXFILE_OK
)
2134 hr
= IDirectXFile_CreateEnumObject(file
, source
, load_options
, &enum_object
);
2135 if (hr
!= DXFILE_OK
)
2138 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
2139 if (hr
!= DXFILE_OK
)
2142 hr
= IDirectXFileData_GetType(data
, &pGuid
);
2143 if (hr
!= DXFILE_OK
)
2146 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid
));
2148 if (!IsEqualGUID(pGuid
, &TID_DXFILEHeader
))
2150 ret
= D3DRMERR_BADFILE
;
2154 hr
= IDirectXFileData_GetData(data
, NULL
, &size
, (void **)&header
);
2155 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(*header
)))
2158 TRACE("Version is %u.%u, flags %#x.\n", header
->major
, header
->minor
, header
->flags
);
2160 /* Version must be 1.0.x */
2161 if ((header
->major
!= 1) || (header
->minor
!= 0))
2163 ret
= D3DRMERR_BADFILE
;
2167 IDirectXFileData_Release(data
);
2172 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
2173 if (hr
== DXFILEERR_NOMOREOBJECTS
)
2175 TRACE("No more object\n");
2178 else if (hr
!= DXFILE_OK
)
2180 ret
= D3DRMERR_BADFILE
;
2184 ret
= load_data(iface
, data
, iids
, iid_count
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
2185 if (ret
!= D3DRM_OK
)
2188 IDirectXFileData_Release(data
);
2196 IDirectXFileData_Release(data
);
2198 IDirectXFileEnumObject_Release(enum_object
);
2200 IDirectXFile_Release(file
);
2205 static HRESULT WINAPI
d3drm3_Tick(IDirect3DRM3
*iface
, D3DVALUE tick
)
2207 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
2212 static HRESULT WINAPI
d3drm3_CreateProgressiveMesh(IDirect3DRM3
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
2214 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
2219 static HRESULT WINAPI
d3drm3_RegisterClient(IDirect3DRM3
*iface
, REFGUID guid
, DWORD
*id
)
2221 FIXME("iface %p, guid %s, id %p stub!\n", iface
, debugstr_guid(guid
), id
);
2226 static HRESULT WINAPI
d3drm3_UnregisterClient(IDirect3DRM3
*iface
, REFGUID guid
)
2228 FIXME("iface %p, guid %s stub!\n", iface
, debugstr_guid(guid
));
2233 static HRESULT WINAPI
d3drm3_CreateClippedVisual(IDirect3DRM3
*iface
,
2234 IDirect3DRMVisual
*visual
, IDirect3DRMClippedVisual
**clipped_visual
)
2236 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface
, visual
, clipped_visual
);
2241 static HRESULT WINAPI
d3drm3_SetOptions(IDirect3DRM3
*iface
, DWORD flags
)
2243 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
2248 static HRESULT WINAPI
d3drm3_GetOptions(IDirect3DRM3
*iface
, DWORD
*flags
)
2250 FIXME("iface %p, flags %p stub!\n", iface
, flags
);
2255 static const struct IDirect3DRM3Vtbl d3drm3_vtbl
=
2257 d3drm3_QueryInterface
,
2260 d3drm3_CreateObject
,
2263 d3drm3_CreateMeshBuilder
,
2265 d3drm3_CreateAnimation
,
2266 d3drm3_CreateAnimationSet
,
2267 d3drm3_CreateTexture
,
2269 d3drm3_CreateLightRGB
,
2270 d3drm3_CreateMaterial
,
2271 d3drm3_CreateDevice
,
2272 d3drm3_CreateDeviceFromSurface
,
2273 d3drm3_CreateDeviceFromD3D
,
2274 d3drm3_CreateDeviceFromClipper
,
2275 d3drm3_CreateTextureFromSurface
,
2276 d3drm3_CreateShadow
,
2277 d3drm3_CreateViewport
,
2279 d3drm3_CreateUserVisual
,
2281 d3drm3_LoadTextureFromResource
,
2282 d3drm3_SetSearchPath
,
2283 d3drm3_AddSearchPath
,
2284 d3drm3_GetSearchPath
,
2285 d3drm3_SetDefaultTextureColors
,
2286 d3drm3_SetDefaultTextureShades
,
2288 d3drm3_GetNamedObject
,
2289 d3drm3_EnumerateObjects
,
2292 d3drm3_CreateProgressiveMesh
,
2293 d3drm3_RegisterClient
,
2294 d3drm3_UnregisterClient
,
2295 d3drm3_CreateClippedVisual
,
2300 HRESULT WINAPI
Direct3DRMCreate(IDirect3DRM
**d3drm
)
2302 struct d3drm
*object
;
2304 TRACE("d3drm %p.\n", d3drm
);
2306 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
2307 return E_OUTOFMEMORY
;
2309 object
->IDirect3DRM_iface
.lpVtbl
= &d3drm1_vtbl
;
2310 object
->IDirect3DRM2_iface
.lpVtbl
= &d3drm2_vtbl
;
2311 object
->IDirect3DRM3_iface
.lpVtbl
= &d3drm3_vtbl
;
2313 object
->iface_count
= 1;
2315 *d3drm
= &object
->IDirect3DRM_iface
;
2320 HRESULT WINAPI
DllCanUnloadNow(void)
2325 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, void **ppv
)
2327 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
2330 return E_INVALIDARG
;
2332 return CLASS_E_CLASSNOTAVAILABLE
;