From 46a44d93e943972d625ac92280a7cecf8a5b503a Mon Sep 17 00:00:00 2001 From: stephena Date: Mon, 27 Mar 2006 21:06:44 +0000 Subject: [PATCH] Added paddle threshold/non-jitter code to Stelladaptor paddle handling. This code basically comes from z26, and is used to eliminate rapid left/right movements which result in visual jitter. Added 'pthresh' commandline option to set this threshold, which defaults to 600. I haven't decided if I should add a GUI option for this yet. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1069 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/emucore/EventHandler.cxx | 31 +++++++++++++++++++++++++++-- stella/src/emucore/EventHandler.hxx | 19 +++++++++++++++--- stella/src/emucore/Settings.cxx | 4 +++- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/stella/src/emucore/EventHandler.cxx b/stella/src/emucore/EventHandler.cxx index c8cbaf474..928e19e19 100644 --- a/stella/src/emucore/EventHandler.cxx +++ b/stella/src/emucore/EventHandler.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventHandler.cxx,v 1.158 2006-03-27 12:52:19 stephena Exp $ +// $Id: EventHandler.cxx,v 1.159 2006-03-27 21:06:44 stephena Exp $ //============================================================================ #include @@ -69,7 +69,8 @@ EventHandler::EventHandler(OSystem* osystem) myQuitFlag(false), myGrabMouseFlag(false), myUseLauncherFlag(false), - myPaddleMode(0) + myPaddleMode(0), + myPaddleThreshold(0) { int i, j, k; @@ -133,6 +134,8 @@ EventHandler::EventHandler(OSystem* osystem) setPaddleMode(myOSystem->settings().getInt("paddle"), false); myFryingFlag = false; + + myPaddleThreshold = myOSystem->settings().getInt("pthresh"); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -757,6 +760,11 @@ void EventHandler::poll(uInt32 time) // Send axis events for the paddles case Controller::Paddles: { + // Determine which paddle we're emulating and see if + // we're getting rapid movement (aka jittering) + if(isJitter(((type-2) << 1) + axis, value)) + break; + int resistance = (Int32) (1000000.0 * (32767 - value) / 65534); myEvent->set(SA_Axis[type-2][axis][2], resistance); break; @@ -1849,6 +1857,25 @@ inline bool EventHandler::eventIsAnalog(Event::Type event) } } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +inline bool EventHandler::isJitter(int paddle, int value) +{ + bool jitter = false; + bool leftMotion = myPaddle[paddle].joy_val - myPaddle[paddle].old_joy_val > 0; + int distance = value - myPaddle[paddle].joy_val; + + // Filter out jitter by not allowing rapid direction changes + if(distance > 0 && !leftMotion) // movement switched from left to right + jitter = distance < myPaddleThreshold; + else if(distance < 0 && leftMotion) // movement switched from right to left + jitter = distance > -myPaddleThreshold; + + myPaddle[paddle].old_joy_val = myPaddle[paddle].joy_val; + myPaddle[paddle].joy_val = value; + + return jitter; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::saveState() { diff --git a/stella/src/emucore/EventHandler.hxx b/stella/src/emucore/EventHandler.hxx index 457d62363..2025b0ee0 100644 --- a/stella/src/emucore/EventHandler.hxx +++ b/stella/src/emucore/EventHandler.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventHandler.hxx,v 1.83 2006-03-25 00:34:17 stephena Exp $ +// $Id: EventHandler.hxx,v 1.84 2006-03-27 21:06:44 stephena Exp $ //============================================================================ #ifndef EVENTHANDLER_HXX @@ -91,9 +91,9 @@ struct JoyMouse { int x, y, x_vel, y_vel, x_max, y_max, x_amt, y_amt, amt, x_down_count, y_down_count; unsigned int last_time, delay_time, x_down_time, y_down_time; + int joy_val, old_joy_val; }; - /** This class takes care of event remapping and dispatching for the Stella core, as well as keeping track of the current 'mode'. @@ -107,7 +107,7 @@ struct JoyMouse { mapping can take place. @author Stephen Anthony - @version $Id: EventHandler.hxx,v 1.83 2006-03-25 00:34:17 stephena Exp $ + @version $Id: EventHandler.hxx,v 1.84 2006-03-27 21:06:44 stephena Exp $ */ class EventHandler { @@ -458,6 +458,16 @@ class EventHandler */ inline bool eventIsAnalog(Event::Type event); + /** + Tests if the given paddle value is displaying a rapid left/right + motion, which is also known as jitter. + + @param paddle The paddle to test + @param value The value assigned to the paddle + @return True if jittering, else false + */ + inline bool isJitter(int paddle, int value); + void saveState(); void changeState(); void loadState(); @@ -525,6 +535,9 @@ class EventHandler // Indicates which paddle the mouse currently emulates Int8 myPaddleMode; + // Indicates the amount by which we consider a paddle to be jittering + int myPaddleThreshold; + // Used for paddle emulation by keyboard or joystick JoyMouse myPaddle[4]; diff --git a/stella/src/emucore/Settings.cxx b/stella/src/emucore/Settings.cxx index 2570907e9..8e567f5d8 100644 --- a/stella/src/emucore/Settings.cxx +++ b/stella/src/emucore/Settings.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Settings.cxx,v 1.82 2006-03-19 00:46:04 stephena Exp $ +// $Id: Settings.cxx,v 1.83 2006-03-27 21:06:44 stephena Exp $ //============================================================================ #include @@ -68,6 +68,7 @@ Settings::Settings(OSystem* osystem) setInternal("p2speed", "50"); setInternal("p3speed", "50"); setInternal("p4speed", "50"); + setInternal("pthresh", "600"); setInternal("showinfo", "false"); @@ -314,6 +315,7 @@ void Settings::usage() << " -p2speed Speed of emulated mouse movement for paddle 2 (0-100)\n" << " -p3speed Speed of emulated mouse movement for paddle 3 (0-100)\n" << " -p4speed Speed of emulated mouse movement for paddle 4 (0-100)\n" + << " -pthresh Set threshold for eliminating paddle jitter\n" << " -tiadefaults <1|0> Use TIA positioning defaults instead of enhanced values\n" #ifdef UNIX << " -accurate <1|0> Accurate game timing (uses more CPU)\n"