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:
parent
4d867fcaef
commit
d45fabe5cd
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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()
|
||||||
|
25
src/render.c
25
src/render.c
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user