1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

add workaround for TS/YR stretching - don't stretch the menus

This commit is contained in:
FunkyFr3sh 2018-11-16 06:37:11 +01:00
parent 4d867fcaef
commit d45fabe5cd
7 changed files with 64 additions and 18 deletions

View File

@ -30,6 +30,7 @@
extern BOOL ShowDriverWarning; extern BOOL ShowDriverWarning;
extern RECT WindowRect; extern RECT WindowRect;
extern BOOL ChildWindowExists;
BOOL detect_cutscene(); BOOL detect_cutscene();
void LimitGameTicks(BOOL isBltOrFlip); void LimitGameTicks(BOOL isBltOrFlip);

View File

@ -51,6 +51,7 @@ extern PFNGLGETSTRINGPROC glGetString;
extern PFNGLGETTEXIMAGEPROC glGetTexImage; extern PFNGLGETTEXIMAGEPROC glGetTexImage;
extern PFNGLPIXELSTOREIPROC glPixelStorei; extern PFNGLPIXELSTOREIPROC glPixelStorei;
extern PFNGLENABLEPROC glEnable; extern PFNGLENABLEPROC glEnable;
extern PFNGLCLEARPROC glClear;
extern PFNGLCREATEPROGRAMPROC glCreateProgram; extern PFNGLCREATEPROGRAMPROC glCreateProgram;
extern PFNGLDELETEPROGRAMPROC glDeleteProgram; extern PFNGLDELETEPROGRAMPROC glDeleteProgram;

View File

@ -47,6 +47,7 @@ RECT WindowRect = { .left = -32000, .top = -32000, .right = 0, .bottom = 0 };
int WindowState = -1; int WindowState = -1;
BOOL Direct3D9Active; BOOL Direct3D9Active;
BOOL GameHandlesClose; BOOL GameHandlesClose;
BOOL ChildWindowExists;
//BOOL WINAPI DllMainCRTStartup(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved) //BOOL WINAPI DllMainCRTStartup(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) 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) BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{ {
ChildWindowExists = TRUE;
IDirectDrawSurfaceImpl *this = (IDirectDrawSurfaceImpl *)lParam; IDirectDrawSurfaceImpl *this = (IDirectDrawSurfaceImpl *)lParam;
HDC hDC = GetDC(hWnd); 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.width = This->render.width;
This->render.viewport.height = This->render.height; This->render.viewport.height = This->render.height;

View File

@ -20,6 +20,7 @@ PFNGLGETSTRINGPROC glGetString;
PFNGLGETTEXIMAGEPROC glGetTexImage; PFNGLGETTEXIMAGEPROC glGetTexImage;
PFNGLPIXELSTOREIPROC glPixelStorei; PFNGLPIXELSTOREIPROC glPixelStorei;
PFNGLENABLEPROC glEnable; PFNGLENABLEPROC glEnable;
PFNGLCLEARPROC glClear;
PFNGLBEGINPROC glBegin; PFNGLBEGINPROC glBegin;
PFNGLENDPROC glEnd; PFNGLENDPROC glEnd;
@ -123,6 +124,7 @@ BOOL OpenGL_LoadDll()
glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(OpenGL_hModule, "glGetTexImage"); glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(OpenGL_hModule, "glGetTexImage");
glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(OpenGL_hModule, "glPixelStorei"); glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(OpenGL_hModule, "glPixelStorei");
glEnable = (PFNGLENABLEPROC)GetProcAddress(OpenGL_hModule, "glEnable"); glEnable = (PFNGLENABLEPROC)GetProcAddress(OpenGL_hModule, "glEnable");
glClear = (PFNGLCLEARPROC)GetProcAddress(OpenGL_hModule, "glClear");
glBegin = (PFNGLBEGINPROC)GetProcAddress(OpenGL_hModule, "glBegin"); glBegin = (PFNGLBEGINPROC)GetProcAddress(OpenGL_hModule, "glBegin");
glEnd = (PFNGLENDPROC)GetProcAddress(OpenGL_hModule, "glEnd"); glEnd = (PFNGLENDPROC)GetProcAddress(OpenGL_hModule, "glEnd");
@ -133,7 +135,7 @@ BOOL OpenGL_LoadDll()
return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport && return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport &&
glBindTexture && glGenTextures && glTexParameteri && glDeleteTextures && glTexImage2D && glBindTexture && glGenTextures && glTexParameteri && glDeleteTextures && glTexImage2D &&
glDrawElements && glTexSubImage2D && glGetError && glGetString && glGetTexImage && glPixelStorei && glDrawElements && glTexSubImage2D && glGetError && glGetString && glGetTexImage && glPixelStorei &&
glEnable && glBegin && glEnd && glTexCoord2f && glVertex2f; glEnable && glClear && glBegin && glEnd && glTexCoord2f && glVertex2f;
} }
void OpenGL_Init() void OpenGL_Init()

View File

