4 This files contains the implementation of Direct3DViewport2. */
9 #include "wine/obj_base.h"
13 #include "debugtools.h"
15 #include "d3d_private.h"
16 #include "mesa_private.h"
18 DEFAULT_DEBUG_CHANNEL(ddraw);
22 #define D3DVPRIVATE(x) mesa_d3dv_private*dvpriv=((mesa_d3dv_private*)x->private)
23 #define D3DLPRIVATE(x) mesa_d3dl_private*dlpriv=((mesa_d3dl_private*)x->private)
25 static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable;
27 /*******************************************************************************
28 * Viewport1/2 static functions
30 static void activate(IDirect3DViewport2Impl* This) {
31 IDirect3DLightImpl* l;
33 /* Activate all the lights associated with this context */
42 /*******************************************************************************
43 * Viewport1/2 Creation functions
45 LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2)
47 IDirect3DViewport2Impl* vp;
49 vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
50 vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
52 ICOM_VTBL(vp) = &viewport2_vtable;
56 vp->device.active_device2 = NULL;
57 vp->activate = activate;
61 ((mesa_d3dv_private *) vp->private)->nextlight = GL_LIGHT0;
63 return (LPDIRECT3DVIEWPORT2)vp;
66 LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1)
68 IDirect3DViewport2Impl* vp;
70 vp = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DViewport2Impl));
71 vp->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dv_private));
73 ICOM_VTBL(vp) = &viewport2_vtable;
77 vp->device.active_device1 = NULL;
78 vp->activate = activate;
82 ((mesa_d3dv_private *) vp->private)->nextlight = GL_LIGHT0;
84 return (LPDIRECT3DVIEWPORT) vp;
87 /*******************************************************************************
88 * IDirect3DViewport2 methods
91 HRESULT WINAPI IDirect3DViewport2Impl_QueryInterface(LPDIRECT3DVIEWPORT2 iface,
95 ICOM_THIS(IDirect3DViewport2Impl,iface);
97 FIXME("(%p)->(%s,%p): stub\n", This, debugstr_guid(riid),ppvObj);
104 ULONG WINAPI IDirect3DViewport2Impl_AddRef(LPDIRECT3DVIEWPORT2 iface)
106 ICOM_THIS(IDirect3DViewport2Impl,iface);
107 TRACE("(%p)->()incrementing from %lu.\n", This, This->ref );
109 return ++(This->ref);
114 ULONG WINAPI IDirect3DViewport2Impl_Release(LPDIRECT3DVIEWPORT2 iface)
116 ICOM_THIS(IDirect3DViewport2Impl,iface);
117 FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
119 if (!--(This->ref)) {
120 HeapFree(GetProcessHeap(),0,This);
127 /*** IDirect3DViewport methods ***/
128 HRESULT WINAPI IDirect3DViewport2Impl_Initialize(LPDIRECT3DVIEWPORT2 iface,
131 ICOM_THIS(IDirect3DViewport2Impl,iface);
132 FIXME("(%p)->(%p): stub\n", This, d3d);
137 HRESULT WINAPI IDirect3DViewport2Impl_GetViewport(LPDIRECT3DVIEWPORT2 iface,
140 ICOM_THIS(IDirect3DViewport2Impl,iface);
141 FIXME("(%p)->(%p): stub\n", This, lpvp);
143 if (This->use_vp2 != 0)
144 return DDERR_INVALIDPARAMS;
146 *lpvp = This->viewport.vp1;
151 HRESULT WINAPI IDirect3DViewport2Impl_SetViewport(LPDIRECT3DVIEWPORT2 iface,
154 ICOM_THIS(IDirect3DViewport2Impl,iface);
155 FIXME("(%p)->(%p): stub\n", This, lpvp);
158 This->viewport.vp1 = *lpvp;
160 TRACE("dwSize = %ld dwX = %ld dwY = %ld\n",
161 lpvp->dwSize, lpvp->dwX, lpvp->dwY);
162 TRACE("dwWidth = %ld dwHeight = %ld\n",
163 lpvp->dwWidth, lpvp->dwHeight);
164 TRACE("dvScaleX = %f dvScaleY = %f\n",
165 lpvp->dvScaleX, lpvp->dvScaleY);
166 TRACE("dvMaxX = %f dvMaxY = %f\n",
167 lpvp->dvMaxX, lpvp->dvMaxY);
168 TRACE("dvMinZ = %f dvMaxZ = %f\n",
169 lpvp->dvMinZ, lpvp->dvMaxZ);
175 HRESULT WINAPI IDirect3DViewport2Impl_TransformVertices(LPDIRECT3DVIEWPORT2 iface,
177 LPD3DTRANSFORMDATA lpData,
181 ICOM_THIS(IDirect3DViewport2Impl,iface);
182 FIXME("(%p)->(%8ld,%p,%08lx,%p): stub\n",
183 This, dwVertexCount, lpData, dwFlags, lpOffScreen);
188 HRESULT WINAPI IDirect3DViewport2Impl_LightElements(LPDIRECT3DVIEWPORT2 iface,
189 DWORD dwElementCount,
190 LPD3DLIGHTDATA lpData)
192 ICOM_THIS(IDirect3DViewport2Impl,iface);
193 FIXME("(%p)->(%8ld,%p): stub\n", This, dwElementCount, lpData);
198 HRESULT WINAPI IDirect3DViewport2Impl_SetBackground(LPDIRECT3DVIEWPORT2 iface,
199 D3DMATERIALHANDLE hMat)
201 ICOM_THIS(IDirect3DViewport2Impl,iface);
202 FIXME("(%p)->(%08lx): stub\n", This, (DWORD) hMat);
207 HRESULT WINAPI IDirect3DViewport2Impl_GetBackground(LPDIRECT3DVIEWPORT2 iface,
208 LPD3DMATERIALHANDLE lphMat,
211 ICOM_THIS(IDirect3DViewport2Impl,iface);
212 FIXME("(%p)->(%p,%p): stub\n", This, lphMat, lpValid);
217 HRESULT WINAPI IDirect3DViewport2Impl_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
218 LPDIRECTDRAWSURFACE lpDDSurface)
220 ICOM_THIS(IDirect3DViewport2Impl,iface);
221 FIXME("(%p)->(%p): stub\n", This, lpDDSurface);
226 HRESULT WINAPI IDirect3DViewport2Impl_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 iface,
227 LPDIRECTDRAWSURFACE* lplpDDSurface,
230 ICOM_THIS(IDirect3DViewport2Impl,iface);
231 FIXME("(%p)->(%p,%p): stub\n", This, lplpDDSurface, lpValid);
236 HRESULT WINAPI IDirect3DViewport2Impl_Clear(LPDIRECT3DVIEWPORT2 iface,
241 ICOM_THIS(IDirect3DViewport2Impl,iface);
243 FIXME("(%p)->(%8ld,%p,%08lx): stub\n", This, dwCount, lpRects, dwFlags);
245 /* For the moment, ignore the rectangles */
246 if (This->device.active_device1 != NULL) {
247 /* Get the rendering context */
249 This->device.active_device2->set_context(This->device.active_device2);
251 This->device.active_device1->set_context(This->device.active_device1);
254 /* Clears the screen */
256 glGetBooleanv(GL_DEPTH_TEST, &ztest);
257 glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
258 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
265 HRESULT WINAPI IDirect3DViewport2Impl_AddLight(LPDIRECT3DVIEWPORT2 iface,
266 LPDIRECT3DLIGHT lpLight)
268 ICOM_THIS(IDirect3DViewport2Impl,iface);
269 IDirect3DLightImpl* ilpLight=(IDirect3DLightImpl*)lpLight;
270 FIXME("(%p)->(%p): stub\n", This, ilpLight);
272 /* Add the light in the 'linked' chain */
273 ilpLight->next = This->lights;
274 This->lights = ilpLight;
276 /* If active, activate the light */
277 if (This->device.active_device1 != NULL) {
279 D3DLPRIVATE(ilpLight);
281 /* Get the rendering context */
283 This->device.active_device2->set_context(This->device.active_device2);
285 This->device.active_device1->set_context(This->device.active_device1);
287 /* Activate the light */
288 dlpriv->light_num = dvpriv->nextlight++;
289 ilpLight->activate(ilpLight);
295 HRESULT WINAPI IDirect3DViewport2Impl_DeleteLight(LPDIRECT3DVIEWPORT2 iface,
296 LPDIRECT3DLIGHT lpLight)
298 ICOM_THIS(IDirect3DViewport2Impl,iface);
299 FIXME("(%p)->(%p): stub\n", This, lpLight);
304 HRESULT WINAPI IDirect3DViewport2Impl_NextLight(LPDIRECT3DVIEWPORT2 iface,
305 LPDIRECT3DLIGHT lpLight,
306 LPDIRECT3DLIGHT* lplpLight,
309 ICOM_THIS(IDirect3DViewport2Impl,iface);
310 FIXME("(%p)->(%p,%p,%08lx): stub\n", This, lpLight, lplpLight, dwFlags);
315 /*** IDirect3DViewport2 methods ***/
316 HRESULT WINAPI IDirect3DViewport2Impl_GetViewport2(LPDIRECT3DVIEWPORT2 iface,
317 LPD3DVIEWPORT2 lpViewport2)
319 ICOM_THIS(IDirect3DViewport2Impl,iface);
320 TRACE("(%p)->(%p)\n", This, lpViewport2);
322 if (This->use_vp2 != 1)
323 return DDERR_INVALIDPARAMS;
325 *lpViewport2 = This->viewport.vp2;
330 HRESULT WINAPI IDirect3DViewport2Impl_SetViewport2(LPDIRECT3DVIEWPORT2 iface,
331 LPD3DVIEWPORT2 lpViewport2)
333 ICOM_THIS(IDirect3DViewport2Impl,iface);
334 TRACE("(%p)->(%p)\n", This, lpViewport2);
336 TRACE("dwSize = %ld dwX = %ld dwY = %ld\n",
337 lpViewport2->dwSize, lpViewport2->dwX, lpViewport2->dwY);
338 TRACE("dwWidth = %ld dwHeight = %ld\n",
339 lpViewport2->dwWidth, lpViewport2->dwHeight);
340 TRACE("dvClipX = %f dvClipY = %f\n",
341 lpViewport2->dvClipX, lpViewport2->dvClipY);
342 TRACE("dvClipWidth = %f dvClipHeight = %f\n",
343 lpViewport2->dvClipWidth, lpViewport2->dvClipHeight);
344 TRACE("dvMinZ = %f dvMaxZ = %f\n",
345 lpViewport2->dvMinZ, lpViewport2->dvMaxZ);
347 This->viewport.vp2 = *lpViewport2;
354 /*******************************************************************************
355 * IDirect3DViewport1/2 VTable
357 static ICOM_VTABLE(IDirect3DViewport2) viewport2_vtable =
359 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
360 /*** IUnknown methods ***/
361 IDirect3DViewport2Impl_QueryInterface,
362 IDirect3DViewport2Impl_AddRef,
363 IDirect3DViewport2Impl_Release,
364 /*** IDirect3DViewport methods ***/
365 IDirect3DViewport2Impl_Initialize,
366 IDirect3DViewport2Impl_GetViewport,
367 IDirect3DViewport2Impl_SetViewport,
368 IDirect3DViewport2Impl_TransformVertices,
369 IDirect3DViewport2Impl_LightElements,
370 IDirect3DViewport2Impl_SetBackground,
371 IDirect3DViewport2Impl_GetBackground,
372 IDirect3DViewport2Impl_SetBackgroundDepth,
373 IDirect3DViewport2Impl_GetBackgroundDepth,
374 IDirect3DViewport2Impl_Clear,
375 IDirect3DViewport2Impl_AddLight,
376 IDirect3DViewport2Impl_DeleteLight,
377 IDirect3DViewport2Impl_NextLight,
378 /*** IDirect3DViewport2 methods ***/
379 IDirect3DViewport2Impl_GetViewport2,
380 IDirect3DViewport2Impl_SetViewport2
383 #else /* HAVE_OPENGL */
385 LPDIRECT3DVIEWPORT d3dviewport_create(IDirect3DImpl* d3d1) {
386 ERR("Should not be called...\n");
390 LPDIRECT3DVIEWPORT2 d3dviewport2_create(IDirect3D2Impl* d3d2) {
391 ERR("Should not be called...\n");
395 #endif /* HAVE_OPENGL */