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
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";
48 static HRESULT
d3drm_create_texture_object(void **object
, IDirect3DRM
*d3drm
)
50 struct d3drm_texture
*texture
;
53 if (FAILED(hr
= d3drm_texture_create(&texture
, d3drm
)))
56 *object
= &texture
->IDirect3DRMTexture_iface
;
61 static HRESULT
d3drm_create_device_object(void **object
, IDirect3DRM
*d3drm
)
63 struct d3drm_device
*device
;
66 if (FAILED(hr
= d3drm_device_create(&device
, d3drm
)))
69 *object
= &device
->IDirect3DRMDevice_iface
;
74 static HRESULT
d3drm_create_viewport_object(void **object
, IDirect3DRM
*d3drm
)
76 struct d3drm_viewport
*viewport
;
79 if (FAILED(hr
= d3drm_viewport_create(&viewport
, d3drm
)))
82 *object
= &viewport
->IDirect3DRMViewport_iface
;
87 static HRESULT
d3drm_create_face_object(void **object
, IDirect3DRM
*d3drm
)
89 struct d3drm_face
*face
;
92 if (FAILED(hr
= d3drm_face_create(&face
)))
95 *object
= &face
->IDirect3DRMFace_iface
;
100 static HRESULT
d3drm_create_mesh_builder_object(void **object
, IDirect3DRM
*d3drm
)
102 struct d3drm_mesh_builder
*mesh_builder
;
105 if (FAILED(hr
= d3drm_mesh_builder_create(&mesh_builder
, d3drm
)))
108 *object
= &mesh_builder
->IDirect3DRMMeshBuilder2_iface
;
113 static HRESULT
d3drm_create_frame_object(void **object
, IDirect3DRM
*d3drm
)
115 struct d3drm_frame
*frame
;
118 if (FAILED(hr
= d3drm_frame_create(&frame
, NULL
, d3drm
)))
121 *object
= &frame
->IDirect3DRMFrame_iface
;
126 static HRESULT
d3drm_create_light_object(void **object
, IDirect3DRM
*d3drm
)
128 struct d3drm_light
*light
;
131 if (FAILED(hr
= d3drm_light_create(&light
, d3drm
)))
134 *object
= &light
->IDirect3DRMLight_iface
;
139 static HRESULT
d3drm_create_material_object(void **object
, IDirect3DRM
*d3drm
)
141 struct d3drm_material
*material
;
144 if (FAILED(hr
= d3drm_material_create(&material
, d3drm
)))
147 *object
= &material
->IDirect3DRMMaterial2_iface
;
152 static HRESULT
d3drm_create_mesh_object(void **object
, IDirect3DRM
*d3drm
)
154 struct d3drm_mesh
*mesh
;
157 if (FAILED(hr
= d3drm_mesh_create(&mesh
, d3drm
)))
160 *object
= &mesh
->IDirect3DRMMesh_iface
;
165 static HRESULT
d3drm_create_animation_object(void **object
, IDirect3DRM
*d3drm
)
167 struct d3drm_animation
*animation
;
170 if (FAILED(hr
= d3drm_animation_create(&animation
, d3drm
)))
173 *object
= &animation
->IDirect3DRMAnimation_iface
;
178 static HRESULT
d3drm_create_wrap_object(void **object
, IDirect3DRM
*d3drm
)
180 struct d3drm_wrap
*wrap
;
183 if (FAILED(hr
= d3drm_wrap_create(&wrap
, d3drm
)))
186 *object
= &wrap
->IDirect3DRMWrap_iface
;
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
)
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
;
242 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
243 return CLASS_E_CLASSNOTAVAILABLE
;
246 IUnknown_AddRef((IUnknown
*)*out
);
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
);
258 InterlockedIncrement(&d3drm
->iface_count
);
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
);
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
;
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
)))
298 *frame
= &object
->IDirect3DRMFrame_iface
;
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
;
326 TRACE("iface %p, face %p.\n", iface
, face
);
328 if (FAILED(hr
= d3drm_face_create(&object
)))
331 *face
= &object
->IDirect3DRMFace_iface
;
336 static HRESULT WINAPI
d3drm1_CreateAnimation(IDirect3DRM
*iface
, IDirect3DRMAnimation
**animation
)
338 struct d3drm_animation
*object
;
341 TRACE("iface %p, animation %p.\n", iface
, animation
);
344 return D3DRMERR_BADVALUE
;
346 if (FAILED(hr
= d3drm_animation_create(&object
, iface
)))
349 *animation
= &object
->IDirect3DRMAnimation_iface
;
354 static HRESULT WINAPI
d3drm1_CreateAnimationSet(IDirect3DRM
*iface
, IDirect3DRMAnimationSet
**set
)
356 FIXME("iface %p, set %p stub!\n", iface
, set
);
361 static HRESULT WINAPI
d3drm1_CreateTexture(IDirect3DRM
*iface
,
362 D3DRMIMAGE
*image
, IDirect3DRMTexture
**texture
)
364 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
365 IDirect3DRMTexture3
*texture3
;
368 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
371 return D3DRMERR_BADVALUE
;
373 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
379 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
380 IDirect3DRMTexture3_Release(texture3
);
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
;
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
)))
427 *device
= &object
->IDirect3DRMDevice_iface
;
432 static HRESULT WINAPI
d3drm1_CreateDeviceFromSurface(IDirect3DRM
*iface
, GUID
*guid
,
433 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice
**device
)
435 struct d3drm_device
*object
;
438 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
439 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
442 return D3DRMERR_BADVALUE
;
445 if (!backbuffer
|| !ddraw
)
446 return D3DRMERR_BADDEVICE
;
448 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
451 if (SUCCEEDED(hr
= d3drm_device_init(object
, 1, ddraw
, backbuffer
, TRUE
)))
452 *device
= &object
->IDirect3DRMDevice_iface
;
454 d3drm_device_destroy(object
);
459 static HRESULT WINAPI
d3drm1_CreateDeviceFromD3D(IDirect3DRM
*iface
,
460 IDirect3D
*d3d
, IDirect3DDevice
*d3d_device
, IDirect3DRMDevice
**device
)
462 struct d3drm_device
*object
;
464 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
465 iface
, d3d
, d3d_device
, device
);
468 return D3DRMERR_BADVALUE
;
471 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
474 if (FAILED(hr
= IDirect3DRMDevice_InitFromD3D(&object
->IDirect3DRMDevice_iface
, d3d
, d3d_device
)))
476 d3drm_device_destroy(object
);
479 *device
= &object
->IDirect3DRMDevice_iface
;
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
;
490 IDirectDrawSurface
*render_target
;
493 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
494 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
497 return D3DRMERR_BADVALUE
;
500 if (!clipper
|| !width
|| !height
)
501 return D3DRMERR_BADVALUE
;
503 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
507 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
509 IDirectDraw_Release(ddraw
);
513 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
516 IDirectDraw_Release(ddraw
);
517 d3drm_device_destroy(object
);
521 hr
= d3drm_device_init(object
, 1, ddraw
, render_target
, TRUE
);
522 IDirectDraw_Release(ddraw
);
523 IDirectDrawSurface_Release(render_target
);
525 d3drm_device_destroy(object
);
527 *device
= &object
->IDirect3DRMDevice_iface
;
532 static HRESULT WINAPI
d3drm1_CreateTextureFromSurface(IDirect3DRM
*iface
,
533 IDirectDrawSurface
*surface
, IDirect3DRMTexture
**texture
)
535 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
536 IDirect3DRMTexture3
*texture3
;
539 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
542 return D3DRMERR_BADVALUE
;
544 if (FAILED(hr
= IDirect3DRM3_CreateTextureFromSurface(&d3drm
->IDirect3DRM3_iface
, surface
, &texture3
)))
550 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
551 IDirect3DRMTexture3_Release(texture3
);
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
);
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
;
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
;
581 return D3DRMERR_BADVALUE
;
583 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
586 if (FAILED(hr
= IDirect3DRMFrame_QueryInterface(camera
, &IID_IDirect3DRMFrame3
, (void **)&camera3
)))
588 IDirect3DRMDevice3_Release(device3
);
592 hr
= IDirect3DRM3_CreateViewport(&d3drm
->IDirect3DRM3_iface
, device3
, camera3
, x
, y
, width
, height
, &viewport2
);
593 IDirect3DRMDevice3_Release(device3
);
594 IDirect3DRMFrame3_Release(camera3
);
598 hr
= IDirect3DRMViewport2_QueryInterface(viewport2
, &IID_IDirect3DRMViewport
, (void **)viewport
);
599 IDirect3DRMViewport2_Release(viewport2
);
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
;
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
);
617 return D3DRMERR_BADVALUE
;
619 if (FAILED(hr
= d3drm_wrap_create(&object
, iface
)))
622 *wrap
= &object
->IDirect3DRMWrap_iface
;
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
);
635 static HRESULT WINAPI
d3drm1_LoadTexture(IDirect3DRM
*iface
,
636 const char *filename
, IDirect3DRMTexture
**texture
)
638 struct d3drm_texture
*object
;
641 TRACE("iface %p, filename %s, texture %p.\n", iface
, debugstr_a(filename
), texture
);
644 return D3DRMERR_BADVALUE
;
646 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
649 *texture
= &object
->IDirect3DRMTexture_iface
;
650 if (FAILED(hr
= IDirect3DRMTexture_InitFromFile(*texture
, filename
)))
652 IDirect3DRMTexture_Release(*texture
);
655 return D3DRMERR_BADVALUE
;
657 return hr
== D3DRMERR_BADOBJECT
? D3DRMERR_FILENOTFOUND
: hr
;
663 static HRESULT WINAPI
d3drm1_LoadTextureFromResource(IDirect3DRM
*iface
,
664 HRSRC resource
, IDirect3DRMTexture
**texture
)
666 struct d3drm_texture
*object
;
669 FIXME("iface %p, resource %p, texture %p stub!\n", iface
, resource
, texture
);
671 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
674 *texture
= &object
->IDirect3DRMTexture_iface
;
679 static HRESULT WINAPI
d3drm1_SetSearchPath(IDirect3DRM
*iface
, const char *path
)
681 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
686 static HRESULT WINAPI
d3drm1_AddSearchPath(IDirect3DRM
*iface
, const char *path
)
688 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
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
);
700 static HRESULT WINAPI
d3drm1_SetDefaultTextureColors(IDirect3DRM
*iface
, DWORD color_count
)
702 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
707 static HRESULT WINAPI
d3drm1_SetDefaultTextureShades(IDirect3DRM
*iface
, DWORD shade_count
)
709 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
714 static HRESULT WINAPI
d3drm1_GetDevices(IDirect3DRM
*iface
, IDirect3DRMDeviceArray
**array
)
716 FIXME("iface %p, array %p stub!\n", iface
, array
);
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
);
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
);
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
);
750 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
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
);
755 IDirect3DRMFrame3_Release(parent_frame3
);
760 static HRESULT WINAPI
d3drm1_Tick(IDirect3DRM
*iface
, D3DVALUE tick
)
762 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
767 static const struct IDirect3DRMVtbl d3drm1_vtbl
=
769 d3drm1_QueryInterface
,
775 d3drm1_CreateMeshBuilder
,
777 d3drm1_CreateAnimation
,
778 d3drm1_CreateAnimationSet
,
779 d3drm1_CreateTexture
,
781 d3drm1_CreateLightRGB
,
782 d3drm1_CreateMaterial
,
784 d3drm1_CreateDeviceFromSurface
,
785 d3drm1_CreateDeviceFromD3D
,
786 d3drm1_CreateDeviceFromClipper
,
787 d3drm1_CreateTextureFromSurface
,
789 d3drm1_CreateViewport
,
791 d3drm1_CreateUserVisual
,
793 d3drm1_LoadTextureFromResource
,
794 d3drm1_SetSearchPath
,
795 d3drm1_AddSearchPath
,
796 d3drm1_GetSearchPath
,
797 d3drm1_SetDefaultTextureColors
,
798 d3drm1_SetDefaultTextureShades
,
800 d3drm1_GetNamedObject
,
801 d3drm1_EnumerateObjects
,
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
);
821 InterlockedIncrement(&d3drm
->iface_count
);
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
);
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
;
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
)))
862 *frame
= &object
->IDirect3DRMFrame2_iface
;
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
;
882 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
884 if (FAILED(hr
= d3drm_mesh_builder_create(&object
, &d3drm
->IDirect3DRM_iface
)))
887 *mesh_builder
= &object
->IDirect3DRMMeshBuilder2_iface
;
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
);
917 static HRESULT WINAPI
d3drm2_CreateTexture(IDirect3DRM2
*iface
,
918 D3DRMIMAGE
*image
, IDirect3DRMTexture2
**texture
)
920 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
921 IDirect3DRMTexture3
*texture3
;
924 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
927 return D3DRMERR_BADVALUE
;
929 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
935 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture2
, (void **)texture
);
936 IDirect3DRMTexture3_Release(texture3
);
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
;
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
)))
984 *device
= &object
->IDirect3DRMDevice2_iface
;
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
;
995 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
996 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
999 return D3DRMERR_BADVALUE
;
1001 hr
= IDirect3DRM3_CreateDeviceFromSurface(&d3drm
->IDirect3DRM3_iface
, guid
, ddraw
, backbuffer
, 0, &device3
);
1005 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
1006 IDirect3DRMDevice3_Release(device3
);
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
;
1018 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1019 iface
, d3d
, d3d_device
, device
);
1022 return D3DRMERR_BADVALUE
;
1025 hr
= IDirect3DRM3_CreateDeviceFromD3D(&d3drm
->IDirect3DRM3_iface
, d3d
, d3d_device
, &device3
);
1029 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void **)device
);
1030 IDirect3DRMDevice3_Release(device3
);
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
;
1043 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1044 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1047 return D3DRMERR_BADVALUE
;
1049 hr
= IDirect3DRM3_CreateDeviceFromClipper(&d3drm
->IDirect3DRM3_iface
, clipper
, guid
, width
, height
, &device3
);
1053 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
1054 IDirect3DRMDevice3_Release(device3
);
1059 static HRESULT WINAPI
d3drm2_CreateTextureFromSurface(IDirect3DRM2
*iface
,
1060 IDirectDrawSurface
*surface
, IDirect3DRMTexture2
**texture
)
1062 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1063 IDirect3DRMTexture3
*texture3
;
1066 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
1069 return D3DRMERR_BADVALUE
;
1071 if (FAILED(hr
= IDirect3DRM3_CreateTextureFromSurface(&d3drm
->IDirect3DRM3_iface
, surface
, &texture3
)))
1077 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
1078 IDirect3DRMTexture3_Release(texture3
);
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
);
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
;
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
;
1108 return D3DRMERR_BADVALUE
;
1110 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
1113 if (FAILED(hr
= IDirect3DRMFrame_QueryInterface(camera
, &IID_IDirect3DRMFrame3
, (void **)&camera3
)))
1115 IDirect3DRMDevice3_Release(device3
);
1119 hr
= IDirect3DRM3_CreateViewport(&d3drm
->IDirect3DRM3_iface
, device3
, camera3
, x
, y
, width
, height
, &viewport2
);
1120 IDirect3DRMDevice3_Release(device3
);
1121 IDirect3DRMFrame3_Release(camera3
);
1125 hr
= IDirect3DRMViewport2_QueryInterface(viewport2
, &IID_IDirect3DRMViewport
, (void **)viewport
);
1126 IDirect3DRMViewport2_Release(viewport2
);
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
);
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
;
1161 TRACE("iface %p, filename %s, texture %p.\n", iface
, debugstr_a(filename
), texture
);
1164 return D3DRMERR_BADVALUE
;
1166 if (FAILED(hr
= IDirect3DRM3_LoadTexture(&d3drm
->IDirect3DRM3_iface
, filename
, &texture3
)))
1172 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture2
, (void **)texture
);
1173 IDirect3DRMTexture3_Release(texture3
);
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
;
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
)))
1191 *texture
= &object
->IDirect3DRMTexture2_iface
;
1196 static HRESULT WINAPI
d3drm2_SetSearchPath(IDirect3DRM2
*iface
, const char *path
)
1198 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1203 static HRESULT WINAPI
d3drm2_AddSearchPath(IDirect3DRM2
*iface
, const char *path
)
1205 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
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
);
1217 static HRESULT WINAPI
d3drm2_SetDefaultTextureColors(IDirect3DRM2
*iface
, DWORD color_count
)
1219 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1224 static HRESULT WINAPI
d3drm2_SetDefaultTextureShades(IDirect3DRM2
*iface
, DWORD shade_count
)
1226 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1231 static HRESULT WINAPI
d3drm2_GetDevices(IDirect3DRM2
*iface
, IDirect3DRMDeviceArray
**array
)
1233 FIXME("iface %p, array %p stub!\n", iface
, array
);
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
);
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
);
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
);
1267 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
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
);
1272 IDirect3DRMFrame3_Release(parent_frame3
);
1277 static HRESULT WINAPI
d3drm2_Tick(IDirect3DRM2
*iface
, D3DVALUE tick
)
1279 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1284 static HRESULT WINAPI
d3drm2_CreateProgressiveMesh(IDirect3DRM2
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1286 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1291 static const struct IDirect3DRM2Vtbl d3drm2_vtbl
=
1293 d3drm2_QueryInterface
,
1296 d3drm2_CreateObject
,
1299 d3drm2_CreateMeshBuilder
,
1301 d3drm2_CreateAnimation
,
1302 d3drm2_CreateAnimationSet
,
1303 d3drm2_CreateTexture
,
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
,
1315 d3drm2_CreateUserVisual
,
1317 d3drm2_LoadTextureFromResource
,
1318 d3drm2_SetSearchPath
,
1319 d3drm2_AddSearchPath
,
1320 d3drm2_GetSearchPath
,
1321 d3drm2_SetDefaultTextureColors
,
1322 d3drm2_SetDefaultTextureShades
,
1324 d3drm2_GetNamedObject
,
1325 d3drm2_EnumerateObjects
,
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
);
1346 InterlockedIncrement(&d3drm
->iface_count
);
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
);
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
);
1375 HRESULT (*create_object
)(void **object
, IDirect3DRM
*d3drm
);
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
);
1396 return D3DRMERR_BADVALUE
;
1401 return D3DRMERR_BADVALUE
;
1406 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer
);
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
)))
1423 if (i
== ARRAY_SIZE(object_table
))
1425 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid
));
1427 return CLASSFACTORY_E_FIRST
;
1430 if (FAILED(hr
= IUnknown_QueryInterface(object
, iid
, out
)))
1432 IUnknown_Release(object
);
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
;
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
)))
1449 *frame
= &object
->IDirect3DRMFrame3_iface
;
1454 static HRESULT WINAPI
d3drm3_CreateMesh(IDirect3DRM3
*iface
, IDirect3DRMMesh
**mesh
)
1456 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1457 struct d3drm_mesh
*object
;
1460 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
1462 if (FAILED(hr
= d3drm_mesh_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1465 *mesh
= &object
->IDirect3DRMMesh_iface
;
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
;
1476 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
1478 if (FAILED(hr
= d3drm_mesh_builder_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1481 *mesh_builder
= &object
->IDirect3DRMMeshBuilder3_iface
;
1486 static HRESULT WINAPI
d3drm3_CreateFace(IDirect3DRM3
*iface
, IDirect3DRMFace2
**face
)
1488 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1489 IDirect3DRMFace
*face1
;
1492 TRACE("iface %p, face %p.\n", iface
, face
);
1494 if (FAILED(hr
= IDirect3DRM_CreateFace(&d3drm
->IDirect3DRM_iface
, &face1
)))
1497 hr
= IDirect3DRMFace_QueryInterface(face1
, &IID_IDirect3DRMFace2
, (void **)face
);
1498 IDirect3DRMFace_Release(face1
);
1503 static HRESULT WINAPI
d3drm3_CreateAnimation(IDirect3DRM3
*iface
, IDirect3DRMAnimation2
**animation
)
1505 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1506 struct d3drm_animation
*object
;
1509 TRACE("iface %p, animation %p.\n", iface
, animation
);
1511 if (FAILED(hr
= d3drm_animation_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1514 *animation
= &object
->IDirect3DRMAnimation2_iface
;
1519 static HRESULT WINAPI
d3drm3_CreateAnimationSet(IDirect3DRM3
*iface
, IDirect3DRMAnimationSet2
**set
)
1521 FIXME("iface %p, set %p stub!\n", iface
, set
);
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
;
1533 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
1536 return D3DRMERR_BADVALUE
;
1538 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1541 *texture
= &object
->IDirect3DRMTexture3_iface
;
1543 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture
, image
)))
1545 IDirect3DRMTexture3_Release(*texture
);
1547 return D3DRMERR_BADVALUE
;
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
;
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
;
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
;
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
;
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
;
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
;
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
;
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
)))
1623 *device
= &object
->IDirect3DRMDevice3_iface
;
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
;
1636 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1637 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, flags
, device
);
1640 return D3DRMERR_BADVALUE
;
1643 if (!backbuffer
|| !ddraw
)
1644 return D3DRMERR_BADDEVICE
;
1646 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
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
;
1654 d3drm_device_destroy(object
);
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
;
1666 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1667 iface
, d3d
, d3d_device
, device
);
1670 return D3DRMERR_BADVALUE
;
1673 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1676 if (FAILED(hr
= IDirect3DRMDevice3_InitFromD3D2(&object
->IDirect3DRMDevice3_iface
, d3d
, d3d_device
)))
1678 d3drm_device_destroy(object
);
1681 *device
= &object
->IDirect3DRMDevice3_iface
;
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
;
1693 IDirectDrawSurface
*render_target
;
1696 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1697 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1700 return D3DRMERR_BADVALUE
;
1703 if (!clipper
|| !width
|| !height
)
1704 return D3DRMERR_BADVALUE
;
1706 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
1710 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1712 IDirectDraw_Release(ddraw
);
1716 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
1719 IDirectDraw_Release(ddraw
);
1720 d3drm_device_destroy(object
);
1724 hr
= d3drm_device_init(object
, 3, ddraw
, render_target
, TRUE
);
1725 IDirectDraw_Release(ddraw
);
1726 IDirectDrawSurface_Release(render_target
);
1728 d3drm_device_destroy(object
);
1730 *device
= &object
->IDirect3DRMDevice3_iface
;
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
);
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
;
1751 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
1754 return D3DRMERR_BADVALUE
;
1756 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1759 *texture
= &object
->IDirect3DRMTexture3_iface
;
1761 if (FAILED(IDirect3DRMTexture3_InitFromSurface(*texture
, surface
)))
1763 IDirect3DRMTexture3_Release(*texture
);
1765 return D3DRMERR_BADVALUE
;
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
;
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
;
1784 return D3DRMERR_BADVALUE
;
1786 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1789 *viewport
= &object
->IDirect3DRMViewport2_iface
;
1791 if (FAILED(hr
= IDirect3DRMViewport2_Init(*viewport
, device
, camera
, x
, y
, width
, height
)))
1793 IDirect3DRMViewport2_Release(*viewport
);
1795 return D3DRMERR_BADVALUE
;
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
;
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
);
1815 return D3DRMERR_BADVALUE
;
1817 if (FAILED(hr
= d3drm_wrap_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1820 *wrap
= &object
->IDirect3DRMWrap_iface
;
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
);
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
;
1840 TRACE("iface %p, filename %s, texture %p.\n", iface
, debugstr_a(filename
), texture
);
1843 return D3DRMERR_BADVALUE
;
1845 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1848 *texture
= &object
->IDirect3DRMTexture3_iface
;
1849 if (FAILED(hr
= IDirect3DRMTexture3_InitFromFile(*texture
, filename
)))
1851 IDirect3DRMTexture3_Release(*texture
);
1853 return hr
== D3DRMERR_BADOBJECT
? D3DRMERR_FILENOTFOUND
: hr
;
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
;
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
)))
1872 *texture
= &object
->IDirect3DRMTexture3_iface
;
1877 static HRESULT WINAPI
d3drm3_SetSearchPath(IDirect3DRM3
*iface
, const char *path
)
1879 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1884 static HRESULT WINAPI
d3drm3_AddSearchPath(IDirect3DRM3
*iface
, const char *path
)
1886 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
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
);
1898 static HRESULT WINAPI
d3drm3_SetDefaultTextureColors(IDirect3DRM3
*iface
, DWORD color_count
)
1900 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1905 static HRESULT WINAPI
d3drm3_SetDefaultTextureShades(IDirect3DRM3
*iface
, DWORD shade_count
)
1907 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1912 static HRESULT WINAPI
d3drm3_GetDevices(IDirect3DRM3
*iface
, IDirect3DRMDeviceArray
**array
)
1914 FIXME("iface %p, array %p stub!\n", iface
, array
);
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
);
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
);
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
;
1941 BOOL requested
= FALSE
;
1943 hr
= IDirectXFileData_GetType(data_object
, &guid
);
1944 if (hr
!= DXFILE_OK
)
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
))
1964 if (requested
|| parent_frame
)
1966 IDirect3DRMMeshBuilder3
*meshbuilder
;
1968 TRACE("Load mesh data\n");
1970 hr
= IDirect3DRM3_CreateMeshBuilder(iface
, &meshbuilder
);
1973 hr
= load_mesh_data(meshbuilder
, data_object
, LoadTextureProc
, ArgLTP
);
1976 /* Only top level objects are notified */
1979 IDirect3DRMObject
*object
;
1981 hr
= IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder
, GUIDs
[i
], (void**)&object
);
1984 LoadProc(object
, GUIDs
[i
], ArgLP
);
1985 IDirect3DRMObject_Release(object
);
1990 IDirect3DRMFrame3_AddVisual(parent_frame
, (IUnknown
*)meshbuilder
);
1993 IDirect3DRMMeshBuilder3_Release(meshbuilder
);
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
))
2013 if (requested
|| parent_frame
)
2015 IDirect3DRMFrame3
*frame
;
2017 TRACE("Load frame data\n");
2019 hr
= IDirect3DRM3_CreateFrame(iface
, parent_frame
, &frame
);
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
);
2062 /* Only top level objects are notified */
2065 IDirect3DRMObject
*object
;
2067 hr
= IDirect3DRMFrame3_QueryInterface(frame
, GUIDs
[i
], (void**)&object
);
2070 LoadProc(object
, GUIDs
[i
], ArgLP
);
2071 IDirect3DRMObject_Release(object
);
2074 IDirect3DRMFrame3_Release(frame
);
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 */
2094 D3DRMMATRIX4D
*matrix
;
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
)))
2103 hr
= IDirect3DRMFrame3_AddTransform(parent_frame
, D3DRMCOMBINE_REPLACE
, *matrix
);
2110 FIXME("Found unknown TID %s\n", debugstr_guid(guid
));
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
;
2131 struct d3drm_file_header
*header
;
2132 HRESULT ret
= D3DRMERR_BADOBJECT
;
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
));
2155 FIXME("Load options %#x not supported yet.\n", flags
);
2159 hr
= DirectXFileCreate(&file
);
2160 if (hr
!= DXFILE_OK
)
2163 hr
= IDirectXFile_RegisterTemplates(file
, templates
, strlen(templates
));
2164 if (hr
!= DXFILE_OK
)
2167 hr
= IDirectXFile_CreateEnumObject(file
, source
, load_options
, &enum_object
);
2168 if (hr
!= DXFILE_OK
)
2171 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
2172 if (hr
!= DXFILE_OK
)
2175 hr
= IDirectXFileData_GetType(data
, &pGuid
);
2176 if (hr
!= DXFILE_OK
)
2179 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid
));
2181 if (!IsEqualGUID(pGuid
, &TID_DXFILEHeader
))
2183 ret
= D3DRMERR_BADFILE
;
2187 hr
= IDirectXFileData_GetData(data
, NULL
, &size
, (void **)&header
);
2188 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(*header
)))
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
;
2200 IDirectXFileData_Release(data
);
2205 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
2206 if (hr
== DXFILEERR_NOMOREOBJECTS
)
2208 TRACE("No more object\n");
2211 else if (hr
!= DXFILE_OK
)
2213 ret
= D3DRMERR_BADFILE
;
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
)
2221 IDirectXFileData_Release(data
);
2229 IDirectXFileData_Release(data
);
2231 IDirectXFileEnumObject_Release(enum_object
);
2233 IDirectXFile_Release(file
);
2238 static HRESULT WINAPI
d3drm3_Tick(IDirect3DRM3
*iface
, D3DVALUE tick
)
2240 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
2245 static HRESULT WINAPI
d3drm3_CreateProgressiveMesh(IDirect3DRM3
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
2247 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
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
);
2259 static HRESULT WINAPI
d3drm3_UnregisterClient(IDirect3DRM3
*iface
, REFGUID guid
)
2261 FIXME("iface %p, guid %s stub!\n", iface
, debugstr_guid(guid
));
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
);
2274 static HRESULT WINAPI
d3drm3_SetOptions(IDirect3DRM3
*iface
, DWORD flags
)
2276 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
2281 static HRESULT WINAPI
d3drm3_GetOptions(IDirect3DRM3
*iface
, DWORD
*flags
)
2283 FIXME("iface %p, flags %p stub!\n", iface
, flags
);
2288 static const struct IDirect3DRM3Vtbl d3drm3_vtbl
=
2290 d3drm3_QueryInterface
,
2293 d3drm3_CreateObject
,
2296 d3drm3_CreateMeshBuilder
,
2298 d3drm3_CreateAnimation
,
2299 d3drm3_CreateAnimationSet
,
2300 d3drm3_CreateTexture
,
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
,
2312 d3drm3_CreateUserVisual
,
2314 d3drm3_LoadTextureFromResource
,
2315 d3drm3_SetSearchPath
,
2316 d3drm3_AddSearchPath
,
2317 d3drm3_GetSearchPath
,
2318 d3drm3_SetDefaultTextureColors
,
2319 d3drm3_SetDefaultTextureShades
,
2321 d3drm3_GetNamedObject
,
2322 d3drm3_EnumerateObjects
,
2325 d3drm3_CreateProgressiveMesh
,
2326 d3drm3_RegisterClient
,
2327 d3drm3_UnregisterClient
,
2328 d3drm3_CreateClippedVisual
,
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
;
2346 object
->iface_count
= 1;
2348 *d3drm
= &object
->IDirect3DRM_iface
;
2353 HRESULT WINAPI
DllCanUnloadNow(void)
2358 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, void **ppv
)
2360 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
2363 return E_INVALIDARG
;
2365 return CLASS_E_CLASSNOTAVAILABLE
;