@ -646,7 +646,23 @@ static void Render()
} }
if (!ddraw->hidemouse) if (!ddraw->hidemouse)
{
ChildWindowExists = FALSE;
EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary); 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); LeaveCriticalSection(&ddraw->cs);
@ -716,9 +732,12 @@ static void Render()
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
glViewport( if (ChildWindowExists)
ddraw->render.viewport.x, ddraw->render.viewport.y, glViewport(0, ddraw->render.height - ddraw->height, ddraw->width, ddraw->height);
ddraw->render.viewport.width, ddraw->render.viewport.height); else
glViewport(
ddraw->render.viewport.x, ddraw->render.viewport.y,
ddraw->render.viewport.width, ddraw->render.viewport.height);
// apply filter // apply filter

View File

@ -25,7 +25,7 @@ static int BitsPerPixel;
static BOOL CreateResources(); static BOOL CreateResources();
static BOOL SetStates(); static BOOL SetStates();
static BOOL UpdateVertices(BOOL inCutscene); static BOOL UpdateVertices(BOOL inCutscene, BOOL stretch);
static void SetMaxFPS(); static void SetMaxFPS();
BOOL Direct3D9_Create() BOOL Direct3D9_Create()
@ -170,7 +170,7 @@ static BOOL CreateResources()
IDirect3DDevice9_CreateVertexBuffer( IDirect3DDevice9_CreateVertexBuffer(
D3dDev, sizeof(CUSTOMVERTEX) * 4, 0, D3DFVF_XYZRHW | D3DFVF_TEX1, D3DPOOL_MANAGED, &VertexBuf, NULL)); 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; int i;
for (i = 0; i < TEXTURE_COUNT; i++) for (i = 0; i < TEXTURE_COUNT; i++)
@ -243,13 +243,13 @@ static BOOL SetStates()
return !err; return !err;
} }
static BOOL UpdateVertices(BOOL inCutscene) static BOOL UpdateVertices(BOOL inCutscene, BOOL stretch)
{ {
float vpX = (float)ddraw->render.viewport.x; float vpX = stretch ? (float)ddraw->render.viewport.x : 0.0f;
float vpY = (float)ddraw->render.viewport.y; float vpY = stretch ? (float)ddraw->render.viewport.y : 0.0f;
float vpW = (float)(ddraw->render.viewport.width + ddraw->render.viewport.x); float vpW = stretch ? (float)(ddraw->render.viewport.width + ddraw->render.viewport.x) : (float)ddraw->width;
float vpH = (float)(ddraw->render.viewport.height + ddraw->render.viewport.y); 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 sH = inCutscene ? ScaleH * ((float)CUTSCENE_HEIGHT / ddraw->height) : ScaleH;
float sW = inCutscene ? ScaleW * ((float)CUTSCENE_WIDTH / ddraw->width) : ScaleW; float sW = inCutscene ? ScaleW * ((float)CUTSCENE_WIDTH / ddraw->width) : ScaleW;
@ -323,12 +323,12 @@ DWORD WINAPI render_d3d9_main(void)
if (detect_cutscene()) if (detect_cutscene())
{ {
if (!InterlockedExchange(&ddraw->incutscene, TRUE)) if (!InterlockedExchange(&ddraw->incutscene, TRUE))
UpdateVertices(TRUE); UpdateVertices(TRUE, TRUE);
} }
else else
{ {
if (InterlockedExchange(&ddraw->incutscene, FALSE)) if (InterlockedExchange(&ddraw->incutscene, FALSE))
UpdateVertices(FALSE); UpdateVertices(FALSE, TRUE);
} }
} }
@ -377,7 +377,21 @@ DWORD WINAPI render_d3d9_main(void)
} }
if (!ddraw->hidemouse) if (!ddraw->hidemouse)
{
ChildWindowExists = FALSE;
EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary); 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); LeaveCriticalSection(&ddraw->cs);

View File

@ -66,6 +66,12 @@ DWORD WINAPI render_soft_main(void)
if (ddraw->vhack) if (ddraw->vhack)
InterlockedExchange(&ddraw->incutscene, scaleCutscene); InterlockedExchange(&ddraw->incutscene, scaleCutscene);
if (!ddraw->hidemouse)
{
ChildWindowExists = FALSE;
EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary);
}
if (scaleCutscene) if (scaleCutscene)
{ {
StretchDIBits( StretchDIBits(
@ -83,7 +89,7 @@ DWORD WINAPI render_soft_main(void)
DIB_RGB_COLORS, DIB_RGB_COLORS,
SRCCOPY); 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( StretchDIBits(
ddraw->render.hDC, ddraw->render.hDC,
@ -115,10 +121,7 @@ DWORD WINAPI render_soft_main(void)
ddraw->primary->surface, ddraw->primary->surface,
ddraw->primary->bmi, ddraw->primary->bmi,
DIB_RGB_COLORS); DIB_RGB_COLORS);
} }
if (!ddraw->hidemouse)
EnumChildWindows(ddraw->hWnd, EnumChildProc, (LPARAM)ddraw->primary);
} }
LeaveCriticalSection(&ddraw->cs); LeaveCriticalSection(&ddraw->cs);