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
;
154 IDirect3DRM IDirect3DRM_iface
;
155 IDirect3DRM2 IDirect3DRM2_iface
;
156 IDirect3DRM3 IDirect3DRM3_iface
;
157 LONG ref1
, ref2
, ref3
, iface_count
;
160 static inline struct d3drm
*impl_from_IDirect3DRM(IDirect3DRM
*iface
)
162 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM_iface
);
165 static inline struct d3drm
*impl_from_IDirect3DRM2(IDirect3DRM2
*iface
)
167 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM2_iface
);
170 static inline struct d3drm
*impl_from_IDirect3DRM3(IDirect3DRM3
*iface
)
172 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM3_iface
);
175 static void d3drm_destroy(struct d3drm
*d3drm
)
177 HeapFree(GetProcessHeap(), 0, d3drm
);
178 TRACE("d3drm object %p is being destroyed.\n", d3drm
);
181 static HRESULT WINAPI
d3drm1_QueryInterface(IDirect3DRM
*iface
, REFIID riid
, void **out
)
183 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
185 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
187 if (IsEqualGUID(riid
, &IID_IDirect3DRM
)
188 || IsEqualGUID(riid
, &IID_IUnknown
))
190 *out
= &d3drm
->IDirect3DRM_iface
;
192 else if (IsEqualGUID(riid
, &IID_IDirect3DRM2
))
194 *out
= &d3drm
->IDirect3DRM2_iface
;
196 else if (IsEqualGUID(riid
, &IID_IDirect3DRM3
))
198 *out
= &d3drm
->IDirect3DRM3_iface
;
203 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
204 return CLASS_E_CLASSNOTAVAILABLE
;
207 IUnknown_AddRef((IUnknown
*)*out
);
211 static ULONG WINAPI
d3drm1_AddRef(IDirect3DRM
*iface
)
213 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
214 ULONG refcount
= InterlockedIncrement(&d3drm
->ref1
);
216 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
219 InterlockedIncrement(&d3drm
->iface_count
);
224 static ULONG WINAPI
d3drm1_Release(IDirect3DRM
*iface
)
226 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
227 ULONG refcount
= InterlockedDecrement(&d3drm
->ref1
);
229 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
231 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
232 d3drm_destroy(d3drm
);
237 static HRESULT WINAPI
d3drm1_CreateObject(IDirect3DRM
*iface
,
238 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
240 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
242 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
243 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
245 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
248 static HRESULT WINAPI
d3drm1_CreateFrame(IDirect3DRM
*iface
,
249 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame
**frame
)
251 struct d3drm_frame
*object
;
254 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
256 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, iface
)))
259 *frame
= &object
->IDirect3DRMFrame_iface
;
264 static HRESULT WINAPI
d3drm1_CreateMesh(IDirect3DRM
*iface
, IDirect3DRMMesh
**mesh
)
266 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
268 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
270 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
273 static HRESULT WINAPI
d3drm1_CreateMeshBuilder(IDirect3DRM
*iface
, IDirect3DRMMeshBuilder
**mesh_builder
)
275 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
277 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
279 return IDirect3DRM2_CreateMeshBuilder(&d3drm
->IDirect3DRM2_iface
, (IDirect3DRMMeshBuilder2
**)mesh_builder
);
282 static HRESULT WINAPI
d3drm1_CreateFace(IDirect3DRM
*iface
, IDirect3DRMFace
**face
)
284 struct d3drm_face
*object
;
287 TRACE("iface %p, face %p.\n", iface
, face
);
289 if (FAILED(hr
= d3drm_face_create(&object
)))
292 *face
= &object
->IDirect3DRMFace_iface
;
297 static HRESULT WINAPI
d3drm1_CreateAnimation(IDirect3DRM
*iface
, IDirect3DRMAnimation
**animation
)
299 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
304 static HRESULT WINAPI
d3drm1_CreateAnimationSet(IDirect3DRM
*iface
, IDirect3DRMAnimationSet
**set
)
306 FIXME("iface %p, set %p stub!\n", iface
, set
);
311 static HRESULT WINAPI
d3drm1_CreateTexture(IDirect3DRM
*iface
,
312 D3DRMIMAGE
*image
, IDirect3DRMTexture
**texture
)
314 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
315 IDirect3DRMTexture3
*texture3
;
318 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
321 return D3DRMERR_BADVALUE
;
323 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
329 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
330 IDirect3DRMTexture3_Release(texture3
);
335 static HRESULT WINAPI
d3drm1_CreateLight(IDirect3DRM
*iface
,
336 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
338 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
340 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
342 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
345 static HRESULT WINAPI
d3drm1_CreateLightRGB(IDirect3DRM
*iface
, D3DRMLIGHTTYPE type
,
346 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
348 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
350 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
351 iface
, type
, red
, green
, blue
, light
);
353 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
356 static HRESULT WINAPI
d3drm1_CreateMaterial(IDirect3DRM
*iface
,
357 D3DVALUE power
, IDirect3DRMMaterial
**material
)
359 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
361 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
363 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
366 static HRESULT WINAPI
d3drm1_CreateDevice(IDirect3DRM
*iface
,
367 DWORD width
, DWORD height
, IDirect3DRMDevice
**device
)
369 struct d3drm_device
*object
;
372 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
374 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
377 *device
= &object
->IDirect3DRMDevice_iface
;
382 static HRESULT WINAPI
d3drm1_CreateDeviceFromSurface(IDirect3DRM
*iface
, GUID
*guid
,
383 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice
**device
)
385 struct d3drm_device
*object
;
388 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
389 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
392 return D3DRMERR_BADVALUE
;
395 if (!backbuffer
|| !ddraw
)
396 return D3DRMERR_BADDEVICE
;
398 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
401 if (SUCCEEDED(hr
= d3drm_device_init(object
, 1, ddraw
, backbuffer
, TRUE
)))
402 *device
= &object
->IDirect3DRMDevice_iface
;
404 d3drm_device_destroy(object
);
409 static HRESULT WINAPI
d3drm1_CreateDeviceFromD3D(IDirect3DRM
*iface
,
410 IDirect3D
*d3d
, IDirect3DDevice
*d3d_device
, IDirect3DRMDevice
**device
)
412 struct d3drm_device
*object
;
414 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
415 iface
, d3d
, d3d_device
, device
);
418 return D3DRMERR_BADVALUE
;
421 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
424 if (FAILED(hr
= IDirect3DRMDevice_InitFromD3D(&object
->IDirect3DRMDevice_iface
, d3d
, d3d_device
)))
426 d3drm_device_destroy(object
);
429 *device
= &object
->IDirect3DRMDevice_iface
;
434 static HRESULT WINAPI
d3drm1_CreateDeviceFromClipper(IDirect3DRM
*iface
,
435 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
436 IDirect3DRMDevice
**device
)
438 struct d3drm_device
*object
;
440 IDirectDrawSurface
*render_target
;
443 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
444 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
447 return D3DRMERR_BADVALUE
;
450 if (!clipper
|| !width
|| !height
)
451 return D3DRMERR_BADVALUE
;
453 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
457 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
459 IDirectDraw_Release(ddraw
);
463 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
466 IDirectDraw_Release(ddraw
);
467 d3drm_device_destroy(object
);
471 hr
= d3drm_device_init(object
, 1, ddraw
, render_target
, TRUE
);
472 IDirectDraw_Release(ddraw
);
473 IDirectDrawSurface_Release(render_target
);
475 d3drm_device_destroy(object
);
477 *device
= &object
->IDirect3DRMDevice_iface
;
482 static HRESULT WINAPI
d3drm1_CreateTextureFromSurface(IDirect3DRM
*iface
,
483 IDirectDrawSurface
*surface
, IDirect3DRMTexture
**texture
)
485 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
486 IDirect3DRMTexture3
*texture3
;
489 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
492 return D3DRMERR_BADVALUE
;
494 if (FAILED(hr
= IDirect3DRM3_CreateTextureFromSurface(&d3drm
->IDirect3DRM3_iface
, surface
, &texture3
)))
500 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
501 IDirect3DRMTexture3_Release(texture3
);
506 static HRESULT WINAPI
d3drm1_CreateShadow(IDirect3DRM
*iface
, IDirect3DRMVisual
*visual
,
507 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
508 IDirect3DRMVisual
**shadow
)
510 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
511 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
516 static HRESULT WINAPI
d3drm1_CreateViewport(IDirect3DRM
*iface
, IDirect3DRMDevice
*device
,
517 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
519 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
520 IDirect3DRMDevice3
*device3
;
521 IDirect3DRMFrame3
*camera3
;
522 IDirect3DRMViewport2
*viewport2
;
525 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
526 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
528 if (!device
|| !camera
)
529 return D3DRMERR_BADOBJECT
;
531 return D3DRMERR_BADVALUE
;
533 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
536 if (FAILED(hr
= IDirect3DRMFrame_QueryInterface(camera
, &IID_IDirect3DRMFrame3
, (void **)&camera3
)))
538 IDirect3DRMDevice3_Release(device3
);
542 hr
= IDirect3DRM3_CreateViewport(&d3drm
->IDirect3DRM3_iface
, device3
, camera3
, x
, y
, width
, height
, &viewport2
);
543 IDirect3DRMDevice3_Release(device3
);
544 IDirect3DRMFrame3_Release(camera3
);
548 hr
= IDirect3DRMViewport2_QueryInterface(viewport2
, &IID_IDirect3DRMViewport
, (void **)viewport
);
549 IDirect3DRMViewport2_Release(viewport2
);
554 static HRESULT WINAPI
d3drm1_CreateWrap(IDirect3DRM
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
555 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
556 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
557 IDirect3DRMWrap
**wrap
)
559 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
560 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
561 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
566 static HRESULT WINAPI
d3drm1_CreateUserVisual(IDirect3DRM
*iface
,
567 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
569 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface
, cb
, ctx
, visual
);
574 static HRESULT WINAPI
d3drm1_LoadTexture(IDirect3DRM
*iface
,
575 const char *filename
, IDirect3DRMTexture
**texture
)
577 struct d3drm_texture
*object
;
580 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
582 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
585 *texture
= &object
->IDirect3DRMTexture_iface
;
590 static HRESULT WINAPI
d3drm1_LoadTextureFromResource(IDirect3DRM
*iface
,
591 HRSRC resource
, IDirect3DRMTexture
**texture
)
593 struct d3drm_texture
*object
;
596 FIXME("iface %p, resource %p, texture %p stub!\n", iface
, resource
, texture
);
598 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
601 *texture
= &object
->IDirect3DRMTexture_iface
;
606 static HRESULT WINAPI
d3drm1_SetSearchPath(IDirect3DRM
*iface
, const char *path
)
608 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
613 static HRESULT WINAPI
d3drm1_AddSearchPath(IDirect3DRM
*iface
, const char *path
)
615 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
620 static HRESULT WINAPI
d3drm1_GetSearchPath(IDirect3DRM
*iface
, DWORD
*size
, char *path
)
622 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
627 static HRESULT WINAPI
d3drm1_SetDefaultTextureColors(IDirect3DRM
*iface
, DWORD color_count
)
629 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
634 static HRESULT WINAPI
d3drm1_SetDefaultTextureShades(IDirect3DRM
*iface
, DWORD shade_count
)
636 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
641 static HRESULT WINAPI
d3drm1_GetDevices(IDirect3DRM
*iface
, IDirect3DRMDeviceArray
**array
)
643 FIXME("iface %p, array %p stub!\n", iface
, array
);
648 static HRESULT WINAPI
d3drm1_GetNamedObject(IDirect3DRM
*iface
,
649 const char *name
, IDirect3DRMObject
**object
)
651 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
656 static HRESULT WINAPI
d3drm1_EnumerateObjects(IDirect3DRM
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
658 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
663 static HRESULT WINAPI
d3drm1_Load(IDirect3DRM
*iface
, void *source
, void *object_id
, IID
**iids
,
664 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
665 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
667 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
668 IDirect3DRMFrame3
*parent_frame3
= NULL
;
669 HRESULT hr
= D3DRM_OK
;
671 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
672 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
673 iface
, source
, object_id
, iids
, iid_count
, flags
,
674 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
677 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
679 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
680 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
682 IDirect3DRMFrame3_Release(parent_frame3
);
687 static HRESULT WINAPI
d3drm1_Tick(IDirect3DRM
*iface
, D3DVALUE tick
)
689 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
694 static const struct IDirect3DRMVtbl d3drm1_vtbl
=
696 d3drm1_QueryInterface
,
702 d3drm1_CreateMeshBuilder
,
704 d3drm1_CreateAnimation
,
705 d3drm1_CreateAnimationSet
,
706 d3drm1_CreateTexture
,
708 d3drm1_CreateLightRGB
,
709 d3drm1_CreateMaterial
,
711 d3drm1_CreateDeviceFromSurface
,
712 d3drm1_CreateDeviceFromD3D
,
713 d3drm1_CreateDeviceFromClipper
,
714 d3drm1_CreateTextureFromSurface
,
716 d3drm1_CreateViewport
,
718 d3drm1_CreateUserVisual
,
720 d3drm1_LoadTextureFromResource
,
721 d3drm1_SetSearchPath
,
722 d3drm1_AddSearchPath
,
723 d3drm1_GetSearchPath
,
724 d3drm1_SetDefaultTextureColors
,
725 d3drm1_SetDefaultTextureShades
,
727 d3drm1_GetNamedObject
,
728 d3drm1_EnumerateObjects
,
733 static HRESULT WINAPI
d3drm2_QueryInterface(IDirect3DRM2
*iface
, REFIID riid
, void **out
)
735 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
737 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
740 static ULONG WINAPI
d3drm2_AddRef(IDirect3DRM2
*iface
)
742 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
743 ULONG refcount
= InterlockedIncrement(&d3drm
->ref2
);
745 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
748 InterlockedIncrement(&d3drm
->iface_count
);
753 static ULONG WINAPI
d3drm2_Release(IDirect3DRM2
*iface
)
755 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
756 ULONG refcount
= InterlockedDecrement(&d3drm
->ref2
);
758 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
760 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
761 d3drm_destroy(d3drm
);
766 static HRESULT WINAPI
d3drm2_CreateObject(IDirect3DRM2
*iface
,
767 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
769 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
771 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
772 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
774 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
777 static HRESULT WINAPI
d3drm2_CreateFrame(IDirect3DRM2
*iface
,
778 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame2
**frame
)
780 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
781 struct d3drm_frame
*object
;
784 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
786 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, &d3drm
->IDirect3DRM_iface
)))
789 *frame
= &object
->IDirect3DRMFrame2_iface
;
794 static HRESULT WINAPI
d3drm2_CreateMesh(IDirect3DRM2
*iface
, IDirect3DRMMesh
**mesh
)
796 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
798 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
800 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
803 static HRESULT WINAPI
d3drm2_CreateMeshBuilder(IDirect3DRM2
*iface
, IDirect3DRMMeshBuilder2
**mesh_builder
)
805 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
806 struct d3drm_mesh_builder
*object
;
809 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
811 if (FAILED(hr
= d3drm_mesh_builder_create(&object
, &d3drm
->IDirect3DRM_iface
)))
814 *mesh_builder
= &object
->IDirect3DRMMeshBuilder2_iface
;
819 static HRESULT WINAPI
d3drm2_CreateFace(IDirect3DRM2
*iface
, IDirect3DRMFace
**face
)
821 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
823 TRACE("iface %p, face %p.\n", iface
, face
);
825 return IDirect3DRM_CreateFace(&d3drm
->IDirect3DRM_iface
, face
);
828 static HRESULT WINAPI
d3drm2_CreateAnimation(IDirect3DRM2
*iface
, IDirect3DRMAnimation
**animation
)
830 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
835 static HRESULT WINAPI
d3drm2_CreateAnimationSet(IDirect3DRM2
*iface
, IDirect3DRMAnimationSet
**set
)
837 FIXME("iface %p, set %p stub!\n", iface
, set
);
842 static HRESULT WINAPI
d3drm2_CreateTexture(IDirect3DRM2
*iface
,
843 D3DRMIMAGE
*image
, IDirect3DRMTexture2
**texture
)
845 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
846 IDirect3DRMTexture3
*texture3
;
849 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
852 return D3DRMERR_BADVALUE
;
854 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
860 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture2
, (void **)texture
);
861 IDirect3DRMTexture3_Release(texture3
);
866 static HRESULT WINAPI
d3drm2_CreateLight(IDirect3DRM2
*iface
,
867 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
869 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
871 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
873 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
876 static HRESULT WINAPI
d3drm2_CreateLightRGB(IDirect3DRM2
*iface
, D3DRMLIGHTTYPE type
,
877 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
879 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
881 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
882 iface
, type
, red
, green
, blue
, light
);
884 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
887 static HRESULT WINAPI
d3drm2_CreateMaterial(IDirect3DRM2
*iface
,
888 D3DVALUE power
, IDirect3DRMMaterial
**material
)
890 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
892 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
894 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
897 static HRESULT WINAPI
d3drm2_CreateDevice(IDirect3DRM2
*iface
,
898 DWORD width
, DWORD height
, IDirect3DRMDevice2
**device
)
900 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
901 struct d3drm_device
*object
;
904 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
906 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
909 *device
= &object
->IDirect3DRMDevice2_iface
;
914 static HRESULT WINAPI
d3drm2_CreateDeviceFromSurface(IDirect3DRM2
*iface
, GUID
*guid
,
915 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice2
**device
)
917 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
918 IDirect3DRMDevice3
*device3
;
920 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
921 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
924 return D3DRMERR_BADVALUE
;
926 hr
= IDirect3DRM3_CreateDeviceFromSurface(&d3drm
->IDirect3DRM3_iface
, guid
, ddraw
, backbuffer
, 0, &device3
);
930 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
931 IDirect3DRMDevice3_Release(device3
);
936 static HRESULT WINAPI
d3drm2_CreateDeviceFromD3D(IDirect3DRM2
*iface
,
937 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice2
**device
)
939 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
940 IDirect3DRMDevice3
*device3
;
943 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
944 iface
, d3d
, d3d_device
, device
);
947 return D3DRMERR_BADVALUE
;
950 hr
= IDirect3DRM3_CreateDeviceFromD3D(&d3drm
->IDirect3DRM3_iface
, d3d
, d3d_device
, &device3
);
954 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void **)device
);
955 IDirect3DRMDevice3_Release(device3
);
960 static HRESULT WINAPI
d3drm2_CreateDeviceFromClipper(IDirect3DRM2
*iface
,
961 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
962 IDirect3DRMDevice2
**device
)
964 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
965 IDirect3DRMDevice3
*device3
;
968 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
969 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
972 return D3DRMERR_BADVALUE
;
974 hr
= IDirect3DRM3_CreateDeviceFromClipper(&d3drm
->IDirect3DRM3_iface
, clipper
, guid
, width
, height
, &device3
);
978 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
979 IDirect3DRMDevice3_Release(device3
);
984 static HRESULT WINAPI
d3drm2_CreateTextureFromSurface(IDirect3DRM2
*iface
,
985 IDirectDrawSurface
*surface
, IDirect3DRMTexture2
**texture
)
987 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
988 IDirect3DRMTexture3
*texture3
;
991 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
994 return D3DRMERR_BADVALUE
;
996 if (FAILED(hr
= IDirect3DRM3_CreateTextureFromSurface(&d3drm
->IDirect3DRM3_iface
, surface
, &texture3
)))
1002 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
1003 IDirect3DRMTexture3_Release(texture3
);
1008 static HRESULT WINAPI
d3drm2_CreateShadow(IDirect3DRM2
*iface
, IDirect3DRMVisual
*visual
,
1009 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
1010 IDirect3DRMVisual
**shadow
)
1012 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1013 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
1018 static HRESULT WINAPI
d3drm2_CreateViewport(IDirect3DRM2
*iface
, IDirect3DRMDevice
*device
,
1019 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
1021 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1022 IDirect3DRMDevice3
*device3
;
1023 IDirect3DRMFrame3
*camera3
;
1024 IDirect3DRMViewport2
*viewport2
;
1027 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
1028 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
1030 if (!device
|| !camera
)
1031 return D3DRMERR_BADOBJECT
;
1033 return D3DRMERR_BADVALUE
;
1035 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
1038 if (FAILED(hr
= IDirect3DRMFrame_QueryInterface(camera
, &IID_IDirect3DRMFrame3
, (void **)&camera3
)))
1040 IDirect3DRMDevice3_Release(device3
);
1044 hr
= IDirect3DRM3_CreateViewport(&d3drm
->IDirect3DRM3_iface
, device3
, camera3
, x
, y
, width
, height
, &viewport2
);
1045 IDirect3DRMDevice3_Release(device3
);
1046 IDirect3DRMFrame3_Release(camera3
);
1050 hr
= IDirect3DRMViewport2_QueryInterface(viewport2
, &IID_IDirect3DRMViewport
, (void **)viewport
);
1051 IDirect3DRMViewport2_Release(viewport2
);
1056 static HRESULT WINAPI
d3drm2_CreateWrap(IDirect3DRM2
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
1057 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
1058 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
1059 IDirect3DRMWrap
**wrap
)
1061 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1062 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1063 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
1068 static HRESULT WINAPI
d3drm2_CreateUserVisual(IDirect3DRM2
*iface
,
1069 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
1071 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
1076 static HRESULT WINAPI
d3drm2_LoadTexture(IDirect3DRM2
*iface
,
1077 const char *filename
, IDirect3DRMTexture2
**texture
)
1079 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1080 struct d3drm_texture
*object
;
1083 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
1085 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1088 *texture
= &object
->IDirect3DRMTexture2_iface
;
1093 static HRESULT WINAPI
d3drm2_LoadTextureFromResource(IDirect3DRM2
*iface
, HMODULE module
,
1094 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture2
**texture
)
1096 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1097 struct d3drm_texture
*object
;
1100 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
1101 iface
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
1103 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1106 *texture
= &object
->IDirect3DRMTexture2_iface
;
1111 static HRESULT WINAPI
d3drm2_SetSearchPath(IDirect3DRM2
*iface
, const char *path
)
1113 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1118 static HRESULT WINAPI
d3drm2_AddSearchPath(IDirect3DRM2
*iface
, const char *path
)
1120 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1125 static HRESULT WINAPI
d3drm2_GetSearchPath(IDirect3DRM2
*iface
, DWORD
*size
, char *path
)
1127 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
1132 static HRESULT WINAPI
d3drm2_SetDefaultTextureColors(IDirect3DRM2
*iface
, DWORD color_count
)
1134 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1139 static HRESULT WINAPI
d3drm2_SetDefaultTextureShades(IDirect3DRM2
*iface
, DWORD shade_count
)
1141 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1146 static HRESULT WINAPI
d3drm2_GetDevices(IDirect3DRM2
*iface
, IDirect3DRMDeviceArray
**array
)
1148 FIXME("iface %p, array %p stub!\n", iface
, array
);
1153 static HRESULT WINAPI
d3drm2_GetNamedObject(IDirect3DRM2
*iface
,
1154 const char *name
, IDirect3DRMObject
**object
)
1156 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
1161 static HRESULT WINAPI
d3drm2_EnumerateObjects(IDirect3DRM2
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
1163 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
1168 static HRESULT WINAPI
d3drm2_Load(IDirect3DRM2
*iface
, void *source
, void *object_id
, IID
**iids
,
1169 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
1170 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
1172 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1173 IDirect3DRMFrame3
*parent_frame3
= NULL
;
1174 HRESULT hr
= D3DRM_OK
;
1176 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1177 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1178 iface
, source
, object_id
, iids
, iid_count
, flags
,
1179 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1182 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
1184 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
1185 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
1187 IDirect3DRMFrame3_Release(parent_frame3
);
1192 static HRESULT WINAPI
d3drm2_Tick(IDirect3DRM2
*iface
, D3DVALUE tick
)
1194 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1199 static HRESULT WINAPI
d3drm2_CreateProgressiveMesh(IDirect3DRM2
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1201 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1206 static const struct IDirect3DRM2Vtbl d3drm2_vtbl
=
1208 d3drm2_QueryInterface
,
1211 d3drm2_CreateObject
,
1214 d3drm2_CreateMeshBuilder
,
1216 d3drm2_CreateAnimation
,
1217 d3drm2_CreateAnimationSet
,
1218 d3drm2_CreateTexture
,
1220 d3drm2_CreateLightRGB
,
1221 d3drm2_CreateMaterial
,
1222 d3drm2_CreateDevice
,
1223 d3drm2_CreateDeviceFromSurface
,
1224 d3drm2_CreateDeviceFromD3D
,
1225 d3drm2_CreateDeviceFromClipper
,
1226 d3drm2_CreateTextureFromSurface
,
1227 d3drm2_CreateShadow
,
1228 d3drm2_CreateViewport
,
1230 d3drm2_CreateUserVisual
,
1232 d3drm2_LoadTextureFromResource
,
1233 d3drm2_SetSearchPath
,
1234 d3drm2_AddSearchPath
,
1235 d3drm2_GetSearchPath
,
1236 d3drm2_SetDefaultTextureColors
,
1237 d3drm2_SetDefaultTextureShades
,
1239 d3drm2_GetNamedObject
,
1240 d3drm2_EnumerateObjects
,
1243 d3drm2_CreateProgressiveMesh
,
1246 static HRESULT WINAPI
d3drm3_QueryInterface(IDirect3DRM3
*iface
, REFIID riid
, void **out
)
1248 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1250 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
1253 static ULONG WINAPI
d3drm3_AddRef(IDirect3DRM3
*iface
)
1255 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1256 ULONG refcount
= InterlockedIncrement(&d3drm
->ref3
);
1258 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
1261 InterlockedIncrement(&d3drm
->iface_count
);
1266 static ULONG WINAPI
d3drm3_Release(IDirect3DRM3
*iface
)
1268 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1269 ULONG refcount
= InterlockedDecrement(&d3drm
->ref3
);
1271 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
1273 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
1274 d3drm_destroy(d3drm
);
1279 static HRESULT WINAPI
d3drm3_CreateObject(IDirect3DRM3
*iface
,
1280 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
1282 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1290 HRESULT (*create_object
)(void **object
, IDirect3DRM
*d3drm
);
1294 {&CLSID_CDirect3DRMTexture
, d3drm_create_texture_object
},
1295 {&CLSID_CDirect3DRMDevice
, d3drm_create_device_object
},
1296 {&CLSID_CDirect3DRMViewport
, d3drm_create_viewport_object
},
1297 {&CLSID_CDirect3DRMFace
, d3drm_create_face_object
},
1298 {&CLSID_CDirect3DRMMeshBuilder
, d3drm_create_mesh_builder_object
},
1299 {&CLSID_CDirect3DRMFrame
, d3drm_create_frame_object
},
1300 {&CLSID_CDirect3DRMLight
, d3drm_create_light_object
},
1301 {&CLSID_CDirect3DRMMaterial
, d3drm_create_material_object
},
1304 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1305 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
1308 return D3DRMERR_BADVALUE
;
1313 return D3DRMERR_BADVALUE
;
1318 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer
);
1323 for (i
= 0; i
< ARRAY_SIZE(object_table
); ++i
)
1325 if (IsEqualGUID(clsid
, object_table
[i
].clsid
))
1327 if (FAILED(hr
= object_table
[i
].create_object((void **)&object
, &d3drm
->IDirect3DRM_iface
)))
1335 if (i
== ARRAY_SIZE(object_table
))
1337 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid
));
1339 return CLASSFACTORY_E_FIRST
;
1342 if (FAILED(hr
= IUnknown_QueryInterface(object
, iid
, out
)))
1344 IUnknown_Release(object
);
1349 static HRESULT WINAPI
d3drm3_CreateFrame(IDirect3DRM3
*iface
,
1350 IDirect3DRMFrame3
*parent
, IDirect3DRMFrame3
**frame
)
1352 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1353 struct d3drm_frame
*object
;
1356 TRACE("iface %p, parent %p, frame %p.\n", iface
, parent
, frame
);
1358 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent
, &d3drm
->IDirect3DRM_iface
)))
1361 *frame
= &object
->IDirect3DRMFrame3_iface
;
1366 static HRESULT WINAPI
d3drm3_CreateMesh(IDirect3DRM3
*iface
, IDirect3DRMMesh
**mesh
)
1368 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
1370 return Direct3DRMMesh_create(mesh
);
1373 static HRESULT WINAPI
d3drm3_CreateMeshBuilder(IDirect3DRM3
*iface
, IDirect3DRMMeshBuilder3
**mesh_builder
)
1375 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1376 struct d3drm_mesh_builder
*object
;
1379 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
1381 if (FAILED(hr
= d3drm_mesh_builder_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1384 *mesh_builder
= &object
->IDirect3DRMMeshBuilder3_iface
;
1389 static HRESULT WINAPI
d3drm3_CreateFace(IDirect3DRM3
*iface
, IDirect3DRMFace2
**face
)
1391 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1392 IDirect3DRMFace
*face1
;
1395 TRACE("iface %p, face %p.\n", iface
, face
);
1397 if (FAILED(hr
= IDirect3DRM_CreateFace(&d3drm
->IDirect3DRM_iface
, &face1
)))
1400 hr
= IDirect3DRMFace_QueryInterface(face1
, &IID_IDirect3DRMFace2
, (void **)face
);
1401 IDirect3DRMFace_Release(face1
);
1406 static HRESULT WINAPI
d3drm3_CreateAnimation(IDirect3DRM3
*iface
, IDirect3DRMAnimation2
**animation
)
1408 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
1413 static HRESULT WINAPI
d3drm3_CreateAnimationSet(IDirect3DRM3
*iface
, IDirect3DRMAnimationSet2
**set
)
1415 FIXME("iface %p, set %p stub!\n", iface
, set
);
1420 static HRESULT WINAPI
d3drm3_CreateTexture(IDirect3DRM3
*iface
,
1421 D3DRMIMAGE
*image
, IDirect3DRMTexture3
**texture
)
1423 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1424 struct d3drm_texture
*object
;
1427 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
1430 return D3DRMERR_BADVALUE
;
1432 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1435 *texture
= &object
->IDirect3DRMTexture3_iface
;
1437 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture
, image
)))
1439 IDirect3DRMTexture3_Release(*texture
);
1441 return D3DRMERR_BADVALUE
;
1447 static HRESULT WINAPI
d3drm3_CreateLight(IDirect3DRM3
*iface
,
1448 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
1450 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1451 struct d3drm_light
*object
;
1454 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface
, type
, color
, light
);
1456 if (SUCCEEDED(hr
= d3drm_light_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1458 IDirect3DRMLight_SetType(&object
->IDirect3DRMLight_iface
, type
);
1459 IDirect3DRMLight_SetColor(&object
->IDirect3DRMLight_iface
, color
);
1462 *light
= &object
->IDirect3DRMLight_iface
;
1467 static HRESULT WINAPI
d3drm3_CreateLightRGB(IDirect3DRM3
*iface
, D3DRMLIGHTTYPE type
,
1468 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
1470 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1471 struct d3drm_light
*object
;
1474 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1475 iface
, type
, red
, green
, blue
, light
);
1477 if (SUCCEEDED(hr
= d3drm_light_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1479 IDirect3DRMLight_SetType(&object
->IDirect3DRMLight_iface
, type
);
1480 IDirect3DRMLight_SetColorRGB(&object
->IDirect3DRMLight_iface
, red
, green
, blue
);
1483 *light
= &object
->IDirect3DRMLight_iface
;
1488 static HRESULT WINAPI
d3drm3_CreateMaterial(IDirect3DRM3
*iface
,
1489 D3DVALUE power
, IDirect3DRMMaterial2
**material
)
1491 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1492 struct d3drm_material
*object
;
1495 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
1497 if (SUCCEEDED(hr
= d3drm_material_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1498 IDirect3DRMMaterial2_SetPower(&object
->IDirect3DRMMaterial2_iface
, power
);
1500 *material
= &object
->IDirect3DRMMaterial2_iface
;
1505 static HRESULT WINAPI
d3drm3_CreateDevice(IDirect3DRM3
*iface
,
1506 DWORD width
, DWORD height
, IDirect3DRMDevice3
**device
)
1508 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1509 struct d3drm_device
*object
;
1512 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
1514 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1517 *device
= &object
->IDirect3DRMDevice3_iface
;
1522 static HRESULT WINAPI
d3drm3_CreateDeviceFromSurface(IDirect3DRM3
*iface
, GUID
*guid
,
1523 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, DWORD flags
, IDirect3DRMDevice3
**device
)
1525 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1526 struct d3drm_device
*object
;
1530 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1531 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, flags
, device
);
1534 return D3DRMERR_BADVALUE
;
1537 if (!backbuffer
|| !ddraw
)
1538 return D3DRMERR_BADDEVICE
;
1540 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1543 use_z_surface
= !(flags
& D3DRMDEVICE_NOZBUFFER
);
1545 if (SUCCEEDED(hr
= d3drm_device_init(object
, 3, ddraw
, backbuffer
, use_z_surface
)))
1546 *device
= &object
->IDirect3DRMDevice3_iface
;
1548 d3drm_device_destroy(object
);
1553 static HRESULT WINAPI
d3drm3_CreateDeviceFromD3D(IDirect3DRM3
*iface
,
1554 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice3
**device
)
1556 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1557 struct d3drm_device
*object
;
1560 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1561 iface
, d3d
, d3d_device
, device
);
1564 return D3DRMERR_BADVALUE
;
1567 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1570 if (FAILED(hr
= IDirect3DRMDevice3_InitFromD3D2(&object
->IDirect3DRMDevice3_iface
, d3d
, d3d_device
)))
1572 d3drm_device_destroy(object
);
1575 *device
= &object
->IDirect3DRMDevice3_iface
;
1580 static HRESULT WINAPI
d3drm3_CreateDeviceFromClipper(IDirect3DRM3
*iface
,
1581 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
1582 IDirect3DRMDevice3
**device
)
1584 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1585 struct d3drm_device
*object
;
1587 IDirectDrawSurface
*render_target
;
1590 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1591 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1594 return D3DRMERR_BADVALUE
;
1597 if (!clipper
|| !width
|| !height
)
1598 return D3DRMERR_BADVALUE
;
1600 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
1604 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1606 IDirectDraw_Release(ddraw
);
1610 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
1613 IDirectDraw_Release(ddraw
);
1614 d3drm_device_destroy(object
);
1618 hr
= d3drm_device_init(object
, 3, ddraw
, render_target
, TRUE
);
1619 IDirectDraw_Release(ddraw
);
1620 IDirectDrawSurface_Release(render_target
);
1622 d3drm_device_destroy(object
);
1624 *device
= &object
->IDirect3DRMDevice3_iface
;
1629 static HRESULT WINAPI
d3drm3_CreateShadow(IDirect3DRM3
*iface
, IUnknown
*object
, IDirect3DRMLight
*light
,
1630 D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
, IDirect3DRMShadow2
**shadow
)
1632 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1633 iface
, object
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
1638 static HRESULT WINAPI
d3drm3_CreateTextureFromSurface(IDirect3DRM3
*iface
,
1639 IDirectDrawSurface
*surface
, IDirect3DRMTexture3
**texture
)
1641 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1642 struct d3drm_texture
*object
;
1645 TRACE("iface %p, surface %p, texture %p.\n", iface
, surface
, texture
);
1648 return D3DRMERR_BADVALUE
;
1650 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1653 *texture
= &object
->IDirect3DRMTexture3_iface
;
1655 if (FAILED(IDirect3DRMTexture3_InitFromSurface(*texture
, surface
)))
1657 IDirect3DRMTexture3_Release(*texture
);
1659 return D3DRMERR_BADVALUE
;
1665 static HRESULT WINAPI
d3drm3_CreateViewport(IDirect3DRM3
*iface
, IDirect3DRMDevice3
*device
,
1666 IDirect3DRMFrame3
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport2
**viewport
)
1668 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1669 struct d3drm_viewport
*object
;
1672 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p.\n",
1673 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
1675 if (!device
|| !camera
)
1676 return D3DRMERR_BADOBJECT
;
1678 return D3DRMERR_BADVALUE
;
1680 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1683 *viewport
= &object
->IDirect3DRMViewport2_iface
;
1685 if (FAILED(hr
= IDirect3DRMViewport2_Init(*viewport
, device
, camera
, x
, y
, width
, height
)))
1687 IDirect3DRMViewport2_Release(*viewport
);
1689 return D3DRMERR_BADVALUE
;
1695 static HRESULT WINAPI
d3drm3_CreateWrap(IDirect3DRM3
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame3
*frame
,
1696 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
1697 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
1698 IDirect3DRMWrap
**wrap
)
1700 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1701 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1702 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
1707 static HRESULT WINAPI
d3drm3_CreateUserVisual(IDirect3DRM3
*iface
,
1708 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
1710 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
1715 static HRESULT WINAPI
d3drm3_LoadTexture(IDirect3DRM3
*iface
,
1716 const char *filename
, IDirect3DRMTexture3
**texture
)
1718 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1719 struct d3drm_texture
*object
;
1722 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
1724 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1727 *texture
= &object
->IDirect3DRMTexture3_iface
;
1732 static HRESULT WINAPI
d3drm3_LoadTextureFromResource(IDirect3DRM3
*iface
, HMODULE module
,
1733 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture3
**texture
)
1735 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1736 struct d3drm_texture
*object
;
1739 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1740 iface
, module
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
1742 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1745 *texture
= &object
->IDirect3DRMTexture3_iface
;
1750 static HRESULT WINAPI
d3drm3_SetSearchPath(IDirect3DRM3
*iface
, const char *path
)
1752 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1757 static HRESULT WINAPI
d3drm3_AddSearchPath(IDirect3DRM3
*iface
, const char *path
)
1759 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1764 static HRESULT WINAPI
d3drm3_GetSearchPath(IDirect3DRM3
*iface
, DWORD
*size
, char *path
)
1766 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
1771 static HRESULT WINAPI
d3drm3_SetDefaultTextureColors(IDirect3DRM3
*iface
, DWORD color_count
)
1773 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1778 static HRESULT WINAPI
d3drm3_SetDefaultTextureShades(IDirect3DRM3
*iface
, DWORD shade_count
)
1780 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1785 static HRESULT WINAPI
d3drm3_GetDevices(IDirect3DRM3
*iface
, IDirect3DRMDeviceArray
**array
)
1787 FIXME("iface %p, array %p stub!\n", iface
, array
);
1792 static HRESULT WINAPI
d3drm3_GetNamedObject(IDirect3DRM3
*iface
,
1793 const char *name
, IDirect3DRMObject
**object
)
1795 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
1800 static HRESULT WINAPI
d3drm3_EnumerateObjects(IDirect3DRM3
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
1802 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
1807 static HRESULT
load_data(IDirect3DRM3
*iface
, IDirectXFileData
*data_object
, IID
**GUIDs
, DWORD nb_GUIDs
, D3DRMLOADCALLBACK LoadProc
,
1808 void *ArgLP
, D3DRMLOADTEXTURECALLBACK LoadTextureProc
, void *ArgLTP
, IDirect3DRMFrame3
*parent_frame
)
1810 HRESULT ret
= D3DRMERR_BADOBJECT
;
1814 BOOL requested
= FALSE
;
1816 hr
= IDirectXFileData_GetType(data_object
, &guid
);
1817 if (hr
!= DXFILE_OK
)
1820 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid
));
1822 /* Load object only if it is top level and requested or if it is part of another object */
1824 if (IsEqualGUID(guid
, &TID_D3DRMMesh
))
1826 TRACE("Found TID_D3DRMMesh\n");
1828 for (i
= 0; i
< nb_GUIDs
; i
++)
1829 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder
) ||
1830 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder2
) ||
1831 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder3
))
1837 if (requested
|| parent_frame
)
1839 IDirect3DRMMeshBuilder3
*meshbuilder
;
1841 TRACE("Load mesh data\n");
1843 hr
= IDirect3DRM3_CreateMeshBuilder(iface
, &meshbuilder
);
1846 hr
= load_mesh_data(meshbuilder
, data_object
, LoadTextureProc
, ArgLTP
);
1849 /* Only top level objects are notified */
1852 IDirect3DRMObject
*object
;
1854 hr
= IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder
, GUIDs
[i
], (void**)&object
);
1857 LoadProc(object
, GUIDs
[i
], ArgLP
);
1858 IDirect3DRMObject_Release(object
);
1863 IDirect3DRMFrame3_AddVisual(parent_frame
, (IUnknown
*)meshbuilder
);
1866 IDirect3DRMMeshBuilder3_Release(meshbuilder
);
1870 ERR("Cannot process mesh\n");
1873 else if (IsEqualGUID(guid
, &TID_D3DRMFrame
))
1875 TRACE("Found TID_D3DRMFrame\n");
1877 for (i
= 0; i
< nb_GUIDs
; i
++)
1878 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame
) ||
1879 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame2
) ||
1880 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame3
))
1886 if (requested
|| parent_frame
)
1888 IDirect3DRMFrame3
*frame
;
1890 TRACE("Load frame data\n");
1892 hr
= IDirect3DRM3_CreateFrame(iface
, parent_frame
, &frame
);
1895 IDirectXFileObject
*child
;
1897 while (SUCCEEDED(hr
= IDirectXFileData_GetNextObject(data_object
, &child
)))
1899 IDirectXFileData
*data
;
1900 IDirectXFileDataReference
*reference
;
1901 IDirectXFileBinary
*binary
;
1903 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1904 &IID_IDirectXFileBinary
, (void **)&binary
)))
1906 FIXME("Binary Object not supported yet\n");
1907 IDirectXFileBinary_Release(binary
);
1909 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1910 &IID_IDirectXFileData
, (void **)&data
)))
1912 TRACE("Found Data Object\n");
1913 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
1914 IDirectXFileData_Release(data
);
1916 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1917 &IID_IDirectXFileDataReference
, (void **)&reference
)))
1919 TRACE("Found Data Object Reference\n");
1920 IDirectXFileDataReference_Resolve(reference
, &data
);
1921 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
1922 IDirectXFileData_Release(data
);
1923 IDirectXFileDataReference_Release(reference
);
1925 IDirectXFileObject_Release(child
);
1928 if (hr
!= DXFILEERR_NOMOREOBJECTS
)
1930 IDirect3DRMFrame3_Release(frame
);
1935 /* Only top level objects are notified */
1938 IDirect3DRMObject
*object
;
1940 hr
= IDirect3DRMFrame3_QueryInterface(frame
, GUIDs
[i
], (void**)&object
);
1943 LoadProc(object
, GUIDs
[i
], ArgLP
);
1944 IDirect3DRMObject_Release(object
);
1947 IDirect3DRMFrame3_Release(frame
);
1951 ERR("Cannot process frame\n");
1954 else if (IsEqualGUID(guid
, &TID_D3DRMMaterial
))
1956 TRACE("Found TID_D3DRMMaterial\n");
1958 /* Cannot be requested so nothing to do */
1960 else if (IsEqualGUID(guid
, &TID_D3DRMFrameTransformMatrix
))
1962 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
1964 /* Cannot be requested */
1967 D3DRMMATRIX4D
*matrix
;
1970 TRACE("Load Frame Transform Matrix data\n");
1972 hr
= IDirectXFileData_GetData(data_object
, NULL
, &size
, (void**)&matrix
);
1973 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(matrix
)))
1976 hr
= IDirect3DRMFrame3_AddTransform(parent_frame
, D3DRMCOMBINE_REPLACE
, *matrix
);
1983 FIXME("Found unknown TID %s\n", debugstr_guid(guid
));
1993 static HRESULT WINAPI
d3drm3_Load(IDirect3DRM3
*iface
, void *source
, void *object_id
, IID
**iids
,
1994 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
1995 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame3
*parent_frame
)
1997 DXFILELOADOPTIONS load_options
;
1998 IDirectXFile
*file
= NULL
;
1999 IDirectXFileEnumObject
*enum_object
= NULL
;
2000 IDirectXFileData
*data
= NULL
;
2004 struct d3drm_file_header
*header
;
2005 HRESULT ret
= D3DRMERR_BADOBJECT
;
2008 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
2009 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
2010 iface
, source
, object_id
, iids
, iid_count
, flags
,
2011 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
2013 TRACE("Looking for GUIDs:\n");
2014 for (i
= 0; i
< iid_count
; ++i
)
2015 TRACE("- %s (%s)\n", debugstr_guid(iids
[i
]), get_IID_string(iids
[i
]));
2017 if (flags
== D3DRMLOAD_FROMMEMORY
)
2019 load_options
= DXFILELOAD_FROMMEMORY
;
2021 else if (flags
== D3DRMLOAD_FROMFILE
)
2023 load_options
= DXFILELOAD_FROMFILE
;
2024 TRACE("Loading from file %s\n", debugstr_a(source
));
2028 FIXME("Load options %#x not supported yet.\n", flags
);
2032 hr
= DirectXFileCreate(&file
);
2033 if (hr
!= DXFILE_OK
)
2036 hr
= IDirectXFile_RegisterTemplates(file
, templates
, strlen(templates
));
2037 if (hr
!= DXFILE_OK
)
2040 hr
= IDirectXFile_CreateEnumObject(file
, source
, load_options
, &enum_object
);
2041 if (hr
!= DXFILE_OK
)
2044 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
2045 if (hr
!= DXFILE_OK
)
2048 hr
= IDirectXFileData_GetType(data
, &pGuid
);
2049 if (hr
!= DXFILE_OK
)
2052 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid
));
2054 if (!IsEqualGUID(pGuid
, &TID_DXFILEHeader
))
2056 ret
= D3DRMERR_BADFILE
;
2060 hr
= IDirectXFileData_GetData(data
, NULL
, &size
, (void **)&header
);
2061 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(*header
)))
2064 TRACE("Version is %u.%u, flags %#x.\n", header
->major
, header
->minor
, header
->flags
);
2066 /* Version must be 1.0.x */
2067 if ((header
->major
!= 1) || (header
->minor
!= 0))
2069 ret
= D3DRMERR_BADFILE
;
2073 IDirectXFileData_Release(data
);
2078 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
2079 if (hr
== DXFILEERR_NOMOREOBJECTS
)
2081 TRACE("No more object\n");
2084 else if (hr
!= DXFILE_OK
)
2086 ret
= D3DRMERR_BADFILE
;
2090 ret
= load_data(iface
, data
, iids
, iid_count
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
2091 if (ret
!= D3DRM_OK
)
2094 IDirectXFileData_Release(data
);
2102 IDirectXFileData_Release(data
);
2104 IDirectXFileEnumObject_Release(enum_object
);
2106 IDirectXFile_Release(file
);
2111 static HRESULT WINAPI
d3drm3_Tick(IDirect3DRM3
*iface
, D3DVALUE tick
)
2113 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
2118 static HRESULT WINAPI
d3drm3_CreateProgressiveMesh(IDirect3DRM3
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
2120 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
2125 static HRESULT WINAPI
d3drm3_RegisterClient(IDirect3DRM3
*iface
, REFGUID guid
, DWORD
*id
)
2127 FIXME("iface %p, guid %s, id %p stub!\n", iface
, debugstr_guid(guid
), id
);
2132 static HRESULT WINAPI
d3drm3_UnregisterClient(IDirect3DRM3
*iface
, REFGUID guid
)
2134 FIXME("iface %p, guid %s stub!\n", iface
, debugstr_guid(guid
));
2139 static HRESULT WINAPI
d3drm3_CreateClippedVisual(IDirect3DRM3
*iface
,
2140 IDirect3DRMVisual
*visual
, IDirect3DRMClippedVisual
**clipped_visual
)
2142 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface
, visual
, clipped_visual
);
2147 static HRESULT WINAPI
d3drm3_SetOptions(IDirect3DRM3
*iface
, DWORD flags
)
2149 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
2154 static HRESULT WINAPI
d3drm3_GetOptions(IDirect3DRM3
*iface
, DWORD
*flags
)
2156 FIXME("iface %p, flags %p stub!\n", iface
, flags
);
2161 static const struct IDirect3DRM3Vtbl d3drm3_vtbl
=
2163 d3drm3_QueryInterface
,
2166 d3drm3_CreateObject
,
2169 d3drm3_CreateMeshBuilder
,
2171 d3drm3_CreateAnimation
,
2172 d3drm3_CreateAnimationSet
,
2173 d3drm3_CreateTexture
,
2175 d3drm3_CreateLightRGB
,
2176 d3drm3_CreateMaterial
,
2177 d3drm3_CreateDevice
,
2178 d3drm3_CreateDeviceFromSurface
,
2179 d3drm3_CreateDeviceFromD3D
,
2180 d3drm3_CreateDeviceFromClipper
,
2181 d3drm3_CreateTextureFromSurface
,
2182 d3drm3_CreateShadow
,
2183 d3drm3_CreateViewport
,
2185 d3drm3_CreateUserVisual
,
2187 d3drm3_LoadTextureFromResource
,
2188 d3drm3_SetSearchPath
,
2189 d3drm3_AddSearchPath
,
2190 d3drm3_GetSearchPath
,
2191 d3drm3_SetDefaultTextureColors
,
2192 d3drm3_SetDefaultTextureShades
,
2194 d3drm3_GetNamedObject
,
2195 d3drm3_EnumerateObjects
,
2198 d3drm3_CreateProgressiveMesh
,
2199 d3drm3_RegisterClient
,
2200 d3drm3_UnregisterClient
,
2201 d3drm3_CreateClippedVisual
,
2206 HRESULT WINAPI
Direct3DRMCreate(IDirect3DRM
**d3drm
)
2208 struct d3drm
*object
;
2210 TRACE("d3drm %p.\n", d3drm
);
2212 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
2213 return E_OUTOFMEMORY
;
2215 object
->IDirect3DRM_iface
.lpVtbl
= &d3drm1_vtbl
;
2216 object
->IDirect3DRM2_iface
.lpVtbl
= &d3drm2_vtbl
;
2217 object
->IDirect3DRM3_iface
.lpVtbl
= &d3drm3_vtbl
;
2219 object
->iface_count
= 1;
2221 *d3drm
= &object
->IDirect3DRM_iface
;
2226 HRESULT WINAPI
DllCanUnloadNow(void)
2231 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, void **ppv
)
2233 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
2236 return E_INVALIDARG
;
2238 return CLASS_E_CLASSNOTAVAILABLE
;