blob: 63b7d3c31ece26ffbcaabd0d003521702dd2f69e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// -------------------------- quadLimit -------------------------- //
// limits a value with a quadratic curve, feels nice
( function() {
function lerp( a, b, i ) {
return ( b - a ) * i + a;
}
function quadLimit( value, curveStart, limit, reach ) {
var direction = curveStart < limit ? 1 : -1;
if ( value * direction < curveStart * direction ) {
return value;
} else if ( value * direction > reach * direction ) {
return limit;
}
// within curve, let's get y value
var denom = reach - 2 * limit + curveStart;
// prevent divide by 0
denom = denom === 0 ? 1 : denom;
var a = ( limit - curveStart ) / denom;
var b = Math.sqrt( ( value - curveStart ) / denom + a * a );
var i1 = b - a;
var i2 = -b - a;
// since sqrt can be +/-, use value that is less than 1
var i = i1 <= 1 ? i1 : i2;
// lerp between curveStart and the limit
var lp1 = lerp( curveStart, limit, i );
// lerp that with the limit again
var lp2 = lerp( lp1, limit, i );
return lp2;
}
window.quadLimit = quadLimit;
})();
|