#pragma once #include // 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); }