mirror of
https://github.com/mupen64plus/mupen64plus-oldsvn.git
synced 2025-04-02 10:52:35 -04:00
466 lines
20 KiB
C++
466 lines
20 KiB
C++
/*
|
|
* Glide64 - Glide video plugin for Nintendo 64 emulators.
|
|
* Copyright (c) 2002 Dave2001
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
//****************************************************************
|
|
//
|
|
// Glide64 - Glide Plugin for Nintendo 64 emulators (tested mostly with Project64)
|
|
// Project started on December 29th, 2001
|
|
//
|
|
// To modify Glide64:
|
|
// * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
|
|
// * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
|
|
//
|
|
// Official Glide64 development channel: #Glide64 on EFnet
|
|
//
|
|
// Original author: Dave2001 (Dave2999@hotmail.com)
|
|
// Other authors: Gonetz, Gugaman
|
|
//
|
|
//****************************************************************
|
|
|
|
#include "Gfx1.3.h"
|
|
|
|
#ifdef GCC
|
|
#include <stdio.h>
|
|
#endif
|
|
|
|
HWND g_hwndDlg = NULL;
|
|
|
|
#ifdef USE_TOOLTIPS
|
|
|
|
#include "resource.h"
|
|
#include "ToolTips.h"
|
|
|
|
BOOL EnumChildProc(HWND hwndCtrl, LPARAM lParam);
|
|
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);
|
|
VOID OnWMNotify(LPARAM lParam);
|
|
|
|
HINSTANCE g_hinst = NULL;
|
|
HWND g_hwndTT = NULL;
|
|
HHOOK g_hhk = NULL;
|
|
|
|
typedef struct TOOLTIPMSG_t {
|
|
int id, id_alt;
|
|
char *title;
|
|
char *text;
|
|
} TOOLTIPMSG;
|
|
|
|
char gctitle[] = "Glide card #";
|
|
char gcmsg[] = "This option is only for users with multiple glide cards installed in one "
|
|
"machine. This selects the glide card number to use. If you only have one glide card "
|
|
"installed in your system, set this option to #1. Otherwise, select the number that "
|
|
"corresponds to the glide card you want to use.\n"
|
|
"[recommended: #1 if only one glide card present]";
|
|
|
|
#define NUM_MSG 39
|
|
TOOLTIPMSG ttmsg[NUM_MSG] = {
|
|
{ IDC_AUTODETECT, 0,
|
|
"Autodetect Microcode",
|
|
"If this option is checked, the microcode of the game "
|
|
"will be detected automatically from the INI, and "
|
|
"therefore it will not need to be set in this "
|
|
"configuration dialog.\n"
|
|
"[recommended: on]" },
|
|
{ IDC_UCODE, IDC_UCODE_T,
|
|
"Force Microcode",
|
|
"This option ONLY has an effect if Autodetect Microcode "
|
|
"is unchecked, the crc from the game could not be "
|
|
"found in the INI, OR after the game has already started "
|
|
"running. In any of those three cases, this will "
|
|
"select the microcode to use\n"
|
|
"[recommended: any, turn on Autodetect Microcode]" },
|
|
{ IDC_RESOLUTION, IDC_RESOLUTION_T,
|
|
"Resolution",
|
|
"This option selects the resolution to set when switching to fullscreen mode "
|
|
"(note again that the plugin must be in fullscreen mode to see anything).\n"
|
|
"[recommended: 640x480, 800x600, 1024x768]" },
|
|
{ IDC_WIREFRAME, 0,
|
|
"Wireframe",
|
|
"This option, when checked, makes it so that the plugin will draw only the "
|
|
"outlines of objects. The colors specified in the combo box to the right "
|
|
"determines the color that the wireframes show up as.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_WFMODE, 0,
|
|
"Wireframe Colors",
|
|
"This selects the colors to use for the wireframes (if wireframe mode is enabled). "
|
|
"There are 3 modes:\n"
|
|
"* Original colors - draw exactly as it would normally, textures and all, only "
|
|
"in wireframes.\n"
|
|
"* Vertex colors - use the colors specified in the vertices to draw the wireframes "
|
|
"with.\n"
|
|
"* Red only - use a constant red color to draw the wireframes.\n"
|
|
"[recommended: Vertex colors]" },
|
|
{ IDC_LOD, 0,
|
|
"Per-pixel level-of-detail calculation",
|
|
"N64 uses special mechanism for mip-mapping, which nearly impossible to reproduce "
|
|
"correctly on PC hardware. This option enables approximate emulation of this feature. "
|
|
"For example, it is required for the Peach/Bowser portrait's transition in Super Mario 64. "
|
|
"There are 3 modes:\n"
|
|
"* off - LOD is not calculated\n"
|
|
"* fast - fast imprecise LOD calculation.\n"
|
|
"* precise - most precise LOD calculation possible, but more slow.\n"
|
|
"[recommended: your preference]" },
|
|
{ IDC_FILTER, IDC_FILTER_T,
|
|
"Filtering mode",
|
|
"There are three filtering modes possible:\n\n"
|
|
"* Automatic filtering - filter exactly how the N64 specifies.\n"
|
|
"* Point-sampled filtering - causes texels to appear square and sharp.\n"
|
|
"* Bilinear filtering - interpolates the texture to make it appear more smooth.\n"
|
|
"[recommended: Force Bilinear]" },
|
|
{ IDC_FOG, 0,
|
|
"Fog enabled",
|
|
"This option, when checked, will allow fog to be used.\n"
|
|
"[recommended: on]" },
|
|
{ IDC_BUFFERCLEAR, 0,
|
|
"Buffer clear on every frame",
|
|
"If this option is checked, the buffer will be cleared (screen initialized to black) "
|
|
"at the beginning of each frame. If this option is disabled, the speed might increase "
|
|
"slightly, but some trails may appear.\n"
|
|
"[recommended: on]" },
|
|
{ IDC_VSYNC, 0,
|
|
"Vertical Sync",
|
|
"This option will enable the vertical sync, which will prevent tearing. "
|
|
"Note: this option will ONLY have effect if vsync is set to \"Software Controlled\" "
|
|
"in the 3dfx Hub. (double-click the 3dfx icon in system tray).\n"
|
|
"[recommended: off]" },
|
|
{ IDC_CRC, 0,
|
|
"Fast texture checksum calculation",
|
|
"This option will enable fast algorithm of checksum calculation. "
|
|
"Fast algorithm sometime returns the same checksum for different textures, which "
|
|
"causes various texture errors. Thus, use it only if you have performance problems.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_SWAP, IDC_SWAP_T,
|
|
"Buffer swapping method",
|
|
"There are 3 buffer swapping methods:\n\n"
|
|
"* old - swap buffers when vertical interrupt has occured.\n"
|
|
"* new - swap buffers when set of conditions is satisfied. \n"
|
|
" Prevents flicker on some games.\n"
|
|
"* hybrid - mix of first two methods.\n"
|
|
" Can prevent even more flickering then previous method,\n"
|
|
" but also can cause artefacts.\n"
|
|
"If you have flickering problems in a game (or graphics that don't show), "
|
|
"try to change swapping method.\n"
|
|
"[recommended: new (hybrid for Paper Mario)]" },
|
|
{ IDC_LOGGING, 0,
|
|
"Log to RDP.txt",
|
|
"RECOMMENDED FOR DEBUGGING ONLY - this option, when checked, will log EVERY SINGLE "
|
|
"COMMAND the plugin processes to a file called RDP.txt in the current directory. "
|
|
"This is incredibly slow, so I recommend keeping it disabled.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_LOGCLEAR, 0,
|
|
"Log clear every frame",
|
|
"RECOMMENDED FOR DEBUGGING ONLY - this option has no effect unless 'Log to RDP.txt' "
|
|
"is checked. This will make it so that the log, RDP.txt, will be cleared at the "
|
|
"beginning of every frame.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_RUNINWINDOW, 0,
|
|
"Run and log in window",
|
|
"RECOMMENDED FOR DEBUGGING ONLY - this option will make it so that the plugin will "
|
|
"still process dlists in windowed mode. This allows for logging to occur while not "
|
|
"in fullscreen, possibly allowing you to debug a crash.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_CACHEFILTER, 0,
|
|
"Bilinear filter texture cache",
|
|
"RECOMMENDED FOR DEBUGGING ONLY - when checked, this option will make the graphical "
|
|
"debugger texture cache use bilinear filtering as opposed to point-sampled filtering, "
|
|
"which it will use otherwise. See 'Filtering mode' for descriptions of bilinear and "
|
|
"point-sampled filtering.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_UNKRED, 0,
|
|
"Unknown combiners as red",
|
|
"Objects that use an unimplemented combine mode will show up as red instead of "
|
|
"assuming texture with full alpha. Disable this option to remove the red stuff "
|
|
"and at least have a guess at the correct combine mode.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_LOGUNK, 0,
|
|
"Log unknown combiners",
|
|
"RECOMMENDED FOR DEBUGGING ONLY - when checked, this option will cause every "
|
|
"unimplemented combiner drawn to be logged to a file called Unimp.txt in the "
|
|
"current directory. This becomes slow when there are unimplemented combiners "
|
|
"on the screen, so I recommend keeping it disabled.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_UNKCLEAR, 0,
|
|
"Clear unknown combiner log every frame",
|
|
"RECOMMENDED FOR DEBUGGING ONLY - this option works much like 'Log clear every "
|
|
"frame' except it clears the combiner log (Unimp.txt) instead of RDP.txt at the "
|
|
"beginning of each frame. Again, this option has no effect if 'combiner logging' "
|
|
"is disabled.\n"
|
|
"[recommended: off]" },
|
|
{ IDC_GID1, IDC_GID2,
|
|
gctitle, gcmsg },
|
|
{ IDC_GID3, IDC_GID4,
|
|
gctitle, gcmsg },
|
|
|
|
{ IDC_FPS, 0,
|
|
"FPS counter",
|
|
"When this option is checked, a FPS (frames per second) counter will be shown "
|
|
"in the lower left corner of the screen.\n"
|
|
"[recommended: your preference]" },
|
|
{ IDC_FPS1, 0,
|
|
"VI/s counter",
|
|
"When this option is checked, a VI/s (vertical interrupts per second) counter "
|
|
"will be shown in the lower left corner of the screen. This is like the FPS "
|
|
"counter but will be consistent at 60 VI/s for full speed on NTSC (U) games and "
|
|
"50 VI/s for full speed on PAL (E) ones.\n"
|
|
"[recommended: your preference]" },
|
|
{ IDC_FPS2, 0,
|
|
"% speed NTSC",
|
|
"This displays a percentage of the actual N64 speed in the lower "
|
|
"left corner of the screen.\n"
|
|
"[recommended: your preference]" },
|
|
{ IDC_FPS3, 0,
|
|
"FPS transparent",
|
|
"If this is checked, the FPS counter will have a transparent background. Otherwise, "
|
|
"it will have a solid black background.\n"
|
|
"[reccomended: your preference]" },
|
|
{ IDC_WRAP_BIG_TEX, 0,
|
|
"Wrap textures which are too big for tmem",
|
|
"This option can fix load of textures which can't fit their place in N64 texture memory. "
|
|
"Example: trees in Zelda MM intro.\n"
|
|
"[reccomended: mostly on]" },
|
|
{ IDC_CUSTOM, 0,
|
|
"Use custom settings from the ini file",
|
|
"Most of settings, available on this page, can be set individually for each game. "
|
|
"If this option is on, custom settings will override common ones. "
|
|
"This is very useful since you won't have to change or even pick out the best settings for a game "
|
|
"because it is already done for you. However, if you want to run games with your own settings, set it off. "
|
|
"The following settings are set in custom part: filtering mode, depth buffer mode, fog, "
|
|
"buffer clear, buffer swapping mode, smart frame buffer read, "
|
|
"depth buffer clear and frame buffer read alpha.\n"
|
|
"[reccomended: on]" },
|
|
{ IDC_HOTKEYS, 0,
|
|
"Enable hotkeys",
|
|
"Currently Glide64 uses 4 hotkeys which you can use during gameplay:\n"
|
|
"BACKSPACE - switch between filtering modes\n"
|
|
"ALT+V - frame buffer read always on/off\n"
|
|
"ALT+B - motion blur on/off\n"
|
|
"ALT+C - corona fix on/off\n"
|
|
"If you need to use these keys for other purposes, disable this option.\n"
|
|
"[reccomended: on]" },
|
|
{ IDC_WRAPPER, 0,
|
|
"Glide wrapper configuration",
|
|
"If you are using Hacktarux's glide wrapper, press this button to configure it" },
|
|
{ IDC_CORONA, 0,
|
|
"Fix for flame's corona in Zelda OOT and Zelda MM",
|
|
"By default corona will be drawn without depth compare, i.e. can be seen through the objects. "
|
|
"This option fixes it. However, it's better to use depth buffer render instead, "
|
|
"to correctly emulate this effect.\n"
|
|
"[reccomended: on for slow PC]" },
|
|
/*
|
|
{ IDC_RE2_VIDEO, 0,
|
|
"Show Resident Evil II videos in native resolution",
|
|
"Video in RE2 is not of good quality, and it's clearly visible when video is scaled up to PC resolution. "
|
|
"This option allows you to watch RE2 videos as is, i.e. without scaling and quality loss.\n"
|
|
"[reccomended: your preference]" },
|
|
*/
|
|
{ IDC_CLOCK, 0,
|
|
"Clock enabled",
|
|
"This option will put a clock in the lower right corner of the screen, showing the current "
|
|
"time.\n"
|
|
"[reccomended: your preference]" },
|
|
{ IDC_FB_READ_ALWAYS, 0,
|
|
"Read every frame",
|
|
"In some games plugin can't detect frame buffer usage. "
|
|
"In such case you need to enable this option to see frame buffer effects. "
|
|
"Every drawn frame will be read from video card -> it works very slow.\n"
|
|
"[reccomended: mostly off (needed only for a few games)]" },
|
|
{ IDC_FB_ALPHA, 0,
|
|
"Read with alpha information",
|
|
"N64 keeps alpha information in its frame buffer, Glide64 does not. "
|
|
"In rare cases this information is vital. Example: Pokemon Puzzle League. "
|
|
"When this option is on, all black pixels readed from frame buffer will have zero alpha.\n"
|
|
"[reccomended: off]" },
|
|
{ IDC_FB_SMART, 0,
|
|
"Smart frame buffer reading",
|
|
"If on, plugin will try to detect frame buffer usage and read frame from video card only when it's needed.\n"
|
|
"[reccomended: on for games which uses frame buffer effects]" },
|
|
{ IDC_ENABLEMB, 0,
|
|
"Enable motion blur effect",
|
|
"Some games use frame buffer for motion blur effect. "
|
|
"It looks very cool, but may work slow since every frame must be read during this effect.\n"
|
|
"[reccomended: your preference]" },
|
|
{ IDC_HIRESFB, 0,
|
|
"Enable hardware frame buffer emulation",
|
|
"If this option is on, plugin will create auxilary frame buffers in video memory instead of copying "
|
|
"frame buffer content into main memory. This allows plugin to run frame buffer effects without slowdown "
|
|
"and without scaling image down to N64's native resolution. This feature is fully supported by "
|
|
"Voodoo 4/5 cards and partially by Voodoo3 and Banshee.\n"
|
|
"[reccomended: on, if supported by your hardware]" },
|
|
{ IDC_FB_INFO, 0,
|
|
"Get information about frame buffers",
|
|
"This is compatibility option. It must be set on for Mupen64 and off for 1964\n" },
|
|
{ IDC_DB_CLEAR, 0,
|
|
"Enable depth buffer clear",
|
|
"Some special effects work only if N64 depth buffer filled with correct values. "
|
|
"Example: Lens flare from the sun in Zelda. This option enables these effects."
|
|
"You may set it off to save a bit of CPU time.\n"
|
|
"[reccomended: on]" },
|
|
{ IDC_DB_RENDER, 0,
|
|
"Enable depth buffer rendering",
|
|
"This option works in conjunction with depth buffer clear to fully emulate N64 depth buffer. "
|
|
"It is required for correct emulation of depth buffer based effects. "
|
|
"However, it requires fast CPU to work full speed.\n"
|
|
"[reccomended: on for fast PC]" },
|
|
};
|
|
|
|
// ** TOOLTIP CODE FROM MSDN LIBRARY SAMPLE WITH SEVERAL MODIFICATIONS **
|
|
|
|
// DoCreateDialogTooltip - creates a tooltip control for a dialog box,
|
|
// enumerates the child control windows, and installs a hook
|
|
// procedure to monitor the message stream for mouse messages posted
|
|
// to the control windows.
|
|
// Returns TRUE if successful, or FALSE otherwise.
|
|
//
|
|
// Global variables
|
|
// g_hinst - handle to the application instance.
|
|
// g_hwndTT - handle to the tooltip control.
|
|
// g_hwndDlg - handle to the dialog box.
|
|
// g_hhk - handle to the hook procedure.
|
|
|
|
BOOL DoCreateDialogTooltip(void)
|
|
{
|
|
// Ensure that the common control DLL is loaded, and create
|
|
// a tooltip control.
|
|
InitCommonControls();
|
|
g_hwndTT = CreateWindowEx(0, TOOLTIPS_CLASS, (LPSTR) NULL,
|
|
TTS_ALWAYSTIP|/*TTS_BALLOON*/0x40, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
|
CW_USEDEFAULT, g_hwndDlg, (HMENU) NULL, g_hinst, NULL);
|
|
|
|
if (g_hwndTT == NULL)
|
|
return FALSE;
|
|
|
|
// Enumerate the child windows to register them with the tooltip
|
|
// control.
|
|
if (!EnumChildWindows(g_hwndDlg, (WNDENUMPROC) EnumChildProc, 0))
|
|
return FALSE;
|
|
|
|
// Install a hook procedure to monitor the message stream for mouse
|
|
// messages intended for the controls in the dialog box.
|
|
g_hhk = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,
|
|
(HINSTANCE) NULL, GetCurrentThreadId());
|
|
|
|
if (g_hhk == (HHOOK) NULL)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// EmumChildProc - registers control windows with a tooltip control by
|
|
// using the TTM_ADDTOOL message to pass the address of a
|
|
// TOOLINFO structure.
|
|
// Returns TRUE if successful, or FALSE otherwise.
|
|
// hwndCtrl - handle of a control window.
|
|
// lParam - application-defined value (not used).
|
|
BOOL EnumChildProc(HWND hwndCtrl, LPARAM lParam)
|
|
{
|
|
TOOLINFO ti;
|
|
|
|
ti.cbSize = sizeof(TOOLINFO);
|
|
ti.uFlags = TTF_IDISHWND;
|
|
ti.hwnd = g_hwndDlg;
|
|
ti.uId = (UINT) hwndCtrl;
|
|
ti.hinst = 0;
|
|
ti.lpszText = LPSTR_TEXTCALLBACK;
|
|
SendMessage(g_hwndTT, TTM_ADDTOOL, 0,
|
|
(LPARAM) (LPTOOLINFO) &ti);
|
|
return TRUE;
|
|
}
|
|
|
|
// GetMsgProc - monitors the message stream for mouse messages intended
|
|
// for a control window in the dialog box.
|
|
// Returns a message-dependent value.
|
|
// nCode - hook code.
|
|
// wParam - message flag (not used).
|
|
// lParam - address of an MSG structure.
|
|
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
MSG *lpmsg;
|
|
|
|
lpmsg = (MSG *) lParam;
|
|
if (nCode < 0 || !(IsChild(g_hwndDlg, lpmsg->hwnd)))
|
|
return (CallNextHookEx(g_hhk, nCode, wParam, lParam));
|
|
|
|
switch (lpmsg->message) {
|
|
case WM_MOUSEMOVE:
|
|
case WM_LBUTTONDOWN:
|
|
case WM_LBUTTONUP:
|
|
case WM_RBUTTONDOWN:
|
|
case WM_RBUTTONUP:
|
|
if (g_hwndTT != NULL) {
|
|
MSG msg;
|
|
|
|
int idCtrl = GetDlgCtrlID((HWND)lpmsg->hwnd);
|
|
|
|
msg.lParam = lpmsg->lParam;
|
|
msg.wParam = lpmsg->wParam;
|
|
msg.message = lpmsg->message;
|
|
msg.hwnd = lpmsg->hwnd;
|
|
SendMessage(g_hwndTT, TTM_RELAYEVENT, 0,
|
|
(LPARAM) (LPMSG) &msg);
|
|
#ifdef TTM_SETMAXTIPWIDTH
|
|
SendMessage(g_hwndTT, TTM_SETMAXTIPWIDTH, 0, 300);
|
|
#endif
|
|
SendMessage(g_hwndTT, TTM_SETDELAYTIME, TTDT_INITIAL, (LPARAM)MAKELONG(500,0));
|
|
SendMessage(g_hwndTT, TTM_SETDELAYTIME, TTDT_AUTOPOP, (LPARAM)MAKELONG(32000,0));
|
|
|
|
for (int i=0; i<NUM_MSG; i++)
|
|
{
|
|
if (idCtrl == ttmsg[i].id ||
|
|
idCtrl == ttmsg[i].id_alt)
|
|
{
|
|
SendMessage(g_hwndTT, /*TTM_SETTITLE*/(WM_USER + 32), 1, (LPARAM)ttmsg[i].title);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return (CallNextHookEx(g_hhk, nCode, wParam, lParam));
|
|
}
|
|
|
|
|
|
// OnWMNotify - provides the tooltip control with the appropriate text
|
|
// to display for a control window. This function is called by
|
|
// the dialog box procedure in response to a WM_NOTIFY message.
|
|
// lParam - second message parameter of the WM_NOTIFY message.
|
|
VOID OnWMNotify(LPARAM lParam)
|
|
{
|
|
LPTOOLTIPTEXT lpttt;
|
|
int idCtrl;
|
|
|
|
if ((((LPNMHDR) lParam)->code) == TTN_NEEDTEXT) {
|
|
idCtrl = GetDlgCtrlID((HWND) ((LPNMHDR) lParam)->idFrom);
|
|
lpttt = (LPTOOLTIPTEXT) lParam;
|
|
|
|
for (int i=0; i<NUM_MSG; i++)
|
|
{
|
|
if (idCtrl == ttmsg[i].id ||
|
|
idCtrl == ttmsg[i].id_alt)
|
|
{
|
|
lpttt->lpszText = ttmsg[i].text;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
#endif /* USE_TOOLTIPS */
|