2 * Implementation of IDirect3DRM Interface
4 * Copyright 2010, 2012 Christian Costa
5 * Copyright 2011 André Hentschel
6 * Copyright 2016 Aaryaman Vasishta
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/debug.h"
32 #include "d3drm_private.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(d3drm
);
36 static const char* get_IID_string(const GUID
* guid
)
38 if (IsEqualGUID(guid
, &IID_IDirect3DRMFrame
))
39 return "IID_IDirect3DRMFrame";
40 else if (IsEqualGUID(guid
, &IID_IDirect3DRMFrame2
))
41 return "IID_IDirect3DRMFrame2";
42 else if (IsEqualGUID(guid
, &IID_IDirect3DRMFrame3
))
43 return "IID_IDirect3DRMFrame3";
44 else if (IsEqualGUID(guid
, &IID_IDirect3DRMMeshBuilder
))
45 return "IID_IDirect3DRMMeshBuilder";
46 else if (IsEqualGUID(guid
, &IID_IDirect3DRMMeshBuilder2
))
47 return "IID_IDirect3DRMMeshBuilder2";
48 else if (IsEqualGUID(guid
, &IID_IDirect3DRMMeshBuilder3
))
49 return "IID_IDirect3DRMMeshBuilder3";
56 IDirect3DRM IDirect3DRM_iface
;
57 IDirect3DRM2 IDirect3DRM2_iface
;
58 IDirect3DRM3 IDirect3DRM3_iface
;
59 LONG ref1
, ref2
, ref3
, iface_count
;
62 static inline struct d3drm
*impl_from_IDirect3DRM(IDirect3DRM
*iface
)
64 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM_iface
);
67 static inline struct d3drm
*impl_from_IDirect3DRM2(IDirect3DRM2
*iface
)
69 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM2_iface
);
72 static inline struct d3drm
*impl_from_IDirect3DRM3(IDirect3DRM3
*iface
)
74 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM3_iface
);
77 static void d3drm_destroy(struct d3drm
*d3drm
)
79 HeapFree(GetProcessHeap(), 0, d3drm
);
80 TRACE("d3drm object %p is being destroyed.\n", d3drm
);
83 static HRESULT WINAPI
d3drm1_QueryInterface(IDirect3DRM
*iface
, REFIID riid
, void **out
)
85 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
87 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
89 if (IsEqualGUID(riid
, &IID_IDirect3DRM
)
90 || IsEqualGUID(riid
, &IID_IUnknown
))
92 *out
= &d3drm
->IDirect3DRM_iface
;
94 else if (IsEqualGUID(riid
, &IID_IDirect3DRM2
))
96 *out
= &d3drm
->IDirect3DRM2_iface
;
98 else if (IsEqualGUID(riid
, &IID_IDirect3DRM3
))
100 *out
= &d3drm
->IDirect3DRM3_iface
;
105 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
106 return CLASS_E_CLASSNOTAVAILABLE
;
109 IUnknown_AddRef((IUnknown
*)*out
);
113 static ULONG WINAPI
d3drm1_AddRef(IDirect3DRM
*iface
)
115 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
116 ULONG refcount
= InterlockedIncrement(&d3drm
->ref1
);
118 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
121 InterlockedIncrement(&d3drm
->iface_count
);
126 static ULONG WINAPI
d3drm1_Release(IDirect3DRM
*iface
)
128 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
129 ULONG refcount
= InterlockedDecrement(&d3drm
->ref1
);
131 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
133 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
134 d3drm_destroy(d3drm
);
139 static HRESULT WINAPI
d3drm1_CreateObject(IDirect3DRM
*iface
,
140 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
142 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
144 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
145 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
147 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
150 static HRESULT WINAPI
d3drm1_CreateFrame(IDirect3DRM
*iface
,
151 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame
**frame
)
153 struct d3drm_frame
*object
;
156 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
158 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, iface
)))
161 *frame
= &object
->IDirect3DRMFrame_iface
;
166 static HRESULT WINAPI
d3drm1_CreateMesh(IDirect3DRM
*iface
, IDirect3DRMMesh
**mesh
)
168 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
170 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
172 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
175 static HRESULT WINAPI
d3drm1_CreateMeshBuilder(IDirect3DRM
*iface
, IDirect3DRMMeshBuilder
**mesh_builder
)
177 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
179 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder
, (IUnknown
**)mesh_builder
);
182 static HRESULT WINAPI
d3drm1_CreateFace(IDirect3DRM
*iface
, IDirect3DRMFace
**face
)
184 TRACE("iface %p, face %p.\n", iface
, face
);
186 return Direct3DRMFace_create(&IID_IDirect3DRMFace
, (IUnknown
**)face
);
189 static HRESULT WINAPI
d3drm1_CreateAnimation(IDirect3DRM
*iface
, IDirect3DRMAnimation
**animation
)
191 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
196 static HRESULT WINAPI
d3drm1_CreateAnimationSet(IDirect3DRM
*iface
, IDirect3DRMAnimationSet
**set
)
198 FIXME("iface %p, set %p stub!\n", iface
, set
);
203 static HRESULT WINAPI
d3drm1_CreateTexture(IDirect3DRM
*iface
,
204 D3DRMIMAGE
*image
, IDirect3DRMTexture
**texture
)
206 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
207 IDirect3DRMTexture3
*texture3
;
210 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
213 return D3DRMERR_BADVALUE
;
215 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
221 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
222 IDirect3DRMTexture3_Release(texture3
);
227 static HRESULT WINAPI
d3drm1_CreateLight(IDirect3DRM
*iface
,
228 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
230 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
232 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
234 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
237 static HRESULT WINAPI
d3drm1_CreateLightRGB(IDirect3DRM
*iface
, D3DRMLIGHTTYPE type
,
238 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
240 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
242 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
243 iface
, type
, red
, green
, blue
, light
);
245 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
248 static HRESULT WINAPI
d3drm1_CreateMaterial(IDirect3DRM
*iface
,
249 D3DVALUE power
, IDirect3DRMMaterial
**material
)
251 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
253 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
255 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
258 static HRESULT WINAPI
d3drm1_CreateDevice(IDirect3DRM
*iface
,
259 DWORD width
, DWORD height
, IDirect3DRMDevice
**device
)
261 struct d3drm_device
*object
;
263 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
265 hr
= d3drm_device_create(&object
);
269 *device
= IDirect3DRMDevice_from_impl(object
);
274 static HRESULT WINAPI
d3drm1_CreateDeviceFromSurface(IDirect3DRM
*iface
, GUID
*guid
,
275 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice
**device
)
277 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
278 struct d3drm_device
*object
;
281 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
282 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
285 return D3DRMERR_BADVALUE
;
288 if (!backbuffer
|| !ddraw
)
289 return D3DRMERR_BADDEVICE
;
291 hr
= d3drm_device_create(&object
);
295 hr
= d3drm_device_init(object
, 1, &d3drm
->IDirect3DRM_iface
, ddraw
, backbuffer
, TRUE
);
297 *device
= IDirect3DRMDevice_from_impl(object
);
299 d3drm_device_destroy(object
);
304 static HRESULT WINAPI
d3drm1_CreateDeviceFromD3D(IDirect3DRM
*iface
,
305 IDirect3D
*d3d
, IDirect3DDevice
*d3d_device
, IDirect3DRMDevice
**device
)
307 struct d3drm_device
*object
;
309 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
310 iface
, d3d
, d3d_device
, device
);
313 return D3DRMERR_BADVALUE
;
315 if (!d3d
|| !d3d_device
)
316 return D3DRMERR_BADVALUE
;
318 hr
= d3drm_device_create(&object
);
322 hr
= d3drm_device_set_ddraw_device_d3d(object
, iface
, d3d
, d3d_device
);
325 d3drm_device_destroy(object
);
328 *device
= IDirect3DRMDevice_from_impl(object
);
333 static HRESULT WINAPI
d3drm1_CreateDeviceFromClipper(IDirect3DRM
*iface
,
334 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
335 IDirect3DRMDevice
**device
)
337 struct d3drm_device
*object
;
339 IDirectDrawSurface
*render_target
;
342 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
343 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
346 return D3DRMERR_BADVALUE
;
349 if (!clipper
|| !width
|| !height
)
350 return D3DRMERR_BADVALUE
;
352 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
356 hr
= d3drm_device_create(&object
);
359 IDirectDraw_Release(ddraw
);
363 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
366 IDirectDraw_Release(ddraw
);
367 d3drm_device_destroy(object
);
371 hr
= d3drm_device_init(object
, 1, iface
, ddraw
, render_target
, TRUE
);
372 IDirectDraw_Release(ddraw
);
373 IDirectDrawSurface_Release(render_target
);
375 d3drm_device_destroy(object
);
377 *device
= IDirect3DRMDevice_from_impl(object
);
382 static HRESULT WINAPI
d3drm1_CreateTextureFromSurface(IDirect3DRM
*iface
,
383 IDirectDrawSurface
*surface
, IDirect3DRMTexture
**texture
)
385 FIXME("iface %p, surface %p, texture %p stub!\n", iface
, surface
, texture
);
390 static HRESULT WINAPI
d3drm1_CreateShadow(IDirect3DRM
*iface
, IDirect3DRMVisual
*visual
,
391 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
392 IDirect3DRMVisual
**shadow
)
394 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
395 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
400 static HRESULT WINAPI
d3drm1_CreateViewport(IDirect3DRM
*iface
, IDirect3DRMDevice
*device
,
401 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
403 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
405 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
406 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
408 return IDirect3DRM2_CreateViewport(&d3drm
->IDirect3DRM2_iface
, device
, camera
, x
, y
, width
, height
, viewport
);
411 static HRESULT WINAPI
d3drm1_CreateWrap(IDirect3DRM
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
412 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
413 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
414 IDirect3DRMWrap
**wrap
)
416 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
417 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
418 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
423 static HRESULT WINAPI
d3drm1_CreateUserVisual(IDirect3DRM
*iface
,
424 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
426 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface
, cb
, ctx
, visual
);
431 static HRESULT WINAPI
d3drm1_LoadTexture(IDirect3DRM
*iface
,
432 const char *filename
, IDirect3DRMTexture
**texture
)
434 struct d3drm_texture
*object
;
437 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
439 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
442 *texture
= &object
->IDirect3DRMTexture_iface
;
447 static HRESULT WINAPI
d3drm1_LoadTextureFromResource(IDirect3DRM
*iface
,
448 HRSRC resource
, IDirect3DRMTexture
**texture
)
450 struct d3drm_texture
*object
;
453 FIXME("iface %p, resource %p, texture %p stub!\n", iface
, resource
, texture
);
455 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
458 *texture
= &object
->IDirect3DRMTexture_iface
;
463 static HRESULT WINAPI
d3drm1_SetSearchPath(IDirect3DRM
*iface
, const char *path
)
465 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
470 static HRESULT WINAPI
d3drm1_AddSearchPath(IDirect3DRM
*iface
, const char *path
)
472 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
477 static HRESULT WINAPI
d3drm1_GetSearchPath(IDirect3DRM
*iface
, DWORD
*size
, char *path
)
479 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
484 static HRESULT WINAPI
d3drm1_SetDefaultTextureColors(IDirect3DRM
*iface
, DWORD color_count
)
486 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
491 static HRESULT WINAPI
d3drm1_SetDefaultTextureShades(IDirect3DRM
*iface
, DWORD shade_count
)
493 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
498 static HRESULT WINAPI
d3drm1_GetDevices(IDirect3DRM
*iface
, IDirect3DRMDeviceArray
**array
)
500 FIXME("iface %p, array %p stub!\n", iface
, array
);
505 static HRESULT WINAPI
d3drm1_GetNamedObject(IDirect3DRM
*iface
,
506 const char *name
, IDirect3DRMObject
**object
)
508 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
513 static HRESULT WINAPI
d3drm1_EnumerateObjects(IDirect3DRM
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
515 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
520 static HRESULT WINAPI
d3drm1_Load(IDirect3DRM
*iface
, void *source
, void *object_id
, IID
**iids
,
521 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
522 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
524 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
525 IDirect3DRMFrame3
*parent_frame3
= NULL
;
526 HRESULT hr
= D3DRM_OK
;
528 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
529 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
530 iface
, source
, object_id
, iids
, iid_count
, flags
,
531 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
534 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
536 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
537 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
539 IDirect3DRMFrame3_Release(parent_frame3
);
544 static HRESULT WINAPI
d3drm1_Tick(IDirect3DRM
*iface
, D3DVALUE tick
)
546 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
551 static const struct IDirect3DRMVtbl d3drm1_vtbl
=
553 d3drm1_QueryInterface
,
559 d3drm1_CreateMeshBuilder
,
561 d3drm1_CreateAnimation
,
562 d3drm1_CreateAnimationSet
,
563 d3drm1_CreateTexture
,
565 d3drm1_CreateLightRGB
,
566 d3drm1_CreateMaterial
,
568 d3drm1_CreateDeviceFromSurface
,
569 d3drm1_CreateDeviceFromD3D
,
570 d3drm1_CreateDeviceFromClipper
,
571 d3drm1_CreateTextureFromSurface
,
573 d3drm1_CreateViewport
,
575 d3drm1_CreateUserVisual
,
577 d3drm1_LoadTextureFromResource
,
578 d3drm1_SetSearchPath
,
579 d3drm1_AddSearchPath
,
580 d3drm1_GetSearchPath
,
581 d3drm1_SetDefaultTextureColors
,
582 d3drm1_SetDefaultTextureShades
,
584 d3drm1_GetNamedObject
,
585 d3drm1_EnumerateObjects
,
590 static HRESULT WINAPI
d3drm2_QueryInterface(IDirect3DRM2
*iface
, REFIID riid
, void **out
)
592 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
594 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
597 static ULONG WINAPI
d3drm2_AddRef(IDirect3DRM2
*iface
)
599 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
600 ULONG refcount
= InterlockedIncrement(&d3drm
->ref2
);
602 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
605 InterlockedIncrement(&d3drm
->iface_count
);
610 static ULONG WINAPI
d3drm2_Release(IDirect3DRM2
*iface
)
612 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
613 ULONG refcount
= InterlockedDecrement(&d3drm
->ref2
);
615 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
617 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
618 d3drm_destroy(d3drm
);
623 static HRESULT WINAPI
d3drm2_CreateObject(IDirect3DRM2
*iface
,
624 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
626 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
628 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
629 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
631 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
634 static HRESULT WINAPI
d3drm2_CreateFrame(IDirect3DRM2
*iface
,
635 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame2
**frame
)
637 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
638 struct d3drm_frame
*object
;
641 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
643 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, &d3drm
->IDirect3DRM_iface
)))
646 *frame
= &object
->IDirect3DRMFrame2_iface
;
651 static HRESULT WINAPI
d3drm2_CreateMesh(IDirect3DRM2
*iface
, IDirect3DRMMesh
**mesh
)
653 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
655 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
657 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
660 static HRESULT WINAPI
d3drm2_CreateMeshBuilder(IDirect3DRM2
*iface
, IDirect3DRMMeshBuilder2
**mesh_builder
)
662 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
664 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder2
, (IUnknown
**)mesh_builder
);
667 static HRESULT WINAPI
d3drm2_CreateFace(IDirect3DRM2
*iface
, IDirect3DRMFace
**face
)
669 TRACE("iface %p, face %p.\n", iface
, face
);
671 return Direct3DRMFace_create(&IID_IDirect3DRMFace
, (IUnknown
**)face
);
674 static HRESULT WINAPI
d3drm2_CreateAnimation(IDirect3DRM2
*iface
, IDirect3DRMAnimation
**animation
)
676 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
681 static HRESULT WINAPI
d3drm2_CreateAnimationSet(IDirect3DRM2
*iface
, IDirect3DRMAnimationSet
**set
)
683 FIXME("iface %p, set %p stub!\n", iface
, set
);
688 static HRESULT WINAPI
d3drm2_CreateTexture(IDirect3DRM2
*iface
,
689 D3DRMIMAGE
*image
, IDirect3DRMTexture2
**texture
)
691 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
692 IDirect3DRMTexture3
*texture3
;
695 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
698 return D3DRMERR_BADVALUE
;
700 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
706 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture2
, (void **)texture
);
707 IDirect3DRMTexture3_Release(texture3
);
712 static HRESULT WINAPI
d3drm2_CreateLight(IDirect3DRM2
*iface
,
713 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
715 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
717 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
719 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
722 static HRESULT WINAPI
d3drm2_CreateLightRGB(IDirect3DRM2
*iface
, D3DRMLIGHTTYPE type
,
723 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
725 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
727 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
728 iface
, type
, red
, green
, blue
, light
);
730 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
733 static HRESULT WINAPI
d3drm2_CreateMaterial(IDirect3DRM2
*iface
,
734 D3DVALUE power
, IDirect3DRMMaterial
**material
)
736 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
738 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
740 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
743 static HRESULT WINAPI
d3drm2_CreateDevice(IDirect3DRM2
*iface
,
744 DWORD width
, DWORD height
, IDirect3DRMDevice2
**device
)
746 struct d3drm_device
*object
;
748 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
750 hr
= d3drm_device_create(&object
);
754 *device
= IDirect3DRMDevice2_from_impl(object
);
759 static HRESULT WINAPI
d3drm2_CreateDeviceFromSurface(IDirect3DRM2
*iface
, GUID
*guid
,
760 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice2
**device
)
762 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
763 IDirect3DRMDevice3
*device3
;
765 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
766 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
769 return D3DRMERR_BADVALUE
;
771 hr
= IDirect3DRM3_CreateDeviceFromSurface(&d3drm
->IDirect3DRM3_iface
, guid
, ddraw
, backbuffer
, 0, &device3
);
775 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
776 IDirect3DRMDevice3_Release(device3
);
781 static HRESULT WINAPI
d3drm2_CreateDeviceFromD3D(IDirect3DRM2
*iface
,
782 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice2
**device
)
784 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
786 IDirect3DDevice
*d3d_device1
;
787 IDirect3DRMDevice
*device1
;
789 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
790 iface
, d3d
, d3d_device
, device
);
793 return D3DRMERR_BADVALUE
;
795 if (!d3d
|| !d3d_device
)
796 return D3DRMERR_BADVALUE
;
798 hr
= IDirect3D2_QueryInterface(d3d
, &IID_IDirect3D
, (void **)&d3d1
);
802 hr
= IDirect3DDevice2_QueryInterface(d3d_device
, &IID_IDirect3DDevice
, (void **)&d3d_device1
);
805 IDirect3D_Release(d3d1
);
809 hr
= IDirect3DRM_CreateDeviceFromD3D(&d3drm
->IDirect3DRM_iface
, d3d1
, d3d_device1
, &device1
);
810 IDirect3D_Release(d3d1
);
811 IDirect3DDevice_Release(d3d_device1
);
815 hr
= IDirect3DRMDevice_QueryInterface(device1
, &IID_IDirect3DRMDevice2
, (void **)device
);
816 IDirect3DRMDevice_Release(device1
);
821 static HRESULT WINAPI
d3drm2_CreateDeviceFromClipper(IDirect3DRM2
*iface
,
822 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
823 IDirect3DRMDevice2
**device
)
825 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
826 IDirect3DRMDevice3
*device3
;
829 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
830 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
833 return D3DRMERR_BADVALUE
;
835 hr
= IDirect3DRM3_CreateDeviceFromClipper(&d3drm
->IDirect3DRM3_iface
, clipper
, guid
, width
, height
, &device3
);
839 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
840 IDirect3DRMDevice3_Release(device3
);
845 static HRESULT WINAPI
d3drm2_CreateTextureFromSurface(IDirect3DRM2
*iface
,
846 IDirectDrawSurface
*surface
, IDirect3DRMTexture2
**texture
)
848 FIXME("iface %p, surface %p, texture %p stub!\n", iface
, surface
, texture
);
853 static HRESULT WINAPI
d3drm2_CreateShadow(IDirect3DRM2
*iface
, IDirect3DRMVisual
*visual
,
854 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
855 IDirect3DRMVisual
**shadow
)
857 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
858 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
863 static HRESULT WINAPI
d3drm2_CreateViewport(IDirect3DRM2
*iface
, IDirect3DRMDevice
*device
,
864 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
866 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
867 struct d3drm_viewport
*object
;
870 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
871 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
873 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
876 *viewport
= &object
->IDirect3DRMViewport_iface
;
881 static HRESULT WINAPI
d3drm2_CreateWrap(IDirect3DRM2
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
882 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
883 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
884 IDirect3DRMWrap
**wrap
)
886 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
887 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
888 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
893 static HRESULT WINAPI
d3drm2_CreateUserVisual(IDirect3DRM2
*iface
,
894 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
896 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
901 static HRESULT WINAPI
d3drm2_LoadTexture(IDirect3DRM2
*iface
,
902 const char *filename
, IDirect3DRMTexture2
**texture
)
904 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
905 struct d3drm_texture
*object
;
908 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
910 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
913 *texture
= &object
->IDirect3DRMTexture2_iface
;
918 static HRESULT WINAPI
d3drm2_LoadTextureFromResource(IDirect3DRM2
*iface
, HMODULE module
,
919 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture2
**texture
)
921 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
922 struct d3drm_texture
*object
;
925 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
926 iface
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
928 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
931 *texture
= &object
->IDirect3DRMTexture2_iface
;
936 static HRESULT WINAPI
d3drm2_SetSearchPath(IDirect3DRM2
*iface
, const char *path
)
938 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
943 static HRESULT WINAPI
d3drm2_AddSearchPath(IDirect3DRM2
*iface
, const char *path
)
945 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
950 static HRESULT WINAPI
d3drm2_GetSearchPath(IDirect3DRM2
*iface
, DWORD
*size
, char *path
)
952 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
957 static HRESULT WINAPI
d3drm2_SetDefaultTextureColors(IDirect3DRM2
*iface
, DWORD color_count
)
959 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
964 static HRESULT WINAPI
d3drm2_SetDefaultTextureShades(IDirect3DRM2
*iface
, DWORD shade_count
)
966 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
971 static HRESULT WINAPI
d3drm2_GetDevices(IDirect3DRM2
*iface
, IDirect3DRMDeviceArray
**array
)
973 FIXME("iface %p, array %p stub!\n", iface
, array
);
978 static HRESULT WINAPI
d3drm2_GetNamedObject(IDirect3DRM2
*iface
,
979 const char *name
, IDirect3DRMObject
**object
)
981 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
986 static HRESULT WINAPI
d3drm2_EnumerateObjects(IDirect3DRM2
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
988 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
993 static HRESULT WINAPI
d3drm2_Load(IDirect3DRM2
*iface
, void *source
, void *object_id
, IID
**iids
,
994 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
995 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
997 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
998 IDirect3DRMFrame3
*parent_frame3
= NULL
;
999 HRESULT hr
= D3DRM_OK
;
1001 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1002 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1003 iface
, source
, object_id
, iids
, iid_count
, flags
,
1004 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1007 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
1009 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
1010 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
1012 IDirect3DRMFrame3_Release(parent_frame3
);
1017 static HRESULT WINAPI
d3drm2_Tick(IDirect3DRM2
*iface
, D3DVALUE tick
)
1019 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1024 static HRESULT WINAPI
d3drm2_CreateProgressiveMesh(IDirect3DRM2
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1026 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1031 static const struct IDirect3DRM2Vtbl d3drm2_vtbl
=
1033 d3drm2_QueryInterface
,
1036 d3drm2_CreateObject
,
1039 d3drm2_CreateMeshBuilder
,
1041 d3drm2_CreateAnimation
,
1042 d3drm2_CreateAnimationSet
,
1043 d3drm2_CreateTexture
,
1045 d3drm2_CreateLightRGB
,
1046 d3drm2_CreateMaterial
,
1047 d3drm2_CreateDevice
,
1048 d3drm2_CreateDeviceFromSurface
,
1049 d3drm2_CreateDeviceFromD3D
,
1050 d3drm2_CreateDeviceFromClipper
,
1051 d3drm2_CreateTextureFromSurface
,
1052 d3drm2_CreateShadow
,
1053 d3drm2_CreateViewport
,
1055 d3drm2_CreateUserVisual
,
1057 d3drm2_LoadTextureFromResource
,
1058 d3drm2_SetSearchPath
,
1059 d3drm2_AddSearchPath
,
1060 d3drm2_GetSearchPath
,
1061 d3drm2_SetDefaultTextureColors
,
1062 d3drm2_SetDefaultTextureShades
,
1064 d3drm2_GetNamedObject
,
1065 d3drm2_EnumerateObjects
,
1068 d3drm2_CreateProgressiveMesh
,
1071 static HRESULT WINAPI
d3drm3_QueryInterface(IDirect3DRM3
*iface
, REFIID riid
, void **out
)
1073 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1075 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
1078 static ULONG WINAPI
d3drm3_AddRef(IDirect3DRM3
*iface
)
1080 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1081 ULONG refcount
= InterlockedIncrement(&d3drm
->ref3
);
1083 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
1086 InterlockedIncrement(&d3drm
->iface_count
);
1091 static ULONG WINAPI
d3drm3_Release(IDirect3DRM3
*iface
)
1093 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1094 ULONG refcount
= InterlockedDecrement(&d3drm
->ref3
);
1096 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
1098 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
1099 d3drm_destroy(d3drm
);
1104 static HRESULT WINAPI
d3drm3_CreateObject(IDirect3DRM3
*iface
,
1105 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
1107 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1111 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1112 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
1115 return D3DRMERR_BADVALUE
;
1120 return D3DRMERR_BADVALUE
;
1125 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer
);
1130 if (IsEqualGUID(clsid
, &CLSID_CDirect3DRMTexture
))
1132 struct d3drm_texture
*texture
;
1133 if (FAILED(hr
= d3drm_texture_create(&texture
, &d3drm
->IDirect3DRM_iface
)))
1138 object
= (IUnknown
*)&texture
->IDirect3DRMTexture3_iface
;
1142 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid
));
1144 return CLASSFACTORY_E_FIRST
;
1147 if (FAILED(hr
= IUnknown_QueryInterface(object
, iid
, out
)))
1149 IUnknown_Release(object
);
1154 static HRESULT WINAPI
d3drm3_CreateFrame(IDirect3DRM3
*iface
,
1155 IDirect3DRMFrame3
*parent
, IDirect3DRMFrame3
**frame
)
1157 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1158 struct d3drm_frame
*object
;
1161 TRACE("iface %p, parent %p, frame %p.\n", iface
, parent
, frame
);
1163 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent
, &d3drm
->IDirect3DRM_iface
)))
1166 *frame
= &object
->IDirect3DRMFrame3_iface
;
1171 static HRESULT WINAPI
d3drm3_CreateMesh(IDirect3DRM3
*iface
, IDirect3DRMMesh
**mesh
)
1173 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
1175 return Direct3DRMMesh_create(mesh
);
1178 static HRESULT WINAPI
d3drm3_CreateMeshBuilder(IDirect3DRM3
*iface
, IDirect3DRMMeshBuilder3
**mesh_builder
)
1180 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
1182 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder3
, (IUnknown
**)mesh_builder
);
1185 static HRESULT WINAPI
d3drm3_CreateFace(IDirect3DRM3
*iface
, IDirect3DRMFace2
**face
)
1187 TRACE("iface %p, face %p.\n", iface
, face
);
1189 return Direct3DRMFace_create(&IID_IDirect3DRMFace2
, (IUnknown
**)face
);
1192 static HRESULT WINAPI
d3drm3_CreateAnimation(IDirect3DRM3
*iface
, IDirect3DRMAnimation2
**animation
)
1194 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
1199 static HRESULT WINAPI
d3drm3_CreateAnimationSet(IDirect3DRM3
*iface
, IDirect3DRMAnimationSet2
**set
)
1201 FIXME("iface %p, set %p stub!\n", iface
, set
);
1206 static HRESULT WINAPI
d3drm3_CreateTexture(IDirect3DRM3
*iface
,
1207 D3DRMIMAGE
*image
, IDirect3DRMTexture3
**texture
)
1209 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1210 struct d3drm_texture
*object
;
1213 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
1216 return D3DRMERR_BADVALUE
;
1218 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1221 *texture
= &object
->IDirect3DRMTexture3_iface
;
1223 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture
, image
)))
1225 IDirect3DRMTexture3_Release(*texture
);
1227 return D3DRMERR_BADVALUE
;
1233 static HRESULT WINAPI
d3drm3_CreateLight(IDirect3DRM3
*iface
,
1234 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
1238 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface
, type
, color
, light
);
1240 if (SUCCEEDED(hr
= Direct3DRMLight_create((IUnknown
**)light
)))
1242 IDirect3DRMLight_SetType(*light
, type
);
1243 IDirect3DRMLight_SetColor(*light
, color
);
1249 static HRESULT WINAPI
d3drm3_CreateLightRGB(IDirect3DRM3
*iface
, D3DRMLIGHTTYPE type
,
1250 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
1254 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1255 iface
, type
, red
, green
, blue
, light
);
1257 if (SUCCEEDED(hr
= Direct3DRMLight_create((IUnknown
**)light
)))
1259 IDirect3DRMLight_SetType(*light
, type
);
1260 IDirect3DRMLight_SetColorRGB(*light
, red
, green
, blue
);
1266 static HRESULT WINAPI
d3drm3_CreateMaterial(IDirect3DRM3
*iface
,
1267 D3DVALUE power
, IDirect3DRMMaterial2
**material
)
1271 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
1273 if (SUCCEEDED(hr
= Direct3DRMMaterial_create(material
)))
1274 IDirect3DRMMaterial2_SetPower(*material
, power
);
1279 static HRESULT WINAPI
d3drm3_CreateDevice(IDirect3DRM3
*iface
,
1280 DWORD width
, DWORD height
, IDirect3DRMDevice3
**device
)
1282 struct d3drm_device
*object
;
1284 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
1286 hr
= d3drm_device_create(&object
);
1290 *device
= IDirect3DRMDevice3_from_impl(object
);
1295 static HRESULT WINAPI
d3drm3_CreateDeviceFromSurface(IDirect3DRM3
*iface
, GUID
*guid
,
1296 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, DWORD flags
, IDirect3DRMDevice3
**device
)
1298 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1299 struct d3drm_device
*object
;
1303 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1304 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, flags
, device
);
1307 return D3DRMERR_BADVALUE
;
1310 if (!backbuffer
|| !ddraw
)
1311 return D3DRMERR_BADDEVICE
;
1313 hr
= d3drm_device_create(&object
);
1317 use_z_surface
= !(flags
& D3DRMDEVICE_NOZBUFFER
);
1319 hr
= d3drm_device_init(object
, 3, &d3drm
->IDirect3DRM_iface
, ddraw
, backbuffer
, use_z_surface
);
1321 *device
= IDirect3DRMDevice3_from_impl(object
);
1323 d3drm_device_destroy(object
);
1328 static HRESULT WINAPI
d3drm3_CreateDeviceFromD3D(IDirect3DRM3
*iface
,
1329 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice3
**device
)
1331 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1333 IDirect3DDevice
*d3d_device1
;
1334 IDirect3DRMDevice
*device1
;
1336 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1337 iface
, d3d
, d3d_device
, device
);
1340 return D3DRMERR_BADVALUE
;
1342 if (!d3d
|| !d3d_device
)
1343 return D3DRMERR_BADVALUE
;
1345 hr
= IDirect3D2_QueryInterface(d3d
, &IID_IDirect3D
, (void **)&d3d1
);
1348 hr
= IDirect3DDevice2_QueryInterface(d3d_device
, &IID_IDirect3DDevice
, (void **)&d3d_device1
);
1351 IDirect3D_Release(d3d1
);
1355 hr
= IDirect3DRM_CreateDeviceFromD3D(&d3drm
->IDirect3DRM_iface
, d3d1
, d3d_device1
, &device1
);
1356 IDirect3D_Release(d3d1
);
1357 IDirect3DDevice_Release(d3d_device1
);
1361 hr
= IDirect3DRMDevice_QueryInterface(device1
, &IID_IDirect3DRMDevice3
, (void **)device
);
1362 IDirect3DRMDevice_Release(device1
);
1367 static HRESULT WINAPI
d3drm3_CreateDeviceFromClipper(IDirect3DRM3
*iface
,
1368 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
1369 IDirect3DRMDevice3
**device
)
1371 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1372 struct d3drm_device
*object
;
1374 IDirectDrawSurface
*render_target
;
1377 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1378 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1381 return D3DRMERR_BADVALUE
;
1384 if (!clipper
|| !width
|| !height
)
1385 return D3DRMERR_BADVALUE
;
1387 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
1391 hr
= d3drm_device_create(&object
);
1394 IDirectDraw_Release(ddraw
);
1398 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
1401 IDirectDraw_Release(ddraw
);
1402 d3drm_device_destroy(object
);
1406 hr
= d3drm_device_init(object
, 3, &d3drm
->IDirect3DRM_iface
, ddraw
, render_target
, TRUE
);
1407 IDirectDraw_Release(ddraw
);
1408 IDirectDrawSurface_Release(render_target
);
1410 d3drm_device_destroy(object
);
1412 *device
= IDirect3DRMDevice3_from_impl(object
);
1417 static HRESULT WINAPI
d3drm3_CreateShadow(IDirect3DRM3
*iface
, IUnknown
*object
, IDirect3DRMLight
*light
,
1418 D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
, IDirect3DRMShadow2
**shadow
)
1420 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1421 iface
, object
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
1426 static HRESULT WINAPI
d3drm3_CreateTextureFromSurface(IDirect3DRM3
*iface
,
1427 IDirectDrawSurface
*surface
, IDirect3DRMTexture3
**texture
)
1429 FIXME("iface %p, surface %p, texture %p stub!\n", iface
, surface
, texture
);
1434 static HRESULT WINAPI
d3drm3_CreateViewport(IDirect3DRM3
*iface
, IDirect3DRMDevice3
*device
,
1435 IDirect3DRMFrame3
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport2
**viewport
)
1437 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1438 struct d3drm_viewport
*object
;
1441 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
1442 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
1444 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1447 *viewport
= &object
->IDirect3DRMViewport2_iface
;
1452 static HRESULT WINAPI
d3drm3_CreateWrap(IDirect3DRM3
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame3
*frame
,
1453 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
1454 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
1455 IDirect3DRMWrap
**wrap
)
1457 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1458 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1459 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
1464 static HRESULT WINAPI
d3drm3_CreateUserVisual(IDirect3DRM3
*iface
,
1465 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
1467 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
1472 static HRESULT WINAPI
d3drm3_LoadTexture(IDirect3DRM3
*iface
,
1473 const char *filename
, IDirect3DRMTexture3
**texture
)
1475 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1476 struct d3drm_texture
*object
;
1479 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
1481 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1484 *texture
= &object
->IDirect3DRMTexture3_iface
;
1489 static HRESULT WINAPI
d3drm3_LoadTextureFromResource(IDirect3DRM3
*iface
, HMODULE module
,
1490 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture3
**texture
)
1492 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1493 struct d3drm_texture
*object
;
1496 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1497 iface
, module
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
1499 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1502 *texture
= &object
->IDirect3DRMTexture3_iface
;
1507 static HRESULT WINAPI
d3drm3_SetSearchPath(IDirect3DRM3
*iface
, const char *path
)
1509 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1514 static HRESULT WINAPI
d3drm3_AddSearchPath(IDirect3DRM3
*iface
, const char *path
)
1516 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1521 static HRESULT WINAPI
d3drm3_GetSearchPath(IDirect3DRM3
*iface
, DWORD
*size
, char *path
)
1523 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
1528 static HRESULT WINAPI
d3drm3_SetDefaultTextureColors(IDirect3DRM3
*iface
, DWORD color_count
)
1530 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1535 static HRESULT WINAPI
d3drm3_SetDefaultTextureShades(IDirect3DRM3
*iface
, DWORD shade_count
)
1537 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1542 static HRESULT WINAPI
d3drm3_GetDevices(IDirect3DRM3
*iface
, IDirect3DRMDeviceArray
**array
)
1544 FIXME("iface %p, array %p stub!\n", iface
, array
);
1549 static HRESULT WINAPI
d3drm3_GetNamedObject(IDirect3DRM3
*iface
,
1550 const char *name
, IDirect3DRMObject
**object
)
1552 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
1557 static HRESULT WINAPI
d3drm3_EnumerateObjects(IDirect3DRM3
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
1559 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
1564 static HRESULT
load_data(IDirect3DRM3
*iface
, IDirectXFileData
*data_object
, IID
**GUIDs
, DWORD nb_GUIDs
, D3DRMLOADCALLBACK LoadProc
,
1565 void *ArgLP
, D3DRMLOADTEXTURECALLBACK LoadTextureProc
, void *ArgLTP
, IDirect3DRMFrame3
*parent_frame
)
1567 HRESULT ret
= D3DRMERR_BADOBJECT
;
1571 BOOL requested
= FALSE
;
1573 hr
= IDirectXFileData_GetType(data_object
, &guid
);
1574 if (hr
!= DXFILE_OK
)
1577 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid
));
1579 /* Load object only if it is top level and requested or if it is part of another object */
1581 if (IsEqualGUID(guid
, &TID_D3DRMMesh
))
1583 TRACE("Found TID_D3DRMMesh\n");
1585 for (i
= 0; i
< nb_GUIDs
; i
++)
1586 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder
) ||
1587 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder2
) ||
1588 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder3
))
1594 if (requested
|| parent_frame
)
1596 IDirect3DRMMeshBuilder3
*meshbuilder
;
1598 TRACE("Load mesh data\n");
1600 hr
= IDirect3DRM3_CreateMeshBuilder(iface
, &meshbuilder
);
1603 hr
= load_mesh_data(meshbuilder
, data_object
, LoadTextureProc
, ArgLTP
);
1606 /* Only top level objects are notified */
1609 IDirect3DRMObject
*object
;
1611 hr
= IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder
, GUIDs
[i
], (void**)&object
);
1614 LoadProc(object
, GUIDs
[i
], ArgLP
);
1615 IDirect3DRMObject_Release(object
);
1620 IDirect3DRMFrame3_AddVisual(parent_frame
, (IUnknown
*)meshbuilder
);
1623 IDirect3DRMMeshBuilder3_Release(meshbuilder
);
1627 ERR("Cannot process mesh\n");
1630 else if (IsEqualGUID(guid
, &TID_D3DRMFrame
))
1632 TRACE("Found TID_D3DRMFrame\n");
1634 for (i
= 0; i
< nb_GUIDs
; i
++)
1635 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame
) ||
1636 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame2
) ||
1637 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame3
))
1643 if (requested
|| parent_frame
)
1645 IDirect3DRMFrame3
*frame
;
1647 TRACE("Load frame data\n");
1649 hr
= IDirect3DRM3_CreateFrame(iface
, parent_frame
, &frame
);
1652 IDirectXFileObject
*child
;
1654 while (SUCCEEDED(hr
= IDirectXFileData_GetNextObject(data_object
, &child
)))
1656 IDirectXFileData
*data
;
1657 IDirectXFileDataReference
*reference
;
1658 IDirectXFileBinary
*binary
;
1660 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1661 &IID_IDirectXFileBinary
, (void **)&binary
)))
1663 FIXME("Binary Object not supported yet\n");
1664 IDirectXFileBinary_Release(binary
);
1666 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1667 &IID_IDirectXFileData
, (void **)&data
)))
1669 TRACE("Found Data Object\n");
1670 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
1671 IDirectXFileData_Release(data
);
1673 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1674 &IID_IDirectXFileDataReference
, (void **)&reference
)))
1676 TRACE("Found Data Object Reference\n");
1677 IDirectXFileDataReference_Resolve(reference
, &data
);
1678 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
1679 IDirectXFileData_Release(data
);
1680 IDirectXFileDataReference_Release(reference
);
1682 IDirectXFileObject_Release(child
);
1685 if (hr
!= DXFILEERR_NOMOREOBJECTS
)
1687 IDirect3DRMFrame3_Release(frame
);
1692 /* Only top level objects are notified */
1695 IDirect3DRMObject
*object
;
1697 hr
= IDirect3DRMFrame3_QueryInterface(frame
, GUIDs
[i
], (void**)&object
);
1700 LoadProc(object
, GUIDs
[i
], ArgLP
);
1701 IDirect3DRMObject_Release(object
);
1704 IDirect3DRMFrame3_Release(frame
);
1708 ERR("Cannot process frame\n");
1711 else if (IsEqualGUID(guid
, &TID_D3DRMMaterial
))
1713 TRACE("Found TID_D3DRMMaterial\n");
1715 /* Cannot be requested so nothing to do */
1717 else if (IsEqualGUID(guid
, &TID_D3DRMFrameTransformMatrix
))
1719 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
1721 /* Cannot be requested */
1724 D3DRMMATRIX4D
*matrix
;
1727 TRACE("Load Frame Transform Matrix data\n");
1729 hr
= IDirectXFileData_GetData(data_object
, NULL
, &size
, (void**)&matrix
);
1730 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(matrix
)))
1733 hr
= IDirect3DRMFrame3_AddTransform(parent_frame
, D3DRMCOMBINE_REPLACE
, *matrix
);
1740 FIXME("Found unknown TID %s\n", debugstr_guid(guid
));
1750 static HRESULT WINAPI
d3drm3_Load(IDirect3DRM3
*iface
, void *source
, void *object_id
, IID
**iids
,
1751 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
1752 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame3
*parent_frame
)
1754 DXFILELOADOPTIONS load_options
;
1755 IDirectXFile
*file
= NULL
;
1756 IDirectXFileEnumObject
*enum_object
= NULL
;
1757 IDirectXFileData
*data
= NULL
;
1761 struct d3drm_file_header
*header
;
1762 HRESULT ret
= D3DRMERR_BADOBJECT
;
1765 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1766 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1767 iface
, source
, object_id
, iids
, iid_count
, flags
,
1768 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1770 TRACE("Looking for GUIDs:\n");
1771 for (i
= 0; i
< iid_count
; ++i
)
1772 TRACE("- %s (%s)\n", debugstr_guid(iids
[i
]), get_IID_string(iids
[i
]));
1774 if (flags
== D3DRMLOAD_FROMMEMORY
)
1776 load_options
= DXFILELOAD_FROMMEMORY
;
1778 else if (flags
== D3DRMLOAD_FROMFILE
)
1780 load_options
= DXFILELOAD_FROMFILE
;
1781 TRACE("Loading from file %s\n", debugstr_a(source
));
1785 FIXME("Load options %#x not supported yet.\n", flags
);
1789 hr
= DirectXFileCreate(&file
);
1790 if (hr
!= DXFILE_OK
)
1793 hr
= IDirectXFile_RegisterTemplates(file
, templates
, strlen(templates
));
1794 if (hr
!= DXFILE_OK
)
1797 hr
= IDirectXFile_CreateEnumObject(file
, source
, load_options
, &enum_object
);
1798 if (hr
!= DXFILE_OK
)
1801 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
1802 if (hr
!= DXFILE_OK
)
1805 hr
= IDirectXFileData_GetType(data
, &pGuid
);
1806 if (hr
!= DXFILE_OK
)
1809 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid
));
1811 if (!IsEqualGUID(pGuid
, &TID_DXFILEHeader
))
1813 ret
= D3DRMERR_BADFILE
;
1817 hr
= IDirectXFileData_GetData(data
, NULL
, &size
, (void **)&header
);
1818 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(*header
)))
1821 TRACE("Version is %u.%u, flags %#x.\n", header
->major
, header
->minor
, header
->flags
);
1823 /* Version must be 1.0.x */
1824 if ((header
->major
!= 1) || (header
->minor
!= 0))
1826 ret
= D3DRMERR_BADFILE
;
1830 IDirectXFileData_Release(data
);
1835 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
1836 if (hr
== DXFILEERR_NOMOREOBJECTS
)
1838 TRACE("No more object\n");
1841 else if (hr
!= DXFILE_OK
)
1843 ret
= D3DRMERR_BADFILE
;
1847 ret
= load_data(iface
, data
, iids
, iid_count
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1848 if (ret
!= D3DRM_OK
)
1851 IDirectXFileData_Release(data
);
1859 IDirectXFileData_Release(data
);
1861 IDirectXFileEnumObject_Release(enum_object
);
1863 IDirectXFile_Release(file
);
1868 static HRESULT WINAPI
d3drm3_Tick(IDirect3DRM3
*iface
, D3DVALUE tick
)
1870 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1875 static HRESULT WINAPI
d3drm3_CreateProgressiveMesh(IDirect3DRM3
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1877 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1882 static HRESULT WINAPI
d3drm3_RegisterClient(IDirect3DRM3
*iface
, REFGUID guid
, DWORD
*id
)
1884 FIXME("iface %p, guid %s, id %p stub!\n", iface
, debugstr_guid(guid
), id
);
1889 static HRESULT WINAPI
d3drm3_UnregisterClient(IDirect3DRM3
*iface
, REFGUID guid
)
1891 FIXME("iface %p, guid %s stub!\n", iface
, debugstr_guid(guid
));
1896 static HRESULT WINAPI
d3drm3_CreateClippedVisual(IDirect3DRM3
*iface
,
1897 IDirect3DRMVisual
*visual
, IDirect3DRMClippedVisual
**clipped_visual
)
1899 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface
, visual
, clipped_visual
);
1904 static HRESULT WINAPI
d3drm3_SetOptions(IDirect3DRM3
*iface
, DWORD flags
)
1906 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
1911 static HRESULT WINAPI
d3drm3_GetOptions(IDirect3DRM3
*iface
, DWORD
*flags
)
1913 FIXME("iface %p, flags %p stub!\n", iface
, flags
);
1918 static const struct IDirect3DRM3Vtbl d3drm3_vtbl
=
1920 d3drm3_QueryInterface
,
1923 d3drm3_CreateObject
,
1926 d3drm3_CreateMeshBuilder
,
1928 d3drm3_CreateAnimation
,
1929 d3drm3_CreateAnimationSet
,
1930 d3drm3_CreateTexture
,
1932 d3drm3_CreateLightRGB
,
1933 d3drm3_CreateMaterial
,
1934 d3drm3_CreateDevice
,
1935 d3drm3_CreateDeviceFromSurface
,
1936 d3drm3_CreateDeviceFromD3D
,
1937 d3drm3_CreateDeviceFromClipper
,
1938 d3drm3_CreateTextureFromSurface
,
1939 d3drm3_CreateShadow
,
1940 d3drm3_CreateViewport
,
1942 d3drm3_CreateUserVisual
,
1944 d3drm3_LoadTextureFromResource
,
1945 d3drm3_SetSearchPath
,
1946 d3drm3_AddSearchPath
,
1947 d3drm3_GetSearchPath
,
1948 d3drm3_SetDefaultTextureColors
,
1949 d3drm3_SetDefaultTextureShades
,
1951 d3drm3_GetNamedObject
,
1952 d3drm3_EnumerateObjects
,
1955 d3drm3_CreateProgressiveMesh
,
1956 d3drm3_RegisterClient
,
1957 d3drm3_UnregisterClient
,
1958 d3drm3_CreateClippedVisual
,
1963 HRESULT WINAPI
Direct3DRMCreate(IDirect3DRM
**d3drm
)
1965 struct d3drm
*object
;
1967 TRACE("d3drm %p.\n", d3drm
);
1969 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1970 return E_OUTOFMEMORY
;
1972 object
->IDirect3DRM_iface
.lpVtbl
= &d3drm1_vtbl
;
1973 object
->IDirect3DRM2_iface
.lpVtbl
= &d3drm2_vtbl
;
1974 object
->IDirect3DRM3_iface
.lpVtbl
= &d3drm3_vtbl
;
1976 object
->iface_count
= 1;
1978 *d3drm
= &object
->IDirect3DRM_iface
;
1983 HRESULT WINAPI
DllCanUnloadNow(void)
1988 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, void **ppv
)
1990 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
1993 return E_INVALIDARG
;
1995 return CLASS_E_CLASSNOTAVAILABLE
;