d3drm: Keep a reference to IDirect3DRM in d3drm_texture.
[wine.git] / dlls / d3drm / d3drm.c
blob4376aa6cff001652390c01cbd70428f161a1dbf8
1 /*
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"
25 #define COBJMACROS
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "dxfile.h"
30 #include "rmxfguid.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";
51 return "?";
54 struct d3drm
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;
102 else
104 *out = NULL;
105 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid));
106 return CLASS_E_CLASSNOTAVAILABLE;
109 IUnknown_AddRef((IUnknown *)*out);
110 return S_OK;
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);
120 if (refcount == 1)
121 InterlockedIncrement(&d3drm->iface_count);
123 return refcount;
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);
136 return refcount;
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 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
155 return Direct3DRMFrame_create(&IID_IDirect3DRMFrame, (IUnknown *)parent_frame, (IUnknown **)frame);
158 static HRESULT WINAPI d3drm1_CreateMesh(IDirect3DRM *iface, IDirect3DRMMesh **mesh)
160 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
162 TRACE("iface %p, mesh %p.\n", iface, mesh);
164 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
167 static HRESULT WINAPI d3drm1_CreateMeshBuilder(IDirect3DRM *iface, IDirect3DRMMeshBuilder **mesh_builder)
169 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
171 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder, (IUnknown **)mesh_builder);
174 static HRESULT WINAPI d3drm1_CreateFace(IDirect3DRM *iface, IDirect3DRMFace **face)
176 TRACE("iface %p, face %p.\n", iface, face);
178 return Direct3DRMFace_create(&IID_IDirect3DRMFace, (IUnknown **)face);
181 static HRESULT WINAPI d3drm1_CreateAnimation(IDirect3DRM *iface, IDirect3DRMAnimation **animation)
183 FIXME("iface %p, animation %p stub!\n", iface, animation);
185 return E_NOTIMPL;
188 static HRESULT WINAPI d3drm1_CreateAnimationSet(IDirect3DRM *iface, IDirect3DRMAnimationSet **set)
190 FIXME("iface %p, set %p stub!\n", iface, set);
192 return E_NOTIMPL;
195 static HRESULT WINAPI d3drm1_CreateTexture(IDirect3DRM *iface,
196 D3DRMIMAGE *image, IDirect3DRMTexture **texture)
198 struct d3drm_texture *object;
199 HRESULT hr;
201 FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture);
203 if (FAILED(hr = d3drm_texture_create(&object, iface)))
204 return hr;
206 *texture = &object->IDirect3DRMTexture_iface;
208 return D3DRM_OK;
211 static HRESULT WINAPI d3drm1_CreateLight(IDirect3DRM *iface,
212 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
214 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
216 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
218 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
221 static HRESULT WINAPI d3drm1_CreateLightRGB(IDirect3DRM *iface, D3DRMLIGHTTYPE type,
222 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
224 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
226 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
227 iface, type, red, green, blue, light);
229 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
232 static HRESULT WINAPI d3drm1_CreateMaterial(IDirect3DRM *iface,
233 D3DVALUE power, IDirect3DRMMaterial **material)
235 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
237 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
239 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
242 static HRESULT WINAPI d3drm1_CreateDevice(IDirect3DRM *iface,
243 DWORD width, DWORD height, IDirect3DRMDevice **device)
245 struct d3drm_device *object;
246 HRESULT hr;
247 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
249 hr = d3drm_device_create(&object);
250 if (FAILED(hr))
251 return hr;
253 *device = IDirect3DRMDevice_from_impl(object);
255 return D3DRM_OK;
258 static HRESULT WINAPI d3drm1_CreateDeviceFromSurface(IDirect3DRM *iface, GUID *guid,
259 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice **device)
261 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
262 struct d3drm_device *object;
263 HRESULT hr;
265 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
266 iface, debugstr_guid(guid), ddraw, backbuffer, device);
268 if (!device)
269 return D3DRMERR_BADVALUE;
270 *device = NULL;
272 if (!backbuffer || !ddraw)
273 return D3DRMERR_BADDEVICE;
275 hr = d3drm_device_create(&object);
276 if (FAILED(hr))
277 return hr;
279 hr = d3drm_device_init(object, 1, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, TRUE);
280 if (SUCCEEDED(hr))
281 *device = IDirect3DRMDevice_from_impl(object);
282 else
283 d3drm_device_destroy(object);
285 return hr;
288 static HRESULT WINAPI d3drm1_CreateDeviceFromD3D(IDirect3DRM *iface,
289 IDirect3D *d3d, IDirect3DDevice *d3d_device, IDirect3DRMDevice **device)
291 struct d3drm_device *object;
292 HRESULT hr;
293 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
294 iface, d3d, d3d_device, device);
296 if (!device)
297 return D3DRMERR_BADVALUE;
298 *device = NULL;
299 if (!d3d || !d3d_device)
300 return D3DRMERR_BADVALUE;
302 hr = d3drm_device_create(&object);
303 if (FAILED(hr))
304 return hr;
306 hr = d3drm_device_set_ddraw_device_d3d(object, iface, d3d, d3d_device);
307 if (FAILED(hr))
309 d3drm_device_destroy(object);
310 return hr;
312 *device = IDirect3DRMDevice_from_impl(object);
314 return D3DRM_OK;
317 static HRESULT WINAPI d3drm1_CreateDeviceFromClipper(IDirect3DRM *iface,
318 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
319 IDirect3DRMDevice **device)
321 struct d3drm_device *object;
322 IDirectDraw *ddraw;
323 IDirectDrawSurface *render_target;
324 HRESULT hr;
326 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
327 iface, clipper, debugstr_guid(guid), width, height, device);
329 if (!device)
330 return D3DRMERR_BADVALUE;
331 *device = NULL;
333 if (!clipper || !width || !height)
334 return D3DRMERR_BADVALUE;
336 hr = DirectDrawCreate(NULL, &ddraw, NULL);
337 if (FAILED(hr))
338 return hr;
340 hr = d3drm_device_create(&object);
341 if (FAILED(hr))
343 IDirectDraw_Release(ddraw);
344 return hr;
347 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
348 if (FAILED(hr))
350 IDirectDraw_Release(ddraw);
351 d3drm_device_destroy(object);
352 return hr;
355 hr = d3drm_device_init(object, 1, iface, ddraw, render_target, TRUE);
356 IDirectDraw_Release(ddraw);
357 IDirectDrawSurface_Release(render_target);
358 if (FAILED(hr))
359 d3drm_device_destroy(object);
360 else
361 *device = IDirect3DRMDevice_from_impl(object);
363 return hr;
366 static HRESULT WINAPI d3drm1_CreateTextureFromSurface(IDirect3DRM *iface,
367 IDirectDrawSurface *surface, IDirect3DRMTexture **texture)
369 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
371 return E_NOTIMPL;
374 static HRESULT WINAPI d3drm1_CreateShadow(IDirect3DRM *iface, IDirect3DRMVisual *visual,
375 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
376 IDirect3DRMVisual **shadow)
378 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
379 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
381 return E_NOTIMPL;
384 static HRESULT WINAPI d3drm1_CreateViewport(IDirect3DRM *iface, IDirect3DRMDevice *device,
385 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
387 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
388 iface, device, camera, x, y, width, height, viewport);
390 return Direct3DRMViewport_create(&IID_IDirect3DRMViewport, (IUnknown **)viewport);
393 static HRESULT WINAPI d3drm1_CreateWrap(IDirect3DRM *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
394 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
395 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
396 IDirect3DRMWrap **wrap)
398 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
399 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
400 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
402 return E_NOTIMPL;
405 static HRESULT WINAPI d3drm1_CreateUserVisual(IDirect3DRM *iface,
406 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
408 FIXME("iface %p, cb %p, ctx %p visual %p stub!\n", iface, cb, ctx, visual);
410 return E_NOTIMPL;
413 static HRESULT WINAPI d3drm1_LoadTexture(IDirect3DRM *iface,
414 const char *filename, IDirect3DRMTexture **texture)
416 struct d3drm_texture *object;
417 HRESULT hr;
419 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
421 if (FAILED(hr = d3drm_texture_create(&object, iface)))
422 return hr;
424 *texture = &object->IDirect3DRMTexture_iface;
426 return D3DRM_OK;
429 static HRESULT WINAPI d3drm1_LoadTextureFromResource(IDirect3DRM *iface,
430 HRSRC resource, IDirect3DRMTexture **texture)
432 struct d3drm_texture *object;
433 HRESULT hr;
435 FIXME("iface %p, resource %p, texture %p stub!\n", iface, resource, texture);
437 if (FAILED(hr = d3drm_texture_create(&object, iface)))
438 return hr;
440 *texture = &object->IDirect3DRMTexture_iface;
442 return D3DRM_OK;
445 static HRESULT WINAPI d3drm1_SetSearchPath(IDirect3DRM *iface, const char *path)
447 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
449 return E_NOTIMPL;
452 static HRESULT WINAPI d3drm1_AddSearchPath(IDirect3DRM *iface, const char *path)
454 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
456 return E_NOTIMPL;
459 static HRESULT WINAPI d3drm1_GetSearchPath(IDirect3DRM *iface, DWORD *size, char *path)
461 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
463 return E_NOTIMPL;
466 static HRESULT WINAPI d3drm1_SetDefaultTextureColors(IDirect3DRM *iface, DWORD color_count)
468 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
470 return E_NOTIMPL;
473 static HRESULT WINAPI d3drm1_SetDefaultTextureShades(IDirect3DRM *iface, DWORD shade_count)
475 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
477 return E_NOTIMPL;
480 static HRESULT WINAPI d3drm1_GetDevices(IDirect3DRM *iface, IDirect3DRMDeviceArray **array)
482 FIXME("iface %p, array %p stub!\n", iface, array);
484 return E_NOTIMPL;
487 static HRESULT WINAPI d3drm1_GetNamedObject(IDirect3DRM *iface,
488 const char *name, IDirect3DRMObject **object)
490 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
492 return E_NOTIMPL;
495 static HRESULT WINAPI d3drm1_EnumerateObjects(IDirect3DRM *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
497 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
499 return E_NOTIMPL;
502 static HRESULT WINAPI d3drm1_Load(IDirect3DRM *iface, void *source, void *object_id, IID **iids,
503 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
504 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
506 struct d3drm *d3drm = impl_from_IDirect3DRM(iface);
507 IDirect3DRMFrame3 *parent_frame3 = NULL;
508 HRESULT hr = D3DRM_OK;
510 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
511 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
512 iface, source, object_id, iids, iid_count, flags,
513 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
515 if (parent_frame)
516 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
517 if (SUCCEEDED(hr))
518 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
519 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
520 if (parent_frame3)
521 IDirect3DRMFrame3_Release(parent_frame3);
523 return hr;
526 static HRESULT WINAPI d3drm1_Tick(IDirect3DRM *iface, D3DVALUE tick)
528 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
530 return E_NOTIMPL;
533 static const struct IDirect3DRMVtbl d3drm1_vtbl =
535 d3drm1_QueryInterface,
536 d3drm1_AddRef,
537 d3drm1_Release,
538 d3drm1_CreateObject,
539 d3drm1_CreateFrame,
540 d3drm1_CreateMesh,
541 d3drm1_CreateMeshBuilder,
542 d3drm1_CreateFace,
543 d3drm1_CreateAnimation,
544 d3drm1_CreateAnimationSet,
545 d3drm1_CreateTexture,
546 d3drm1_CreateLight,
547 d3drm1_CreateLightRGB,
548 d3drm1_CreateMaterial,
549 d3drm1_CreateDevice,
550 d3drm1_CreateDeviceFromSurface,
551 d3drm1_CreateDeviceFromD3D,
552 d3drm1_CreateDeviceFromClipper,
553 d3drm1_CreateTextureFromSurface,
554 d3drm1_CreateShadow,
555 d3drm1_CreateViewport,
556 d3drm1_CreateWrap,
557 d3drm1_CreateUserVisual,
558 d3drm1_LoadTexture,
559 d3drm1_LoadTextureFromResource,
560 d3drm1_SetSearchPath,
561 d3drm1_AddSearchPath,
562 d3drm1_GetSearchPath,
563 d3drm1_SetDefaultTextureColors,
564 d3drm1_SetDefaultTextureShades,
565 d3drm1_GetDevices,
566 d3drm1_GetNamedObject,
567 d3drm1_EnumerateObjects,
568 d3drm1_Load,
569 d3drm1_Tick,
572 static HRESULT WINAPI d3drm2_QueryInterface(IDirect3DRM2 *iface, REFIID riid, void **out)
574 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
576 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
579 static ULONG WINAPI d3drm2_AddRef(IDirect3DRM2 *iface)
581 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
582 ULONG refcount = InterlockedIncrement(&d3drm->ref2);
584 TRACE("%p increasing refcount to %u.\n", iface, refcount);
586 if (refcount == 1)
587 InterlockedIncrement(&d3drm->iface_count);
589 return refcount;
592 static ULONG WINAPI d3drm2_Release(IDirect3DRM2 *iface)
594 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
595 ULONG refcount = InterlockedDecrement(&d3drm->ref2);
597 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
599 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
600 d3drm_destroy(d3drm);
602 return refcount;
605 static HRESULT WINAPI d3drm2_CreateObject(IDirect3DRM2 *iface,
606 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
608 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
610 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
611 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
613 return IDirect3DRM3_CreateObject(&d3drm->IDirect3DRM3_iface, clsid, outer, iid, out);
616 static HRESULT WINAPI d3drm2_CreateFrame(IDirect3DRM2 *iface,
617 IDirect3DRMFrame *parent_frame, IDirect3DRMFrame2 **frame)
619 TRACE("iface %p, parent_frame %p, frame %p.\n", iface, parent_frame, frame);
621 return Direct3DRMFrame_create(&IID_IDirect3DRMFrame2, (IUnknown*)parent_frame, (IUnknown**)frame);
624 static HRESULT WINAPI d3drm2_CreateMesh(IDirect3DRM2 *iface, IDirect3DRMMesh **mesh)
626 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
628 TRACE("iface %p, mesh %p.\n", iface, mesh);
630 return IDirect3DRM3_CreateMesh(&d3drm->IDirect3DRM3_iface, mesh);
633 static HRESULT WINAPI d3drm2_CreateMeshBuilder(IDirect3DRM2 *iface, IDirect3DRMMeshBuilder2 **mesh_builder)
635 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
637 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder2, (IUnknown **)mesh_builder);
640 static HRESULT WINAPI d3drm2_CreateFace(IDirect3DRM2 *iface, IDirect3DRMFace **face)
642 TRACE("iface %p, face %p.\n", iface, face);
644 return Direct3DRMFace_create(&IID_IDirect3DRMFace, (IUnknown **)face);
647 static HRESULT WINAPI d3drm2_CreateAnimation(IDirect3DRM2 *iface, IDirect3DRMAnimation **animation)
649 FIXME("iface %p, animation %p stub!\n", iface, animation);
651 return E_NOTIMPL;
654 static HRESULT WINAPI d3drm2_CreateAnimationSet(IDirect3DRM2 *iface, IDirect3DRMAnimationSet **set)
656 FIXME("iface %p, set %p stub!\n", iface, set);
658 return E_NOTIMPL;
661 static HRESULT WINAPI d3drm2_CreateTexture(IDirect3DRM2 *iface,
662 D3DRMIMAGE *image, IDirect3DRMTexture2 **texture)
664 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
665 struct d3drm_texture *object;
666 HRESULT hr;
668 FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture);
670 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
671 return hr;
673 *texture = &object->IDirect3DRMTexture2_iface;
675 return D3DRM_OK;
678 static HRESULT WINAPI d3drm2_CreateLight(IDirect3DRM2 *iface,
679 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
681 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
683 TRACE("iface %p, type %#x, color 0x%08x, light %p.\n", iface, type, color, light);
685 return IDirect3DRM3_CreateLight(&d3drm->IDirect3DRM3_iface, type, color, light);
688 static HRESULT WINAPI d3drm2_CreateLightRGB(IDirect3DRM2 *iface, D3DRMLIGHTTYPE type,
689 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
691 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
693 TRACE("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p.\n",
694 iface, type, red, green, blue, light);
696 return IDirect3DRM3_CreateLightRGB(&d3drm->IDirect3DRM3_iface, type, red, green, blue, light);
699 static HRESULT WINAPI d3drm2_CreateMaterial(IDirect3DRM2 *iface,
700 D3DVALUE power, IDirect3DRMMaterial **material)
702 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
704 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
706 return IDirect3DRM3_CreateMaterial(&d3drm->IDirect3DRM3_iface, power, (IDirect3DRMMaterial2 **)material);
709 static HRESULT WINAPI d3drm2_CreateDevice(IDirect3DRM2 *iface,
710 DWORD width, DWORD height, IDirect3DRMDevice2 **device)
712 struct d3drm_device *object;
713 HRESULT hr;
714 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
716 hr = d3drm_device_create(&object);
717 if (FAILED(hr))
718 return hr;
720 *device = IDirect3DRMDevice2_from_impl(object);
722 return D3DRM_OK;
725 static HRESULT WINAPI d3drm2_CreateDeviceFromSurface(IDirect3DRM2 *iface, GUID *guid,
726 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, IDirect3DRMDevice2 **device)
728 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
729 IDirect3DRMDevice3 *device3;
730 HRESULT hr;
731 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, device %p.\n",
732 iface, debugstr_guid(guid), ddraw, backbuffer, device);
734 if (!device)
735 return D3DRMERR_BADVALUE;
736 *device = NULL;
737 hr = IDirect3DRM3_CreateDeviceFromSurface(&d3drm->IDirect3DRM3_iface, guid, ddraw, backbuffer, 0, &device3);
738 if (FAILED(hr))
739 return hr;
741 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
742 IDirect3DRMDevice3_Release(device3);
744 return hr;
747 static HRESULT WINAPI d3drm2_CreateDeviceFromD3D(IDirect3DRM2 *iface,
748 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice2 **device)
750 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
751 IDirect3D *d3d1;
752 IDirect3DDevice *d3d_device1;
753 IDirect3DRMDevice *device1;
754 HRESULT hr;
755 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
756 iface, d3d, d3d_device, device);
758 if (!device)
759 return D3DRMERR_BADVALUE;
760 *device = NULL;
761 if (!d3d || !d3d_device)
762 return D3DRMERR_BADVALUE;
764 hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1);
765 if (FAILED(hr))
766 return hr;
768 hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1);
769 if (FAILED(hr))
771 IDirect3D_Release(d3d1);
772 return hr;
775 hr = IDirect3DRM_CreateDeviceFromD3D(&d3drm->IDirect3DRM_iface, d3d1, d3d_device1, &device1);
776 IDirect3D_Release(d3d1);
777 IDirect3DDevice_Release(d3d_device1);
778 if (FAILED(hr))
779 return hr;
781 hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice2, (void **)device);
782 IDirect3DRMDevice_Release(device1);
784 return hr;
787 static HRESULT WINAPI d3drm2_CreateDeviceFromClipper(IDirect3DRM2 *iface,
788 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
789 IDirect3DRMDevice2 **device)
791 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
792 IDirect3DRMDevice3 *device3;
793 HRESULT hr;
795 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
796 iface, clipper, debugstr_guid(guid), width, height, device);
798 if (!device)
799 return D3DRMERR_BADVALUE;
800 *device = NULL;
801 hr = IDirect3DRM3_CreateDeviceFromClipper(&d3drm->IDirect3DRM3_iface, clipper, guid, width, height, &device3);
802 if (FAILED(hr))
803 return hr;
805 hr = IDirect3DRMDevice3_QueryInterface(device3, &IID_IDirect3DRMDevice2, (void**)device);
806 IDirect3DRMDevice3_Release(device3);
808 return hr;
811 static HRESULT WINAPI d3drm2_CreateTextureFromSurface(IDirect3DRM2 *iface,
812 IDirectDrawSurface *surface, IDirect3DRMTexture2 **texture)
814 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
816 return E_NOTIMPL;
819 static HRESULT WINAPI d3drm2_CreateShadow(IDirect3DRM2 *iface, IDirect3DRMVisual *visual,
820 IDirect3DRMLight *light, D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz,
821 IDirect3DRMVisual **shadow)
823 FIXME("iface %p, visual %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
824 iface, visual, light, px, py, pz, nx, ny, nz, shadow);
826 return E_NOTIMPL;
829 static HRESULT WINAPI d3drm2_CreateViewport(IDirect3DRM2 *iface, IDirect3DRMDevice *device,
830 IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport **viewport)
832 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
833 iface, device, camera, x, y, width, height, viewport);
835 return Direct3DRMViewport_create(&IID_IDirect3DRMViewport, (IUnknown **)viewport);
838 static HRESULT WINAPI d3drm2_CreateWrap(IDirect3DRM2 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *frame,
839 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
840 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
841 IDirect3DRMWrap **wrap)
843 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
844 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
845 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
847 return E_NOTIMPL;
850 static HRESULT WINAPI d3drm2_CreateUserVisual(IDirect3DRM2 *iface,
851 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
853 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
855 return E_NOTIMPL;
858 static HRESULT WINAPI d3drm2_LoadTexture(IDirect3DRM2 *iface,
859 const char *filename, IDirect3DRMTexture2 **texture)
861 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
862 struct d3drm_texture *object;
863 HRESULT hr;
865 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
867 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
868 return hr;
870 *texture = &object->IDirect3DRMTexture2_iface;
872 return hr;
875 static HRESULT WINAPI d3drm2_LoadTextureFromResource(IDirect3DRM2 *iface, HMODULE module,
876 const char *resource_name, const char *resource_type, IDirect3DRMTexture2 **texture)
878 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
879 struct d3drm_texture *object;
880 HRESULT hr;
882 FIXME("iface %p, resource_name %s, resource_type %s, texture %p stub!\n",
883 iface, debugstr_a(resource_name), debugstr_a(resource_type), texture);
885 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
886 return hr;
888 *texture = &object->IDirect3DRMTexture2_iface;
890 return D3DRM_OK;
893 static HRESULT WINAPI d3drm2_SetSearchPath(IDirect3DRM2 *iface, const char *path)
895 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
897 return E_NOTIMPL;
900 static HRESULT WINAPI d3drm2_AddSearchPath(IDirect3DRM2 *iface, const char *path)
902 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
904 return E_NOTIMPL;
907 static HRESULT WINAPI d3drm2_GetSearchPath(IDirect3DRM2 *iface, DWORD *size, char *path)
909 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
911 return E_NOTIMPL;
914 static HRESULT WINAPI d3drm2_SetDefaultTextureColors(IDirect3DRM2 *iface, DWORD color_count)
916 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
918 return E_NOTIMPL;
921 static HRESULT WINAPI d3drm2_SetDefaultTextureShades(IDirect3DRM2 *iface, DWORD shade_count)
923 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
925 return E_NOTIMPL;
928 static HRESULT WINAPI d3drm2_GetDevices(IDirect3DRM2 *iface, IDirect3DRMDeviceArray **array)
930 FIXME("iface %p, array %p stub!\n", iface, array);
932 return E_NOTIMPL;
935 static HRESULT WINAPI d3drm2_GetNamedObject(IDirect3DRM2 *iface,
936 const char *name, IDirect3DRMObject **object)
938 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
940 return E_NOTIMPL;
943 static HRESULT WINAPI d3drm2_EnumerateObjects(IDirect3DRM2 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
945 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
947 return E_NOTIMPL;
950 static HRESULT WINAPI d3drm2_Load(IDirect3DRM2 *iface, void *source, void *object_id, IID **iids,
951 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
952 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame *parent_frame)
954 struct d3drm *d3drm = impl_from_IDirect3DRM2(iface);
955 IDirect3DRMFrame3 *parent_frame3 = NULL;
956 HRESULT hr = D3DRM_OK;
958 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
959 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
960 iface, source, object_id, iids, iid_count, flags,
961 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
963 if (parent_frame)
964 hr = IDirect3DRMFrame_QueryInterface(parent_frame, &IID_IDirect3DRMFrame3, (void **)&parent_frame3);
965 if (SUCCEEDED(hr))
966 hr = IDirect3DRM3_Load(&d3drm->IDirect3DRM3_iface, source, object_id, iids, iid_count,
967 flags, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame3);
968 if (parent_frame3)
969 IDirect3DRMFrame3_Release(parent_frame3);
971 return hr;
974 static HRESULT WINAPI d3drm2_Tick(IDirect3DRM2 *iface, D3DVALUE tick)
976 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
978 return E_NOTIMPL;
981 static HRESULT WINAPI d3drm2_CreateProgressiveMesh(IDirect3DRM2 *iface, IDirect3DRMProgressiveMesh **mesh)
983 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
985 return E_NOTIMPL;
988 static const struct IDirect3DRM2Vtbl d3drm2_vtbl =
990 d3drm2_QueryInterface,
991 d3drm2_AddRef,
992 d3drm2_Release,
993 d3drm2_CreateObject,
994 d3drm2_CreateFrame,
995 d3drm2_CreateMesh,
996 d3drm2_CreateMeshBuilder,
997 d3drm2_CreateFace,
998 d3drm2_CreateAnimation,
999 d3drm2_CreateAnimationSet,
1000 d3drm2_CreateTexture,
1001 d3drm2_CreateLight,
1002 d3drm2_CreateLightRGB,
1003 d3drm2_CreateMaterial,
1004 d3drm2_CreateDevice,
1005 d3drm2_CreateDeviceFromSurface,
1006 d3drm2_CreateDeviceFromD3D,
1007 d3drm2_CreateDeviceFromClipper,
1008 d3drm2_CreateTextureFromSurface,
1009 d3drm2_CreateShadow,
1010 d3drm2_CreateViewport,
1011 d3drm2_CreateWrap,
1012 d3drm2_CreateUserVisual,
1013 d3drm2_LoadTexture,
1014 d3drm2_LoadTextureFromResource,
1015 d3drm2_SetSearchPath,
1016 d3drm2_AddSearchPath,
1017 d3drm2_GetSearchPath,
1018 d3drm2_SetDefaultTextureColors,
1019 d3drm2_SetDefaultTextureShades,
1020 d3drm2_GetDevices,
1021 d3drm2_GetNamedObject,
1022 d3drm2_EnumerateObjects,
1023 d3drm2_Load,
1024 d3drm2_Tick,
1025 d3drm2_CreateProgressiveMesh,
1028 static HRESULT WINAPI d3drm3_QueryInterface(IDirect3DRM3 *iface, REFIID riid, void **out)
1030 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1032 return d3drm1_QueryInterface(&d3drm->IDirect3DRM_iface, riid, out);
1035 static ULONG WINAPI d3drm3_AddRef(IDirect3DRM3 *iface)
1037 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1038 ULONG refcount = InterlockedIncrement(&d3drm->ref3);
1040 TRACE("%p increasing refcount to %u.\n", iface, refcount);
1042 if (refcount == 1)
1043 InterlockedIncrement(&d3drm->iface_count);
1045 return refcount;
1048 static ULONG WINAPI d3drm3_Release(IDirect3DRM3 *iface)
1050 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1051 ULONG refcount = InterlockedDecrement(&d3drm->ref3);
1053 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
1055 if (!refcount && !InterlockedDecrement(&d3drm->iface_count))
1056 d3drm_destroy(d3drm);
1058 return refcount;
1061 static HRESULT WINAPI d3drm3_CreateObject(IDirect3DRM3 *iface,
1062 REFCLSID clsid, IUnknown *outer, REFIID iid, void **out)
1064 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1065 IUnknown *object;
1066 HRESULT hr;
1068 TRACE("iface %p, clsid %s, outer %p, iid %s, out %p.\n",
1069 iface, debugstr_guid(clsid), outer, debugstr_guid(iid), out);
1071 if (!out)
1072 return D3DRMERR_BADVALUE;
1074 if (!clsid || !iid)
1076 *out = NULL;
1077 return D3DRMERR_BADVALUE;
1080 if (outer)
1082 FIXME("COM aggregation for outer IUnknown (%p) not implemented. Returning E_NOTIMPL.\n", outer);
1083 *out = NULL;
1084 return E_NOTIMPL;
1087 if (IsEqualGUID(clsid, &CLSID_CDirect3DRMTexture))
1089 struct d3drm_texture *texture;
1090 if (FAILED(hr = d3drm_texture_create(&texture, &d3drm->IDirect3DRM_iface)))
1092 *out = NULL;
1093 return hr;
1095 object = (IUnknown *)&texture->IDirect3DRMTexture3_iface;
1097 else
1099 FIXME("%s not implemented. Returning CLASSFACTORY_E_FIRST.\n", debugstr_guid(clsid));
1100 *out = NULL;
1101 return CLASSFACTORY_E_FIRST;
1104 if (FAILED(hr = IUnknown_QueryInterface(object, iid, out)))
1105 *out = NULL;
1106 IUnknown_Release(object);
1108 return hr;
1111 static HRESULT WINAPI d3drm3_CreateFrame(IDirect3DRM3 *iface,
1112 IDirect3DRMFrame3 *parent, IDirect3DRMFrame3 **frame)
1114 TRACE("iface %p, parent %p, frame %p.\n", iface, parent, frame);
1116 return Direct3DRMFrame_create(&IID_IDirect3DRMFrame3, (IUnknown *)parent, (IUnknown **)frame);
1119 static HRESULT WINAPI d3drm3_CreateMesh(IDirect3DRM3 *iface, IDirect3DRMMesh **mesh)
1121 TRACE("iface %p, mesh %p.\n", iface, mesh);
1123 return Direct3DRMMesh_create(mesh);
1126 static HRESULT WINAPI d3drm3_CreateMeshBuilder(IDirect3DRM3 *iface, IDirect3DRMMeshBuilder3 **mesh_builder)
1128 TRACE("iface %p, mesh_builder %p.\n", iface, mesh_builder);
1130 return Direct3DRMMeshBuilder_create(&IID_IDirect3DRMMeshBuilder3, (IUnknown **)mesh_builder);
1133 static HRESULT WINAPI d3drm3_CreateFace(IDirect3DRM3 *iface, IDirect3DRMFace2 **face)
1135 TRACE("iface %p, face %p.\n", iface, face);
1137 return Direct3DRMFace_create(&IID_IDirect3DRMFace2, (IUnknown **)face);
1140 static HRESULT WINAPI d3drm3_CreateAnimation(IDirect3DRM3 *iface, IDirect3DRMAnimation2 **animation)
1142 FIXME("iface %p, animation %p stub!\n", iface, animation);
1144 return E_NOTIMPL;
1147 static HRESULT WINAPI d3drm3_CreateAnimationSet(IDirect3DRM3 *iface, IDirect3DRMAnimationSet2 **set)
1149 FIXME("iface %p, set %p stub!\n", iface, set);
1151 return E_NOTIMPL;
1154 static HRESULT WINAPI d3drm3_CreateTexture(IDirect3DRM3 *iface,
1155 D3DRMIMAGE *image, IDirect3DRMTexture3 **texture)
1157 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1158 struct d3drm_texture *object;
1159 HRESULT hr;
1161 FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture);
1163 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1164 return hr;
1166 *texture = &object->IDirect3DRMTexture3_iface;
1168 return D3DRM_OK;
1171 static HRESULT WINAPI d3drm3_CreateLight(IDirect3DRM3 *iface,
1172 D3DRMLIGHTTYPE type, D3DCOLOR color, IDirect3DRMLight **light)
1174 HRESULT hr;
1176 FIXME("iface %p, type %#x, color 0x%08x, light %p partial stub!\n", iface, type, color, light);
1178 if (SUCCEEDED(hr = Direct3DRMLight_create((IUnknown **)light)))
1180 IDirect3DRMLight_SetType(*light, type);
1181 IDirect3DRMLight_SetColor(*light, color);
1184 return hr;
1187 static HRESULT WINAPI d3drm3_CreateLightRGB(IDirect3DRM3 *iface, D3DRMLIGHTTYPE type,
1188 D3DVALUE red, D3DVALUE green, D3DVALUE blue, IDirect3DRMLight **light)
1190 HRESULT hr;
1192 FIXME("iface %p, type %#x, red %.8e, green %.8e, blue %.8e, light %p partial stub!\n",
1193 iface, type, red, green, blue, light);
1195 if (SUCCEEDED(hr = Direct3DRMLight_create((IUnknown **)light)))
1197 IDirect3DRMLight_SetType(*light, type);
1198 IDirect3DRMLight_SetColorRGB(*light, red, green, blue);
1201 return hr;
1204 static HRESULT WINAPI d3drm3_CreateMaterial(IDirect3DRM3 *iface,
1205 D3DVALUE power, IDirect3DRMMaterial2 **material)
1207 HRESULT hr;
1209 TRACE("iface %p, power %.8e, material %p.\n", iface, power, material);
1211 if (SUCCEEDED(hr = Direct3DRMMaterial_create(material)))
1212 IDirect3DRMMaterial2_SetPower(*material, power);
1214 return hr;
1217 static HRESULT WINAPI d3drm3_CreateDevice(IDirect3DRM3 *iface,
1218 DWORD width, DWORD height, IDirect3DRMDevice3 **device)
1220 struct d3drm_device *object;
1221 HRESULT hr;
1222 FIXME("iface %p, width %u, height %u, device %p partial stub!\n", iface, width, height, device);
1224 hr = d3drm_device_create(&object);
1225 if (FAILED(hr))
1226 return hr;
1228 *device = IDirect3DRMDevice3_from_impl(object);
1230 return D3DRM_OK;
1233 static HRESULT WINAPI d3drm3_CreateDeviceFromSurface(IDirect3DRM3 *iface, GUID *guid,
1234 IDirectDraw *ddraw, IDirectDrawSurface *backbuffer, DWORD flags, IDirect3DRMDevice3 **device)
1236 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1237 struct d3drm_device *object;
1238 BOOL use_z_surface;
1239 HRESULT hr;
1241 TRACE("iface %p, guid %s, ddraw %p, backbuffer %p, flags %#x, device %p.\n",
1242 iface, debugstr_guid(guid), ddraw, backbuffer, flags, device);
1244 if (!device)
1245 return D3DRMERR_BADVALUE;
1246 *device = NULL;
1248 if (!backbuffer || !ddraw)
1249 return D3DRMERR_BADDEVICE;
1251 hr = d3drm_device_create(&object);
1252 if (FAILED(hr))
1253 return hr;
1255 use_z_surface = !(flags & D3DRMDEVICE_NOZBUFFER);
1257 hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, backbuffer, use_z_surface);
1258 if (SUCCEEDED(hr))
1259 *device = IDirect3DRMDevice3_from_impl(object);
1260 else
1261 d3drm_device_destroy(object);
1263 return hr;
1266 static HRESULT WINAPI d3drm3_CreateDeviceFromD3D(IDirect3DRM3 *iface,
1267 IDirect3D2 *d3d, IDirect3DDevice2 *d3d_device, IDirect3DRMDevice3 **device)
1269 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1270 IDirect3D *d3d1;
1271 IDirect3DDevice *d3d_device1;
1272 IDirect3DRMDevice *device1;
1273 HRESULT hr;
1274 TRACE("iface %p, d3d %p, d3d_device %p, device %p.\n",
1275 iface, d3d, d3d_device, device);
1277 if (!device)
1278 return D3DRMERR_BADVALUE;
1279 *device = NULL;
1280 if (!d3d || !d3d_device)
1281 return D3DRMERR_BADVALUE;
1283 hr = IDirect3D2_QueryInterface(d3d, &IID_IDirect3D, (void **)&d3d1);
1284 if (FAILED(hr))
1285 return hr;
1286 hr = IDirect3DDevice2_QueryInterface(d3d_device, &IID_IDirect3DDevice, (void **)&d3d_device1);
1287 if (FAILED(hr))
1289 IDirect3D_Release(d3d1);
1290 return hr;
1293 hr = IDirect3DRM_CreateDeviceFromD3D(&d3drm->IDirect3DRM_iface, d3d1, d3d_device1, &device1);
1294 IDirect3D_Release(d3d1);
1295 IDirect3DDevice_Release(d3d_device1);
1296 if (FAILED(hr))
1297 return hr;
1299 hr = IDirect3DRMDevice_QueryInterface(device1, &IID_IDirect3DRMDevice3, (void **)device);
1300 IDirect3DRMDevice_Release(device1);
1302 return hr;
1305 static HRESULT WINAPI d3drm3_CreateDeviceFromClipper(IDirect3DRM3 *iface,
1306 IDirectDrawClipper *clipper, GUID *guid, int width, int height,
1307 IDirect3DRMDevice3 **device)
1309 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1310 struct d3drm_device *object;
1311 IDirectDraw *ddraw;
1312 IDirectDrawSurface *render_target;
1313 HRESULT hr;
1315 TRACE("iface %p, clipper %p, guid %s, width %d, height %d, device %p.\n",
1316 iface, clipper, debugstr_guid(guid), width, height, device);
1318 if (!device)
1319 return D3DRMERR_BADVALUE;
1320 *device = NULL;
1322 if (!clipper || !width || !height)
1323 return D3DRMERR_BADVALUE;
1325 hr = DirectDrawCreate(NULL, &ddraw, NULL);
1326 if (FAILED(hr))
1327 return hr;
1329 hr = d3drm_device_create(&object);
1330 if (FAILED(hr))
1332 IDirectDraw_Release(ddraw);
1333 return hr;
1336 hr = d3drm_device_create_surfaces_from_clipper(object, ddraw, clipper, width, height, &render_target);
1337 if (FAILED(hr))
1339 IDirectDraw_Release(ddraw);
1340 d3drm_device_destroy(object);
1341 return hr;
1344 hr = d3drm_device_init(object, 3, &d3drm->IDirect3DRM_iface, ddraw, render_target, TRUE);
1345 IDirectDraw_Release(ddraw);
1346 IDirectDrawSurface_Release(render_target);
1347 if (FAILED(hr))
1348 d3drm_device_destroy(object);
1349 else
1350 *device = IDirect3DRMDevice3_from_impl(object);
1352 return hr;
1355 static HRESULT WINAPI d3drm3_CreateShadow(IDirect3DRM3 *iface, IUnknown *object, IDirect3DRMLight *light,
1356 D3DVALUE px, D3DVALUE py, D3DVALUE pz, D3DVALUE nx, D3DVALUE ny, D3DVALUE nz, IDirect3DRMShadow2 **shadow)
1358 FIXME("iface %p, object %p, light %p, px %.8e, py %.8e, pz %.8e, nx %.8e, ny %.8e, nz %.8e, shadow %p stub!\n",
1359 iface, object, light, px, py, pz, nx, ny, nz, shadow);
1361 return E_NOTIMPL;
1364 static HRESULT WINAPI d3drm3_CreateTextureFromSurface(IDirect3DRM3 *iface,
1365 IDirectDrawSurface *surface, IDirect3DRMTexture3 **texture)
1367 FIXME("iface %p, surface %p, texture %p stub!\n", iface, surface, texture);
1369 return E_NOTIMPL;
1372 static HRESULT WINAPI d3drm3_CreateViewport(IDirect3DRM3 *iface, IDirect3DRMDevice3 *device,
1373 IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height, IDirect3DRMViewport2 **viewport)
1375 FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u, viewport %p partial stub!\n",
1376 iface, device, camera, x, y, width, height, viewport);
1378 return Direct3DRMViewport_create(&IID_IDirect3DRMViewport2, (IUnknown **)viewport);
1381 static HRESULT WINAPI d3drm3_CreateWrap(IDirect3DRM3 *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame3 *frame,
1382 D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1383 D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv,
1384 IDirect3DRMWrap **wrap)
1386 FIXME("iface %p, type %#x, frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, "
1387 "ux %.8e, uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e, wrap %p stub!\n",
1388 iface, type, frame, ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv, wrap);
1390 return E_NOTIMPL;
1393 static HRESULT WINAPI d3drm3_CreateUserVisual(IDirect3DRM3 *iface,
1394 D3DRMUSERVISUALCALLBACK cb, void *ctx, IDirect3DRMUserVisual **visual)
1396 FIXME("iface %p, cb %p, ctx %p, visual %p stub!\n", iface, cb, ctx, visual);
1398 return E_NOTIMPL;
1401 static HRESULT WINAPI d3drm3_LoadTexture(IDirect3DRM3 *iface,
1402 const char *filename, IDirect3DRMTexture3 **texture)
1404 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1405 struct d3drm_texture *object;
1406 HRESULT hr;
1408 FIXME("iface %p, filename %s, texture %p stub!\n", iface, debugstr_a(filename), texture);
1410 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1411 return hr;
1413 *texture = &object->IDirect3DRMTexture3_iface;
1415 return D3DRM_OK;
1418 static HRESULT WINAPI d3drm3_LoadTextureFromResource(IDirect3DRM3 *iface, HMODULE module,
1419 const char *resource_name, const char *resource_type, IDirect3DRMTexture3 **texture)
1421 struct d3drm *d3drm = impl_from_IDirect3DRM3(iface);
1422 struct d3drm_texture *object;
1423 HRESULT hr;
1425 FIXME("iface %p, module %p, resource_name %s, resource_type %s, texture %p stub!\n",
1426 iface, module, debugstr_a(resource_name), debugstr_a(resource_type), texture);
1428 if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface)))
1429 return hr;
1431 *texture = &object->IDirect3DRMTexture3_iface;
1433 return D3DRM_OK;
1436 static HRESULT WINAPI d3drm3_SetSearchPath(IDirect3DRM3 *iface, const char *path)
1438 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1440 return E_NOTIMPL;
1443 static HRESULT WINAPI d3drm3_AddSearchPath(IDirect3DRM3 *iface, const char *path)
1445 FIXME("iface %p, path %s stub!\n", iface, debugstr_a(path));
1447 return E_NOTIMPL;
1450 static HRESULT WINAPI d3drm3_GetSearchPath(IDirect3DRM3 *iface, DWORD *size, char *path)
1452 FIXME("iface %p, size %p, path %p stub!\n", iface, size, path);
1454 return E_NOTIMPL;
1457 static HRESULT WINAPI d3drm3_SetDefaultTextureColors(IDirect3DRM3 *iface, DWORD color_count)
1459 FIXME("iface %p, color_count %u stub!\n", iface, color_count);
1461 return E_NOTIMPL;
1464 static HRESULT WINAPI d3drm3_SetDefaultTextureShades(IDirect3DRM3 *iface, DWORD shade_count)
1466 FIXME("iface %p, shade_count %u stub!\n", iface, shade_count);
1468 return E_NOTIMPL;
1471 static HRESULT WINAPI d3drm3_GetDevices(IDirect3DRM3 *iface, IDirect3DRMDeviceArray **array)
1473 FIXME("iface %p, array %p stub!\n", iface, array);
1475 return E_NOTIMPL;
1478 static HRESULT WINAPI d3drm3_GetNamedObject(IDirect3DRM3 *iface,
1479 const char *name, IDirect3DRMObject **object)
1481 FIXME("iface %p, name %s, object %p stub!\n", iface, debugstr_a(name), object);
1483 return E_NOTIMPL;
1486 static HRESULT WINAPI d3drm3_EnumerateObjects(IDirect3DRM3 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
1488 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1490 return E_NOTIMPL;
1493 static HRESULT load_data(IDirect3DRM3 *iface, IDirectXFileData *data_object, IID **GUIDs, DWORD nb_GUIDs, D3DRMLOADCALLBACK LoadProc,
1494 void *ArgLP, D3DRMLOADTEXTURECALLBACK LoadTextureProc, void *ArgLTP, IDirect3DRMFrame3 *parent_frame)
1496 HRESULT ret = D3DRMERR_BADOBJECT;
1497 HRESULT hr;
1498 const GUID* guid;
1499 DWORD i;
1500 BOOL requested = FALSE;
1502 hr = IDirectXFileData_GetType(data_object, &guid);
1503 if (hr != DXFILE_OK)
1504 goto end;
1506 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1508 /* Load object only if it is top level and requested or if it is part of another object */
1510 if (IsEqualGUID(guid, &TID_D3DRMMesh))
1512 TRACE("Found TID_D3DRMMesh\n");
1514 for (i = 0; i < nb_GUIDs; i++)
1515 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder) ||
1516 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder2) ||
1517 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMMeshBuilder3))
1519 requested = TRUE;
1520 break;
1523 if (requested || parent_frame)
1525 IDirect3DRMMeshBuilder3 *meshbuilder;
1527 TRACE("Load mesh data\n");
1529 hr = IDirect3DRM3_CreateMeshBuilder(iface, &meshbuilder);
1530 if (SUCCEEDED(hr))
1532 hr = load_mesh_data(meshbuilder, data_object, LoadTextureProc, ArgLTP);
1533 if (SUCCEEDED(hr))
1535 /* Only top level objects are notified */
1536 if (!parent_frame)
1538 IDirect3DRMObject *object;
1540 hr = IDirect3DRMMeshBuilder3_QueryInterface(meshbuilder, GUIDs[i], (void**)&object);
1541 if (SUCCEEDED(hr))
1543 LoadProc(object, GUIDs[i], ArgLP);
1544 IDirect3DRMObject_Release(object);
1547 else
1549 IDirect3DRMFrame3_AddVisual(parent_frame, (IUnknown*)meshbuilder);
1552 IDirect3DRMMeshBuilder3_Release(meshbuilder);
1555 if (FAILED(hr))
1556 ERR("Cannot process mesh\n");
1559 else if (IsEqualGUID(guid, &TID_D3DRMFrame))
1561 TRACE("Found TID_D3DRMFrame\n");
1563 for (i = 0; i < nb_GUIDs; i++)
1564 if (IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame) ||
1565 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame2) ||
1566 IsEqualGUID(GUIDs[i], &IID_IDirect3DRMFrame3))
1568 requested = TRUE;
1569 break;
1572 if (requested || parent_frame)
1574 IDirect3DRMFrame3 *frame;
1576 TRACE("Load frame data\n");
1578 hr = IDirect3DRM3_CreateFrame(iface, parent_frame, &frame);
1579 if (SUCCEEDED(hr))
1581 IDirectXFileObject *child;
1583 while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(data_object, &child)))
1585 IDirectXFileData *data;
1586 IDirectXFileDataReference *reference;
1587 IDirectXFileBinary *binary;
1589 if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1590 &IID_IDirectXFileBinary, (void **)&binary)))
1592 FIXME("Binary Object not supported yet\n");
1593 IDirectXFileBinary_Release(binary);
1595 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1596 &IID_IDirectXFileData, (void **)&data)))
1598 TRACE("Found Data Object\n");
1599 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
1600 IDirectXFileData_Release(data);
1602 else if (SUCCEEDED(IDirectXFileObject_QueryInterface(child,
1603 &IID_IDirectXFileDataReference, (void **)&reference)))
1605 TRACE("Found Data Object Reference\n");
1606 IDirectXFileDataReference_Resolve(reference, &data);
1607 hr = load_data(iface, data, GUIDs, nb_GUIDs, LoadProc, ArgLP, LoadTextureProc, ArgLTP, frame);
1608 IDirectXFileData_Release(data);
1609 IDirectXFileDataReference_Release(reference);
1611 IDirectXFileObject_Release(child);
1614 if (hr != DXFILEERR_NOMOREOBJECTS)
1616 IDirect3DRMFrame3_Release(frame);
1617 goto end;
1619 hr = S_OK;
1621 /* Only top level objects are notified */
1622 if (!parent_frame)
1624 IDirect3DRMObject *object;
1626 hr = IDirect3DRMFrame3_QueryInterface(frame, GUIDs[i], (void**)&object);
1627 if (SUCCEEDED(hr))
1629 LoadProc(object, GUIDs[i], ArgLP);
1630 IDirect3DRMObject_Release(object);
1633 IDirect3DRMFrame3_Release(frame);
1636 if (FAILED(hr))
1637 ERR("Cannot process frame\n");
1640 else if (IsEqualGUID(guid, &TID_D3DRMMaterial))
1642 TRACE("Found TID_D3DRMMaterial\n");
1644 /* Cannot be requested so nothing to do */
1646 else if (IsEqualGUID(guid, &TID_D3DRMFrameTransformMatrix))
1648 TRACE("Found TID_D3DRMFrameTransformMatrix\n");
1650 /* Cannot be requested */
1651 if (parent_frame)
1653 D3DRMMATRIX4D *matrix;
1654 DWORD size;
1656 TRACE("Load Frame Transform Matrix data\n");
1658 hr = IDirectXFileData_GetData(data_object, NULL, &size, (void**)&matrix);
1659 if ((hr != DXFILE_OK) || (size != sizeof(matrix)))
1660 goto end;
1662 hr = IDirect3DRMFrame3_AddTransform(parent_frame, D3DRMCOMBINE_REPLACE, *matrix);
1663 if (FAILED(hr))
1664 goto end;
1667 else
1669 FIXME("Found unknown TID %s\n", debugstr_guid(guid));
1672 ret = D3DRM_OK;
1674 end:
1676 return ret;
1679 static HRESULT WINAPI d3drm3_Load(IDirect3DRM3 *iface, void *source, void *object_id, IID **iids,
1680 DWORD iid_count, D3DRMLOADOPTIONS flags, D3DRMLOADCALLBACK load_cb, void *load_ctx,
1681 D3DRMLOADTEXTURECALLBACK load_tex_cb, void *load_tex_ctx, IDirect3DRMFrame3 *parent_frame)
1683 DXFILELOADOPTIONS load_options;
1684 IDirectXFile *file = NULL;
1685 IDirectXFileEnumObject *enum_object = NULL;
1686 IDirectXFileData *data = NULL;
1687 HRESULT hr;
1688 const GUID* pGuid;
1689 DWORD size;
1690 struct d3drm_file_header *header;
1691 HRESULT ret = D3DRMERR_BADOBJECT;
1692 DWORD i;
1694 TRACE("iface %p, source %p, object_id %p, iids %p, iid_count %u, flags %#x, "
1695 "load_cb %p, load_ctx %p, load_tex_cb %p, load_tex_ctx %p, parent_frame %p.\n",
1696 iface, source, object_id, iids, iid_count, flags,
1697 load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1699 TRACE("Looking for GUIDs:\n");
1700 for (i = 0; i < iid_count; ++i)
1701 TRACE("- %s (%s)\n", debugstr_guid(iids[i]), get_IID_string(iids[i]));
1703 if (flags == D3DRMLOAD_FROMMEMORY)
1705 load_options = DXFILELOAD_FROMMEMORY;
1707 else if (flags == D3DRMLOAD_FROMFILE)
1709 load_options = DXFILELOAD_FROMFILE;
1710 TRACE("Loading from file %s\n", debugstr_a(source));
1712 else
1714 FIXME("Load options %#x not supported yet.\n", flags);
1715 return E_NOTIMPL;
1718 hr = DirectXFileCreate(&file);
1719 if (hr != DXFILE_OK)
1720 goto end;
1722 hr = IDirectXFile_RegisterTemplates(file, templates, strlen(templates));
1723 if (hr != DXFILE_OK)
1724 goto end;
1726 hr = IDirectXFile_CreateEnumObject(file, source, load_options, &enum_object);
1727 if (hr != DXFILE_OK)
1728 goto end;
1730 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
1731 if (hr != DXFILE_OK)
1732 goto end;
1734 hr = IDirectXFileData_GetType(data, &pGuid);
1735 if (hr != DXFILE_OK)
1736 goto end;
1738 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1740 if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
1742 ret = D3DRMERR_BADFILE;
1743 goto end;
1746 hr = IDirectXFileData_GetData(data, NULL, &size, (void **)&header);
1747 if ((hr != DXFILE_OK) || (size != sizeof(*header)))
1748 goto end;
1750 TRACE("Version is %u.%u, flags %#x.\n", header->major, header->minor, header->flags);
1752 /* Version must be 1.0.x */
1753 if ((header->major != 1) || (header->minor != 0))
1755 ret = D3DRMERR_BADFILE;
1756 goto end;
1759 IDirectXFileData_Release(data);
1760 data = NULL;
1762 while (1)
1764 hr = IDirectXFileEnumObject_GetNextDataObject(enum_object, &data);
1765 if (hr == DXFILEERR_NOMOREOBJECTS)
1767 TRACE("No more object\n");
1768 break;
1770 else if (hr != DXFILE_OK)
1772 ret = D3DRMERR_BADFILE;
1773 goto end;
1776 ret = load_data(iface, data, iids, iid_count, load_cb, load_ctx, load_tex_cb, load_tex_ctx, parent_frame);
1777 if (ret != D3DRM_OK)
1778 goto end;
1780 IDirectXFileData_Release(data);
1781 data = NULL;
1784 ret = D3DRM_OK;
1786 end:
1787 if (data)
1788 IDirectXFileData_Release(data);
1789 if (enum_object)
1790 IDirectXFileEnumObject_Release(enum_object);
1791 if (file)
1792 IDirectXFile_Release(file);
1794 return ret;
1797 static HRESULT WINAPI d3drm3_Tick(IDirect3DRM3 *iface, D3DVALUE tick)
1799 FIXME("iface %p, tick %.8e stub!\n", iface, tick);
1801 return E_NOTIMPL;
1804 static HRESULT WINAPI d3drm3_CreateProgressiveMesh(IDirect3DRM3 *iface, IDirect3DRMProgressiveMesh **mesh)
1806 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1808 return E_NOTIMPL;
1811 static HRESULT WINAPI d3drm3_RegisterClient(IDirect3DRM3 *iface, REFGUID guid, DWORD *id)
1813 FIXME("iface %p, guid %s, id %p stub!\n", iface, debugstr_guid(guid), id);
1815 return E_NOTIMPL;
1818 static HRESULT WINAPI d3drm3_UnregisterClient(IDirect3DRM3 *iface, REFGUID guid)
1820 FIXME("iface %p, guid %s stub!\n", iface, debugstr_guid(guid));
1822 return E_NOTIMPL;
1825 static HRESULT WINAPI d3drm3_CreateClippedVisual(IDirect3DRM3 *iface,
1826 IDirect3DRMVisual *visual, IDirect3DRMClippedVisual **clipped_visual)
1828 FIXME("iface %p, visual %p, clipped_visual %p stub!\n", iface, visual, clipped_visual);
1830 return E_NOTIMPL;
1833 static HRESULT WINAPI d3drm3_SetOptions(IDirect3DRM3 *iface, DWORD flags)
1835 FIXME("iface %p, flags %#x stub!\n", iface, flags);
1837 return E_NOTIMPL;
1840 static HRESULT WINAPI d3drm3_GetOptions(IDirect3DRM3 *iface, DWORD *flags)
1842 FIXME("iface %p, flags %p stub!\n", iface, flags);
1844 return E_NOTIMPL;
1847 static const struct IDirect3DRM3Vtbl d3drm3_vtbl =
1849 d3drm3_QueryInterface,
1850 d3drm3_AddRef,
1851 d3drm3_Release,
1852 d3drm3_CreateObject,
1853 d3drm3_CreateFrame,
1854 d3drm3_CreateMesh,
1855 d3drm3_CreateMeshBuilder,
1856 d3drm3_CreateFace,
1857 d3drm3_CreateAnimation,
1858 d3drm3_CreateAnimationSet,
1859 d3drm3_CreateTexture,
1860 d3drm3_CreateLight,
1861 d3drm3_CreateLightRGB,
1862 d3drm3_CreateMaterial,
1863 d3drm3_CreateDevice,
1864 d3drm3_CreateDeviceFromSurface,
1865 d3drm3_CreateDeviceFromD3D,
1866 d3drm3_CreateDeviceFromClipper,
1867 d3drm3_CreateTextureFromSurface,
1868 d3drm3_CreateShadow,
1869 d3drm3_CreateViewport,
1870 d3drm3_CreateWrap,
1871 d3drm3_CreateUserVisual,
1872 d3drm3_LoadTexture,
1873 d3drm3_LoadTextureFromResource,
1874 d3drm3_SetSearchPath,
1875 d3drm3_AddSearchPath,
1876 d3drm3_GetSearchPath,
1877 d3drm3_SetDefaultTextureColors,
1878 d3drm3_SetDefaultTextureShades,
1879 d3drm3_GetDevices,
1880 d3drm3_GetNamedObject,
1881 d3drm3_EnumerateObjects,
1882 d3drm3_Load,
1883 d3drm3_Tick,
1884 d3drm3_CreateProgressiveMesh,
1885 d3drm3_RegisterClient,
1886 d3drm3_UnregisterClient,
1887 d3drm3_CreateClippedVisual,
1888 d3drm3_SetOptions,
1889 d3drm3_GetOptions,
1892 HRESULT WINAPI Direct3DRMCreate(IDirect3DRM **d3drm)
1894 struct d3drm *object;
1896 TRACE("d3drm %p.\n", d3drm);
1898 if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
1899 return E_OUTOFMEMORY;
1901 object->IDirect3DRM_iface.lpVtbl = &d3drm1_vtbl;
1902 object->IDirect3DRM2_iface.lpVtbl = &d3drm2_vtbl;
1903 object->IDirect3DRM3_iface.lpVtbl = &d3drm3_vtbl;
1904 object->ref1 = 1;
1905 object->iface_count = 1;
1907 *d3drm = &object->IDirect3DRM_iface;
1909 return S_OK;
1912 HRESULT WINAPI DllCanUnloadNow(void)
1914 return S_FALSE;
1917 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
1919 TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
1921 if(!ppv)
1922 return E_INVALIDARG;
1924 return CLASS_E_CLASSNOTAVAILABLE;