62 lines
2.2 KiB
C
62 lines
2.2 KiB
C
#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
|