2012-12-24 10:20:23 -05:00
|
|
|
#include "dxwnd.h"
|
2013-01-04 10:30:38 -05:00
|
|
|
#include "dxwcore.hpp"
|
2012-12-24 10:20:23 -05:00
|
|
|
#include "syslibs.h"
|
|
|
|
#include "dxhook.h"
|
|
|
|
|
2013-01-25 11:17:02 -05:00
|
|
|
#define DXWDECLARATIONS TRUE
|
|
|
|
#include "glhook.h"
|
|
|
|
#undef DXWDECLARATIONS
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
FARPROC Remap_gl_ProcAddress(LPCSTR proc, HMODULE hModule)
|
|
|
|
{
|
|
|
|
if (!strcmp(proc,"glViewport")){
|
|
|
|
pglViewport=(glViewport_Type)(*pGetProcAddress)(hModule, proc);
|
|
|
|
OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglViewport);
|
|
|
|
return (FARPROC)extglViewport;
|
|
|
|
}
|
|
|
|
if (!strcmp(proc,"glScissor")){
|
|
|
|
pglScissor=(glScissor_Type)(*pGetProcAddress)(hModule, proc);
|
|
|
|
OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglScissor);
|
|
|
|
return (FARPROC)extglScissor;
|
|
|
|
}
|
|
|
|
if (!strcmp(proc,"glGetIntegerv")){
|
|
|
|
pglGetIntegerv=(glGetIntegerv_Type)(*pGetProcAddress)(hModule, proc);
|
|
|
|
OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglGetIntegerv);
|
|
|
|
return (FARPROC)extglGetIntegerv;
|
|
|
|
}
|
2013-01-25 11:17:02 -05:00
|
|
|
if (!strcmp(proc,"glDrawBuffer")){
|
|
|
|
pglDrawBuffer=(glDrawBuffer_Type)(*pGetProcAddress)(hModule, proc);
|
|
|
|
OutTraceD("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), pglDrawBuffer);
|
|
|
|
return (FARPROC)extglDrawBuffer;
|
|
|
|
}
|
|
|
|
|
2012-12-24 10:20:23 -05:00
|
|
|
// NULL -> keep the original call address
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-04-04 12:17:08 -04:00
|
|
|
void ForceHookOpenGL(HMODULE base) // to do .....
|
|
|
|
{
|
|
|
|
HMODULE hGlLib;
|
|
|
|
hGlLib=(*pLoadLibraryA)("OpenGL32.dll");
|
|
|
|
//hGlLib=LoadLibrary("OpenGL32.dll");
|
|
|
|
OutTrace("hGlLib=%x\n",hGlLib);
|
|
|
|
if(!hGlLib){
|
|
|
|
OutTraceE("LoadLibrary(\"OpenGL32.dll\") ERROR: err=%d at %d\n", GetLastError(), __LINE__);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
pglViewport=(glViewport_Type)GetProcAddress(hGlLib, "glViewport");
|
|
|
|
if(pglViewport) {
|
|
|
|
HookAPI(base, "opengl32", pglViewport, "glViewport", extglViewport);
|
|
|
|
extglViewport(dxw.iPosX,dxw.iPosY,dxw.iSizX,dxw.iSizY);
|
|
|
|
}
|
|
|
|
pglScissor=(glScissor_Type)GetProcAddress(hGlLib, "glScissor");
|
|
|
|
if(pglScissor) {
|
|
|
|
HookAPI(base, "opengl32", pglScissor, "glScissor", extglScissor);
|
|
|
|
//extglScissor(dxw.iPosX,dxw.iPosY,dxw.iSizX,dxw.iSizY);
|
|
|
|
}
|
|
|
|
pglGetIntegerv=(glGetIntegerv_Type)GetProcAddress(hGlLib, "glGetIntegerv");
|
|
|
|
if(pglGetIntegerv) {
|
|
|
|
HookAPI(base, "opengl32", pglGetIntegerv, "glGetIntegerv", extglGetIntegerv);
|
|
|
|
//extglGetIntegerv(0, NULL);
|
|
|
|
}
|
|
|
|
pglDrawBuffer=(glDrawBuffer_Type)GetProcAddress(hGlLib, "glDrawBuffer");
|
|
|
|
if(pglDrawBuffer) {
|
|
|
|
HookAPI(base, "opengl32", pglDrawBuffer, "glDrawBuffer", extglDrawBuffer);
|
|
|
|
//extglDrawBuffer(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void HookOpenGLLibs(HMODULE module, char *customlib)
|
2012-12-24 10:20:23 -05:00
|
|
|
{
|
|
|
|
void *tmp;
|
|
|
|
char *DefOpenGLModule="OpenGL32.dll";
|
2013-04-04 12:17:08 -04:00
|
|
|
int HookMode;
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2013-01-19 11:16:54 -05:00
|
|
|
if (!customlib) customlib=DefOpenGLModule;
|
2012-12-24 10:20:23 -05:00
|
|
|
|
2013-04-04 12:17:08 -04:00
|
|
|
HookMode=0; // temporary ...
|
|
|
|
switch(HookMode){
|
|
|
|
case 0:
|
|
|
|
tmp = HookAPI(module, customlib, NULL, "glViewport", extglViewport);
|
|
|
|
if(tmp) pglViewport = (glViewport_Type)tmp;
|
|
|
|
tmp = HookAPI(module, customlib, NULL, "glScissor", extglScissor);
|
|
|
|
if(tmp) pglScissor = (glScissor_Type)tmp;
|
|
|
|
tmp = HookAPI(module, customlib, NULL, "glGetIntegerv", extglGetIntegerv);
|
|
|
|
if(tmp) pglGetIntegerv = (glGetIntegerv_Type)tmp;
|
|
|
|
tmp = HookAPI(module, customlib, NULL, "glDrawBuffer", extglDrawBuffer);
|
|
|
|
if(tmp) pglDrawBuffer = (glDrawBuffer_Type)tmp;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
static int DoOnce=TRUE;
|
|
|
|
if(DoOnce){
|
|
|
|
ForceHookOpenGL(module);
|
|
|
|
DoOnce=FALSE;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2012-12-24 10:20:23 -05:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-01-25 11:17:02 -05:00
|
|
|
void WINAPI extglViewport(GLint x, GLint y, GLsizei width, GLsizei height)
|
|
|
|
{
|
|
|
|
RECT client;
|
|
|
|
//if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return;
|
|
|
|
(*pGetClientRect)(dxw.GethWnd(), &client);
|
|
|
|
OutTraceD("glViewport: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
|
|
|
|
if(IsDebug) OutTrace("glViewport: DEBUG win=(%d,%d) screen=(%d,%d)\n",
|
|
|
|
client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight());
|
|
|
|
x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
|
|
|
|
y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
|
|
|
|
width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
|
|
|
|
height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
|
|
|
|
OutTraceD("glViewport: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
|
|
|
|
(*pglViewport)(x, y, width, height);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WINAPI extglScissor(GLint x, GLint y, GLsizei width, GLsizei height)
|
|
|
|
{
|
|
|
|
RECT client;
|
|
|
|
//if (dxw.dwFlags2 & HANDLEFPS) if(dxw.HandleFPS()) return;
|
|
|
|
(*pGetClientRect)(dxw.GethWnd(), &client);
|
|
|
|
OutTraceD("glScissor: declared pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
|
|
|
|
x = (x * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
|
|
|
|
y = (y * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
|
|
|
|
width = (width * (GLint)client.right) / (GLint)dxw.GetScreenWidth();
|
|
|
|
height = (height * (GLint)client.bottom) / (GLint)dxw.GetScreenHeight();
|
|
|
|
OutTraceD("glScissor: remapped pos=(%d,%d) size=(%d,%d)\n", x, y, width, height);
|
|
|
|
(*pglScissor)(x, y, width, height);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WINAPI extglGetIntegerv(GLenum pname, GLint *params)
|
|
|
|
{
|
|
|
|
(*pglGetIntegerv)(pname, params);
|
|
|
|
OutTraceD("glGetIntegerv: pname=%d\n", pname);
|
|
|
|
}
|
|
|
|
|
|
|
|
void WINAPI extglDrawBuffer(GLenum mode)
|
|
|
|
{
|
|
|
|
if (IsDebug) OutTrace("glDrawBuffer: mode=%x\n", mode);
|
|
|
|
// handle FPS only to backbuffer updates (if stereo, on left backbuffer...)
|
|
|
|
// using the frontbuffer seems less reliable: Return to Castle Wolfenstein doesn't use it at all!
|
|
|
|
if (dxw.dwFlags2 & HANDLEFPS){
|
|
|
|
switch (mode){
|
|
|
|
//case GL_FRONT_LEFT:
|
|
|
|
case GL_BACK_LEFT:
|
|
|
|
//case GL_FRONT:
|
|
|
|
case GL_BACK:
|
|
|
|
case GL_LEFT:
|
|
|
|
case GL_FRONT_AND_BACK:
|
|
|
|
if(dxw.HandleFPS()) return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(*pglDrawBuffer)(mode);
|
|
|
|
}
|