mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 10:41:12 +00:00
Added support for non-full screen viewports and clearing.
This commit is contained in:
parent
cc5f3cd9b8
commit
86f69135c4
3 changed files with 74 additions and 29 deletions
|
@ -1087,25 +1087,8 @@ Main_IDirect3DDeviceImpl_3_2T_SetCurrentViewport(LPDIRECT3DDEVICE3 iface,
|
|||
|
||||
/* Activate this viewport */
|
||||
This->current_viewport->active_device = This;
|
||||
This->current_viewport->activate(This->current_viewport);
|
||||
This->current_viewport->activate(This->current_viewport);
|
||||
|
||||
/* And copy the values in the structure used by the device */
|
||||
if (This->current_viewport->use_vp2) {
|
||||
This->active_viewport.dwX = This->current_viewport->viewports.vp2.dwX;
|
||||
This->active_viewport.dwY = This->current_viewport->viewports.vp2.dwY;
|
||||
This->active_viewport.dwHeight = This->current_viewport->viewports.vp2.dwHeight;
|
||||
This->active_viewport.dwWidth = This->current_viewport->viewports.vp2.dwWidth;
|
||||
This->active_viewport.dvMinZ = This->current_viewport->viewports.vp2.dvMinZ;
|
||||
This->active_viewport.dvMaxZ = This->current_viewport->viewports.vp2.dvMaxZ;
|
||||
} else {
|
||||
This->active_viewport.dwX = This->current_viewport->viewports.vp1.dwX;
|
||||
This->active_viewport.dwY = This->current_viewport->viewports.vp1.dwY;
|
||||
This->active_viewport.dwHeight = This->current_viewport->viewports.vp1.dwHeight;
|
||||
This->active_viewport.dwWidth = This->current_viewport->viewports.vp1.dwWidth;
|
||||
This->active_viewport.dvMinZ = This->current_viewport->viewports.vp1.dvMinZ;
|
||||
This->active_viewport.dvMaxZ = This->current_viewport->viewports.vp1.dvMaxZ;
|
||||
}
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -2190,24 +2190,51 @@ GL_IDirect3DDeviceImpl_7_SetClipPlane(LPDIRECT3DDEVICE7 iface, DWORD dwIndex, CO
|
|||
|
||||
TRACE("(%p)->(%ld,%p)\n", This, dwIndex, pPlaneEquation);
|
||||
|
||||
if (dwIndex>=This->max_clipping_planes) {
|
||||
if (dwIndex >= This->max_clipping_planes) {
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
TRACE(" clip plane %ld : %f %f %f %f\n", dwIndex, pPlaneEquation[0], pPlaneEquation[1], pPlaneEquation[2], pPlaneEquation[3] );
|
||||
|
||||
memcpy( This->clipping_planes[dwIndex].plane, pPlaneEquation, sizeof(D3DVALUE[4]));
|
||||
memcpy(This->clipping_planes[dwIndex].plane, pPlaneEquation, sizeof(D3DVALUE[4]));
|
||||
plane[0] = pPlaneEquation[0];
|
||||
plane[1] = pPlaneEquation[1];
|
||||
plane[2] = pPlaneEquation[2];
|
||||
plane[3] = pPlaneEquation[3];
|
||||
|
||||
/* XXX: is here also code needed to handle the transformation of the world? */
|
||||
glClipPlane( GL_CLIP_PLANE0+dwIndex, (const GLdouble*)(&plane) );
|
||||
glClipPlane( GL_CLIP_PLANE0 + dwIndex, (const GLdouble*) (&plane) );
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
||||
HRESULT WINAPI
|
||||
GL_IDirect3DDeviceImpl_7_SetViewport(LPDIRECT3DDEVICE7 iface,
|
||||
LPD3DVIEWPORT7 lpData)
|
||||
{
|
||||
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||
TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
|
||||
|
||||
if (TRACE_ON(ddraw)) {
|
||||
TRACE(" viewport is : \n");
|
||||
TRACE(" - dwX = %ld dwY = %ld\n",
|
||||
lpData->dwX, lpData->dwY);
|
||||
TRACE(" - dwWidth = %ld dwHeight = %ld\n",
|
||||
lpData->dwWidth, lpData->dwHeight);
|
||||
TRACE(" - dvMinZ = %f dvMaxZ = %f\n",
|
||||
lpData->dvMinZ, lpData->dvMaxZ);
|
||||
}
|
||||
This->active_viewport = *lpData;
|
||||
|
||||
/* Set the viewport */
|
||||
glDepthRange(lpData->dvMinZ, lpData->dvMaxZ);
|
||||
glViewport(lpData->dwX,
|
||||
This->surface->surface_desc.dwHeight - (lpData->dwHeight + lpData->dwY),
|
||||
lpData->dwWidth, lpData->dwHeight);
|
||||
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
|
||||
# define XCAST(fun) (typeof(VTABLE_IDirect3DDevice7.fun))
|
||||
#else
|
||||
|
@ -2230,7 +2257,7 @@ ICOM_VTABLE(IDirect3DDevice7) VTABLE_IDirect3DDevice7 =
|
|||
XCAST(Clear) Main_IDirect3DDeviceImpl_7_Clear,
|
||||
XCAST(SetTransform) Main_IDirect3DDeviceImpl_7_3T_2T_SetTransform,
|
||||
XCAST(GetTransform) Main_IDirect3DDeviceImpl_7_3T_2T_GetTransform,
|
||||
XCAST(SetViewport) Main_IDirect3DDeviceImpl_7_SetViewport,
|
||||
XCAST(SetViewport) GL_IDirect3DDeviceImpl_7_SetViewport,
|
||||
XCAST(MultiplyTransform) Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform,
|
||||
XCAST(GetViewport) Main_IDirect3DDeviceImpl_7_GetViewport,
|
||||
XCAST(SetMaterial) GL_IDirect3DDeviceImpl_7_SetMaterial,
|
||||
|
@ -2430,6 +2457,8 @@ static HRESULT d3ddevice_clear(IDirect3DDeviceImpl *This,
|
|||
GLbitfield bitfield = 0;
|
||||
GLint old_stencil_clear_value;
|
||||
GLfloat old_color_clear_value[4];
|
||||
D3DRECT rect;
|
||||
int i;
|
||||
|
||||
TRACE("(%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
|
||||
if (TRACE_ON(ddraw)) {
|
||||
|
@ -2442,10 +2471,16 @@ static HRESULT d3ddevice_clear(IDirect3DDeviceImpl *This,
|
|||
}
|
||||
}
|
||||
|
||||
if (dwCount > 1) {
|
||||
WARN(" Warning, this function only for now clears the whole screen...\n");
|
||||
if (dwCount == 0) {
|
||||
/* Not sure if this is really needed... */
|
||||
dwCount = 1;
|
||||
rect.u1.x1 = 0;
|
||||
rect.u2.y1 = 0;
|
||||
rect.u3.x2 = This->surface->surface_desc.dwWidth;
|
||||
rect.u4.y2 = This->surface->surface_desc.dwHeight;
|
||||
lpRects = ▭
|
||||
}
|
||||
|
||||
|
||||
/* Clears the screen */
|
||||
ENTER_GL();
|
||||
if (dwFlags & D3DCLEAR_ZBUFFER) {
|
||||
|
@ -2471,8 +2506,14 @@ static HRESULT d3ddevice_clear(IDirect3DDeviceImpl *This,
|
|||
((dwColor >> 24) & 0xFF) / 255.0);
|
||||
TRACE(" color value (ARGB) : %08lx\n", dwColor);
|
||||
}
|
||||
|
||||
glClear(bitfield);
|
||||
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
for (i = 0; i < dwCount; i++) {
|
||||
glScissor(lpRects[i].u1.x1, This->surface->surface_desc.dwHeight - lpRects[i].u4.y2,
|
||||
lpRects[i].u3.x2 - lpRects[i].u1.x1, lpRects[i].u4.y2 - lpRects[i].u2.y1);
|
||||
glClear(bitfield);
|
||||
}
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
||||
if (dwFlags & D3DCLEAR_ZBUFFER) {
|
||||
glDepthMask(ztest);
|
||||
|
@ -2504,7 +2545,7 @@ d3ddevice_blt(IDirectDrawSurfaceImpl *This, LPRECT rdst,
|
|||
/* This is easy to handle for the D3D Device... */
|
||||
DWORD color = lpbltfx->u5.dwFillColor;
|
||||
TRACE(" executing D3D Device override.\n");
|
||||
d3ddevice_clear(This->d3ddevice, 0, NULL, D3DCLEAR_TARGET, color, 0.0, 0x00000000);
|
||||
d3ddevice_clear(This->d3ddevice, 1, rdst, D3DCLEAR_TARGET, color, 0.0, 0x00000000);
|
||||
return DD_OK;
|
||||
}
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
|
|
@ -34,7 +34,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
|||
|
||||
static void activate(IDirect3DViewportImpl* This) {
|
||||
IDirect3DLightImpl* light;
|
||||
|
||||
D3DVIEWPORT7 vp;
|
||||
|
||||
/* Activate all the lights associated with this context */
|
||||
light = This->lights;
|
||||
|
||||
|
@ -42,6 +43,26 @@ static void activate(IDirect3DViewportImpl* This) {
|
|||
light->activate(light);
|
||||
light = light->next;
|
||||
}
|
||||
|
||||
/* And copy the values in the structure used by the device */
|
||||
if (This->use_vp2) {
|
||||
vp.dwX = This->viewports.vp2.dwX;
|
||||
vp.dwY = This->viewports.vp2.dwY;
|
||||
vp.dwHeight = This->viewports.vp2.dwHeight;
|
||||
vp.dwWidth = This->viewports.vp2.dwWidth;
|
||||
vp.dvMinZ = This->viewports.vp2.dvMinZ;
|
||||
vp.dvMaxZ = This->viewports.vp2.dvMaxZ;
|
||||
} else {
|
||||
vp.dwX = This->viewports.vp1.dwX;
|
||||
vp.dwY = This->viewports.vp1.dwY;
|
||||
vp.dwHeight = This->viewports.vp1.dwHeight;
|
||||
vp.dwWidth = This->viewports.vp1.dwWidth;
|
||||
vp.dvMinZ = This->viewports.vp1.dvMinZ;
|
||||
vp.dvMaxZ = This->viewports.vp1.dvMaxZ;
|
||||
}
|
||||
|
||||
/* And also set the viewport */
|
||||
IDirect3DDevice7_SetViewport(ICOM_INTERFACE(This->active_device, IDirect3DDevice7), &vp);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue