X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=JSActionAnalog.m;h=30838868e1a46cb184bae13ef84d9aa649afb68e;hp=ae347fa9ad85774e7ac9ad41ba8ff109117df3d4;hb=8a554859b8457eefa566c839062640fa450424af;hpb=3f6df7a954fb74bcebf6fc6c0e60821843b0f31b diff --git a/JSActionAnalog.m b/JSActionAnalog.m index ae347fa..3083886 100644 --- a/JSActionAnalog.m +++ b/JSActionAnalog.m @@ -5,32 +5,33 @@ // Created by Sam McCall on 5/05/09. // -// TODO: Dead zone should be configurable per-device. #define DEAD_ZONE 0.3 #import "JSActionAnalog.h" +static float normalize(int p, int min, int max) { + return 2 * (p - min) / (float)(max - min) - 1; +} + @implementation JSActionAnalog { float magnitude; + int rawMin; + int rawMax; } -@synthesize offset, scale; - -- (id)initWithIndex:(int)newIndex offset:(float)offset_ scale:(float)scale_ { +- (id)initWithIndex:(int)index rawMin:(int)rawMin_ rawMax:(int)rawMax_ { if ((self = [super init])) { + self.name = [[NSString alloc] initWithFormat: @"Axis %d", index]; self.children = @[[[JSAction alloc] initWithName:@"Low" base:self], [[JSAction alloc] initWithName:@"High" base:self]]; - self.index = newIndex; - self.offset = offset_; - self.scale = scale_; - self.name = [[NSString alloc] initWithFormat: @"Axis %d", self.index]; + rawMax = rawMax_; + rawMin = rawMin_; } return self; } - (id)findSubActionForValue:(IOHIDValueRef)value { - int raw = IOHIDValueGetIntegerValue(value); - float mag = offset + scale * raw; + float mag = normalize(IOHIDValueGetIntegerValue(value), rawMin, rawMax); if (mag < -DEAD_ZONE) return self.children[0]; else if (mag > DEAD_ZONE) @@ -40,8 +41,7 @@ } - (void)notifyEvent:(IOHIDValueRef)value { - int raw = IOHIDValueGetIntegerValue(value); - magnitude = offset + scale * raw; + magnitude = normalize(IOHIDValueGetIntegerValue(value), rawMin, rawMax); [self.children[0] setActive:magnitude < -DEAD_ZONE]; [self.children[1] setActive:magnitude > DEAD_ZONE]; }