31 lines
823 B
C
31 lines
823 B
C
#pragma once
|
|
|
|
#include <common.h>
|
|
|
|
// 26.6 fixed point. 1.0 = 64, -32.0 .. 31.999 range in SSINT32.
|
|
typedef SSINT32 f26_6;
|
|
|
|
#define F26_ONE ((f26_6)64)
|
|
#define F26_HALF ((f26_6)32)
|
|
#define F26_FROM_INT(x) ((f26_6)((x) * 64))
|
|
#define F26_FLOOR(x) ((x) >> 6)
|
|
#define F26_ROUND(x) (((x) + 32) >> 6)
|
|
#define F26_FRAC(x) ((x) & 63)
|
|
|
|
static inline f26_6 f26_mul(f26_6 a, f26_6 b) {
|
|
return (f26_6)(((SSINT64)a * b) >> 6);
|
|
}
|
|
|
|
static inline f26_6 f26_div(f26_6 a, f26_6 b) {
|
|
if (b == 0) return 0;
|
|
return (f26_6)(((SSINT64)a << 6) / b);
|
|
}
|
|
|
|
// Linear interpolation. t in [0, 64].
|
|
static inline f26_6 f26_lerp(f26_6 a, f26_6 b, f26_6 t) {
|
|
return a + f26_mul(b - a, t);
|
|
}
|
|
|
|
// Floor-of-division helper for bezier root solving.
|
|
static inline SSINT32 isign(SSINT32 x) { return (x > 0) - (x < 0); }
|