summaryrefslogtreecommitdiffstats
path: root/bounds4/quad-limit.js
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;

})();