diff --git a/libmupen64plus/mupen64plus-video-jabo/Config.h b/libmupen64plus/mupen64plus-video-jabo/Config.h new file mode 100644 index 0000000000..b9f77cfe1b --- /dev/null +++ b/libmupen64plus/mupen64plus-video-jabo/Config.h @@ -0,0 +1,10 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include "m64p.h" + +BOOL Config_Open(); +int Config_ReadInt(const char *itemname, const char *desc, int def_value, BOOL create=TRUE, BOOL isBoolean=TRUE); + + +#endif /* CONFIG_H */ \ No newline at end of file diff --git a/libmupen64plus/mupen64plus-video-jabo/config.cpp b/libmupen64plus/mupen64plus-video-jabo/config.cpp new file mode 100644 index 0000000000..8c905a99d7 --- /dev/null +++ b/libmupen64plus/mupen64plus-video-jabo/config.cpp @@ -0,0 +1,42 @@ +#include "Config.h" +#include "m64p.h" + +static m64p_handle video_general_section; +static m64p_handle video_jabo_section; + + +BOOL Config_Open() +{ + if (ConfigOpenSection("Video-General", &video_general_section) != M64ERR_SUCCESS || + ConfigOpenSection("Video-Jabo", &video_jabo_section) != M64ERR_SUCCESS) + { + //ERRLOG("Could not open configuration"); + return FALSE; + } + ConfigSetDefaultBool(video_general_section, "Fullscreen", false, "Use fullscreen mode if True, or windowed mode if False"); + ConfigSetDefaultInt(video_general_section, "ScreenWidth", 640, "Width of output window or fullscreen width"); + ConfigSetDefaultInt(video_general_section, "ScreenHeight", 480, "Height of output window or fullscreen height"); + + return TRUE; +} + +int Config_ReadScreenInt(const char *itemname) +{ + return ConfigGetParamInt(video_general_section, itemname); +} + +BOOL Config_ReadInt(const char *itemname, const char *desc, int def_value, int create, int isBoolean) +{ + //VLOG("Getting value %s", itemname); + if (isBoolean) + { + ConfigSetDefaultBool(video_jabo_section, itemname, def_value, desc); + return ConfigGetParamBool(video_jabo_section, itemname); + } + else + { + ConfigSetDefaultInt(video_jabo_section, itemname, def_value, desc); + return ConfigGetParamInt(video_jabo_section, itemname); + } + +} \ No newline at end of file diff --git a/libmupen64plus/mupen64plus-video-jabo/m64p.h b/libmupen64plus/mupen64plus-video-jabo/m64p.h new file mode 100644 index 0000000000..dd073ddfaa --- /dev/null +++ b/libmupen64plus/mupen64plus-video-jabo/m64p.h @@ -0,0 +1,14 @@ +#include "m64p_config.h" + +extern ptr_ConfigOpenSection ConfigOpenSection; +extern ptr_ConfigSetParameter ConfigSetParameter; +extern ptr_ConfigGetParameter ConfigGetParameter; +extern ptr_ConfigGetParameterHelp ConfigGetParameterHelp; +extern ptr_ConfigSetDefaultInt ConfigSetDefaultInt; +extern ptr_ConfigSetDefaultFloat ConfigSetDefaultFloat; +extern ptr_ConfigSetDefaultBool ConfigSetDefaultBool; +extern ptr_ConfigSetDefaultString ConfigSetDefaultString; +extern ptr_ConfigGetParamInt ConfigGetParamInt; +extern ptr_ConfigGetParamFloat ConfigGetParamFloat; +extern ptr_ConfigGetParamBool ConfigGetParamBool; +extern ptr_ConfigGetParamString ConfigGetParamString; \ No newline at end of file diff --git a/libmupen64plus/mupen64plus-video-jabo/main.cpp b/libmupen64plus/mupen64plus-video-jabo/main.cpp index 72f627b5df..5143a278ae 100644 --- a/libmupen64plus/mupen64plus-video-jabo/main.cpp +++ b/libmupen64plus/mupen64plus-video-jabo/main.cpp @@ -14,6 +14,7 @@ #include "main.h" #include "typedefs.h" +#include "Config.h" #define LOG(x) { std::ofstream myfile; myfile.open ("jabo_wrapper_log.txt", std::ios::app); myfile << x << "\n"; myfile.close(); } @@ -37,6 +38,19 @@ namespace OldAPI ptr_GetDllInfo GetDllInfo = NULL; } +ptr_ConfigOpenSection ConfigOpenSection = NULL; +ptr_ConfigSetParameter ConfigSetParameter = NULL; +ptr_ConfigGetParameter ConfigGetParameter = NULL; +ptr_ConfigGetParameterHelp ConfigGetParameterHelp = NULL; +ptr_ConfigSetDefaultInt ConfigSetDefaultInt = NULL; +ptr_ConfigSetDefaultFloat ConfigSetDefaultFloat = NULL; +ptr_ConfigSetDefaultBool ConfigSetDefaultBool = NULL; +ptr_ConfigSetDefaultString ConfigSetDefaultString = NULL; +ptr_ConfigGetParamInt ConfigGetParamInt = NULL; +ptr_ConfigGetParamFloat ConfigGetParamFloat = NULL; +ptr_ConfigGetParamBool ConfigGetParamBool = NULL; +ptr_ConfigGetParamString ConfigGetParamString = NULL; + /* local variables */ static void (*l_DebugCallback)(void *, int, const char *) = NULL; static void *l_DebugCallContext = NULL; @@ -56,6 +70,9 @@ ptr_D3D8_ReadScreen D3D8_ReadScreen = NULL; typedef void (*ptr_D3D8_CloseDLL)(); ptr_D3D8_CloseDLL D3D8_CloseDLL = NULL; +DWORD old_options; +DWORD old_initflags; + void setup_jabo_functions() { JaboDLL = LoadLibrary("Jabotard_Direct3D8.dll"); @@ -142,6 +159,18 @@ EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Con return M64ERR_INCOMPATIBLE; } + ConfigOpenSection = (ptr_ConfigOpenSection) GetProcAddress(CoreLibHandle, "ConfigOpenSection"); + ConfigSetParameter = (ptr_ConfigSetParameter) GetProcAddress(CoreLibHandle, "ConfigSetParameter"); + ConfigGetParameter = (ptr_ConfigGetParameter) GetProcAddress(CoreLibHandle, "ConfigGetParameter"); + ConfigSetDefaultInt = (ptr_ConfigSetDefaultInt) GetProcAddress(CoreLibHandle, "ConfigSetDefaultInt"); + ConfigSetDefaultFloat = (ptr_ConfigSetDefaultFloat) GetProcAddress(CoreLibHandle, "ConfigSetDefaultFloat"); + ConfigSetDefaultBool = (ptr_ConfigSetDefaultBool) GetProcAddress(CoreLibHandle, "ConfigSetDefaultBool"); + ConfigSetDefaultString = (ptr_ConfigSetDefaultString) GetProcAddress(CoreLibHandle, "ConfigSetDefaultString"); + ConfigGetParamInt = (ptr_ConfigGetParamInt) GetProcAddress(CoreLibHandle, "ConfigGetParamInt"); + ConfigGetParamFloat = (ptr_ConfigGetParamFloat) GetProcAddress(CoreLibHandle, "ConfigGetParamFloat"); + ConfigGetParamBool = (ptr_ConfigGetParamBool) GetProcAddress(CoreLibHandle, "ConfigGetParamBool"); + ConfigGetParamString = (ptr_ConfigGetParamString) GetProcAddress(CoreLibHandle, "ConfigGetParamString"); + l_PluginInit = 1; return M64ERR_SUCCESS; } @@ -233,6 +262,138 @@ EXPORT int CALL InitiateGFX(GFX_INFO Gfx_Info) { LOG("API WRAPPER:\t InitiateGFX") + Config_Open(); + + SETTINGS settings; + settings.anisotropic_level = (int)Config_ReadInt("anisotropic_level","ANISOTROPIC_FILTERING_LEVEL",0,TRUE,FALSE); + settings.brightness = (int)Config_ReadInt("brightness","Brightness level",0,TRUE,FALSE); + settings.antialiasing_level = (int)Config_ReadInt("antialiasing_level","Antialiasing level",0,TRUE,FALSE); + settings.super2xsal = (BOOL)Config_ReadInt("super2xsal","Enables Super2xSal textures",FALSE); + settings.texture_filter = (BOOL)Config_ReadInt("texture_filter","Always use texture filter",FALSE); + settings.adjust_aspect_ratio = (BOOL)Config_ReadInt("adjust_aspect_ratio","Adjust game aspect ratio to match yours",FALSE); + settings.legacy_pixel_pipeline = (BOOL)Config_ReadInt("legacy_pixel_pipeline","Use legacy pixel pipeline",FALSE); + settings.alpha_blending = (BOOL)Config_ReadInt("alpha_blending","Force alpha blending",FALSE); + settings.wireframe = (BOOL)Config_ReadInt("wireframe","Wireframe rendering",FALSE); + settings.direct3d_transformation_pipeline = (BOOL)Config_ReadInt("direct3d_transformation_pipeline","Use Direct3D transformation pipeline",FALSE); + settings.z_compare = (BOOL)Config_ReadInt("z_compare","Force Z Compare",FALSE); + settings.copy_framebuffer = (BOOL)Config_ReadInt("copy_framebuffer","Copy framebuffer to RDRAM",FALSE); + settings.resolution_width = (int)Config_ReadInt("resolution_width","Emulated Width",-1,TRUE,FALSE); + settings.resolution_height = (int)Config_ReadInt("resolution_height","Emulated Height",-1,TRUE,FALSE); + settings.clear_mode = (int)Config_ReadInt("clear_mode","Direct3D Clear Mode Height",0,TRUE,FALSE); + + DWORD new_options_val = 0; + if (settings.copy_framebuffer == TRUE) { new_options_val |= 0x20000000; } + if (settings.z_compare == TRUE) { new_options_val |= 0x10000000; } + if (settings.legacy_pixel_pipeline == TRUE) { new_options_val |= 0x08000000; } + if (settings.alpha_blending == TRUE) { new_options_val |= 0x04000000; } + if (settings.adjust_aspect_ratio == TRUE) { new_options_val |= 0x02000000; } + if (settings.texture_filter == TRUE) { new_options_val |= 0x01000000; } + if (settings.super2xsal == TRUE) { new_options_val |= 0x00001000; } + new_options_val |= (((settings.brightness - 100) / 3) & 0x1F) << 19; + switch (settings.antialiasing_level) + { + case 1: new_options_val |= 0x00004004; break; + case 2: new_options_val |= 0x00008004; break; + case 3: new_options_val |= 0x00010004; break; + } + switch (settings.anisotropic_level) + { + case 1: new_options_val |= 0x00000024; break; + case 2: new_options_val |= 0x00000044; break; + case 3: new_options_val |= 0x00000084; break; + case 4: new_options_val |= 0x00000104; break; + } + + // Force 800x600 for now + new_options_val |= 0x00000004; + + DWORD new_initflags_val = 0x00e00000; + if (settings.direct3d_transformation_pipeline == true) { new_initflags_val = 0x00a00000; } + + + + + HKEY mainkey; + if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\JaboSoft\\Project64 DLL\\Direct3D8 1.6.1",0,KEY_READ,&mainkey) != ERROR_SUCCESS) + { + // key doesn't exist, so we need to create it first + //LOG("Main key doesn't exist"); + if (RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\JaboSoft\\Project64 DLL\\Direct3D8 1.6.1",NULL,NULL,NULL,KEY_READ,NULL,&mainkey,NULL) != ERROR_SUCCESS) + { + // Couldn't create the key + //LOG("Couldn't make main key"); + return (FALSE); + } + } + + // key now exists, try to find the Options Value + DWORD type; + DWORD cbData; + int options_value; + LSTATUS result = RegQueryValueEx(mainkey, "Options", NULL, &type, (LPBYTE)&options_value, &cbData); + if (result != ERROR_SUCCESS) + { + if (result == ERROR_FILE_NOT_FOUND) + { + options_value = 0; + } + else + { + RegCloseKey(mainkey); + //LOG("error opening options value"); + return (FALSE); + } + } + + // Found it, save the value + old_options = options_value; + + // now try to find the Direct3D init flags subkey Value + int initflags_value; + result = RegQueryValueEx(mainkey, "Direct3D8.InitFlags", NULL, &type, (LPBYTE)&initflags_value, &cbData); + if (result != ERROR_SUCCESS) + { + if (result == ERROR_FILE_NOT_FOUND) + { + initflags_value = 0x00e00000; + } + else + { + RegCloseKey(mainkey); + //LOG("error opening options value"); + return (FALSE); + } + } + + // Found it, save it + old_initflags = initflags_value; + + RegCloseKey(mainkey); + + // Reopen the key for writing + if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\JaboSoft\\Project64 DLL\\Direct3D8 1.6.1",0,KEY_WRITE,&mainkey) != ERROR_SUCCESS) + { + //LOG("failure to open key for write. ...what"); + return (FALSE); + } + + // Store our options value + DWORD new_val = new_options_val; + if (RegSetValueEx(mainkey, "Options", NULL, REG_DWORD, (BYTE *)&new_val, 4) != ERROR_SUCCESS) + { + //LOG("couldn't write options value. wat"); + } + + // Store our init flags value + new_val = new_initflags_val; + if (RegSetValueEx(mainkey, "Direct3D8.InitFlags", NULL, REG_DWORD, (BYTE *)&new_val, 4) != ERROR_SUCCESS) + { + //LOG("couldn't write init flags value. wat"); + } + + RegCloseKey(mainkey); + + OldAPI::GFX_INFO blah; blah.hWnd = hWnd_jabo; @@ -274,7 +435,7 @@ EXPORT int CALL InitiateGFX(GFX_INFO Gfx_Info) blah.CheckInterrupts = Gfx_Info.CheckInterrupts; OldAPI::InitiateGFX(blah); - OldAPI::DllConfig(hWnd_jabo); + //OldAPI::DllConfig(hWnd_jabo); return(TRUE); } diff --git a/libmupen64plus/mupen64plus-video-jabo/main.h b/libmupen64plus/mupen64plus-video-jabo/main.h index 7de00f283f..c6a78cc994 100644 --- a/libmupen64plus/mupen64plus-video-jabo/main.h +++ b/libmupen64plus/mupen64plus-video-jabo/main.h @@ -6,4 +6,22 @@ #define VIDEXT_API_VERSION 0x030000 #define CONFIG_PARAM_VERSION 1.00 -#define VERSION_PRINTF_SPLIT(x) (((x) >> 16) & 0xffff), (((x) >> 8) & 0xff), ((x) & 0xff) \ No newline at end of file +#define VERSION_PRINTF_SPLIT(x) (((x) >> 16) & 0xffff), (((x) >> 8) & 0xff), ((x) & 0xff) + +typedef struct { + int anisotropic_level; + int brightness; + int antialiasing_level; + BOOL super2xsal; + BOOL texture_filter; + BOOL adjust_aspect_ratio; + BOOL legacy_pixel_pipeline; + BOOL alpha_blending; + BOOL wireframe; + BOOL direct3d_transformation_pipeline; + BOOL z_compare; + BOOL copy_framebuffer; + int resolution_width; + int resolution_height; + int clear_mode; +} SETTINGS; \ No newline at end of file diff --git a/libmupen64plus/mupen64plus-video-jabo/mupen64plus-video-jabo/mupen64plus-video-jabo.vcxproj b/libmupen64plus/mupen64plus-video-jabo/mupen64plus-video-jabo/mupen64plus-video-jabo.vcxproj index 0cd81ba0aa..d3f9c71bad 100644 --- a/libmupen64plus/mupen64plus-video-jabo/mupen64plus-video-jabo/mupen64plus-video-jabo.vcxproj +++ b/libmupen64plus/mupen64plus-video-jabo/mupen64plus-video-jabo/mupen64plus-video-jabo.vcxproj @@ -90,11 +90,14 @@ + + +