]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into TimePath/polytrails
authorMario <mario@smbclan.net>
Tue, 7 Mar 2017 20:19:59 +0000 (06:19 +1000)
committerMario <mario@smbclan.net>
Tue, 7 Mar 2017 20:19:59 +0000 (06:19 +1000)
1  2 
qcsrc/lib/math.qh

diff --combined qcsrc/lib/math.qh
index 5ed328227aa9293f34f07ced18eccb84ac05eb5a,06994887c58ad6bbaeb7a46855052f300561279b..fe70417aa99d3d009f8bdd74970b15ea4b593a7c
@@@ -1,18 -1,20 +1,20 @@@
  #pragma once
  
+ #include "lib/float.qh"
  void mean_accumulate(entity e, .float a, .float c, float mean, float value, float weight)
  {
        if (weight == 0) return;
-       if (mean == 0) e.(a) *= pow(value, weight);
-       else e.(a) += pow(value, mean) * weight;
+       if (mean == 0) e.(a) *= (value ** weight);
+       else e.(a) += (value ** mean) * weight;
        e.(c) += weight;
  }
  
  float mean_evaluate(entity e, .float a, .float c, float mean)
  {
        if (e.(c) == 0) return 0;
-       if (mean == 0) return pow(e.(a), 1.0 / e.(c));
-       else return pow(e.(a) / e.(c), 1.0 / mean);
+       if (mean == 0) return (e.(a) ** (1.0 / e.(c)));
+       else return ((e.(a) / e.(c)) ** (1.0 / mean));
  }
  
  #define MEAN_ACCUMULATE(s, prefix, v, w) mean_accumulate(s, prefix##_accumulator, prefix##_count, prefix##_mean, v, w)
@@@ -64,24 -66,6 +66,24 @@@ vector vsnap(vector point, float fsize
        return vret;
  }
  
 +float lerpratio(float f0, float f1, float ratio) { return f0 * (1 - ratio) + f1 * ratio; }
 +
 +float lerp(float t0, float f0, float t1, float f1, float t) { return lerpratio(f0, f1, (t - t0) / (t1 - t0)); }
 +
 +float lerp3ratio(float f0, float f1, float f2, float ratio)
 +{
 +      int mid = 0.5;
 +      return ratio < mid ? lerpratio(f0, f1, ratio / mid) : ratio > mid ? lerpratio(f1, f2, (ratio - mid) / mid) : f1;
 +}
 +
 +vector lerpvratio(vector f0, vector f1, float ratio) { return f0 * (1 - ratio) + f1 * ratio; }
 +
 +vector lerpv3ratio(vector f0, vector f1, vector f2, float ratio)
 +{
 +      int mid = 0.5;
 +      return ratio < mid ? lerpvratio(f0, f1, ratio / mid) : ratio > mid ? lerpvratio(f1, f2, (ratio - mid) / mid) : f1;
 +}
 +
  vector lerpv(float t0, vector v0, float t1, vector v1, float t)
  {
        return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));
@@@ -194,6 -178,12 +196,12 @@@ float almost_equals(float a, float b
        return a - b < eps && b - a < eps;
  }
  
+ float almost_equals_eps(float a, float b, float times_eps)
+ {
+       float eps = max(fabs(a), fabs(b)) * FLOAT_EPSILON * times_eps;
+       return a - b < eps && b - a < eps;
+ }
  float almost_in_bounds(float a, float b, float c)
  {
        float eps = (max(a, -a) + max(c, -c)) * 0.001;
  
  float ExponentialFalloff(float mindist, float maxdist, float halflifedist, float d)
  {
-       if (halflifedist > 0) return pow(0.5, (bound(mindist, d, maxdist) - mindist) / halflifedist);
-       else if (halflifedist < 0) return pow(0.5, (bound(mindist, d, maxdist) - maxdist) / halflifedist);
+       if (halflifedist > 0) return (0.5 ** ((bound(mindist, d, maxdist) - mindist) / halflifedist));
+       else if (halflifedist < 0) return (0.5 ** ((bound(mindist, d, maxdist) - maxdist) / halflifedist));
        else return 1;
  }
  
  float power2of(float e)
  {
-       return pow(2, e);
+       return (2 ** e);
  }
  
  float log2of(float e)