[D3D] Some viewport fixes
Christian Costa
titan.costa at wanadoo.fr
Sun Oct 12 04:55:20 CDT 2003
Hi,
This patch makes Nomad Soul display 3D. This game is playbable now.
Bye,
Christian.
Changelog :
Add necessary AddRef/Release stuff to {Set/Get}CurrentViewport.
When changing parameters of a viewport, do the appropriate update if it
is current.
Christian Costa titan.costa at wanadoo.fr
-------------- next part --------------
Index: d3dviewport.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3dviewport.c,v
retrieving revision 1.22
diff -u -r1.22 d3dviewport.c
--- d3dviewport.c 5 Sep 2003 23:08:41 -0000 1.22
+++ d3dviewport.c 12 Oct 2003 09:33:44 -0000
@@ -180,6 +180,7 @@
LPD3DVIEWPORT lpData)
{
ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+ LPDIRECT3DVIEWPORT3 current_viewport;
TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
if (TRACE_ON(ddraw)) {
@@ -196,7 +197,14 @@
*/
This->viewports.vp1.dvMinZ = 0.0;
This->viewports.vp1.dvMaxZ = 1.0;
-
+
+ if (This->active_device) {
+ IDirect3DDevice3_GetCurrentViewport(ICOM_INTERFACE(This->active_device, IDirect3DDevice3), ¤t_viewport);
+ if (ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, current_viewport) == This)
+ This->activate(This);
+ IDirect3DViewport3_Release(current_viewport);
+ }
+
return DD_OK;
}
@@ -402,6 +410,7 @@
LPD3DVIEWPORT2 lpData)
{
ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+ LPDIRECT3DVIEWPORT3 current_viewport;
TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
if (TRACE_ON(ddraw)) {
@@ -412,6 +421,14 @@
This->use_vp2 = 1;
memset(&(This->viewports.vp2), 0, sizeof(This->viewports.vp2));
memcpy(&(This->viewports.vp2), lpData, lpData->dwSize);
+
+ if (This->active_device) {
+ IDirect3DDevice3_GetCurrentViewport(ICOM_INTERFACE(This->active_device, IDirect3DDevice3), ¤t_viewport);
+ if (ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, current_viewport) == This)
+ This->activate(This);
+ IDirect3DViewport3_Release(current_viewport);
+ }
+
return DD_OK;
}
Index: d3ddevice/main.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/d3ddevice/main.c,v
retrieving revision 1.49
diff -u -r1.49 main.c
--- d3ddevice/main.c 5 Sep 2003 23:08:41 -0000 1.49
+++ d3ddevice/main.c 12 Oct 2003 09:33:49 -0000
@@ -1100,15 +1100,24 @@
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
TRACE("(%p/%p)->(%p)\n", This, iface, lpDirect3DViewport3);
+ /* Do nothing if the specified viewport is the same as the current one */
+ if (This->current_viewport == ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3))
+ return DD_OK;
+
/* Should check if the viewport was added or not */
+ /* Release previous viewport and AddRef the new one */
+ if (This->current_viewport)
+ IDirect3DViewport3_Release(ICOM_INTERFACE(This->current_viewport, IDirect3DViewport3));
+ IDirect3DViewport3_AddRef(lpDirect3DViewport3);
+
/* Set this viewport as the current viewport */
This->current_viewport = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, lpDirect3DViewport3);
/* Activate this viewport */
This->current_viewport->active_device = This;
This->current_viewport->activate(This->current_viewport);
-
+
return DD_OK;
}
@@ -1120,6 +1129,10 @@
TRACE("(%p/%p)->(%p)\n", This, iface, lplpDirect3DViewport3);
*lplpDirect3DViewport3 = ICOM_INTERFACE(This->current_viewport, IDirect3DViewport3);
+
+ /* AddRef the returned viewport */
+ IDirect3DViewport3_AddRef(*lplpDirect3DViewport3);
+
TRACE(" returning interface %p\n", *lplpDirect3DViewport3);
return DD_OK;
More information about the wine-patches
mailing list