diff --git a/inc/main.h b/inc/main.h index 69583c4..bdd0d4a 100644 --- a/inc/main.h +++ b/inc/main.h @@ -30,6 +30,7 @@ extern BOOL ShowDriverWarning; extern RECT WindowRect; +extern BOOL ChildWindowExists; BOOL detect_cutscene(); void LimitGameTicks(BOOL isBltOrFlip); diff --git a/inc/opengl.h b/inc/opengl.h index 39961d4..ce46f55 100644 --- a/inc/opengl.h +++ b/inc/opengl.h @@ -51,6 +51,7 @@ extern PFNGLGETSTRINGPROC glGetString; extern PFNGLGETTEXIMAGEPROC glGetTexImage; extern PFNGLPIXELSTOREIPROC glPixelStorei; extern PFNGLENABLEPROC glEnable; +extern PFNGLCLEARPROC glClear; extern PFNGLCREATEPROGRAMPROC glCreateProgram; extern PFNGLDELETEPROGRAMPROC glDeleteProgram; diff --git a/src/main.c b/src/main.c index b986535..664de05 100644 --- a/src/main.c +++ b/src/main.c @@ -47,6 +47,7 @@ RECT WindowRect = { .left = -32000, .top = -32000, .right = 0, .bottom = 0 }; int WindowState = -1; BOOL Direct3D9Active; BOOL GameHandlesClose; +BOOL ChildWindowExists; //BOOL WINAPI DllMainCRTStartup(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) @@ -106,6 +107,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam) { + ChildWindowExists = TRUE; + IDirectDrawSurfaceImpl *this = (IDirectDrawSurfaceImpl *)lParam; HDC hDC = GetDC(hWnd); @@ -567,6 +570,9 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD } } } + + if (!ddraw->hidemouse) + This->boxing = This->maintas = maintas = FALSE; This->render.viewport.width = This->render.width; This->render.viewport.height = This->render.height; diff --git a/src/opengl.c b/src/opengl.c index 7deb1b0..a13332a 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -20,6 +20,7 @@ PFNGLGETSTRINGPROC glGetString; PFNGLGETTEXIMAGEPROC glGetTexImage; PFNGLPIXELSTOREIPROC glPixelStorei; PFNGLENABLEPROC glEnable; +PFNGLCLEARPROC glClear; PFNGLBEGINPROC glBegin; PFNGLENDPROC glEnd; @@ -123,6 +124,7 @@ BOOL OpenGL_LoadDll() glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(OpenGL_hModule, "glGetTexImage"); glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(OpenGL_hModule, "glPixelStorei"); glEnable = (PFNGLENABLEPROC)GetProcAddress(OpenGL_hModule, "glEnable"); + glClear = (PFNGLCLEARPROC)GetProcAddress(OpenGL_hModule, "glClear"); glBegin = (PFNGLBEGINPROC)GetProcAddress(OpenGL_hModule, "glBegin"); glEnd = (PFNGLENDPROC)GetProcAddress(OpenGL_hModule, "glEnd"); @@ -133,7 +135,7 @@ BOOL OpenGL_LoadDll() return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport && glBindTexture && glGenTextures && glTexParameteri && glDeleteTextures && glTexImage2D && glDrawElements && glTexSubImage2D && glGetError && glGetString && glGetTexImage && glPixelStorei && - glEnable && glBegin && glEnd && glTexCoord2f && glVertex2f; + glEnable && glClear && glBegin && glEnd && glTexCoord2f && glVertex2f; } void OpenGL_Init() diff --git a/src/render.c b/src/render.c index c837549..eb5cf8c 100644 --- a/src/render.c +++ b/src/render.c @@ -646,7 +646,23 @@ static void Render() } if (!ddraw->hidemouse) + { + ChildWindowExists = FALSE; EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary); + + if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height) + { + if (ChildWindowExists) + { + glClear(GL_COLOR_BUFFER_BIT); + glViewport(0, ddraw->render.height - ddraw->height, ddraw->width, ddraw->height); + } + else + glViewport( + ddraw->render.viewport.x, ddraw->render.viewport.y, + ddraw->render.viewport.width, ddraw->render.viewport.height); + } + } } LeaveCriticalSection(&ddraw->cs); @@ -716,9 +732,12 @@ static void Render() glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0); - glViewport( - ddraw->render.viewport.x, ddraw->render.viewport.y, - ddraw->render.viewport.width, ddraw->render.viewport.height); + if (ChildWindowExists) + glViewport(0, ddraw->render.height - ddraw->height, ddraw->width, ddraw->height); + else + glViewport( + ddraw->render.viewport.x, ddraw->render.viewport.y, + ddraw->render.viewport.width, ddraw->render.viewport.height); // apply filter diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 9c54866..e47d6c8 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -25,7 +25,7 @@ static int BitsPerPixel; static BOOL CreateResources(); static BOOL SetStates(); -static BOOL UpdateVertices(BOOL inCutscene); +static BOOL UpdateVertices(BOOL inCutscene, BOOL stretch); static void SetMaxFPS(); BOOL Direct3D9_Create() @@ -170,7 +170,7 @@ static BOOL CreateResources() IDirect3DDevice9_CreateVertexBuffer( D3dDev, sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &VertexBuf, NULL)); - err = err || !UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0)); + err = err || !UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0), TRUE); int i; for (i = 0; i < TEXTURE_COUNT; i++) @@ -243,13 +243,13 @@ static BOOL SetStates() return !err; } -static BOOL UpdateVertices(BOOL inCutscene) +static BOOL UpdateVertices(BOOL inCutscene, BOOL stretch) { - float vpX = (float)ddraw->render.viewport.x; - float vpY = (float)ddraw->render.viewport.y; + float vpX = stretch ? (float)ddraw->render.viewport.x : 0.0f; + float vpY = stretch ? (float)ddraw->render.viewport.y : 0.0f; - float vpW = (float)(ddraw->render.viewport.width + ddraw->render.viewport.x); - float vpH = (float)(ddraw->render.viewport.height + ddraw->render.viewport.y); + float vpW = stretch ? (float)(ddraw->render.viewport.width + ddraw->render.viewport.x) : (float)ddraw->width; + float vpH = stretch ? (float)(ddraw->render.viewport.height + ddraw->render.viewport.y) : (float)ddraw->height; float sH = inCutscene ? ScaleH * ((float)CUTSCENE_HEIGHT / ddraw->height) : ScaleH; float sW = inCutscene ? ScaleW * ((float)CUTSCENE_WIDTH / ddraw->width) : ScaleW; @@ -323,12 +323,12 @@ DWORD WINAPI render_d3d9_main(void) if (detect_cutscene()) { if (!InterlockedExchange(&ddraw->incutscene, TRUE)) - UpdateVertices(TRUE); + UpdateVertices(TRUE, TRUE); } else { if (InterlockedExchange(&ddraw->incutscene, FALSE)) - UpdateVertices(FALSE); + UpdateVertices(FALSE, TRUE); } } @@ -377,7 +377,21 @@ DWORD WINAPI render_d3d9_main(void) } if (!ddraw->hidemouse) + { + ChildWindowExists = FALSE; EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary); + + if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height) + { + if (ChildWindowExists) + { + IDirect3DDevice9_Clear(D3dDev, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + UpdateVertices(FALSE, FALSE); + } + else + UpdateVertices(FALSE, TRUE); + } + } } LeaveCriticalSection(&ddraw->cs); diff --git a/src/render_soft.c b/src/render_soft.c index b1faf42..9c186c8 100644 --- a/src/render_soft.c +++ b/src/render_soft.c @@ -66,6 +66,12 @@ DWORD WINAPI render_soft_main(void) if (ddraw->vhack) InterlockedExchange(&ddraw->incutscene, scaleCutscene); + if (!ddraw->hidemouse) + { + ChildWindowExists = FALSE; + EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary); + } + if (scaleCutscene) { StretchDIBits( @@ -83,7 +89,7 @@ DWORD WINAPI render_soft_main(void) DIB_RGB_COLORS, SRCCOPY); } - else if (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height) + else if (!ChildWindowExists && (ddraw->render.width != ddraw->width || ddraw->render.height != ddraw->height)) { StretchDIBits( ddraw->render.hDC, @@ -115,10 +121,7 @@ DWORD WINAPI render_soft_main(void) ddraw->primary->surface, ddraw->primary->bmi, DIB_RGB_COLORS); - } - - if (!ddraw->hidemouse) - EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary); + } } LeaveCriticalSection(&ddraw->cs);