#pragma once #include "platform.h" #include #include #include namespace stingray_plugin_foundation { // Common math functions. namespace math { const float pi = 3.141592654f; __forceinline bool is_pow2(unsigned); __forceinline float square_root(float); __forceinline float degrees_to_radians(float); __forceinline float radians_to_degrees(float f); #undef max template __forceinline T max(T a, T b); template __forceinline T max3(T a, T b, T c); #undef min template __forceinline T min(T a, T b); template __forceinline T min3(T a, T b, T c); template __forceinline T clamp(T x, T min, T max); template __forceinline T abs(T x); template __forceinline T sign(T x); unsigned branchless_max(unsigned a, unsigned b); unsigned branchless_min(unsigned a, unsigned b); unsigned div_ceil(unsigned a, unsigned b); unsigned div_round(unsigned a, unsigned b); __forceinline unsigned round_down_to_align(unsigned x, unsigned align) {return x - x%align;} __forceinline unsigned round_up_to_align(unsigned x, unsigned align) {return round_down_to_align(x+align-1, align);} __forceinline bool valid(const float *fa, unsigned n) { for (unsigned i=0; i= FLT_MAX || f <= -FLT_MAX) return false; } return true; } __forceinline unsigned log2(unsigned a) { unsigned log2 = 0; while(a >>= 1) log2++; return log2; } } __forceinline float lerp(float a, float b, float t); // Finds the maximum value and its source from a number of tested // values. template class FindMaximum { public: // Initiates the search for the maximum value. // * `start` The start value of the search. FindMaximum(float start = -std::numeric_limits::max()) : _value(start) {} // Tests if value is the biggest value encountered so far. // If it is, the value and the source are recorded and the // function returns true, otherwise it returns false. bool test(float value, const SOURCE &source) { if (value > _value) { _value = value; _source = source; return true; } else return false; } // Returns true if any value bigger than the start value was // found. bool found(float start = -std::numeric_limits::max()) {return _value > start;} // Returns the maximum value found. const float &value() {return _value;} // Returns the source of the maximum value found const SOURCE &source() {return _source;} private: float _value; SOURCE _source; }; // Finds the minimum value and its source from a number of tested // values. template class FindMinimum { public: // Initiates the search for the minimum avlue. // * `start` The start value of the search FindMinimum(float start = std::numeric_limits::max()) : _value(start) {} // Tests if value is the smallest value encountered so far. // If it is, the value and the source are recorded and the // function returns true, otherwise it returns false. bool test(const float &value, const SOURCE &source) { if (value < _value) { _value = value; _source = source; return true; } else return false; } // Returns true if any value smaller than the start value was // found. bool found(float start = std::numeric_limits::max()) {return _value < start;} // Returns the maximum value found. const float &value() {return _value;} // Returns the source of the maximum value found const SOURCE &source() {return _source;} private: float _value; SOURCE _source; }; // Class that represents a cross fade. // A cross fade is a mix between an in fade and an out fade. class Crossfade { public: // Creates a new crossfade that is fully faded in. Crossfade() : _fade_in(1), _fade_in_t(FLT_MAX), _fade_out(0), _fade_out_t(FLT_MAX) {} // Creates a new crossfade that fades in over time `bt`. Crossfade(float bt) : _fade_in(0), _fade_in_t(bt), _fade_out(0), _fade_out_t(FLT_MAX) {} // Fades out the current crossfade over time bt. void fade_out(float bt) { if (bt < _fade_out_t) _fade_out_t = bt; if (_fade_in_t != FLT_MAX && bt < _fade_in_t) _fade_in_t = bt; } // Updates this crossfade void update(float dt); // Returns true if the crossfade is done bool is_done() {return _fade_out == 1;} // Returns the current blend value for the crossfade float blend() {return _fade_in - _fade_out;} private: float _fade_in, _fade_in_t; float _fade_out, _fade_out_t; }; } #include "math.inl"