diff options
Diffstat (limited to 'macosx/plugins/PeopsXgl/macsrc/NetSfPeopsOpenGLPluginConfigController.m')
| -rw-r--r-- | macosx/plugins/PeopsXgl/macsrc/NetSfPeopsOpenGLPluginConfigController.m | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/macosx/plugins/PeopsXgl/macsrc/NetSfPeopsOpenGLPluginConfigController.m b/macosx/plugins/PeopsXgl/macsrc/NetSfPeopsOpenGLPluginConfigController.m new file mode 100644 index 00000000..781508be --- /dev/null +++ b/macosx/plugins/PeopsXgl/macsrc/NetSfPeopsOpenGLPluginConfigController.m @@ -0,0 +1,348 @@ + +/* All the various stuff needed for configuration is done here, + including reading the Config file and displaying a dialog box + AboutDlgProc() is a plug-in function called from the PCSX app, as is + DlgProc() +*/ + +#import "NetSfPeopsOpenGLPluginConfigController.h" +#include "gpu.h" +#include "cfg.h" +#include "menu.h" +#include <OpenGL/gl.h> // bah, "externals.h" thinks include files are for wimps; OpenGL header, in fact, is needed +#include "externals.h" + +#define APP_ID @"net.sf.peops.GpuOpenGLPlugin" +#define PrefsKey APP_ID @" Settings" + +static NetSfPeopsOpenGLPluginConfigController *windowController; +char * pConfigFile=NULL; + +void AboutDlgProc() +{ + // Get parent application instance + NSApplication *app = [NSApplication sharedApplication]; + NSBundle *bundle = [NSBundle bundleWithIdentifier:APP_ID]; + + // Get Credits.rtf + NSString *path = [bundle pathForResource:@"Credits" ofType:@"rtf"]; + NSAttributedString *credits; + if (path) { + credits = [[[NSAttributedString alloc] initWithPath: path + documentAttributes:NULL] autorelease]; + } else { + credits = [[[NSAttributedString alloc] initWithString:@""] autorelease]; + } + + // Get Application Icon + NSImage *icon = [[NSWorkspace sharedWorkspace] iconForFile:[bundle bundlePath]]; + NSSize size = NSMakeSize(64, 64); + [icon setSize:size]; + + [app orderFrontStandardAboutPanelWithOptions:[NSDictionary dictionaryWithObjectsAndKeys: + [bundle objectForInfoDictionaryKey:@"CFBundleName"], @"ApplicationName", + icon, @"ApplicationIcon", + [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"], @"ApplicationVersion", + [bundle objectForInfoDictionaryKey:@"CFBundleVersion"], @"Version", + [bundle objectForInfoDictionaryKey:@"NSHumanReadableCopyright"], @"Copyright", + credits, @"Credits", + nil]]; +} + + +void DlgProc() +{ + NSWindow *window; + + PrepFactoryDefaultPreferences(); // Must do here to avoid a "when does such-and-such bind" issue + + if (windowController == nil) { + windowController = [[PluginConfigController alloc] initWithWindowNibName:@"NetSfPeopsOpenGLConfig"]; + } + window = [windowController window]; + + /* load values */ + [windowController loadValues]; + + [window center]; + [window makeKeyAndOrderFront:nil]; +} + + +void PrepFactoryDefaultPreferences(void) +{ + // THE place to find the names of settings. + // If it's not here, you can't set it. + + // create or read a sub-dictionary beneath the main PCSX app prefs. + // dictionary is named "net.sf.GpuOpenGLPlugin Settings" + // and contains all our key/values + // the prefs .plist will store this dictionary ("net.sf...") as an object + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + //tired of wasting time hacking around the "convenience" function + // of registerDefaults, so: + if ([defaults objectForKey:PrefsKey] == nil) + { + // just create default preferences and save them. + + NSDictionary* defaultPrefs = + [[NSDictionary alloc] initWithObjectsAndKeys: + [NSNumber numberWithBool:NO], @"FPS Counter", + [NSNumber numberWithBool:NO], @"Auto Full Screen", + [NSNumber numberWithBool:NO], @"Frame Skipping", + [NSNumber numberWithBool:YES], @"Frame Limit", + [NSNumber numberWithBool:NO], @"VSync", + [NSNumber numberWithBool:NO], @"Enable Hacks", + [NSNumber numberWithInt:0], @"Dither Mode", + [NSNumber numberWithLong:0], @"Hacks", + + [NSNumber numberWithBool:YES], @"Proportional Resize", +// [NSSize stringWithCString: @"default"], @"Fullscreen Resolution", + [NSNumber numberWithInt:2], @"Offscreen Drawing Level", + [NSNumber numberWithInt:0], @"Texture Color Depth Level", + [NSNumber numberWithInt:0], @"Texture Enhancement Level", + [NSNumber numberWithInt:0], @"Texture Filter Level", + [NSNumber numberWithInt:0], @"Frame Buffer Level", + [NSNumber numberWithBool:NO], @"Draw Scanlines", + // nasty: + [NSArchiver archivedDataWithRootObject: [NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:0.25]], @"Scanline Color", + [NSNumber numberWithBool:NO], @"Advanced Blending", + [NSNumber numberWithBool:NO], @"Opaque Pass", + [NSNumber numberWithBool:NO], @"Blur", + [NSNumber numberWithBool:YES], @"Z Mask Clipping", + [NSNumber numberWithBool:NO], @"Wireframe Mode", + [NSNumber numberWithBool:YES], @"Emulate mjpeg decoder", // helps remove unsightly vertical line in movies + [NSNumber numberWithBool:NO], @"Fast mjpeg decoder", + nil]; + + [defaults setObject: defaultPrefs forKey:PrefsKey]; + [defaults synchronize]; + } + return; +} + +void ReadConfig(void) +{ + // set up PCSX GPU plug's global variables according to user preferences. + // this is called from the PCSX GPU plugin thread via GPUOpen. + + // has nothing to do with the Configuration dialog box, btw., other than the + // fact that the config dialog writes to user prefs. This only reads, which + // is important because PCSX will change its globals on the fly + // and saving those new ad hoc changes is Bad for the user. + + PrepFactoryDefaultPreferences(); // in case user deletes, or on new startup + +//NOTE this is NOT the "keyValues" member of the controller. Just sayin. + NSDictionary* keyValues = [[NSUserDefaults standardUserDefaults] dictionaryForKey:PrefsKey]; + + + // bind all prefs settings to their PCSX counterparts + // with a little finagling to make it work as expected + iShowFPS = [[keyValues objectForKey:@"FPS Counter"] boolValue]; + + if ([[keyValues objectForKey:@"Frame Limit"] boolValue]){ + bUseFrameLimit = 1; + iFrameLimit = 2; // required + fFrameRate = 60; // required (some number, 60 seems ok) + } + +// Dithering is either on or off in OpenGL plug, but hey + bDrawDither = [[keyValues objectForKey:@"Dither Mode"] intValue]; + + bChangeWinMode = [[keyValues objectForKey:@"Auto Full Screen"] boolValue] ? 2 : 1; + bUseFrameSkip = [[keyValues objectForKey:@"Frame Skipping"] boolValue]; + + bUseFixes = [[keyValues objectForKey:@"Enable Hacks"] boolValue]; + dwCfgFixes = [[keyValues objectForKey:@"Hacks"] longValue]; + + +// we always start out at 800x600 (at least until resizing the window is implemented) + iResX = 800; + iResY = 600; + + iBlurBuffer = [[keyValues objectForKey:@"Blur"] boolValue]; // not noticeable, but doesn't harm + iUseScanLines = [[keyValues objectForKey:@"Draw Scanlines"] boolValue]; // works + NSColor* scanColor = [NSUnarchiver unarchiveObjectWithData: [keyValues objectForKey:@"Scanline Color"]]; + iScanlineColor[0] = [scanColor redComponent]; + iScanlineColor[1] = [scanColor greenComponent]; + iScanlineColor[2] = [scanColor blueComponent]; + iScanlineColor[3] = [scanColor alphaComponent]; + + iScanBlend = 0; // we always draw nice since it costs nothing. + iUseMask = [[keyValues objectForKey:@"Z Mask Clipping"] boolValue]; // works, clips polygons with primitive "Z" buffer + bUseLines = [[keyValues objectForKey:@"Wireframe Mode"] boolValue]; // works, aka "Wireframe" mode + iOffscreenDrawing = [[keyValues objectForKey:@"Offscreen Drawing Level"] intValue]; // draw offscreen for texture building? + if (iOffscreenDrawing > 4) iOffscreenDrawing = 4; + if (iOffscreenDrawing < 0) iOffscreenDrawing = 0; + + +// texture quality, whatever that means (doesn't hurt), more like "texture handling" or "texture performance" + iFrameTexType = [[keyValues objectForKey:@"Frame Buffer Level"] intValue]; + if (iFrameTexType > 3) iFrameTexType = 3; + if (iFrameTexType < 0) iFrameTexType = 0; + + iTexQuality = [[keyValues objectForKey:@"Texture Color Depth Level"] intValue]; + if (iTexQuality > 4) iTexQuality = 4; + if (iTexQuality < 0) iTexQuality = 0; + +// MAG_FILTER = LINEAR, etc. + iFilterType = [[keyValues objectForKey:@"Texture Filter Level"] intValue]; + if (iFilterType > 2) iFilterType = 2; + if (iFilterType < 0) iFilterType = 0; + +// stretches textures (more detail). You'd think it would look great, but it's not massively better. NEEDS iFilterType to be of any use. + iHiResTextures = [[keyValues objectForKey:@"Texture Enhancement Level"] intValue]; + if (iHiResTextures > 2) iHiResTextures = 2; + if (iHiResTextures < 0) iHiResTextures = 0; + + // well actually, the "SaI" mode is best, but is #1, so swap qualities: + if (iHiResTextures != 0) + iHiResTextures = 3 - iHiResTextures; + + if (iHiResTextures && !iFilterType) + iFilterType = 1; // needed to see any real effect + + bUseFastMdec = [[keyValues objectForKey:@"Emulate mjpeg decoder"] boolValue]; + bUse15bitMdec = [[keyValues objectForKey:@"Fast mjpeg decoder"] boolValue]; + + + if (iShowFPS) + ulKeybits|=KEY_SHOWFPS; + else + ulKeybits&=~KEY_SHOWFPS; + + // additional checks + if(!iColDepth) iColDepth=32; +#if 0 // was in SoftGPU, not in OpenGL + if(iUseFixes) dwActFixes=dwCfgFixes; + else dwActFixes=0; +#else + dwActFixes=0; // for now... TODO +#endif + + + SetFixes(); + + // need this or you'll be playing at light speed: + if(iFrameLimit==2) SetAutoFrameCap(); + bSkipNextFrame = FALSE; + + szDispBuf[0]=0; + BuildDispMenu(0); +} + +@implementation PluginConfigController + +- (IBAction)cancel:(id)sender +{ + //TODO: the IB bindings have already changed everything to what the + // user clicked on. + // Therefore, "backup" settings should be stored before interaction, + // then restored here. + // IMO, 'cancel' is not needed since the config dialog doesn't launch + // an action when "ok" is clicked. + [self close]; +} + +- (IBAction)ok:(id)sender +{ + +// most everything is taken care of through bindings in Interface Builder. +// note that the IB interface uses NSObjectController (a dict controller) as a proxy to +// NSUserDefaultsController because NSUserDefaultsController can't +// handle dictionaries. Yup, that's what I said. </snark>. + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults synchronize]; + +// treat hacks specially: + + unsigned long hackValues = 0; + int i; + NSArray *views = [hacksView subviews]; + for (i=0; i<[views count]; i++) { + NSView *control = [views objectAtIndex:i]; + if ([control isKindOfClass:[NSButton class]]) { + hackValues |= [(NSControl *)control intValue] << ([control tag] - 1); + } + } + + keyValues = [NSMutableDictionary dictionaryWithDictionary: [[NSUserDefaults standardUserDefaults] dictionaryForKey:PrefsKey]]; + + NSMutableDictionary *writeDic = [NSMutableDictionary dictionaryWithDictionary:keyValues]; + [writeDic setObject:[NSNumber numberWithLong:hackValues] forKey:@"Hacks"]; + + // write the preferences with Hacks adjustments + [defaults setObject:writeDic forKey:PrefsKey]; + [defaults synchronize]; + + [self close]; +} + +- (IBAction)reset:(id)sender +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults removeObjectForKey:PrefsKey]; + [self loadValues]; +} + +- (IBAction)hackToggle:(id)sender +{ + // enable the "hacks" checkboxes + BOOL enable = [sender intValue] ? YES : NO; + int i; + NSArray *views = [hacksView subviews]; + + for (i=0; i<[views count]; i++) { + NSView *control = [views objectAtIndex:i]; + if ([control isKindOfClass:[NSButton class]]) { + [(NSControl *)control setEnabled:enable]; + } + } +} + +- (void)loadValues +{ +// set up the window with the values in the .plist + +// all preferences are bound in Interface Builder. +// Though the "hacks settings" is controlled here because it disables/enables the list +// and uses a bit mask + +// Note that in the .nib, an NSObjectController (aka "dict controller") +// is used as a proxy to NSUserDefaults +// because NSUserDefaults is slightly retarded about nested dictionaries +// OK, "Completely" retarded. + + PrepFactoryDefaultPreferences(); // in case we're starting anew + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + /* load from preferences */ + keyValues = [NSMutableDictionary dictionaryWithDictionary: [defaults dictionaryForKey:PrefsKey]]; + + unsigned long hackValues = [[keyValues objectForKey:@"Hacks"] longValue]; + + // build refs to hacks checkboxes + int i; + NSArray *views = [hacksView subviews]; + for (i=0; i<[views count]; i++) { + NSView *control = [views objectAtIndex:i]; + if ([control isKindOfClass:[NSButton class]]) { + [(NSControl *)control setIntValue:(hackValues >> ([control tag] - 1)) & 1]; + } + } + + [self hackToggle:hackEnable]; +} + +- (void)awakeFromNib +{ + hacksView = [[hacksView subviews] objectAtIndex:0]; + [[NSColorPanel sharedColorPanel] setShowsAlpha:YES]; // eliminate dumb behavior! +} + +@end |
