@@ -263,7 +263,7 @@ SPaddle Paddle;
263263SPaddle DefaultPaddle = { false , ' K' , ' L' };
264264
265265SAnalog Analog;
266- SAnalog DefaultAnalog = { false , 1 , 2 , 15 , true , true };
266+ SAnalog DefaultAnalog = { false , 1 , 2 , 15 , true };
267267
268268bool killStylusTopScreen = false ;
269269bool killStylusOffScreen = false ;
@@ -485,7 +485,6 @@ static void LoadAnalogConfig()
485485 ReadAnalogControl (" Y" , Analog.Y );
486486 ReadAnalogControl (" Deadzone" , Analog.Deadzone );
487487 ReadAnalogBool (" Joined" , Analog.Joined );
488- ReadAnalogBool (" Circle" , Analog.Circle );
489488}
490489
491490
@@ -2714,6 +2713,12 @@ static float get_analog_float(WORD axis)
27142713 return (float ) val / 10000 .0f ;
27152714}
27162715
2716+ static float apply_deadzone (float value, float mag, float deadzone) {
2717+ if (mag <= deadzone) return 0 .0f ;
2718+ float cmag = std::min (mag, 1 .0f ); // clamp mag to 1.0f just in case
2719+ return value * (cmag - deadzone) / (1 .0f - deadzone) / mag;
2720+ }
2721+
27172722// void S9xOldAutofireAndStuff ()
27182723// {
27192724// // stuff ripped out of Snes9x that's no longer functional, at least for now
@@ -3058,11 +3063,13 @@ void input_acquire()
30583063 float y = get_analog_float (Analog.Y );
30593064
30603065 if (Analog.Joined ) {
3061- float value = Analog.Circle ? std::hypot (x, y) : (std::max)(std::abs (x), std::abs (y));
3062- if (value < deadzone) x = y = 0 .0f ;
3066+ float mag = std::hypot (x, y);
3067+ x = apply_deadzone (x, mag, deadzone);
3068+ y = apply_deadzone (y, mag, deadzone);
30633069 } else {
3064- if (x < deadzone && x > -deadzone) x = 0 .0f ;
3065- if (y < deadzone && y > -deadzone) y = 0 .0f ;
3070+ // Faster approximation that prioritizes cardinal directions
3071+ x = apply_deadzone (x, x, deadzone);
3072+ y = apply_deadzone (y, y, deadzone);
30663073 }
30673074
30683075 analog_setValue (x, y);
0 commit comments