diff --git a/GNUmakefile b/GNUmakefile index 8fe637174..e401c1d9f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -241,8 +241,8 @@ engine_objs := \ miniz.c \ miniz_tinfl.c \ miniz_tdef.c \ - fix16.c \ - fix16_str.c \ + fix16.cpp \ + fix16_str.cpp \ engine_editor_objs := \ build.cpp \ diff --git a/platform/Windows/build.vcxproj b/platform/Windows/build.vcxproj index e708fcc5e..bd2638510 100644 --- a/platform/Windows/build.vcxproj +++ b/platform/Windows/build.vcxproj @@ -211,8 +211,8 @@ true - - + + diff --git a/source/build/Dependencies.mak b/source/build/Dependencies.mak index 6e73ec93d..64a0ed83a 100644 --- a/source/build/Dependencies.mak +++ b/source/build/Dependencies.mak @@ -47,11 +47,11 @@ $(engine_obj)/wiibits.$o: $(engine_src)/wiibits.cpp $(engine_inc)/wiibits.h $(engine_obj)/winbits.$o: $(engine_src)/winbits.cpp $(engine_inc)/winbits.h $(engine_obj)/xxhash.$o: $(engine_src)/xxhash.c $(engine_inc)/xxhash.h $(engine_obj)/pngwrite.$o: $(engine_src)/pngwrite.cpp $(engine_inc)/pngwrite.h -$(engine_obj)/fix16.$o: $(engine_src)/fix16.c $(engine_inc)/fix16.h $(engine_inc)/fix16_int64.h +$(engine_obj)/fix16.$o: $(engine_src)/fix16.cpp $(engine_inc)/fix16.h $(engine_inc)/fix16_int64.h $(engine_obj)/miniz.$o: $(engine_src)/miniz.c $(engine_inc)/miniz.h $(engine_inc)/miniz_common.h $(engine_inc)/miniz_tinfl.h $(engine_inc)/miniz_tdef.h $(engine_obj)/miniz_tinfl.$o: $(engine_src)/miniz_tinfl.c $(engine_inc)/miniz.h $(engine_inc)/miniz_common.h $(engine_inc)/miniz_tinfl.h $(engine_inc)/miniz_tdef.h $(engine_obj)/miniz_tdef.$o: $(engine_src)/miniz_tdef.c $(engine_inc)/miniz.h $(engine_inc)/miniz_common.h $(engine_inc)/miniz_tinfl.h $(engine_inc)/miniz_tdef.h -$(engine_obj)/fix16_str.$o: $(engine_src)/fix16_str.c $(engine_inc)/fix16.h +$(engine_obj)/fix16_str.$o: $(engine_src)/fix16_str.cpp $(engine_inc)/fix16.h $(engine_obj)/lunatic.$o: $(engine_src)/lunatic.cpp $(engine_inc)/lunatic.h $(engine_inc)/cache1d.h $(engine_inc)/osd.h diff --git a/source/build/include/fix16.h b/source/build/include/fix16.h index ea73b1cd9..1e9941151 100644 --- a/source/build/include/fix16.h +++ b/source/build/include/fix16.h @@ -1,6 +1,8 @@ #ifndef __libfixmath_fix16_h__ #define __libfixmath_fix16_h__ +#include "compat.h" + #ifdef __cplusplus extern "C" { @@ -26,54 +28,46 @@ extern "C" typedef int32_t fix16_t; -static const fix16_t FOUR_DIV_PI = 0x145F3; /*!< Fix16 value of 4/PI */ -static const fix16_t _FOUR_DIV_PI2 = 0xFFFF9840; /*!< Fix16 value of -4/PIĀ² */ -static const fix16_t X4_CORRECTION_COMPONENT = 0x399A; /*!< Fix16 value of 0.225 */ -static const fix16_t PI_DIV_4 = 0x0000C90F; /*!< Fix16 value of PI/4 */ -static const fix16_t THREE_PI_DIV_4 = 0x00025B2F; /*!< Fix16 value of 3PI/4 */ +static CONSTEXPR const fix16_t FIX16_MAX = 0x7FFFFFFF; /*!< the maximum value of fix16_t */ +static CONSTEXPR const fix16_t FIX16_MIN = 0x80000000; /*!< the minimum value of fix16_t */ +static CONSTEXPR const fix16_t FIX16_OVERFLOW = 0x80000000; /*!< the value used to indicate overflows when FIXMATH_NO_OVERFLOW is not specified */ -static const fix16_t fix16_maximum = 0x7FFFFFFF; /*!< the maximum value of fix16_t */ -static const fix16_t fix16_minimum = 0x80000000; /*!< the minimum value of fix16_t */ -static const fix16_t fix16_overflow = 0x80000000; /*!< the value used to indicate overflows when FIXMATH_NO_OVERFLOW is not specified */ - -static const fix16_t fix16_pi = 205887; /*!< fix16_t value of pi */ -static const fix16_t fix16_e = 178145; /*!< fix16_t value of e */ -static const fix16_t fix16_one = 0x00010000; /*!< fix16_t value of 1 */ +static CONSTEXPR const fix16_t fix16_one = 0x00010000; /*!< fix16_t value of 1 */ /* Conversion functions between fix16_t and float/integer. * These are inlined to allow compiler to optimize away constant numbers */ -static inline fix16_t fix16_from_int(int a) { return a * fix16_one; } -static inline float fix16_to_float(fix16_t a) { return (float)a / fix16_one; } -static inline double fix16_to_dbl(fix16_t a) { return (double)a / fix16_one; } +static FORCE_INLINE CONSTEXPR fix16_t fix16_from_int(int a) { return a * fix16_one; } +static FORCE_INLINE CONSTEXPR float fix16_to_float(fix16_t a) { return (float)a / fix16_one; } +static FORCE_INLINE CONSTEXPR double fix16_to_dbl(fix16_t a) { return (double)a / fix16_one; } static inline int fix16_to_int(fix16_t a) { #ifdef FIXMATH_NO_ROUNDING return (a >> 16); #else - if (a >= 0) - return (a + (fix16_one >> 1)) / fix16_one; - return (a - (fix16_one >> 1)) / fix16_one; + if (a >= 0) + return (a + (fix16_one >> 1)) / fix16_one; + return (a - (fix16_one >> 1)) / fix16_one; #endif } static inline fix16_t fix16_from_float(float a) { - float temp = a * fix16_one; + float temp = a * fix16_one; #ifndef FIXMATH_NO_ROUNDING - temp += (temp >= 0) ? 0.5f : -0.5f; + temp += (temp >= 0) ? 0.5f : -0.5f; #endif - return (fix16_t)temp; + return (fix16_t)temp; } static inline fix16_t fix16_from_dbl(double a) { - double temp = a * fix16_one; + double temp = a * fix16_one; #ifndef FIXMATH_NO_ROUNDING - temp += (temp >= 0) ? 0.5f : -0.5f; + temp += (temp >= 0) ? 0.5f : -0.5f; #endif - return (fix16_t)temp; + return (fix16_t)temp; } /* Macro for defining fix16_t constant values. @@ -87,24 +81,24 @@ static inline fix16_t fix16_from_dbl(double a) */ #define F16(x) ((fix16_t)(((x) >= 0) ? ((x) * 65536.0 + 0.5) : ((x) * 65536.0 - 0.5))) -static inline fix16_t fix16_abs(fix16_t x) - { return (x < 0 ? -x : x); } -static inline fix16_t fix16_floor(fix16_t x) - { return (x & 0xFFFF0000UL); } -static inline fix16_t fix16_ceil(fix16_t x) - { return (x & 0xFFFF0000UL) + ((x & 0x0000FFFFUL) ? fix16_one : 0); } -static inline fix16_t fix16_min(fix16_t x, fix16_t y) - { return (x < y ? x : y); } -static inline fix16_t fix16_max(fix16_t x, fix16_t y) - { return (x > y ? x : y); } -static inline fix16_t fix16_clamp(fix16_t x, fix16_t lo, fix16_t hi) - { return fix16_min(fix16_max(x, lo), hi); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_abs(fix16_t x) + { return (x < 0 ? -x : x); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_floor(fix16_t x) + { return (x & 0xFFFF0000UL); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_ceil(fix16_t x) + { return (x & 0xFFFF0000UL) + ((x & 0x0000FFFFUL) ? fix16_one : 0); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_min(fix16_t x, fix16_t y) + { return (x < y ? x : y); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_max(fix16_t x, fix16_t y) + { return (x > y ? x : y); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_clamp(fix16_t x, fix16_t lo, fix16_t hi) + { return fix16_min(fix16_max(x, lo), hi); } /* Subtraction and addition with (optional) overflow detection. */ #ifdef FIXMATH_NO_OVERFLOW -static inline fix16_t fix16_add(fix16_t inArg0, fix16_t inArg1) { return (inArg0 + inArg1); } -static inline fix16_t fix16_sub(fix16_t inArg0, fix16_t inArg1) { return (inArg0 - inArg1); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_add(fix16_t inArg0, fix16_t inArg1) { return (inArg0 + inArg1); } +static FORCE_INLINE CONSTEXPR fix16_t fix16_sub(fix16_t inArg0, fix16_t inArg1) { return (inArg0 - inArg1); } #else @@ -135,9 +129,9 @@ extern fix16_t fix16_smul(fix16_t inArg0, fix16_t inArg1) FIXMATH_FUNC_ATTRS; extern fix16_t fix16_sdiv(fix16_t inArg0, fix16_t inArg1) FIXMATH_FUNC_ATTRS; #endif -/*! Divides the first given fix16_t by the second and returns the result. +/*! Divides the first given fix16_t by the second and returns the remainder. */ -extern fix16_t fix16_mod(fix16_t x, fix16_t y) FIXMATH_FUNC_ATTRS; +static FORCE_INLINE fix16_t fix16_mod(fix16_t x, fix16_t y) { return x %= y; } @@ -183,11 +177,11 @@ extern fix16_t fix16_atan2(fix16_t inY, fix16_t inX) FIXMATH_FUNC_ATTRS; static const fix16_t fix16_rad_to_deg_mult = 3754936; static inline fix16_t fix16_rad_to_deg(fix16_t radians) - { return fix16_mul(radians, fix16_rad_to_deg_mult); } + { return fix16_mul(radians, fix16_rad_to_deg_mult); } static const fix16_t fix16_deg_to_rad_mult = 1144; static inline fix16_t fix16_deg_to_rad(fix16_t degrees) - { return fix16_mul(degrees, fix16_deg_to_rad_mult); } + { return fix16_mul(degrees, fix16_deg_to_rad_mult); } @@ -198,7 +192,7 @@ extern fix16_t fix16_sqrt(fix16_t inValue) FIXMATH_FUNC_ATTRS; /*! Returns the square of the given fix16_t. */ static inline fix16_t fix16_sq(fix16_t x) - { return fix16_mul(x, x); } + { return fix16_mul(x, x); } /*! Returns the exponent (e^) of the given fix16_t. */ diff --git a/source/build/include/fix16_int64.h b/source/build/include/fix16_int64.h index 9f09f5c12..88ceaee3c 100644 --- a/source/build/include/fix16_int64.h +++ b/source/build/include/fix16_int64.h @@ -1,33 +1,35 @@ #ifndef __libfixmath_int64_h__ #define __libfixmath_int64_h__ +#include "compat.h" + #ifdef __cplusplus extern "C" { #endif #ifndef FIXMATH_NO_64BIT -static inline int64_t int64_const(int32_t hi, uint32_t lo) { return (((int64_t)hi << 32) | lo); } -static inline int64_t int64_from_int32(int32_t x) { return (int64_t)x; } -static inline int32_t int64_hi(int64_t x) { return (x >> 32); } -static inline uint32_t int64_lo(int64_t x) { return (x & ((1ULL << 32) - 1)); } +static FORCE_INLINE CONSTEXPR int64_t int64_const(int32_t hi, uint32_t lo) { return (((int64_t)hi << 32) | lo); } +static FORCE_INLINE CONSTEXPR int64_t int64_from_int32(int32_t x) { return (int64_t)x; } +static FORCE_INLINE CONSTEXPR int32_t int64_hi(int64_t x) { return (x >> 32); } +static FORCE_INLINE CONSTEXPR uint32_t int64_lo(int64_t x) { return (x & ((1ULL << 32) - 1)); } -static inline int64_t int64_add(int64_t x, int64_t y) { return (x + y); } -static inline int64_t int64_neg(int64_t x) { return (-x); } -static inline int64_t int64_sub(int64_t x, int64_t y) { return (x - y); } -static inline int64_t int64_shift(int64_t x, int8_t y) { return (y < 0 ? (x >> -y) : (x << y)); } +static FORCE_INLINE CONSTEXPR int64_t int64_add(int64_t x, int64_t y) { return (x + y); } +static FORCE_INLINE CONSTEXPR int64_t int64_neg(int64_t x) { return (-x); } +static FORCE_INLINE CONSTEXPR int64_t int64_sub(int64_t x, int64_t y) { return (x - y); } +static FORCE_INLINE CONSTEXPR int64_t int64_shift(int64_t x, int8_t y) { return (y < 0 ? (x >> -y) : (x << y)); } -static inline int64_t int64_mul_i32_i32(int32_t x, int32_t y) { return (x * y); } -static inline int64_t int64_mul_i64_i32(int64_t x, int32_t y) { return (x * y); } +static FORCE_INLINE CONSTEXPR int64_t int64_mul_i32_i32(int32_t x, int32_t y) { return (x * y); } +static FORCE_INLINE CONSTEXPR int64_t int64_mul_i64_i32(int64_t x, int32_t y) { return (x * y); } -static inline int64_t int64_div_i64_i32(int64_t x, int32_t y) { return (x / y); } +static FORCE_INLINE CONSTEXPR int64_t int64_div_i64_i32(int64_t x, int32_t y) { return (x / y); } -static inline int int64_cmp_eq(int64_t x, int64_t y) { return (x == y); } -static inline int int64_cmp_ne(int64_t x, int64_t y) { return (x != y); } -static inline int int64_cmp_gt(int64_t x, int64_t y) { return (x > y); } -static inline int int64_cmp_ge(int64_t x, int64_t y) { return (x >= y); } -static inline int int64_cmp_lt(int64_t x, int64_t y) { return (x < y); } -static inline int int64_cmp_le(int64_t x, int64_t y) { return (x <= y); } +static FORCE_INLINE CONSTEXPR int int64_cmp_eq(int64_t x, int64_t y) { return (x == y); } +static FORCE_INLINE CONSTEXPR int int64_cmp_ne(int64_t x, int64_t y) { return (x != y); } +static FORCE_INLINE CONSTEXPR int int64_cmp_gt(int64_t x, int64_t y) { return (x > y); } +static FORCE_INLINE CONSTEXPR int int64_cmp_ge(int64_t x, int64_t y) { return (x >= y); } +static FORCE_INLINE CONSTEXPR int int64_cmp_lt(int64_t x, int64_t y) { return (x < y); } +static FORCE_INLINE CONSTEXPR int int64_cmp_le(int64_t x, int64_t y) { return (x <= y); } #else typedef struct { @@ -35,17 +37,17 @@ typedef struct { uint32_t lo; } __int64_t; -static inline __int64_t int64_const(int32_t hi, uint32_t lo) { return (__int64_t){ hi, lo }; } -static inline __int64_t int64_from_int32(int32_t x) { return (__int64_t){ (x < 0 ? -1 : 0), x }; } -static inline int32_t int64_hi(__int64_t x) { return x.hi; } -static inline uint32_t int64_lo(__int64_t x) { return x.lo; } +static FORCE_INLINE CONSTEXPR __int64_t int64_const(int32_t hi, uint32_t lo) { return (__int64_t){ hi, lo }; } +static FORCE_INLINE CONSTEXPR __int64_t int64_from_int32(int32_t x) { return (__int64_t){ (x < 0 ? -1 : 0), x }; } +static FORCE_INLINE CONSTEXPR int32_t int64_hi(__int64_t x) { return x.hi; } +static FORCE_INLINE CONSTEXPR uint32_t int64_lo(__int64_t x) { return x.lo; } -static inline int int64_cmp_eq(__int64_t x, __int64_t y) { return ((x.hi == y.hi) && (x.lo == y.lo)); } -static inline int int64_cmp_ne(__int64_t x, __int64_t y) { return ((x.hi != y.hi) || (x.lo != y.lo)); } -static inline int int64_cmp_gt(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo > y.lo))); } -static inline int int64_cmp_ge(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo >= y.lo))); } -static inline int int64_cmp_lt(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo < y.lo))); } -static inline int int64_cmp_le(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo <= y.lo))); } +static FORCE_INLINE CONSTEXPR int int64_cmp_eq(__int64_t x, __int64_t y) { return ((x.hi == y.hi) && (x.lo == y.lo)); } +static FORCE_INLINE CONSTEXPR int int64_cmp_ne(__int64_t x, __int64_t y) { return ((x.hi != y.hi) || (x.lo != y.lo)); } +static FORCE_INLINE CONSTEXPR int int64_cmp_gt(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo > y.lo))); } +static FORCE_INLINE CONSTEXPR int int64_cmp_ge(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo >= y.lo))); } +static FORCE_INLINE CONSTEXPR int int64_cmp_lt(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo < y.lo))); } +static FORCE_INLINE CONSTEXPR int int64_cmp_le(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo <= y.lo))); } static inline __int64_t int64_add(__int64_t x, __int64_t y) { __int64_t ret; diff --git a/source/build/src/fix16.c b/source/build/src/fix16.cpp similarity index 90% rename from source/build/src/fix16.c rename to source/build/src/fix16.cpp index f0bef3c70..5774c5f5f 100644 --- a/source/build/src/fix16.c +++ b/source/build/src/fix16.cpp @@ -15,7 +15,7 @@ fix16_t fix16_add(fix16_t a, fix16_t b) // Overflow can only happen if sign of a == sign of b, and then // it causes sign of sum != sign of a. if (!((_a ^ _b) & 0x80000000) && ((_a ^ sum) & 0x80000000)) - return fix16_overflow; + return FIX16_OVERFLOW; return sum; } @@ -28,7 +28,7 @@ fix16_t fix16_sub(fix16_t a, fix16_t b) // Overflow can only happen if sign of a != sign of b, and then // it causes sign of diff != sign of a. if (((_a ^ _b) & 0x80000000) && ((_a ^ diff) & 0x80000000)) - return fix16_overflow; + return FIX16_OVERFLOW; return diff; } @@ -38,8 +38,8 @@ fix16_t fix16_sadd(fix16_t a, fix16_t b) { fix16_t result = fix16_add(a, b); - if (result == fix16_overflow) - return (a >= 0) ? fix16_maximum : fix16_minimum; + if (result == FIX16_OVERFLOW) + return (a >= 0) ? FIX16_MAX : FIX16_MIN; return result; } @@ -48,8 +48,8 @@ fix16_t fix16_ssub(fix16_t a, fix16_t b) { fix16_t result = fix16_sub(a, b); - if (result == fix16_overflow) - return (a >= 0) ? fix16_maximum : fix16_minimum; + if (result == FIX16_OVERFLOW) + return (a >= 0) ? FIX16_MAX : FIX16_MIN; return result; } @@ -76,7 +76,7 @@ fix16_t fix16_mul(fix16_t inArg0, fix16_t inArg1) { #ifndef FIXMATH_NO_OVERFLOW if (~upper) - return fix16_overflow; + return FIX16_OVERFLOW; #endif #ifndef FIXMATH_NO_ROUNDING @@ -88,7 +88,7 @@ fix16_t fix16_mul(fix16_t inArg0, fix16_t inArg1) { #ifndef FIXMATH_NO_OVERFLOW if (upper) - return fix16_overflow; + return FIX16_OVERFLOW; #endif } @@ -108,12 +108,12 @@ fix16_t fix16_smul(fix16_t inArg0, fix16_t inArg1) { fix16_t result = fix16_mul(inArg0, inArg1); - if (result == fix16_overflow) + if (result == FIX16_OVERFLOW) { if ((inArg0 >= 0) == (inArg1 >= 0)) - return fix16_maximum; + return FIX16_MAX; else - return fix16_minimum; + return FIX16_MIN; } return result; @@ -144,7 +144,7 @@ fix16_t fix16_div(fix16_t a, fix16_t b) // computed all the bits in (a<<17)/b. Usually this takes 1-3 iterations. if (b == 0) - return fix16_minimum; + return FIX16_MIN; uint32_t remainder = (a >= 0) ? a : (-a); uint32_t divider = (b >= 0) ? b : (-b); @@ -182,7 +182,7 @@ fix16_t fix16_div(fix16_t a, fix16_t b) #ifndef FIXMATH_NO_OVERFLOW if (div & ~(0xFFFFFFFF >> bit_pos)) - return fix16_overflow; + return FIX16_OVERFLOW; #endif remainder <<= 1; @@ -200,8 +200,8 @@ fix16_t fix16_div(fix16_t a, fix16_t b) if ((a ^ b) & 0x80000000) { #ifndef FIXMATH_NO_OVERFLOW - if (result == fix16_minimum) - return fix16_overflow; + if (result == FIX16_MIN) + return FIX16_OVERFLOW; #endif result = -result; @@ -216,20 +216,18 @@ fix16_t fix16_sdiv(fix16_t inArg0, fix16_t inArg1) { fix16_t result = fix16_div(inArg0, inArg1); - if (result == fix16_overflow) + if (result == FIX16_OVERFLOW) { if ((inArg0 >= 0) == (inArg1 >= 0)) - return fix16_maximum; + return FIX16_MAX; else - return fix16_minimum; + return FIX16_MIN; } return result; } #endif -fix16_t fix16_mod(fix16_t x, fix16_t y) { return x %= y; } - #ifndef FIXMATH_NO_64BIT diff --git a/source/build/src/fix16_str.c b/source/build/src/fix16_str.cpp similarity index 97% rename from source/build/src/fix16_str.c rename to source/build/src/fix16_str.cpp index eff906f63..59cdfdb84 100644 --- a/source/build/src/fix16_str.c +++ b/source/build/src/fix16_str.cpp @@ -79,7 +79,7 @@ fix16_t fix16_from_str(const char *buf) if (count == 0 || count > 5 || intpart > 32768 || (!negative && intpart > 32767)) - return fix16_overflow; + return FIX16_OVERFLOW; fix16_t value = intpart << 16; @@ -104,7 +104,7 @@ fix16_t fix16_from_str(const char *buf) while (*buf != '\0') { if (!isdigit(*buf) && !isspace(*buf)) - return fix16_overflow; + return FIX16_OVERFLOW; buf++; }