#ifndef GUF_MATH_H #define GUF_MATH_H #include "guf_common.h" #include "guf_assert.h" #define GUF_PI 3.14159265358979323846264338327950288 // Rotate left. static inline uint64_t guf_rotl_u64(uint64_t x, int k) { return (x << k) | (x >> (64 - k)); } static inline float guf_clamp_f32(float x, float min, float max) { if (x < min) return min; if (x > max) return max; return x; } static inline double guf_clamp_f64(double x, double min, double max) { if (x < min) return min; if (x > max) return max; return x; } static inline float guf_lerp_f32(float a, float b, float alpha) { return (1 - alpha) * a + alpha * b; } static inline double guf_lerp_f64(double a, double b, double alpha) { return (1 - alpha) * a + alpha * b; } static inline float guf_smoothstep_f32(float edge0, float edge1, float x) { GUF_ASSERT(edge0 != edge1); x = guf_clamp_f32((x - edge0) / (edge1 - edge0), 0, 1); return x * x * (3.f - 2.f * x); } static inline float guf_smootherstep_f32(float edge0, float edge1, float x) { GUF_ASSERT(edge0 != edge1); x = guf_clamp_f32((x - edge0) / (edge1 - edge0), 0, 1); return x * x * x * (x * (6.f * x - 15.f) + 10.f); } static inline int guf_abs_int(int x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > INT_MIN); return -x;} // I would not drink that... static inline long guf_abs_long(long x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > LONG_MIN); return -x;} static inline long long guf_abs_long_long(long long x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > LLONG_MIN); return -x;} static inline int8_t guf_abs_i8 (int8_t x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > INT8_MIN); return -x;} static inline int16_t guf_abs_i16(int16_t x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > INT16_MIN); return -x;} static inline int32_t guf_abs_i32(int32_t x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > INT32_MIN); return -x;} static inline int64_t guf_abs_i64(int64_t x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > INT64_MIN); return -x;} static inline ptrdiff_t guf_abs_ptrdiff(ptrdiff_t x) {if (x >= 0) {return x;} GUF_ASSERT_RELEASE(x > PTRDIFF_MIN); return -x;} #endif