2 * Implementation of IDirect3DRMViewport Interface
4 * Copyright 2012 André Hentschel
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/port.h"
24 #include "d3drm_private.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(d3drm
);
28 static inline struct d3drm_viewport
*impl_from_IDirect3DRMViewport(IDirect3DRMViewport
*iface
)
30 return CONTAINING_RECORD(iface
, struct d3drm_viewport
, IDirect3DRMViewport_iface
);
33 static inline struct d3drm_viewport
*impl_from_IDirect3DRMViewport2(IDirect3DRMViewport2
*iface
)
35 return CONTAINING_RECORD(iface
, struct d3drm_viewport
, IDirect3DRMViewport2_iface
);
38 static inline void d3drm_normalize_d3d_color(D3DCOLORVALUE
*color_value
, D3DCOLOR color
)
40 color_value
->u1
.r
= RGBA_GETRED(color
) / 255.0f
;
41 color_value
->u2
.g
= RGBA_GETGREEN(color
) / 255.0f
;
42 color_value
->u3
.b
= RGBA_GETBLUE(color
) / 255.0f
;
43 color_value
->u4
.a
= RGBA_GETALPHA(color
) / 255.0f
;
46 static HRESULT
d3drm_update_background_material(struct d3drm_viewport
*viewport
)
48 IDirect3DRMFrame
*root_frame
;
53 if (FAILED(hr
= IDirect3DRMFrame_GetScene(viewport
->camera
, &root_frame
)))
55 color
= IDirect3DRMFrame_GetSceneBackground(root_frame
);
57 memset(&mat
, 0, sizeof(mat
));
58 mat
.dwSize
= sizeof(mat
);
59 d3drm_normalize_d3d_color(&mat
.u
.diffuse
, color
);
61 return IDirect3DMaterial_SetMaterial(viewport
->material
, &mat
);
64 static void d3drm_viewport_destroy(struct d3drm_viewport
*viewport
)
66 TRACE("viewport %p releasing attached interfaces.\n", viewport
);
68 d3drm_object_cleanup((IDirect3DRMObject
*)&viewport
->IDirect3DRMViewport_iface
, &viewport
->obj
);
70 if (viewport
->d3d_viewport
)
72 IDirect3DViewport_Release(viewport
->d3d_viewport
);
73 IDirect3DMaterial_Release(viewport
->material
);
74 IDirect3DRMFrame_Release(viewport
->camera
);
75 IDirect3DRM_Release(viewport
->d3drm
);
78 HeapFree(GetProcessHeap(), 0, viewport
);
81 static HRESULT WINAPI
d3drm_viewport2_QueryInterface(IDirect3DRMViewport2
*iface
, REFIID riid
, void **out
)
83 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
85 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
87 if (IsEqualGUID(riid
, &IID_IDirect3DRMViewport
)
88 || IsEqualGUID(riid
, &IID_IDirect3DRMObject
)
89 || IsEqualGUID(riid
, &IID_IUnknown
))
91 *out
= &viewport
->IDirect3DRMViewport_iface
;
93 else if (IsEqualGUID(riid
, &IID_IDirect3DRMViewport2
))
95 *out
= &viewport
->IDirect3DRMViewport2_iface
;
100 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid
));
101 return CLASS_E_CLASSNOTAVAILABLE
;
104 IUnknown_AddRef((IUnknown
*)*out
);
108 static HRESULT WINAPI
d3drm_viewport1_QueryInterface(IDirect3DRMViewport
*iface
, REFIID riid
, void **out
)
110 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
112 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
114 return d3drm_viewport2_QueryInterface(&viewport
->IDirect3DRMViewport2_iface
, riid
, out
);
117 static ULONG WINAPI
d3drm_viewport2_AddRef(IDirect3DRMViewport2
*iface
)
119 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
120 ULONG refcount
= InterlockedIncrement(&viewport
->obj
.ref
);
122 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
127 static ULONG WINAPI
d3drm_viewport1_AddRef(IDirect3DRMViewport
*iface
)
129 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
131 TRACE("iface %p.\n", iface
);
133 return d3drm_viewport2_AddRef(&viewport
->IDirect3DRMViewport2_iface
);
136 static ULONG WINAPI
d3drm_viewport2_Release(IDirect3DRMViewport2
*iface
)
138 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
139 ULONG refcount
= InterlockedDecrement(&viewport
->obj
.ref
);
141 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
144 d3drm_viewport_destroy(viewport
);
149 static ULONG WINAPI
d3drm_viewport1_Release(IDirect3DRMViewport
*iface
)
151 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
153 TRACE("iface %p.\n", iface
);
155 return d3drm_viewport2_Release(&viewport
->IDirect3DRMViewport2_iface
);
158 static HRESULT WINAPI
d3drm_viewport2_Clone(IDirect3DRMViewport2
*iface
,
159 IUnknown
*outer
, REFIID iid
, void **out
)
161 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface
, outer
, debugstr_guid(iid
), out
);
166 static HRESULT WINAPI
d3drm_viewport1_Clone(IDirect3DRMViewport
*iface
,
167 IUnknown
*outer
, REFIID iid
, void **out
)
169 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface
, outer
, debugstr_guid(iid
), out
);
174 static HRESULT WINAPI
d3drm_viewport2_AddDestroyCallback(IDirect3DRMViewport2
*iface
,
175 D3DRMOBJECTCALLBACK cb
, void *ctx
)
177 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
179 TRACE("iface %p, cb %p, ctx %p\n", iface
, cb
, ctx
);
181 return d3drm_object_add_destroy_callback(&viewport
->obj
, cb
, ctx
);
184 static HRESULT WINAPI
d3drm_viewport1_AddDestroyCallback(IDirect3DRMViewport
*iface
,
185 D3DRMOBJECTCALLBACK cb
, void *ctx
)
187 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
189 TRACE("iface %p, cb %p, ctx %p\n", iface
, cb
, ctx
);
191 return d3drm_viewport2_AddDestroyCallback(&viewport
->IDirect3DRMViewport2_iface
, cb
, ctx
);
194 static HRESULT WINAPI
d3drm_viewport2_DeleteDestroyCallback(IDirect3DRMViewport2
*iface
,
195 D3DRMOBJECTCALLBACK cb
, void *ctx
)
197 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
199 TRACE("iface %p, cb %p, ctx %p\n", iface
, cb
, ctx
);
201 return d3drm_object_delete_destroy_callback(&viewport
->obj
, cb
, ctx
);
204 static HRESULT WINAPI
d3drm_viewport1_DeleteDestroyCallback(IDirect3DRMViewport
*iface
,
205 D3DRMOBJECTCALLBACK cb
, void *ctx
)
207 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
209 TRACE("iface %p, cb %p, ctx %p\n", iface
, cb
, ctx
);
211 return d3drm_viewport2_DeleteDestroyCallback(&viewport
->IDirect3DRMViewport2_iface
, cb
, ctx
);
214 static HRESULT WINAPI
d3drm_viewport2_SetAppData(IDirect3DRMViewport2
*iface
, DWORD data
)
216 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
218 TRACE("iface %p, data %#x\n", iface
, data
);
220 viewport
->obj
.appdata
= data
;
224 static HRESULT WINAPI
d3drm_viewport1_SetAppData(IDirect3DRMViewport
*iface
, DWORD data
)
226 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
228 TRACE("iface %p, data %#x\n", iface
, data
);
230 return d3drm_viewport2_SetAppData(&viewport
->IDirect3DRMViewport2_iface
, data
);
233 static DWORD WINAPI
d3drm_viewport2_GetAppData(IDirect3DRMViewport2
*iface
)
235 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
237 TRACE("iface %p\n", iface
);
239 return viewport
->obj
.appdata
;
242 static DWORD WINAPI
d3drm_viewport1_GetAppData(IDirect3DRMViewport
*iface
)
244 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
246 TRACE("iface %p.\n", iface
);
248 return d3drm_viewport2_GetAppData(&viewport
->IDirect3DRMViewport2_iface
);
251 static HRESULT WINAPI
d3drm_viewport2_SetName(IDirect3DRMViewport2
*iface
, const char *name
)
253 FIXME("iface %p, name %s stub!\n", iface
, debugstr_a(name
));
258 static HRESULT WINAPI
d3drm_viewport1_SetName(IDirect3DRMViewport
*iface
, const char *name
)
260 FIXME("iface %p, name %s stub!\n", iface
, debugstr_a(name
));
265 static HRESULT WINAPI
d3drm_viewport2_GetName(IDirect3DRMViewport2
*iface
, DWORD
*size
, char *name
)
267 FIXME("iface %p, size %p, name %p stub!\n", iface
, size
, name
);
272 static HRESULT WINAPI
d3drm_viewport1_GetName(IDirect3DRMViewport
*iface
, DWORD
*size
, char *name
)
274 FIXME("iface %p, size %p, name %p stub!\n", iface
, size
, name
);
279 static HRESULT WINAPI
d3drm_viewport2_GetClassName(IDirect3DRMViewport2
*iface
, DWORD
*size
, char *name
)
281 TRACE("iface %p, size %p, name %p.\n", iface
, size
, name
);
283 if (!size
|| *size
< strlen("Viewport") || !name
)
286 strcpy(name
, "Viewport");
287 *size
= sizeof("Viewport");
292 static HRESULT WINAPI
d3drm_viewport1_GetClassName(IDirect3DRMViewport
*iface
, DWORD
*size
, char *name
)
294 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
296 TRACE("iface %p, size %p, name %p.\n", iface
, size
, name
);
298 return d3drm_viewport2_GetClassName(&viewport
->IDirect3DRMViewport2_iface
, size
, name
);
301 static HRESULT WINAPI
d3drm_viewport2_Init(IDirect3DRMViewport2
*iface
, IDirect3DRMDevice3
*device
,
302 IDirect3DRMFrame3
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
)
304 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
305 struct d3drm_device
*device_obj
= unsafe_impl_from_IDirect3DRMDevice3(device
);
308 IDirect3D
*d3d1
= NULL
;
309 IDirect3DDevice
*d3d_device
= NULL
;
310 IDirect3DMaterial
*material
= NULL
;
311 D3DMATERIALHANDLE hmat
;
312 HRESULT hr
= D3DRM_OK
;
314 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u.\n",
315 iface
, device
, camera
, x
, y
, width
, height
);
317 if (!device_obj
|| !camera
318 || width
> device_obj
->width
319 || height
> device_obj
->height
)
321 return D3DRMERR_BADOBJECT
;
324 if (viewport
->d3d_viewport
)
325 return D3DRMERR_BADOBJECT
;
327 IDirect3DRM_AddRef(viewport
->d3drm
);
329 if (FAILED(hr
= IDirect3DRMDevice3_GetDirect3DDevice(device
, &d3d_device
)))
332 if (FAILED(hr
= IDirect3DDevice_GetDirect3D(d3d_device
, &d3d1
)))
335 if (FAILED(hr
= IDirect3D_CreateViewport(d3d1
, &viewport
->d3d_viewport
, NULL
)))
338 vp
.dwSize
= sizeof(vp
);
340 vp
.dwHeight
= height
;
343 scale
= width
> height
? (float)width
/ 2.0f
: (float)height
/ 2.0f
;
346 vp
.dvMaxX
= vp
.dwWidth
/ (2.0f
* vp
.dvScaleX
);
347 vp
.dvMaxY
= vp
.dwHeight
/ (2.0f
* vp
.dvScaleY
);
351 if (FAILED(hr
= IDirect3DViewport_SetViewport(viewport
->d3d_viewport
, &vp
)))
354 if (FAILED(hr
= IDirect3DDevice_AddViewport(d3d_device
, viewport
->d3d_viewport
)))
357 if (FAILED(hr
= IDirect3DRMFrame3_QueryInterface(camera
, &IID_IDirect3DRMFrame
, (void **)&viewport
->camera
)))
360 if (FAILED(hr
= IDirect3D_CreateMaterial(d3d1
, &material
, NULL
)))
363 if (FAILED(hr
= IDirect3DMaterial_GetHandle(material
, d3d_device
, &hmat
)))
366 hr
= IDirect3DViewport_SetBackground(viewport
->d3d_viewport
, hmat
);
367 viewport
->material
= material
;
368 viewport
->device
= device_obj
;
374 if (viewport
->d3d_viewport
)
376 IDirect3DViewport_Release(viewport
->d3d_viewport
);
377 viewport
->d3d_viewport
= NULL
;
379 if (viewport
->camera
)
380 IDirect3DRMFrame_Release(viewport
->camera
);
382 IDirect3DMaterial_Release(material
);
383 IDirect3DRM_Release(viewport
->d3drm
);
386 IDirect3DDevice_Release(d3d_device
);
388 IDirect3D_Release(d3d1
);
393 static HRESULT WINAPI
d3drm_viewport1_Init(IDirect3DRMViewport
*iface
, IDirect3DRMDevice
*device
,
394 IDirect3DRMFrame
*camera
, DWORD x
, DWORD y
, DWORD width
, DWORD height
)
396 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
397 struct d3drm_frame
*frame
= unsafe_impl_from_IDirect3DRMFrame(camera
);
398 IDirect3DRMDevice3
*device3
;
401 TRACE("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u.\n",
402 iface
, device
, camera
, x
, y
, width
, height
);
404 if (!device
|| !frame
)
405 return D3DRMERR_BADOBJECT
;
407 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMDevice3
, (void **)&device3
)))
410 hr
= d3drm_viewport2_Init(&viewport
->IDirect3DRMViewport2_iface
, device3
, &frame
->IDirect3DRMFrame3_iface
,
411 x
, y
, width
, height
);
412 IDirect3DRMDevice3_Release(device3
);
417 static HRESULT WINAPI
d3drm_viewport2_Clear(IDirect3DRMViewport2
*iface
, DWORD flags
)
419 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
420 DDSCAPS caps
= { DDSCAPS_ZBUFFER
};
423 IDirectDrawSurface
*ds
;
424 DWORD clear_flags
= 0;
426 TRACE("iface %p, flags %#x.\n", iface
, flags
);
428 clear_rect
.u1
.x1
= clear_rect
.u2
.y1
= 0;
429 clear_rect
.u3
.x2
= viewport
->device
->width
;
430 clear_rect
.u4
.y2
= viewport
->device
->height
;
432 if (flags
& D3DRMCLEAR_TARGET
)
434 clear_flags
|= D3DCLEAR_TARGET
;
435 d3drm_update_background_material(viewport
);
437 if (flags
& D3DRMCLEAR_ZBUFFER
)
439 hr
= IDirectDrawSurface_GetAttachedSurface(viewport
->device
->render_target
, &caps
, &ds
);
442 clear_flags
|= D3DCLEAR_ZBUFFER
;
443 IDirectDrawSurface_Release(ds
);
446 if (flags
& D3DRMCLEAR_DIRTYRECTS
)
447 FIXME("Flag D3DRMCLEAR_DIRTYRECT not implemented yet.\n");
449 if (FAILED(hr
= IDirect3DViewport_Clear(viewport
->d3d_viewport
, 1, &clear_rect
, clear_flags
)))
455 static HRESULT WINAPI
d3drm_viewport1_Clear(IDirect3DRMViewport
*iface
)
457 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
459 TRACE("iface %p.\n", iface
);
461 return d3drm_viewport2_Clear(&viewport
->IDirect3DRMViewport2_iface
, D3DRMCLEAR_ALL
);
464 static HRESULT WINAPI
d3drm_viewport2_Render(IDirect3DRMViewport2
*iface
, IDirect3DRMFrame3
*frame
)
466 FIXME("iface %p, frame %p stub!\n", iface
, frame
);
471 static HRESULT WINAPI
d3drm_viewport1_Render(IDirect3DRMViewport
*iface
, IDirect3DRMFrame
*frame
)
473 FIXME("iface %p, frame %p stub!\n", iface
, frame
);
478 static HRESULT WINAPI
d3drm_viewport2_SetFront(IDirect3DRMViewport2
*iface
, D3DVALUE front
)
480 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
482 TRACE("iface %p, front %.8e.\n", iface
, front
);
484 viewport
->front
= front
;
489 static HRESULT WINAPI
d3drm_viewport1_SetFront(IDirect3DRMViewport
*iface
, D3DVALUE front
)
491 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
493 TRACE("iface %p, front %.8e.\n", iface
, front
);
495 return d3drm_viewport2_SetFront(&viewport
->IDirect3DRMViewport2_iface
, front
);
498 static HRESULT WINAPI
d3drm_viewport2_SetBack(IDirect3DRMViewport2
*iface
, D3DVALUE back
)
500 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
502 TRACE("iface %p, back %.8e.\n", iface
, back
);
504 viewport
->back
= back
;
509 static HRESULT WINAPI
d3drm_viewport1_SetBack(IDirect3DRMViewport
*iface
, D3DVALUE back
)
511 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
513 TRACE("iface %p, back %.8e.\n", iface
, back
);
515 return d3drm_viewport2_SetBack(&viewport
->IDirect3DRMViewport2_iface
, back
);
518 static HRESULT WINAPI
d3drm_viewport2_SetField(IDirect3DRMViewport2
*iface
, D3DVALUE field
)
520 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
522 TRACE("iface %p, field %.8e.\n", iface
, field
);
524 viewport
->field
= field
;
529 static HRESULT WINAPI
d3drm_viewport1_SetField(IDirect3DRMViewport
*iface
, D3DVALUE field
)
531 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
533 TRACE("iface %p, field %.8e.\n", iface
, field
);
535 return d3drm_viewport2_SetField(&viewport
->IDirect3DRMViewport2_iface
, field
);
538 static HRESULT WINAPI
d3drm_viewport2_SetUniformScaling(IDirect3DRMViewport2
*iface
, BOOL b
)
540 FIXME("iface %p, b %#x stub!\n", iface
, b
);
545 static HRESULT WINAPI
d3drm_viewport1_SetUniformScaling(IDirect3DRMViewport
*iface
, BOOL b
)
547 FIXME("iface %p, b %#x stub!\n", iface
, b
);
552 static HRESULT WINAPI
d3drm_viewport2_SetCamera(IDirect3DRMViewport2
*iface
, IDirect3DRMFrame3
*camera
)
554 FIXME("iface %p, camera %p stub!\n", iface
, camera
);
559 static HRESULT WINAPI
d3drm_viewport1_SetCamera(IDirect3DRMViewport
*iface
, IDirect3DRMFrame
*camera
)
561 FIXME("iface %p, camera %p stub!\n", iface
, camera
);
566 static HRESULT WINAPI
d3drm_viewport2_SetProjection(IDirect3DRMViewport2
*iface
, D3DRMPROJECTIONTYPE type
)
568 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
570 TRACE("iface %p, type %#x.\n", iface
, type
);
572 viewport
->projection
= type
;
577 static HRESULT WINAPI
d3drm_viewport1_SetProjection(IDirect3DRMViewport
*iface
, D3DRMPROJECTIONTYPE type
)
579 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
581 TRACE("iface %p, type %#x.\n", iface
, type
);
583 return d3drm_viewport2_SetProjection(&viewport
->IDirect3DRMViewport2_iface
, type
);
586 static HRESULT WINAPI
d3drm_viewport2_Transform(IDirect3DRMViewport2
*iface
, D3DRMVECTOR4D
*d
, D3DVECTOR
*s
)
588 FIXME("iface %p, d %p, s %p stub!\n", iface
, d
, s
);
593 static HRESULT WINAPI
d3drm_viewport1_Transform(IDirect3DRMViewport
*iface
, D3DRMVECTOR4D
*d
, D3DVECTOR
*s
)
595 FIXME("iface %p, d %p, s %p stub!\n", iface
, d
, s
);
600 static HRESULT WINAPI
d3drm_viewport2_InverseTransform(IDirect3DRMViewport2
*iface
, D3DVECTOR
*d
, D3DRMVECTOR4D
*s
)
602 FIXME("iface %p, d %p, s %p stub!\n", iface
, d
, s
);
607 static HRESULT WINAPI
d3drm_viewport1_InverseTransform(IDirect3DRMViewport
*iface
, D3DVECTOR
*d
, D3DRMVECTOR4D
*s
)
609 FIXME("iface %p, d %p, s %p stub!\n", iface
, d
, s
);
614 static HRESULT WINAPI
d3drm_viewport2_Configure(IDirect3DRMViewport2
*iface
,
615 LONG x
, LONG y
, DWORD width
, DWORD height
)
617 FIXME("iface %p, x %d, y %d, width %u, height %u stub!\n", iface
, x
, y
, width
, height
);
622 static HRESULT WINAPI
d3drm_viewport1_Configure(IDirect3DRMViewport
*iface
,
623 LONG x
, LONG y
, DWORD width
, DWORD height
)
625 FIXME("iface %p, x %d, y %d, width %u, height %u stub!\n", iface
, x
, y
, width
, height
);
630 static HRESULT WINAPI
d3drm_viewport2_ForceUpdate(IDirect3DRMViewport2
* iface
,
631 DWORD x1
, DWORD y1
, DWORD x2
, DWORD y2
)
633 FIXME("iface %p, x1 %u, y1 %u, x2 %u, y2 %u stub!\n", iface
, x1
, y1
, x2
, y2
);
638 static HRESULT WINAPI
d3drm_viewport1_ForceUpdate(IDirect3DRMViewport
*iface
,
639 DWORD x1
, DWORD y1
, DWORD x2
, DWORD y2
)
641 FIXME("iface %p, x1 %u, y1 %u, x2 %u, y2 %u stub!\n", iface
, x1
, y1
, x2
, y2
);
646 static HRESULT WINAPI
d3drm_viewport2_SetPlane(IDirect3DRMViewport2
*iface
,
647 D3DVALUE left
, D3DVALUE right
, D3DVALUE bottom
, D3DVALUE top
)
649 FIXME("iface %p, left %.8e, right %.8e, bottom %.8e, top %.8e stub!\n",
650 iface
, left
, right
, bottom
, top
);
655 static HRESULT WINAPI
d3drm_viewport1_SetPlane(IDirect3DRMViewport
*iface
,
656 D3DVALUE left
, D3DVALUE right
, D3DVALUE bottom
, D3DVALUE top
)
658 FIXME("iface %p, left %.8e, right %.8e, bottom %.8e, top %.8e stub!\n",
659 iface
, left
, right
, bottom
, top
);
664 static HRESULT WINAPI
d3drm_viewport2_GetCamera(IDirect3DRMViewport2
*iface
, IDirect3DRMFrame3
**camera
)
666 FIXME("iface %p, camera %p stub!\n", iface
, camera
);
671 static HRESULT WINAPI
d3drm_viewport1_GetCamera(IDirect3DRMViewport
*iface
, IDirect3DRMFrame
**camera
)
673 FIXME("iface %p, camera %p stub!\n", iface
, camera
);
678 static HRESULT WINAPI
d3drm_viewport2_GetDevice(IDirect3DRMViewport2
*iface
, IDirect3DRMDevice3
**device
)
680 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
682 TRACE("iface %p, device %p.\n", iface
, device
);
684 if (!viewport
->device
)
685 return D3DRMERR_BADOBJECT
;
687 *device
= &viewport
->device
->IDirect3DRMDevice3_iface
;
688 IDirect3DRMDevice3_AddRef(*device
);
693 static HRESULT WINAPI
d3drm_viewport1_GetDevice(IDirect3DRMViewport
*iface
, IDirect3DRMDevice
**device
)
695 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
697 TRACE("iface %p, device %p.\n\n", iface
, device
);
699 if (!viewport
->device
)
700 return D3DRMERR_BADOBJECT
;
702 *device
= &viewport
->device
->IDirect3DRMDevice_iface
;
703 IDirect3DRMDevice_AddRef(*device
);
708 static HRESULT WINAPI
d3drm_viewport2_GetPlane(IDirect3DRMViewport2
*iface
,
709 D3DVALUE
*left
, D3DVALUE
*right
, D3DVALUE
*bottom
, D3DVALUE
*top
)
711 FIXME("iface %p, left %p, right %p, bottom %p, top %p stub!\n",
712 iface
, left
, right
, bottom
, top
);
717 static HRESULT WINAPI
d3drm_viewport1_GetPlane(IDirect3DRMViewport
*iface
,
718 D3DVALUE
*left
, D3DVALUE
*right
, D3DVALUE
*bottom
, D3DVALUE
*top
)
720 FIXME("iface %p, left %p, right %p, bottom %p, top %p stub!\n",
721 iface
, left
, right
, bottom
, top
);
726 static HRESULT WINAPI
d3drm_viewport2_Pick(IDirect3DRMViewport2
*iface
,
727 LONG x
, LONG y
, IDirect3DRMPickedArray
**visuals
)
729 FIXME("iface %p, x %d, y %d, visuals %p stub!\n", iface
, x
, y
, visuals
);
734 static HRESULT WINAPI
d3drm_viewport1_Pick(IDirect3DRMViewport
*iface
,
735 LONG x
, LONG y
, IDirect3DRMPickedArray
**visuals
)
737 FIXME("iface %p, x %d, y %d, visuals %p stub!\n", iface
, x
, y
, visuals
);
742 static BOOL WINAPI
d3drm_viewport2_GetUniformScaling(IDirect3DRMViewport2
*iface
)
744 FIXME("iface %p stub!\n", iface
);
749 static BOOL WINAPI
d3drm_viewport1_GetUniformScaling(IDirect3DRMViewport
*iface
)
751 FIXME("iface %p stub!\n", iface
);
756 static LONG WINAPI
d3drm_viewport2_GetX(IDirect3DRMViewport2
*iface
)
758 FIXME("iface %p stub!\n", iface
);
763 static LONG WINAPI
d3drm_viewport1_GetX(IDirect3DRMViewport
*iface
)
765 FIXME("iface %p stub!\n", iface
);
770 static LONG WINAPI
d3drm_viewport2_GetY(IDirect3DRMViewport2
*iface
)
772 FIXME("iface %p stub!\n", iface
);
777 static LONG WINAPI
d3drm_viewport1_GetY(IDirect3DRMViewport
*iface
)
779 FIXME("iface %p stub!\n", iface
);
784 static DWORD WINAPI
d3drm_viewport2_GetWidth(IDirect3DRMViewport2
*iface
)
786 FIXME("iface %p stub!\n", iface
);
791 static DWORD WINAPI
d3drm_viewport1_GetWidth(IDirect3DRMViewport
*iface
)
793 FIXME("iface %p stub!\n", iface
);
798 static DWORD WINAPI
d3drm_viewport2_GetHeight(IDirect3DRMViewport2
*iface
)
800 FIXME("iface %p stub!\n", iface
);
805 static DWORD WINAPI
d3drm_viewport1_GetHeight(IDirect3DRMViewport
*iface
)
807 FIXME("iface %p stub!\n", iface
);
812 static D3DVALUE WINAPI
d3drm_viewport2_GetField(IDirect3DRMViewport2
*iface
)
814 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
816 TRACE("iface %p.\n", iface
);
818 return viewport
->field
;
821 static D3DVALUE WINAPI
d3drm_viewport1_GetField(IDirect3DRMViewport
*iface
)
823 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
825 TRACE("iface %p.\n", iface
);
827 return d3drm_viewport2_GetField(&viewport
->IDirect3DRMViewport2_iface
);
830 static D3DVALUE WINAPI
d3drm_viewport2_GetBack(IDirect3DRMViewport2
*iface
)
832 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
834 TRACE("iface %p.\n", iface
);
836 return viewport
->back
;
839 static D3DVALUE WINAPI
d3drm_viewport1_GetBack(IDirect3DRMViewport
*iface
)
841 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
843 TRACE("iface %p.\n", iface
);
845 return d3drm_viewport2_GetBack(&viewport
->IDirect3DRMViewport2_iface
);
848 static D3DVALUE WINAPI
d3drm_viewport2_GetFront(IDirect3DRMViewport2
*iface
)
850 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
852 TRACE("iface %p.\n", iface
);
854 return viewport
->front
;
857 static D3DVALUE WINAPI
d3drm_viewport1_GetFront(IDirect3DRMViewport
*iface
)
859 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
861 TRACE("iface %p.\n", iface
);
863 return d3drm_viewport2_GetFront(&viewport
->IDirect3DRMViewport2_iface
);
866 static D3DRMPROJECTIONTYPE WINAPI
d3drm_viewport2_GetProjection(IDirect3DRMViewport2
*iface
)
868 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport2(iface
);
870 TRACE("iface %p.\n", iface
);
872 return viewport
->projection
;
875 static D3DRMPROJECTIONTYPE WINAPI
d3drm_viewport1_GetProjection(IDirect3DRMViewport
*iface
)
877 struct d3drm_viewport
*viewport
= impl_from_IDirect3DRMViewport(iface
);
879 TRACE("iface %p.\n", iface
);
881 return d3drm_viewport2_GetProjection(&viewport
->IDirect3DRMViewport2_iface
);
884 static HRESULT WINAPI
d3drm_viewport2_GetDirect3DViewport(IDirect3DRMViewport2
*iface
,
885 IDirect3DViewport
**viewport
)
887 struct d3drm_viewport
*viewport_object
= impl_from_IDirect3DRMViewport2(iface
);
889 TRACE("iface %p, viewport %p.\n", iface
, viewport
);
891 if (!viewport_object
->d3d_viewport
)
892 return D3DRMERR_BADOBJECT
;
894 *viewport
= viewport_object
->d3d_viewport
;
895 IDirect3DViewport_AddRef(*viewport
);
900 static HRESULT WINAPI
d3drm_viewport1_GetDirect3DViewport(IDirect3DRMViewport
*iface
,
901 IDirect3DViewport
**viewport
)
903 struct d3drm_viewport
*viewport_object
= impl_from_IDirect3DRMViewport(iface
);
905 TRACE("iface %p, viewport %p.\n", iface
, viewport
);
907 return d3drm_viewport2_GetDirect3DViewport(&viewport_object
->IDirect3DRMViewport2_iface
, viewport
);
910 static HRESULT WINAPI
d3drm_viewport2_TransformVectors(IDirect3DRMViewport2
*iface
,
911 DWORD vector_count
, D3DRMVECTOR4D
*dst
, D3DVECTOR
*src
)
913 FIXME("iface %p, vector_count %u, dst %p, src %p stub!\n", iface
, vector_count
, dst
, src
);
918 static HRESULT WINAPI
d3drm_viewport2_InverseTransformVectors(IDirect3DRMViewport2
*iface
,
919 DWORD vector_count
, D3DVECTOR
*dst
, D3DRMVECTOR4D
*src
)
921 FIXME("iface %p, vector_count %u, dst %p, src %p stub!\n", iface
, vector_count
, dst
, src
);
926 static const struct IDirect3DRMViewport2Vtbl d3drm_viewport2_vtbl
=
928 d3drm_viewport2_QueryInterface
,
929 d3drm_viewport2_AddRef
,
930 d3drm_viewport2_Release
,
931 d3drm_viewport2_Clone
,
932 d3drm_viewport2_AddDestroyCallback
,
933 d3drm_viewport2_DeleteDestroyCallback
,
934 d3drm_viewport2_SetAppData
,
935 d3drm_viewport2_GetAppData
,
936 d3drm_viewport2_SetName
,
937 d3drm_viewport2_GetName
,
938 d3drm_viewport2_GetClassName
,
939 d3drm_viewport2_Init
,
940 d3drm_viewport2_Clear
,
941 d3drm_viewport2_Render
,
942 d3drm_viewport2_SetFront
,
943 d3drm_viewport2_SetBack
,
944 d3drm_viewport2_SetField
,
945 d3drm_viewport2_SetUniformScaling
,
946 d3drm_viewport2_SetCamera
,
947 d3drm_viewport2_SetProjection
,
948 d3drm_viewport2_Transform
,
949 d3drm_viewport2_InverseTransform
,
950 d3drm_viewport2_Configure
,
951 d3drm_viewport2_ForceUpdate
,
952 d3drm_viewport2_SetPlane
,
953 d3drm_viewport2_GetCamera
,
954 d3drm_viewport2_GetDevice
,
955 d3drm_viewport2_GetPlane
,
956 d3drm_viewport2_Pick
,
957 d3drm_viewport2_GetUniformScaling
,
958 d3drm_viewport2_GetX
,
959 d3drm_viewport2_GetY
,
960 d3drm_viewport2_GetWidth
,
961 d3drm_viewport2_GetHeight
,
962 d3drm_viewport2_GetField
,
963 d3drm_viewport2_GetBack
,
964 d3drm_viewport2_GetFront
,
965 d3drm_viewport2_GetProjection
,
966 d3drm_viewport2_GetDirect3DViewport
,
967 d3drm_viewport2_TransformVectors
,
968 d3drm_viewport2_InverseTransformVectors
,
971 static const struct IDirect3DRMViewportVtbl d3drm_viewport1_vtbl
=
973 d3drm_viewport1_QueryInterface
,
974 d3drm_viewport1_AddRef
,
975 d3drm_viewport1_Release
,
976 d3drm_viewport1_Clone
,
977 d3drm_viewport1_AddDestroyCallback
,
978 d3drm_viewport1_DeleteDestroyCallback
,
979 d3drm_viewport1_SetAppData
,
980 d3drm_viewport1_GetAppData
,
981 d3drm_viewport1_SetName
,
982 d3drm_viewport1_GetName
,
983 d3drm_viewport1_GetClassName
,
984 d3drm_viewport1_Init
,
985 d3drm_viewport1_Clear
,
986 d3drm_viewport1_Render
,
987 d3drm_viewport1_SetFront
,
988 d3drm_viewport1_SetBack
,
989 d3drm_viewport1_SetField
,
990 d3drm_viewport1_SetUniformScaling
,
991 d3drm_viewport1_SetCamera
,
992 d3drm_viewport1_SetProjection
,
993 d3drm_viewport1_Transform
,
994 d3drm_viewport1_InverseTransform
,
995 d3drm_viewport1_Configure
,
996 d3drm_viewport1_ForceUpdate
,
997 d3drm_viewport1_SetPlane
,
998 d3drm_viewport1_GetCamera
,
999 d3drm_viewport1_GetDevice
,
1000 d3drm_viewport1_GetPlane
,
1001 d3drm_viewport1_Pick
,
1002 d3drm_viewport1_GetUniformScaling
,
1003 d3drm_viewport1_GetX
,
1004 d3drm_viewport1_GetY
,
1005 d3drm_viewport1_GetWidth
,
1006 d3drm_viewport1_GetHeight
,
1007 d3drm_viewport1_GetField
,
1008 d3drm_viewport1_GetBack
,
1009 d3drm_viewport1_GetFront
,
1010 d3drm_viewport1_GetProjection
,
1011 d3drm_viewport1_GetDirect3DViewport
,
1014 HRESULT
d3drm_viewport_create(struct d3drm_viewport
**viewport
, IDirect3DRM
*d3drm
)
1016 struct d3drm_viewport
*object
;
1018 TRACE("viewport %p, d3drm %p.\n", viewport
, d3drm
);
1020 if (!(object
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*object
))))
1021 return E_OUTOFMEMORY
;
1023 object
->IDirect3DRMViewport_iface
.lpVtbl
= &d3drm_viewport1_vtbl
;
1024 object
->IDirect3DRMViewport2_iface
.lpVtbl
= &d3drm_viewport2_vtbl
;
1025 object
->d3drm
= d3drm
;
1026 d3drm_object_init(&object
->obj
);