diff --git a/lib/NitroSDK/asm/fx_fx.s b/lib/NitroSDK/asm/fx_fx.s deleted file mode 100644 index 4e31020a..00000000 --- a/lib/NitroSDK/asm/fx_fx.s +++ /dev/null @@ -1,9 +0,0 @@ - .include "asm/macros.inc" - - .text - - arm_func_start FX_Init -FX_Init: ; 0x02076070 - bx lr - arm_func_end FX_Init - diff --git a/lib/NitroSDK/src/fx/fx.c b/lib/NitroSDK/src/fx/fx.c new file mode 100644 index 00000000..4a049c19 --- /dev/null +++ b/lib/NitroSDK/src/fx/fx.c @@ -0,0 +1,17 @@ +#include + +void FX_Init(void) +{ + SDK_ASSERT(2 == sizeof(fx16)); + SDK_ASSERT(4 == sizeof(fx32)); + SDK_ASSERT(8 == sizeof(fx64)); + SDK_ASSERT(8 == sizeof(fx64c)); + SDK_ASSERT(6 == sizeof(VecFx16)); + SDK_ASSERT(12 == sizeof(VecFx32)); + + SDK_ASSERT(64 == sizeof(MtxFx44)); + SDK_ASSERT(48 == sizeof(MtxFx43)); + SDK_ASSERT(36 == sizeof(MtxFx33)); + SDK_ASSERT(16 == sizeof(MtxFx22)); + +} diff --git a/lib/NitroSDK/src/fx/fx_vec.c b/lib/NitroSDK/src/fx/fx_vec.c new file mode 100644 index 00000000..48288dd3 --- /dev/null +++ b/lib/NitroSDK/src/fx/fx_vec.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include + +#include + +fx32 VEC_DotProduct (const VecFx32 *a, const VecFx32 *b) +{ + SDK_NULL_ASSERT(a); + SDK_NULL_ASSERT(b); + return (fx32)(((fx64)a->x * b->x + + (fx64)a->y * b->y + (fx64)a->z * b->z + (1 << (FX64_SHIFT - 1))) >> FX64_SHIFT); +} + +void VEC_CrossProduct (const VecFx32 *a, const VecFx32 *b, VecFx32 *axb) +{ + fx32 x, y, z; + + SDK_NULL_ASSERT(a); + SDK_NULL_ASSERT(b); + SDK_NULL_ASSERT(axb); + + x = (fx32)(((fx64)a->y * b->z - (fx64)a->z * b->y + (1 << (FX64_SHIFT - 1))) >> FX64_SHIFT); + y = (fx32)(((fx64)a->z * b->x - (fx64)a->x * b->z + (1 << (FX64_SHIFT - 1))) >> FX64_SHIFT); + z = (fx32)(((fx64)a->x * b->y - (fx64)a->y * b->x + (1 << (FX64_SHIFT - 1))) >> FX32_SHIFT); + + axb->x = x; + axb->y = y; + axb->z = z; +} + +void VEC_Normalize (const VecFx32 *pSrc, VecFx32 *pDst) +{ + fx64 t; + s32 sqrt; + + SDK_NULL_ASSERT(pSrc); + SDK_NULL_ASSERT(pDst); + SDK_ASSERT(!CP_IsDivBusy() && !CP_IsSqrtBusy()); + + t = (fx64)pSrc->x * pSrc->x; + t += (fx64)pSrc->y * pSrc->y; + t += (fx64)pSrc->z * pSrc->z; + + SDK_ASSERTMSG(t > 0, "*pSrc is (0, 0, 0)"); + SDK_WARNING(1LL << (FX32_SHIFT + FX32_SHIFT + FX64C_SHIFT) >= (u64)t, "*pSrc is too large!"); + + CP_SetDiv64_64(1LL << (FX32_SHIFT + FX32_SHIFT + FX64C_SHIFT), (u64)t); + CP_SetSqrt64((u64)(t << 2)); + + sqrt = (s32)CP_GetSqrtResult32(); + + t = CP_GetDivResult64(); + t = t * sqrt; + + pDst->x = (fx32)((t * pSrc->x + (1LL << (32 + FX32_SHIFT))) >> (32 + FX32_SHIFT + 1)); + pDst->y = (fx32)((t * pSrc->y + (1LL << (32 + FX32_SHIFT))) >> (32 + FX32_SHIFT + 1)); + pDst->z = (fx32)((t * pSrc->z + (1LL << (32 + FX32_SHIFT))) >> (32 + FX32_SHIFT + 1)); +} + +fx32 VEC_Distance (const VecFx32 *v1, const VecFx32 *v2) +{ + fx64 tmp; + fx32 diff; + + SDK_NULL_ASSERT(v1); + SDK_NULL_ASSERT(v2); + + diff = v1->x - v2->x; + tmp = (fx64)diff * diff; + + diff = v1->y - v2->y; + tmp += (fx64)diff * diff; + + diff = v1->z - v2->z; + tmp += (fx64)diff * diff; + + tmp <<= 2; + CP_SetSqrt64((u64)tmp); + + return ((fx32)CP_GetSqrtResult32() + 1) >> 1; +} + +#include diff --git a/lib/include/nitro/fx/fx.h b/lib/include/nitro/fx/fx.h index 6a0c0ce4..5fe543f2 100644 --- a/lib/include/nitro/fx/fx.h +++ b/lib/include/nitro/fx/fx.h @@ -183,8 +183,9 @@ typedef struct { } MtxFx22; #endif +void FX_Init(void); + // #if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) -// void FX_Init(void); // // SDK_DECL_INLINE s32 FX_Whole(fx32 v); // SDK_DECL_INLINE fx32 FX_Floor(fx32 v); diff --git a/lib/include/nitro/fx/fx_vec.h b/lib/include/nitro/fx/fx_vec.h new file mode 100644 index 00000000..8b81d3e4 --- /dev/null +++ b/lib/include/nitro/fx/fx_vec.h @@ -0,0 +1,50 @@ +#ifndef NITRO_FX_VEC_H_ +#define NITRO_FX_VEC_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void VEC_Add(const VecFx32 * a, const VecFx32 * b, VecFx32 * ab); +void VEC_Subtract(const VecFx32 * a, const VecFx32 * b, VecFx32 * ab); +fx32 VEC_DotProduct(const VecFx32 * a, const VecFx32 * b); +void VEC_CrossProduct(const VecFx32 * a, const VecFx32 * b, VecFx32 * axb); +fx32 VEC_Mag(const VecFx32 * v); +fx32 VEC_Distance(const VecFx32 * v1, const VecFx32 * v2); +void VEC_Normalize(const VecFx32 * pSrc, VecFx32 * pDst); +void VEC_MultAdd(fx32 a, const VecFx32 * v1, const VecFx32 * v2, VecFx32 * pDest); +void VEC_MultSubtract(fx32 a, const VecFx32 * v1, const VecFx32 * v2, VecFx32 * pDest); + +void VEC_Fx16Add(const VecFx16 * a, const VecFx16 * b, VecFx16 * ab); +void VEC_Fx16Subtract(const VecFx16 * a, const VecFx16 * b, VecFx16 * ab); +fx32 VEC_Fx16DotProduct(const VecFx16 * a, const VecFx16 * b); +void VEC_Fx16CrossProduct(const VecFx16 * a, const VecFx16 * b, VecFx16 * axb); +fx32 VEC_Fx16Mag(const VecFx16 * v); +fx32 VEC_Fx16Distance(const VecFx16 * v1, const VecFx16 * v2); +void VEC_Fx16Normalize(const VecFx16 * pSrc, VecFx16 * pDst); + +SDK_INLINE void VEC_Set (VecFx32 * a, fx32 x, fx32 y, fx32 z) +{ + SDK_NULL_ASSERT(a); + + a->x = x; + a->y = y; + a->z = z; +} + +SDK_INLINE void VEC_Fx16Set (VecFx16 * a, fx16 x, fx16 y, fx16 z) +{ + SDK_NULL_ASSERT(a); + + a->x = x; + a->y = y; + a->z = z; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/main.lsf b/main.lsf index 185f0cec..83177414 100644 --- a/main.lsf +++ b/main.lsf @@ -226,9 +226,9 @@ Static main ### NitroSDK ### Object lib/NitroSDK/asm/mtx.o Object lib/NitroSDK/src/fx/fx_cp.o - Object lib/NitroSDK/asm/fx_vec.o + Object lib/NitroSDK/src/fx/fx_vec.o Object lib/NitroSDK/src/fx/fx_atanidx.o - Object lib/NitroSDK/asm/fx_fx.o + Object lib/NitroSDK/src/fx/fx.o Object lib/NitroSDK/asm/gx.o Object lib/NitroSDK/asm/gxstate.o Object lib/NitroSDK/asm/gx_vramcnt.o