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";
54 static HRESULT
d3drm_create_texture_object(void **object
, IDirect3DRM
*d3drm
)
56 struct d3drm_texture
*texture
;
59 if (FAILED(hr
= d3drm_texture_create(&texture
, d3drm
)))
62 *object
= &texture
->IDirect3DRMTexture_iface
;
67 static HRESULT
d3drm_create_device_object(void **object
, IDirect3DRM
*d3drm
)
69 struct d3drm_device
*device
;
72 if (FAILED(hr
= d3drm_device_create(&device
, d3drm
)))
75 *object
= &device
->IDirect3DRMDevice_iface
;
82 IDirect3DRM IDirect3DRM_iface
;
83 IDirect3DRM2 IDirect3DRM2_iface
;
84 IDirect3DRM3 IDirect3DRM3_iface
;
85 LONG ref1
, ref2
, ref3
, iface_count
;
88 static inline struct d3drm
*impl_from_IDirect3DRM(IDirect3DRM
*iface
)
90 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM_iface
);
93 static inline struct d3drm
*impl_from_IDirect3DRM2(IDirect3DRM2
*iface
)
95 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM2_iface
);
98 static inline struct d3drm
*impl_from_IDirect3DRM3(IDirect3DRM3
*iface
)
100 return CONTAINING_RECORD(iface
, struct d3drm
, IDirect3DRM3_iface
);
103 static void d3drm_destroy(struct d3drm
*d3drm
)
105 HeapFree(GetProcessHeap(), 0, d3drm
);
106 TRACE("d3drm object %p is being destroyed.\n", d3drm
);
109 static HRESULT WINAPI
d3drm1_QueryInterface(IDirect3DRM
*iface
, REFIID riid
, void **out
)
111 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
113 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
115 if (IsEqualGUID(riid
, &IID_IDirect3DRM
)
116 || IsEqualGUID(riid
, &IID_IUnknown
))
118 *out
= &d3drm
->IDirect3DRM_iface
;
120 else if (IsEqualGUID(riid
, &IID_IDirect3DRM2
))
122 *out
= &d3drm
->IDirect3DRM2_iface
;
124 else if (IsEqualGUID(riid
, &IID_IDirect3DRM3
))
126 *out
= &d3drm
->IDirect3DRM3_iface
;
131 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
132 return CLASS_E_CLASSNOTAVAILABLE
;
135 IUnknown_AddRef((IUnknown
*)*out
);
139 static ULONG WINAPI
d3drm1_AddRef(IDirect3DRM
*iface
)
141 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
142 ULONG refcount
= InterlockedIncrement(&d3drm
->ref1
);
144 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
147 InterlockedIncrement(&d3drm
->iface_count
);
152 static ULONG WINAPI
d3drm1_Release(IDirect3DRM
*iface
)
154 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
155 ULONG refcount
= InterlockedDecrement(&d3drm
->ref1
);
157 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
159 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
160 d3drm_destroy(d3drm
);
165 static HRESULT WINAPI
d3drm1_CreateObject(IDirect3DRM
*iface
,
166 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
168 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
170 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
171 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
173 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
176 static HRESULT WINAPI
d3drm1_CreateFrame(IDirect3DRM
*iface
,
177 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame
**frame
)
179 struct d3drm_frame
*object
;
182 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
184 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, iface
)))
187 *frame
= &object
->IDirect3DRMFrame_iface
;
192 static HRESULT WINAPI
d3drm1_CreateMesh(IDirect3DRM
*iface
, IDirect3DRMMesh
**mesh
)
194 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
196 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
198 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
201 static HRESULT WINAPI
d3drm1_CreateMeshBuilder(IDirect3DRM
*iface
, IDirect3DRMMeshBuilder
**mesh_builder
)
203 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
205 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder
, (IUnknown
**)mesh_builder
);
208 static HRESULT WINAPI
d3drm1_CreateFace(IDirect3DRM
*iface
, IDirect3DRMFace
**face
)
210 TRACE("iface %p, face %p.\n", iface
, face
);
212 return Direct3DRMFace_create(&IID_IDirect3DRMFace
, (IUnknown
**)face
);
215 static HRESULT WINAPI
d3drm1_CreateAnimation(IDirect3DRM
*iface
, IDirect3DRMAnimation
**animation
)
217 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
222 static HRESULT WINAPI
d3drm1_CreateAnimationSet(IDirect3DRM
*iface
, IDirect3DRMAnimationSet
**set
)
224 FIXME("iface %p, set %p stub!\n", iface
, set
);
229 static HRESULT WINAPI
d3drm1_CreateTexture(IDirect3DRM
*iface
,
230 D3DRMIMAGE
*image
, IDirect3DRMTexture
**texture
)
232 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
233 IDirect3DRMTexture3
*texture3
;
236 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
239 return D3DRMERR_BADVALUE
;
241 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
247 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture
, (void **)texture
);
248 IDirect3DRMTexture3_Release(texture3
);
253 static HRESULT WINAPI
d3drm1_CreateLight(IDirect3DRM
*iface
,
254 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
256 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
258 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
260 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
263 static HRESULT WINAPI
d3drm1_CreateLightRGB(IDirect3DRM
*iface
, D3DRMLIGHTTYPE type
,
264 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
266 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
268 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
269 iface
, type
, red
, green
, blue
, light
);
271 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
274 static HRESULT WINAPI
d3drm1_CreateMaterial(IDirect3DRM
*iface
,
275 D3DVALUE power
, IDirect3DRMMaterial
**material
)
277 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
279 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
281 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
284 static HRESULT WINAPI
d3drm1_CreateDevice(IDirect3DRM
*iface
,
285 DWORD width
, DWORD height
, IDirect3DRMDevice
**device
)
287 struct d3drm_device
*object
;
290 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
292 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
295 *device
= &object
->IDirect3DRMDevice_iface
;
300 static HRESULT WINAPI
d3drm1_CreateDeviceFromSurface(IDirect3DRM
*iface
, GUID
*guid
,
301 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice
**device
)
303 struct d3drm_device
*object
;
306 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
307 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
310 return D3DRMERR_BADVALUE
;
313 if (!backbuffer
|| !ddraw
)
314 return D3DRMERR_BADDEVICE
;
316 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
319 if (SUCCEEDED(hr
= d3drm_device_init(object
, 1, ddraw
, backbuffer
, TRUE
)))
320 *device
= &object
->IDirect3DRMDevice_iface
;
322 d3drm_device_destroy(object
);
327 static HRESULT WINAPI
d3drm1_CreateDeviceFromD3D(IDirect3DRM
*iface
,
328 IDirect3D
*d3d
, IDirect3DDevice
*d3d_device
, IDirect3DRMDevice
**device
)
330 struct d3drm_device
*object
;
332 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
333 iface
, d3d
, d3d_device
, device
);
336 return D3DRMERR_BADVALUE
;
339 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
342 if (FAILED(hr
= IDirect3DRMDevice_InitFromD3D(&object
->IDirect3DRMDevice_iface
, d3d
, d3d_device
)))
344 d3drm_device_destroy(object
);
347 *device
= &object
->IDirect3DRMDevice_iface
;
352 static HRESULT WINAPI
d3drm1_CreateDeviceFromClipper(IDirect3DRM
*iface
,
353 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
354 IDirect3DRMDevice
**device
)
356 struct d3drm_device
*object
;
358 IDirectDrawSurface
*render_target
;
361 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
362 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
365 return D3DRMERR_BADVALUE
;
368 if (!clipper
|| !width
|| !height
)
369 return D3DRMERR_BADVALUE
;
371 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
375 if (FAILED(hr
= d3drm_device_create(&object
, iface
)))
377 IDirectDraw_Release(ddraw
);
381 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
384 IDirectDraw_Release(ddraw
);
385 d3drm_device_destroy(object
);
389 hr
= d3drm_device_init(object
, 1, ddraw
, render_target
, TRUE
);
390 IDirectDraw_Release(ddraw
);
391 IDirectDrawSurface_Release(render_target
);
393 d3drm_device_destroy(object
);
395 *device
= &object
->IDirect3DRMDevice_iface
;
400 static HRESULT WINAPI
d3drm1_CreateTextureFromSurface(IDirect3DRM
*iface
,
401 IDirectDrawSurface
*surface
, IDirect3DRMTexture
**texture
)
403 FIXME("iface %p, surface %p, texture %p stub!\n", iface
, surface
, texture
);
408 static HRESULT WINAPI
d3drm1_CreateShadow(IDirect3DRM
*iface
, IDirect3DRMVisual
*visual
,
409 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
410 IDirect3DRMVisual
**shadow
)
412 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
413 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
418 static HRESULT WINAPI
d3drm1_CreateViewport(IDirect3DRM
*iface
, IDirect3DRMDevice
*device
,
419 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
421 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
423 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
424 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
426 return IDirect3DRM2_CreateViewport(&d3drm
->IDirect3DRM2_iface
, device
, camera
, x
, y
, width
, height
, viewport
);
429 static HRESULT WINAPI
d3drm1_CreateWrap(IDirect3DRM
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
430 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
431 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
432 IDirect3DRMWrap
**wrap
)
434 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
435 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
436 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
441 static HRESULT WINAPI
d3drm1_CreateUserVisual(IDirect3DRM
*iface
,
442 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
444 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface
, cb
, ctx
, visual
);
449 static HRESULT WINAPI
d3drm1_LoadTexture(IDirect3DRM
*iface
,
450 const char *filename
, IDirect3DRMTexture
**texture
)
452 struct d3drm_texture
*object
;
455 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
457 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
460 *texture
= &object
->IDirect3DRMTexture_iface
;
465 static HRESULT WINAPI
d3drm1_LoadTextureFromResource(IDirect3DRM
*iface
,
466 HRSRC resource
, IDirect3DRMTexture
**texture
)
468 struct d3drm_texture
*object
;
471 FIXME("iface %p, resource %p, texture %p stub!\n", iface
, resource
, texture
);
473 if (FAILED(hr
= d3drm_texture_create(&object
, iface
)))
476 *texture
= &object
->IDirect3DRMTexture_iface
;
481 static HRESULT WINAPI
d3drm1_SetSearchPath(IDirect3DRM
*iface
, const char *path
)
483 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
488 static HRESULT WINAPI
d3drm1_AddSearchPath(IDirect3DRM
*iface
, const char *path
)
490 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
495 static HRESULT WINAPI
d3drm1_GetSearchPath(IDirect3DRM
*iface
, DWORD
*size
, char *path
)
497 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
502 static HRESULT WINAPI
d3drm1_SetDefaultTextureColors(IDirect3DRM
*iface
, DWORD color_count
)
504 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
509 static HRESULT WINAPI
d3drm1_SetDefaultTextureShades(IDirect3DRM
*iface
, DWORD shade_count
)
511 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
516 static HRESULT WINAPI
d3drm1_GetDevices(IDirect3DRM
*iface
, IDirect3DRMDeviceArray
**array
)
518 FIXME("iface %p, array %p stub!\n", iface
, array
);
523 static HRESULT WINAPI
d3drm1_GetNamedObject(IDirect3DRM
*iface
,
524 const char *name
, IDirect3DRMObject
**object
)
526 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
531 static HRESULT WINAPI
d3drm1_EnumerateObjects(IDirect3DRM
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
533 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
538 static HRESULT WINAPI
d3drm1_Load(IDirect3DRM
*iface
, void *source
, void *object_id
, IID
**iids
,
539 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
540 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
542 struct d3drm
*d3drm
= impl_from_IDirect3DRM(iface
);
543 IDirect3DRMFrame3
*parent_frame3
= NULL
;
544 HRESULT hr
= D3DRM_OK
;
546 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
547 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
548 iface
, source
, object_id
, iids
, iid_count
, flags
,
549 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
552 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
554 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
555 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
557 IDirect3DRMFrame3_Release(parent_frame3
);
562 static HRESULT WINAPI
d3drm1_Tick(IDirect3DRM
*iface
, D3DVALUE tick
)
564 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
569 static const struct IDirect3DRMVtbl d3drm1_vtbl
=
571 d3drm1_QueryInterface
,
577 d3drm1_CreateMeshBuilder
,
579 d3drm1_CreateAnimation
,
580 d3drm1_CreateAnimationSet
,
581 d3drm1_CreateTexture
,
583 d3drm1_CreateLightRGB
,
584 d3drm1_CreateMaterial
,
586 d3drm1_CreateDeviceFromSurface
,
587 d3drm1_CreateDeviceFromD3D
,
588 d3drm1_CreateDeviceFromClipper
,
589 d3drm1_CreateTextureFromSurface
,
591 d3drm1_CreateViewport
,
593 d3drm1_CreateUserVisual
,
595 d3drm1_LoadTextureFromResource
,
596 d3drm1_SetSearchPath
,
597 d3drm1_AddSearchPath
,
598 d3drm1_GetSearchPath
,
599 d3drm1_SetDefaultTextureColors
,
600 d3drm1_SetDefaultTextureShades
,
602 d3drm1_GetNamedObject
,
603 d3drm1_EnumerateObjects
,
608 static HRESULT WINAPI
d3drm2_QueryInterface(IDirect3DRM2
*iface
, REFIID riid
, void **out
)
610 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
612 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
615 static ULONG WINAPI
d3drm2_AddRef(IDirect3DRM2
*iface
)
617 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
618 ULONG refcount
= InterlockedIncrement(&d3drm
->ref2
);
620 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
623 InterlockedIncrement(&d3drm
->iface_count
);
628 static ULONG WINAPI
d3drm2_Release(IDirect3DRM2
*iface
)
630 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
631 ULONG refcount
= InterlockedDecrement(&d3drm
->ref2
);
633 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
635 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
636 d3drm_destroy(d3drm
);
641 static HRESULT WINAPI
d3drm2_CreateObject(IDirect3DRM2
*iface
,
642 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
644 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
646 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
647 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
649 return IDirect3DRM3_CreateObject(&d3drm
->IDirect3DRM3_iface
, clsid
, outer
, iid
, out
);
652 static HRESULT WINAPI
d3drm2_CreateFrame(IDirect3DRM2
*iface
,
653 IDirect3DRMFrame
*parent_frame
, IDirect3DRMFrame2
**frame
)
655 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
656 struct d3drm_frame
*object
;
659 TRACE("iface %p, parent_frame %p, frame %p.\n", iface
, parent_frame
, frame
);
661 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent_frame
, &d3drm
->IDirect3DRM_iface
)))
664 *frame
= &object
->IDirect3DRMFrame2_iface
;
669 static HRESULT WINAPI
d3drm2_CreateMesh(IDirect3DRM2
*iface
, IDirect3DRMMesh
**mesh
)
671 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
673 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
675 return IDirect3DRM3_CreateMesh(&d3drm
->IDirect3DRM3_iface
, mesh
);
678 static HRESULT WINAPI
d3drm2_CreateMeshBuilder(IDirect3DRM2
*iface
, IDirect3DRMMeshBuilder2
**mesh_builder
)
680 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
682 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder2
, (IUnknown
**)mesh_builder
);
685 static HRESULT WINAPI
d3drm2_CreateFace(IDirect3DRM2
*iface
, IDirect3DRMFace
**face
)
687 TRACE("iface %p, face %p.\n", iface
, face
);
689 return Direct3DRMFace_create(&IID_IDirect3DRMFace
, (IUnknown
**)face
);
692 static HRESULT WINAPI
d3drm2_CreateAnimation(IDirect3DRM2
*iface
, IDirect3DRMAnimation
**animation
)
694 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
699 static HRESULT WINAPI
d3drm2_CreateAnimationSet(IDirect3DRM2
*iface
, IDirect3DRMAnimationSet
**set
)
701 FIXME("iface %p, set %p stub!\n", iface
, set
);
706 static HRESULT WINAPI
d3drm2_CreateTexture(IDirect3DRM2
*iface
,
707 D3DRMIMAGE
*image
, IDirect3DRMTexture2
**texture
)
709 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
710 IDirect3DRMTexture3
*texture3
;
713 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
716 return D3DRMERR_BADVALUE
;
718 if (FAILED(hr
= IDirect3DRM3_CreateTexture(&d3drm
->IDirect3DRM3_iface
, image
, &texture3
)))
724 hr
= IDirect3DRMTexture3_QueryInterface(texture3
, &IID_IDirect3DRMTexture2
, (void **)texture
);
725 IDirect3DRMTexture3_Release(texture3
);
730 static HRESULT WINAPI
d3drm2_CreateLight(IDirect3DRM2
*iface
,
731 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
733 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
735 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface
, type
, color
, light
);
737 return IDirect3DRM3_CreateLight(&d3drm
->IDirect3DRM3_iface
, type
, color
, light
);
740 static HRESULT WINAPI
d3drm2_CreateLightRGB(IDirect3DRM2
*iface
, D3DRMLIGHTTYPE type
,
741 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
743 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
745 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
746 iface
, type
, red
, green
, blue
, light
);
748 return IDirect3DRM3_CreateLightRGB(&d3drm
->IDirect3DRM3_iface
, type
, red
, green
, blue
, light
);
751 static HRESULT WINAPI
d3drm2_CreateMaterial(IDirect3DRM2
*iface
,
752 D3DVALUE power
, IDirect3DRMMaterial
**material
)
754 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
756 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
758 return IDirect3DRM3_CreateMaterial(&d3drm
->IDirect3DRM3_iface
, power
, (IDirect3DRMMaterial2
**)material
);
761 static HRESULT WINAPI
d3drm2_CreateDevice(IDirect3DRM2
*iface
,
762 DWORD width
, DWORD height
, IDirect3DRMDevice2
**device
)
764 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
765 struct d3drm_device
*object
;
768 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
770 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
773 *device
= &object
->IDirect3DRMDevice2_iface
;
778 static HRESULT WINAPI
d3drm2_CreateDeviceFromSurface(IDirect3DRM2
*iface
, GUID
*guid
,
779 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, IDirect3DRMDevice2
**device
)
781 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
782 IDirect3DRMDevice3
*device3
;
784 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
785 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, device
);
788 return D3DRMERR_BADVALUE
;
790 hr
= IDirect3DRM3_CreateDeviceFromSurface(&d3drm
->IDirect3DRM3_iface
, guid
, ddraw
, backbuffer
, 0, &device3
);
794 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
795 IDirect3DRMDevice3_Release(device3
);
800 static HRESULT WINAPI
d3drm2_CreateDeviceFromD3D(IDirect3DRM2
*iface
,
801 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice2
**device
)
803 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
804 IDirect3DRMDevice3
*device3
;
807 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
808 iface
, d3d
, d3d_device
, device
);
811 return D3DRMERR_BADVALUE
;
814 hr
= IDirect3DRM3_CreateDeviceFromD3D(&d3drm
->IDirect3DRM3_iface
, d3d
, d3d_device
, &device3
);
818 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void **)device
);
819 IDirect3DRMDevice3_Release(device3
);
824 static HRESULT WINAPI
d3drm2_CreateDeviceFromClipper(IDirect3DRM2
*iface
,
825 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
826 IDirect3DRMDevice2
**device
)
828 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
829 IDirect3DRMDevice3
*device3
;
832 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
833 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
836 return D3DRMERR_BADVALUE
;
838 hr
= IDirect3DRM3_CreateDeviceFromClipper(&d3drm
->IDirect3DRM3_iface
, clipper
, guid
, width
, height
, &device3
);
842 hr
= IDirect3DRMDevice3_QueryInterface(device3
, &IID_IDirect3DRMDevice2
, (void**)device
);
843 IDirect3DRMDevice3_Release(device3
);
848 static HRESULT WINAPI
d3drm2_CreateTextureFromSurface(IDirect3DRM2
*iface
,
849 IDirectDrawSurface
*surface
, IDirect3DRMTexture2
**texture
)
851 FIXME("iface %p, surface %p, texture %p stub!\n", iface
, surface
, texture
);
856 static HRESULT WINAPI
d3drm2_CreateShadow(IDirect3DRM2
*iface
, IDirect3DRMVisual
*visual
,
857 IDirect3DRMLight
*light
, D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
,
858 IDirect3DRMVisual
**shadow
)
860 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
861 iface
, visual
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
866 static HRESULT WINAPI
d3drm2_CreateViewport(IDirect3DRM2
*iface
, IDirect3DRMDevice
*device
,
867 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport
**viewport
)
869 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
870 struct d3drm_viewport
*object
;
873 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
874 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
876 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
879 *viewport
= &object
->IDirect3DRMViewport_iface
;
884 static HRESULT WINAPI
d3drm2_CreateWrap(IDirect3DRM2
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame
*frame
,
885 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
886 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
887 IDirect3DRMWrap
**wrap
)
889 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
890 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
891 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
896 static HRESULT WINAPI
d3drm2_CreateUserVisual(IDirect3DRM2
*iface
,
897 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
899 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
904 static HRESULT WINAPI
d3drm2_LoadTexture(IDirect3DRM2
*iface
,
905 const char *filename
, IDirect3DRMTexture2
**texture
)
907 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
908 struct d3drm_texture
*object
;
911 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
913 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
916 *texture
= &object
->IDirect3DRMTexture2_iface
;
921 static HRESULT WINAPI
d3drm2_LoadTextureFromResource(IDirect3DRM2
*iface
, HMODULE module
,
922 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture2
**texture
)
924 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
925 struct d3drm_texture
*object
;
928 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
929 iface
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
931 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
934 *texture
= &object
->IDirect3DRMTexture2_iface
;
939 static HRESULT WINAPI
d3drm2_SetSearchPath(IDirect3DRM2
*iface
, const char *path
)
941 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
946 static HRESULT WINAPI
d3drm2_AddSearchPath(IDirect3DRM2
*iface
, const char *path
)
948 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
953 static HRESULT WINAPI
d3drm2_GetSearchPath(IDirect3DRM2
*iface
, DWORD
*size
, char *path
)
955 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
960 static HRESULT WINAPI
d3drm2_SetDefaultTextureColors(IDirect3DRM2
*iface
, DWORD color_count
)
962 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
967 static HRESULT WINAPI
d3drm2_SetDefaultTextureShades(IDirect3DRM2
*iface
, DWORD shade_count
)
969 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
974 static HRESULT WINAPI
d3drm2_GetDevices(IDirect3DRM2
*iface
, IDirect3DRMDeviceArray
**array
)
976 FIXME("iface %p, array %p stub!\n", iface
, array
);
981 static HRESULT WINAPI
d3drm2_GetNamedObject(IDirect3DRM2
*iface
,
982 const char *name
, IDirect3DRMObject
**object
)
984 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
989 static HRESULT WINAPI
d3drm2_EnumerateObjects(IDirect3DRM2
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
991 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
996 static HRESULT WINAPI
d3drm2_Load(IDirect3DRM2
*iface
, void *source
, void *object_id
, IID
**iids
,
997 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
998 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame
*parent_frame
)
1000 struct d3drm
*d3drm
= impl_from_IDirect3DRM2(iface
);
1001 IDirect3DRMFrame3
*parent_frame3
= NULL
;
1002 HRESULT hr
= D3DRM_OK
;
1004 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1005 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1006 iface
, source
, object_id
, iids
, iid_count
, flags
,
1007 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1010 hr
= IDirect3DRMFrame_QueryInterface(parent_frame
, &IID_IDirect3DRMFrame3
, (void **)&parent_frame3
);
1012 hr
= IDirect3DRM3_Load(&d3drm
->IDirect3DRM3_iface
, source
, object_id
, iids
, iid_count
,
1013 flags
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame3
);
1015 IDirect3DRMFrame3_Release(parent_frame3
);
1020 static HRESULT WINAPI
d3drm2_Tick(IDirect3DRM2
*iface
, D3DVALUE tick
)
1022 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1027 static HRESULT WINAPI
d3drm2_CreateProgressiveMesh(IDirect3DRM2
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1029 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1034 static const struct IDirect3DRM2Vtbl d3drm2_vtbl
=
1036 d3drm2_QueryInterface
,
1039 d3drm2_CreateObject
,
1042 d3drm2_CreateMeshBuilder
,
1044 d3drm2_CreateAnimation
,
1045 d3drm2_CreateAnimationSet
,
1046 d3drm2_CreateTexture
,
1048 d3drm2_CreateLightRGB
,
1049 d3drm2_CreateMaterial
,
1050 d3drm2_CreateDevice
,
1051 d3drm2_CreateDeviceFromSurface
,
1052 d3drm2_CreateDeviceFromD3D
,
1053 d3drm2_CreateDeviceFromClipper
,
1054 d3drm2_CreateTextureFromSurface
,
1055 d3drm2_CreateShadow
,
1056 d3drm2_CreateViewport
,
1058 d3drm2_CreateUserVisual
,
1060 d3drm2_LoadTextureFromResource
,
1061 d3drm2_SetSearchPath
,
1062 d3drm2_AddSearchPath
,
1063 d3drm2_GetSearchPath
,
1064 d3drm2_SetDefaultTextureColors
,
1065 d3drm2_SetDefaultTextureShades
,
1067 d3drm2_GetNamedObject
,
1068 d3drm2_EnumerateObjects
,
1071 d3drm2_CreateProgressiveMesh
,
1074 static HRESULT WINAPI
d3drm3_QueryInterface(IDirect3DRM3
*iface
, REFIID riid
, void **out
)
1076 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1078 return d3drm1_QueryInterface(&d3drm
->IDirect3DRM_iface
, riid
, out
);
1081 static ULONG WINAPI
d3drm3_AddRef(IDirect3DRM3
*iface
)
1083 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1084 ULONG refcount
= InterlockedIncrement(&d3drm
->ref3
);
1086 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
1089 InterlockedIncrement(&d3drm
->iface_count
);
1094 static ULONG WINAPI
d3drm3_Release(IDirect3DRM3
*iface
)
1096 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1097 ULONG refcount
= InterlockedDecrement(&d3drm
->ref3
);
1099 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
1101 if (!refcount
&& !InterlockedDecrement(&d3drm
->iface_count
))
1102 d3drm_destroy(d3drm
);
1107 static HRESULT WINAPI
d3drm3_CreateObject(IDirect3DRM3
*iface
,
1108 REFCLSID clsid
, IUnknown
*outer
, REFIID iid
, void **out
)
1110 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1118 HRESULT (*create_object
)(void **object
, IDirect3DRM
*d3drm
);
1122 {&CLSID_CDirect3DRMTexture
, d3drm_create_texture_object
},
1123 {&CLSID_CDirect3DRMDevice
, d3drm_create_device_object
},
1126 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1127 iface
, debugstr_guid(clsid
), outer
, debugstr_guid(iid
), out
);
1130 return D3DRMERR_BADVALUE
;
1135 return D3DRMERR_BADVALUE
;
1140 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer
);
1145 for (i
= 0; i
< ARRAY_SIZE(object_table
); ++i
)
1147 if (IsEqualGUID(clsid
, object_table
[i
].clsid
))
1149 if (FAILED(hr
= object_table
[i
].create_object((void **)&object
, &d3drm
->IDirect3DRM_iface
)))
1157 if (i
== ARRAY_SIZE(object_table
))
1159 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid
));
1161 return CLASSFACTORY_E_FIRST
;
1164 if (FAILED(hr
= IUnknown_QueryInterface(object
, iid
, out
)))
1166 IUnknown_Release(object
);
1171 static HRESULT WINAPI
d3drm3_CreateFrame(IDirect3DRM3
*iface
,
1172 IDirect3DRMFrame3
*parent
, IDirect3DRMFrame3
**frame
)
1174 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1175 struct d3drm_frame
*object
;
1178 TRACE("iface %p, parent %p, frame %p.\n", iface
, parent
, frame
);
1180 if (FAILED(hr
= d3drm_frame_create(&object
, (IUnknown
*)parent
, &d3drm
->IDirect3DRM_iface
)))
1183 *frame
= &object
->IDirect3DRMFrame3_iface
;
1188 static HRESULT WINAPI
d3drm3_CreateMesh(IDirect3DRM3
*iface
, IDirect3DRMMesh
**mesh
)
1190 TRACE("iface %p, mesh %p.\n", iface
, mesh
);
1192 return Direct3DRMMesh_create(mesh
);
1195 static HRESULT WINAPI
d3drm3_CreateMeshBuilder(IDirect3DRM3
*iface
, IDirect3DRMMeshBuilder3
**mesh_builder
)
1197 TRACE("iface %p, mesh_builder %p.\n", iface
, mesh_builder
);
1199 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder3
, (IUnknown
**)mesh_builder
);
1202 static HRESULT WINAPI
d3drm3_CreateFace(IDirect3DRM3
*iface
, IDirect3DRMFace2
**face
)
1204 TRACE("iface %p, face %p.\n", iface
, face
);
1206 return Direct3DRMFace_create(&IID_IDirect3DRMFace2
, (IUnknown
**)face
);
1209 static HRESULT WINAPI
d3drm3_CreateAnimation(IDirect3DRM3
*iface
, IDirect3DRMAnimation2
**animation
)
1211 FIXME("iface %p, animation %p stub!\n", iface
, animation
);
1216 static HRESULT WINAPI
d3drm3_CreateAnimationSet(IDirect3DRM3
*iface
, IDirect3DRMAnimationSet2
**set
)
1218 FIXME("iface %p, set %p stub!\n", iface
, set
);
1223 static HRESULT WINAPI
d3drm3_CreateTexture(IDirect3DRM3
*iface
,
1224 D3DRMIMAGE
*image
, IDirect3DRMTexture3
**texture
)
1226 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1227 struct d3drm_texture
*object
;
1230 TRACE("iface %p, image %p, texture %p.\n", iface
, image
, texture
);
1233 return D3DRMERR_BADVALUE
;
1235 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1238 *texture
= &object
->IDirect3DRMTexture3_iface
;
1240 if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture
, image
)))
1242 IDirect3DRMTexture3_Release(*texture
);
1244 return D3DRMERR_BADVALUE
;
1250 static HRESULT WINAPI
d3drm3_CreateLight(IDirect3DRM3
*iface
,
1251 D3DRMLIGHTTYPE type
, D3DCOLOR color
, IDirect3DRMLight
**light
)
1255 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface
, type
, color
, light
);
1257 if (SUCCEEDED(hr
= Direct3DRMLight_create((IUnknown
**)light
)))
1259 IDirect3DRMLight_SetType(*light
, type
);
1260 IDirect3DRMLight_SetColor(*light
, color
);
1266 static HRESULT WINAPI
d3drm3_CreateLightRGB(IDirect3DRM3
*iface
, D3DRMLIGHTTYPE type
,
1267 D3DVALUE red
, D3DVALUE green
, D3DVALUE blue
, IDirect3DRMLight
**light
)
1271 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1272 iface
, type
, red
, green
, blue
, light
);
1274 if (SUCCEEDED(hr
= Direct3DRMLight_create((IUnknown
**)light
)))
1276 IDirect3DRMLight_SetType(*light
, type
);
1277 IDirect3DRMLight_SetColorRGB(*light
, red
, green
, blue
);
1283 static HRESULT WINAPI
d3drm3_CreateMaterial(IDirect3DRM3
*iface
,
1284 D3DVALUE power
, IDirect3DRMMaterial2
**material
)
1288 TRACE("iface %p, power %.8e, material %p.\n", iface
, power
, material
);
1290 if (SUCCEEDED(hr
= Direct3DRMMaterial_create(material
)))
1291 IDirect3DRMMaterial2_SetPower(*material
, power
);
1296 static HRESULT WINAPI
d3drm3_CreateDevice(IDirect3DRM3
*iface
,
1297 DWORD width
, DWORD height
, IDirect3DRMDevice3
**device
)
1299 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1300 struct d3drm_device
*object
;
1303 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface
, width
, height
, device
);
1305 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1308 *device
= &object
->IDirect3DRMDevice3_iface
;
1313 static HRESULT WINAPI
d3drm3_CreateDeviceFromSurface(IDirect3DRM3
*iface
, GUID
*guid
,
1314 IDirectDraw
*ddraw
, IDirectDrawSurface
*backbuffer
, DWORD flags
, IDirect3DRMDevice3
**device
)
1316 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1317 struct d3drm_device
*object
;
1321 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1322 iface
, debugstr_guid(guid
), ddraw
, backbuffer
, flags
, device
);
1325 return D3DRMERR_BADVALUE
;
1328 if (!backbuffer
|| !ddraw
)
1329 return D3DRMERR_BADDEVICE
;
1331 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1334 use_z_surface
= !(flags
& D3DRMDEVICE_NOZBUFFER
);
1336 if (SUCCEEDED(hr
= d3drm_device_init(object
, 3, ddraw
, backbuffer
, use_z_surface
)))
1337 *device
= &object
->IDirect3DRMDevice3_iface
;
1339 d3drm_device_destroy(object
);
1344 static HRESULT WINAPI
d3drm3_CreateDeviceFromD3D(IDirect3DRM3
*iface
,
1345 IDirect3D2
*d3d
, IDirect3DDevice2
*d3d_device
, IDirect3DRMDevice3
**device
)
1347 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1348 struct d3drm_device
*object
;
1351 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1352 iface
, d3d
, d3d_device
, device
);
1355 return D3DRMERR_BADVALUE
;
1358 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1361 if (FAILED(hr
= IDirect3DRMDevice3_InitFromD3D2(&object
->IDirect3DRMDevice3_iface
, d3d
, d3d_device
)))
1363 d3drm_device_destroy(object
);
1366 *device
= &object
->IDirect3DRMDevice3_iface
;
1371 static HRESULT WINAPI
d3drm3_CreateDeviceFromClipper(IDirect3DRM3
*iface
,
1372 IDirectDrawClipper
*clipper
, GUID
*guid
, int width
, int height
,
1373 IDirect3DRMDevice3
**device
)
1375 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1376 struct d3drm_device
*object
;
1378 IDirectDrawSurface
*render_target
;
1381 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1382 iface
, clipper
, debugstr_guid(guid
), width
, height
, device
);
1385 return D3DRMERR_BADVALUE
;
1388 if (!clipper
|| !width
|| !height
)
1389 return D3DRMERR_BADVALUE
;
1391 hr
= DirectDrawCreate(NULL
, &ddraw
, NULL
);
1395 if (FAILED(hr
= d3drm_device_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1397 IDirectDraw_Release(ddraw
);
1401 hr
= d3drm_device_create_surfaces_from_clipper(object
, ddraw
, clipper
, width
, height
, &render_target
);
1404 IDirectDraw_Release(ddraw
);
1405 d3drm_device_destroy(object
);
1409 hr
= d3drm_device_init(object
, 3, ddraw
, render_target
, TRUE
);
1410 IDirectDraw_Release(ddraw
);
1411 IDirectDrawSurface_Release(render_target
);
1413 d3drm_device_destroy(object
);
1415 *device
= &object
->IDirect3DRMDevice3_iface
;
1420 static HRESULT WINAPI
d3drm3_CreateShadow(IDirect3DRM3
*iface
, IUnknown
*object
, IDirect3DRMLight
*light
,
1421 D3DVALUE px
, D3DVALUE py
, D3DVALUE pz
, D3DVALUE nx
, D3DVALUE ny
, D3DVALUE nz
, IDirect3DRMShadow2
**shadow
)
1423 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1424 iface
, object
, light
, px
, py
, pz
, nx
, ny
, nz
, shadow
);
1429 static HRESULT WINAPI
d3drm3_CreateTextureFromSurface(IDirect3DRM3
*iface
,
1430 IDirectDrawSurface
*surface
, IDirect3DRMTexture3
**texture
)
1432 FIXME("iface %p, surface %p, texture %p stub!\n", iface
, surface
, texture
);
1437 static HRESULT WINAPI
d3drm3_CreateViewport(IDirect3DRM3
*iface
, IDirect3DRMDevice3
*device
,
1438 IDirect3DRMFrame3
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
, IDirect3DRMViewport2
**viewport
)
1440 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1441 struct d3drm_viewport
*object
;
1444 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
1445 iface
, device
, camera
, x
, y
, width
, height
, viewport
);
1447 if (FAILED(hr
= d3drm_viewport_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1450 *viewport
= &object
->IDirect3DRMViewport2_iface
;
1455 static HRESULT WINAPI
d3drm3_CreateWrap(IDirect3DRM3
*iface
, D3DRMWRAPTYPE type
, IDirect3DRMFrame3
*frame
,
1456 D3DVALUE ox
, D3DVALUE oy
, D3DVALUE oz
, D3DVALUE dx
, D3DVALUE dy
, D3DVALUE dz
,
1457 D3DVALUE ux
, D3DVALUE uy
, D3DVALUE uz
, D3DVALUE ou
, D3DVALUE ov
, D3DVALUE su
, D3DVALUE sv
,
1458 IDirect3DRMWrap
**wrap
)
1460 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1461 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1462 iface
, type
, frame
, ox
, oy
, oz
, dx
, dy
, dz
, ux
, uy
, uz
, ou
, ov
, su
, sv
, wrap
);
1467 static HRESULT WINAPI
d3drm3_CreateUserVisual(IDirect3DRM3
*iface
,
1468 D3DRMUSERVISUALCALLBACK cb
, void *ctx
, IDirect3DRMUserVisual
**visual
)
1470 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface
, cb
, ctx
, visual
);
1475 static HRESULT WINAPI
d3drm3_LoadTexture(IDirect3DRM3
*iface
,
1476 const char *filename
, IDirect3DRMTexture3
**texture
)
1478 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1479 struct d3drm_texture
*object
;
1482 FIXME("iface %p, filename %s, texture %p stub!\n", iface
, debugstr_a(filename
), texture
);
1484 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1487 *texture
= &object
->IDirect3DRMTexture3_iface
;
1492 static HRESULT WINAPI
d3drm3_LoadTextureFromResource(IDirect3DRM3
*iface
, HMODULE module
,
1493 const char *resource_name
, const char *resource_type
, IDirect3DRMTexture3
**texture
)
1495 struct d3drm
*d3drm
= impl_from_IDirect3DRM3(iface
);
1496 struct d3drm_texture
*object
;
1499 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1500 iface
, module
, debugstr_a(resource_name
), debugstr_a(resource_type
), texture
);
1502 if (FAILED(hr
= d3drm_texture_create(&object
, &d3drm
->IDirect3DRM_iface
)))
1505 *texture
= &object
->IDirect3DRMTexture3_iface
;
1510 static HRESULT WINAPI
d3drm3_SetSearchPath(IDirect3DRM3
*iface
, const char *path
)
1512 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1517 static HRESULT WINAPI
d3drm3_AddSearchPath(IDirect3DRM3
*iface
, const char *path
)
1519 FIXME("iface %p, path %s stub!\n", iface
, debugstr_a(path
));
1524 static HRESULT WINAPI
d3drm3_GetSearchPath(IDirect3DRM3
*iface
, DWORD
*size
, char *path
)
1526 FIXME("iface %p, size %p, path %p stub!\n", iface
, size
, path
);
1531 static HRESULT WINAPI
d3drm3_SetDefaultTextureColors(IDirect3DRM3
*iface
, DWORD color_count
)
1533 FIXME("iface %p, color_count %u stub!\n", iface
, color_count
);
1538 static HRESULT WINAPI
d3drm3_SetDefaultTextureShades(IDirect3DRM3
*iface
, DWORD shade_count
)
1540 FIXME("iface %p, shade_count %u stub!\n", iface
, shade_count
);
1545 static HRESULT WINAPI
d3drm3_GetDevices(IDirect3DRM3
*iface
, IDirect3DRMDeviceArray
**array
)
1547 FIXME("iface %p, array %p stub!\n", iface
, array
);
1552 static HRESULT WINAPI
d3drm3_GetNamedObject(IDirect3DRM3
*iface
,
1553 const char *name
, IDirect3DRMObject
**object
)
1555 FIXME("iface %p, name %s, object %p stub!\n", iface
, debugstr_a(name
), object
);
1560 static HRESULT WINAPI
d3drm3_EnumerateObjects(IDirect3DRM3
*iface
, D3DRMOBJECTCALLBACK cb
, void *ctx
)
1562 FIXME("iface %p, cb %p, ctx %p stub!\n", iface
, cb
, ctx
);
1567 static HRESULT
load_data(IDirect3DRM3
*iface
, IDirectXFileData
*data_object
, IID
**GUIDs
, DWORD nb_GUIDs
, D3DRMLOADCALLBACK LoadProc
,
1568 void *ArgLP
, D3DRMLOADTEXTURECALLBACK LoadTextureProc
, void *ArgLTP
, IDirect3DRMFrame3
*parent_frame
)
1570 HRESULT ret
= D3DRMERR_BADOBJECT
;
1574 BOOL requested
= FALSE
;
1576 hr
= IDirectXFileData_GetType(data_object
, &guid
);
1577 if (hr
!= DXFILE_OK
)
1580 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid
));
1582 /* Load object only if it is top level and requested or if it is part of another object */
1584 if (IsEqualGUID(guid
, &TID_D3DRMMesh
))
1586 TRACE("Found TID_D3DRMMesh\n");
1588 for (i
= 0; i
< nb_GUIDs
; i
++)
1589 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder
) ||
1590 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder2
) ||
1591 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMMeshBuilder3
))
1597 if (requested
|| parent_frame
)
1599 IDirect3DRMMeshBuilder3
*meshbuilder
;
1601 TRACE("Load mesh data\n");
1603 hr
= IDirect3DRM3_CreateMeshBuilder(iface
, &meshbuilder
);
1606 hr
= load_mesh_data(meshbuilder
, data_object
, LoadTextureProc
, ArgLTP
);
1609 /* Only top level objects are notified */
1612 IDirect3DRMObject
*object
;
1614 hr
= IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder
, GUIDs
[i
], (void**)&object
);
1617 LoadProc(object
, GUIDs
[i
], ArgLP
);
1618 IDirect3DRMObject_Release(object
);
1623 IDirect3DRMFrame3_AddVisual(parent_frame
, (IUnknown
*)meshbuilder
);
1626 IDirect3DRMMeshBuilder3_Release(meshbuilder
);
1630 ERR("Cannot process mesh\n");
1633 else if (IsEqualGUID(guid
, &TID_D3DRMFrame
))
1635 TRACE("Found TID_D3DRMFrame\n");
1637 for (i
= 0; i
< nb_GUIDs
; i
++)
1638 if (IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame
) ||
1639 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame2
) ||
1640 IsEqualGUID(GUIDs
[i
], &IID_IDirect3DRMFrame3
))
1646 if (requested
|| parent_frame
)
1648 IDirect3DRMFrame3
*frame
;
1650 TRACE("Load frame data\n");
1652 hr
= IDirect3DRM3_CreateFrame(iface
, parent_frame
, &frame
);
1655 IDirectXFileObject
*child
;
1657 while (SUCCEEDED(hr
= IDirectXFileData_GetNextObject(data_object
, &child
)))
1659 IDirectXFileData
*data
;
1660 IDirectXFileDataReference
*reference
;
1661 IDirectXFileBinary
*binary
;
1663 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1664 &IID_IDirectXFileBinary
, (void **)&binary
)))
1666 FIXME("Binary Object not supported yet\n");
1667 IDirectXFileBinary_Release(binary
);
1669 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1670 &IID_IDirectXFileData
, (void **)&data
)))
1672 TRACE("Found Data Object\n");
1673 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
1674 IDirectXFileData_Release(data
);
1676 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child
,
1677 &IID_IDirectXFileDataReference
, (void **)&reference
)))
1679 TRACE("Found Data Object Reference\n");
1680 IDirectXFileDataReference_Resolve(reference
, &data
);
1681 hr
= load_data(iface
, data
, GUIDs
, nb_GUIDs
, LoadProc
, ArgLP
, LoadTextureProc
, ArgLTP
, frame
);
1682 IDirectXFileData_Release(data
);
1683 IDirectXFileDataReference_Release(reference
);
1685 IDirectXFileObject_Release(child
);
1688 if (hr
!= DXFILEERR_NOMOREOBJECTS
)
1690 IDirect3DRMFrame3_Release(frame
);
1695 /* Only top level objects are notified */
1698 IDirect3DRMObject
*object
;
1700 hr
= IDirect3DRMFrame3_QueryInterface(frame
, GUIDs
[i
], (void**)&object
);
1703 LoadProc(object
, GUIDs
[i
], ArgLP
);
1704 IDirect3DRMObject_Release(object
);
1707 IDirect3DRMFrame3_Release(frame
);
1711 ERR("Cannot process frame\n");
1714 else if (IsEqualGUID(guid
, &TID_D3DRMMaterial
))
1716 TRACE("Found TID_D3DRMMaterial\n");
1718 /* Cannot be requested so nothing to do */
1720 else if (IsEqualGUID(guid
, &TID_D3DRMFrameTransformMatrix
))
1722 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
1724 /* Cannot be requested */
1727 D3DRMMATRIX4D
*matrix
;
1730 TRACE("Load Frame Transform Matrix data\n");
1732 hr
= IDirectXFileData_GetData(data_object
, NULL
, &size
, (void**)&matrix
);
1733 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(matrix
)))
1736 hr
= IDirect3DRMFrame3_AddTransform(parent_frame
, D3DRMCOMBINE_REPLACE
, *matrix
);
1743 FIXME("Found unknown TID %s\n", debugstr_guid(guid
));
1753 static HRESULT WINAPI
d3drm3_Load(IDirect3DRM3
*iface
, void *source
, void *object_id
, IID
**iids
,
1754 DWORD iid_count
, D3DRMLOADOPTIONS flags
, D3DRMLOADCALLBACK load_cb
, void *load_ctx
,
1755 D3DRMLOADTEXTURECALLBACK load_tex_cb
, void *load_tex_ctx
, IDirect3DRMFrame3
*parent_frame
)
1757 DXFILELOADOPTIONS load_options
;
1758 IDirectXFile
*file
= NULL
;
1759 IDirectXFileEnumObject
*enum_object
= NULL
;
1760 IDirectXFileData
*data
= NULL
;
1764 struct d3drm_file_header
*header
;
1765 HRESULT ret
= D3DRMERR_BADOBJECT
;
1768 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1769 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1770 iface
, source
, object_id
, iids
, iid_count
, flags
,
1771 load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1773 TRACE("Looking for GUIDs:\n");
1774 for (i
= 0; i
< iid_count
; ++i
)
1775 TRACE("- %s (%s)\n", debugstr_guid(iids
[i
]), get_IID_string(iids
[i
]));
1777 if (flags
== D3DRMLOAD_FROMMEMORY
)
1779 load_options
= DXFILELOAD_FROMMEMORY
;
1781 else if (flags
== D3DRMLOAD_FROMFILE
)
1783 load_options
= DXFILELOAD_FROMFILE
;
1784 TRACE("Loading from file %s\n", debugstr_a(source
));
1788 FIXME("Load options %#x not supported yet.\n", flags
);
1792 hr
= DirectXFileCreate(&file
);
1793 if (hr
!= DXFILE_OK
)
1796 hr
= IDirectXFile_RegisterTemplates(file
, templates
, strlen(templates
));
1797 if (hr
!= DXFILE_OK
)
1800 hr
= IDirectXFile_CreateEnumObject(file
, source
, load_options
, &enum_object
);
1801 if (hr
!= DXFILE_OK
)
1804 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
1805 if (hr
!= DXFILE_OK
)
1808 hr
= IDirectXFileData_GetType(data
, &pGuid
);
1809 if (hr
!= DXFILE_OK
)
1812 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid
));
1814 if (!IsEqualGUID(pGuid
, &TID_DXFILEHeader
))
1816 ret
= D3DRMERR_BADFILE
;
1820 hr
= IDirectXFileData_GetData(data
, NULL
, &size
, (void **)&header
);
1821 if ((hr
!= DXFILE_OK
) || (size
!= sizeof(*header
)))
1824 TRACE("Version is %u.%u, flags %#x.\n", header
->major
, header
->minor
, header
->flags
);
1826 /* Version must be 1.0.x */
1827 if ((header
->major
!= 1) || (header
->minor
!= 0))
1829 ret
= D3DRMERR_BADFILE
;
1833 IDirectXFileData_Release(data
);
1838 hr
= IDirectXFileEnumObject_GetNextDataObject(enum_object
, &data
);
1839 if (hr
== DXFILEERR_NOMOREOBJECTS
)
1841 TRACE("No more object\n");
1844 else if (hr
!= DXFILE_OK
)
1846 ret
= D3DRMERR_BADFILE
;
1850 ret
= load_data(iface
, data
, iids
, iid_count
, load_cb
, load_ctx
, load_tex_cb
, load_tex_ctx
, parent_frame
);
1851 if (ret
!= D3DRM_OK
)
1854 IDirectXFileData_Release(data
);
1862 IDirectXFileData_Release(data
);
1864 IDirectXFileEnumObject_Release(enum_object
);
1866 IDirectXFile_Release(file
);
1871 static HRESULT WINAPI
d3drm3_Tick(IDirect3DRM3
*iface
, D3DVALUE tick
)
1873 FIXME("iface %p, tick %.8e stub!\n", iface
, tick
);
1878 static HRESULT WINAPI
d3drm3_CreateProgressiveMesh(IDirect3DRM3
*iface
, IDirect3DRMProgressiveMesh
**mesh
)
1880 FIXME("iface %p, mesh %p stub!\n", iface
, mesh
);
1885 static HRESULT WINAPI
d3drm3_RegisterClient(IDirect3DRM3
*iface
, REFGUID guid
, DWORD
*id
)
1887 FIXME("iface %p, guid %s, id %p stub!\n", iface
, debugstr_guid(guid
), id
);
1892 static HRESULT WINAPI
d3drm3_UnregisterClient(IDirect3DRM3
*iface
, REFGUID guid
)
1894 FIXME("iface %p, guid %s stub!\n", iface
, debugstr_guid(guid
));
1899 static HRESULT WINAPI
d3drm3_CreateClippedVisual(IDirect3DRM3
*iface
,
1900 IDirect3DRMVisual
*visual
, IDirect3DRMClippedVisual
**clipped_visual
)
1902 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface
, visual
, clipped_visual
);
1907 static HRESULT WINAPI
d3drm3_SetOptions(IDirect3DRM3
*iface
, DWORD flags
)
1909 FIXME("iface %p, flags %#x stub!\n", iface
, flags
);
1914 static HRESULT WINAPI
d3drm3_GetOptions(IDirect3DRM3
*iface
, DWORD
*flags
)
1916 FIXME("iface %p, flags %p stub!\n", iface
, flags
);
1921 static const struct IDirect3DRM3Vtbl d3drm3_vtbl
=
1923 d3drm3_QueryInterface
,
1926 d3drm3_CreateObject
,
1929 d3drm3_CreateMeshBuilder
,
1931 d3drm3_CreateAnimation
,
1932 d3drm3_CreateAnimationSet
,
1933 d3drm3_CreateTexture
,
1935 d3drm3_CreateLightRGB
,
1936 d3drm3_CreateMaterial
,
1937 d3drm3_CreateDevice
,
1938 d3drm3_CreateDeviceFromSurface
,
1939 d3drm3_CreateDeviceFromD3D
,
1940 d3drm3_CreateDeviceFromClipper
,
1941 d3drm3_CreateTextureFromSurface
,
1942 d3drm3_CreateShadow
,
1943 d3drm3_CreateViewport
,
1945 d3drm3_CreateUserVisual
,
1947 d3drm3_LoadTextureFromResource
,
1948 d3drm3_SetSearchPath
,
1949 d3drm3_AddSearchPath
,
1950 d3drm3_GetSearchPath
,
1951 d3drm3_SetDefaultTextureColors
,
1952 d3drm3_SetDefaultTextureShades
,
1954 d3drm3_GetNamedObject
,
1955 d3drm3_EnumerateObjects
,
1958 d3drm3_CreateProgressiveMesh
,
1959 d3drm3_RegisterClient
,
1960 d3drm3_UnregisterClient
,
1961 d3drm3_CreateClippedVisual
,
1966 HRESULT WINAPI
Direct3DRMCreate(IDirect3DRM
**d3drm
)
1968 struct d3drm
*object
;
1970 TRACE("d3drm %p.\n", d3drm
);
1972 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1973 return E_OUTOFMEMORY
;
1975 object
->IDirect3DRM_iface
.lpVtbl
= &d3drm1_vtbl
;
1976 object
->IDirect3DRM2_iface
.lpVtbl
= &d3drm2_vtbl
;
1977 object
->IDirect3DRM3_iface
.lpVtbl
= &d3drm3_vtbl
;
1979 object
->iface_count
= 1;
1981 *d3drm
= &object
->IDirect3DRM_iface
;
1986 HRESULT WINAPI
DllCanUnloadNow(void)
1991 HRESULT WINAPI
DllGetClassObject(REFCLSID rclsid
, REFIID riid
, void **ppv
)
1993 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid
), debugstr_guid(riid
), ppv
);
1996 return E_INVALIDARG
;
1998 return CLASS_E_CLASSNOTAVAILABLE
;