Module: wine Branch: refs/heads/master Commit: 5b8b776431d34ffc18ac02123bb58bd31fc54f9a URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=5b8b776431d34ffc18ac0212...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu May 25 11:40:36 2006 +0200
wined3d: Small rhw vertex fix.
Fix the one pixel displacement and move the glOrtho code in a common function.
---
dlls/wined3d/drawprim.c | 86 ++++++++++++++++++++-------------------- dlls/wined3d/surface.c | 71 +-------------------------------- dlls/wined3d/wined3d_private.h | 3 - 3 files changed, 47 insertions(+), 113 deletions(-)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index b78e3d6..6e703eb 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -180,6 +180,49 @@ static GLfloat invymat[16] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+void d3ddevice_set_ortho(IWineD3DDeviceImpl *This) { + /* If the last draw was transformed as well, no need to reapply all the matrixes */ + if ( (!This->last_was_rhw) || (This->viewport_changed) ) { + + double X, Y, height, width, minZ, maxZ; + This->last_was_rhw = TRUE; + This->viewport_changed = FALSE; + + /* Transformed already into viewport coordinates, so we do not need transform + matrices. Reset all matrices to identity and leave the default matrix in world + mode. */ + glMatrixMode(GL_MODELVIEW); + checkGLcall("glMatrixMode(GL_MODELVIEW)"); + glLoadIdentity(); + checkGLcall("glLoadIdentity"); + + glMatrixMode(GL_PROJECTION); + checkGLcall("glMatrixMode(GL_PROJECTION)"); + glLoadIdentity(); + checkGLcall("glLoadIdentity"); + + /* Set up the viewport to be full viewport */ + X = This->stateBlock->viewport.X; + Y = This->stateBlock->viewport.Y; + height = This->stateBlock->viewport.Height; + width = This->stateBlock->viewport.Width; + minZ = This->stateBlock->viewport.MinZ; + maxZ = This->stateBlock->viewport.MaxZ; + TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ); + glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ); + checkGLcall("glOrtho"); + + /* Window Coord 0 is the middle of the first pixel, so translate by half + a pixel (See comment above glTranslate below) */ + glTranslatef(0.375, 0.375, 0); + checkGLcall("glTranslatef(0.375, 0.375, 0)"); + if (This->renderUpsideDown) { + glMultMatrixf(invymat); + checkGLcall("glMultMatrixf(invymat)"); + } + } + +} /* Setup views - Transformed & lit if RHW, else untransformed. Only unlit if Normals are supplied Returns: Whether to restore lighting afterwards */ @@ -198,48 +241,7 @@ static BOOL primitiveInitState(IWineD3DD }
if (!useVS && vtx_transformed) { - - /* If the last draw was transformed as well, no need to reapply all the matrixes */ - if ( (!This->last_was_rhw) || (This->viewport_changed) ) { - - double X, Y, height, width, minZ, maxZ; - This->last_was_rhw = TRUE; - This->viewport_changed = FALSE; - - /* Transformed already into viewport coordinates, so we do not need transform - matrices. Reset all matrices to identity and leave the default matrix in world - mode. */ - glMatrixMode(GL_MODELVIEW); - checkGLcall("glMatrixMode(GL_MODELVIEW)"); - glLoadIdentity(); - checkGLcall("glLoadIdentity"); - - glMatrixMode(GL_PROJECTION); - checkGLcall("glMatrixMode(GL_PROJECTION)"); - glLoadIdentity(); - checkGLcall("glLoadIdentity"); - - /* Set up the viewport to be full viewport */ - X = This->stateBlock->viewport.X; - Y = This->stateBlock->viewport.Y; - height = This->stateBlock->viewport.Height; - width = This->stateBlock->viewport.Width; - minZ = This->stateBlock->viewport.MinZ; - maxZ = This->stateBlock->viewport.MaxZ; - TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ); - glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ); - checkGLcall("glOrtho"); - - /* Window Coord 0 is the middle of the first pixel, so translate by half - a pixel (See comment above glTranslate below) */ - glTranslatef(0.5, 0.5, 0); - checkGLcall("glTranslatef(0.5, 0.5, 0)"); - if (This->renderUpsideDown) { - glMultMatrixf(invymat); - checkGLcall("glMultMatrixf(invymat)"); - } - } - + d3ddevice_set_ortho(This); } else {
/* Untransformed, so relies on the view and projection matrices */ diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 301f7df..7932667 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -780,41 +780,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_Unloc /* glDrawPixels transforms the raster position as though it was a vertex - we want to draw at screen position 0,0 - Set up ortho (rhw) mode as per drawprim (and leave set - it will sort itself out due to last_was_rhw */ - if ( (!myDevice->last_was_rhw) || (myDevice->viewport_changed) ) { - - double X, Y, height, width, minZ, maxZ; - myDevice->last_was_rhw = TRUE; - myDevice->viewport_changed = FALSE; - - /* Transformed already into viewport coordinates, so we do not need transform - matrices. Reset all matrices to identity and leave the default matrix in world - mode. */ - glMatrixMode(GL_MODELVIEW); - checkGLcall("glMatrixMode"); - glLoadIdentity(); - checkGLcall("glLoadIdentity"); - - glMatrixMode(GL_PROJECTION); - checkGLcall("glMatrixMode"); - glLoadIdentity(); - checkGLcall("glLoadIdentity"); - - /* Set up the viewport to be full viewport */ - X = myDevice->stateBlock->viewport.X; - Y = myDevice->stateBlock->viewport.Y; - height = myDevice->stateBlock->viewport.Height; - width = myDevice->stateBlock->viewport.Width; - minZ = myDevice->stateBlock->viewport.MinZ; - maxZ = myDevice->stateBlock->viewport.MaxZ; - TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ); - glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ); - checkGLcall("glOrtho"); - - /* Window Coord 0 is the middle of the first pixel, so translate by half - a pixel (See comment above glTranslate below) */ - glTranslatef(0.5, 0.5, 0); - checkGLcall("glTranslatef(0.5, 0.5, 0)"); - } + d3ddevice_set_ortho(This->resource.wineD3DDevice);
if (iface == implSwapChain->backBuffer || iface == myDevice->renderTarget) { glDrawBuffer(GL_BACK); @@ -2192,40 +2158,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_BltOv
/* Draw a textured quad */ - if ( TRUE ) { - double X, Y, height, width, minZ, maxZ; - myDevice->last_was_rhw = FALSE; - myDevice->viewport_changed = FALSE; - - /* Transformed already into viewport coordinates, so we do not need transform - matrices. Reset all matrices to identity and leave the default matrix in world - mode. */ - glMatrixMode(GL_MODELVIEW); - checkGLcall("glMatrixMode"); - glLoadIdentity(); - checkGLcall("glLoadIdentity"); - - glMatrixMode(GL_PROJECTION); - checkGLcall("glMatrixMode"); - glLoadIdentity(); - checkGLcall("glLoadIdentity"); - - /* Set up the viewport to be full viewport */ - X = myDevice->stateBlock->viewport.X; - Y = myDevice->stateBlock->viewport.Y; - height = myDevice->stateBlock->viewport.Height; - width = myDevice->stateBlock->viewport.Width; - minZ = myDevice->stateBlock->viewport.MinZ; - maxZ = myDevice->stateBlock->viewport.MaxZ; - TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ); - glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ); - checkGLcall("glOrtho"); - - /* Window Coord 0 is the middle of the first pixel, so translate by half - a pixel (See comment above glTranslate below) */ - glTranslatef(0.375, 0.375, 0); - checkGLcall("glTranslatef(0.375, 0.375, 0)"); - } + d3ddevice_set_ortho(This->resource.wineD3DDevice);
glBegin(GL_QUADS);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index a0a4414..7e53955 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -597,8 +597,7 @@ typedef struct PrivateData DWORD size; } PrivateData;
-/* OpenGL ortho matrix setup */ -void d3ddevice_set_ortho(IWineD3DDeviceImpl *This, BOOL dontclip); +void d3ddevice_set_ortho(IWineD3DDeviceImpl *This);
/***************************************************************************** * IWineD3DResource implementation structure