#ifndef _DOLPHIN_MTX #define _DOLPHIN_MTX #include #include #ifdef __cplusplus extern "C" { #endif #if !defined(MTX_USE_PS) && !defined(MTX_USE_C) && !defined(GEKKO) #define MTX_USE_C #endif #if !defined(MTX_USE_PS) && !defined(MTX_USE_C) && defined(GEKKO) #ifndef _DEBUG #define MTX_USE_PS #endif #endif #define MTX_PTR_OFFSET 3 #define MTX44_PTR_OFFSET 4 typedef struct { u32 numMtx; MtxPtr stackBase; MtxPtr stackPtr; } MTXStack, MtxStack, *MtxStackPtr; #define MTXDegToRad(a) ((a)*0.01745329252f) #define MTXRadToDeg(a) ((a)*57.29577951f) #define MTXRowCol(m, r, c) ((m)[(r)][(c)]) void C_MTXIdentity(Mtx m); void C_MTXCopy(const Mtx src, Mtx dst); void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab); void C_MTXConcatArray(const Mtx a, const Mtx* srcBase, Mtx* dstBase, u32 count); void C_MTXTranspose(const Mtx src, Mtx xPose); u32 C_MTXInverse(const Mtx src, Mtx inv); u32 C_MTXInvXpose(const Mtx src, Mtx invX); #ifdef GEKKO void PSMTXIdentity(Mtx m); void PSMTXCopy(const Mtx src, Mtx dst); void PSMTXConcat(const Mtx a, const Mtx b, Mtx ab); void PSMTXConcatArray(const Mtx a, const Mtx* srcBase, Mtx* dstBase, u32 count); void PSMTXTranspose(const Mtx src, Mtx xPose); u32 PSMTXInverse(const Mtx src, Mtx inv); u32 PSMTXInvXpose(const Mtx src, Mtx invX); #else #define PSMTXIdentity MTXIdentity #define PSMTXCopy MTXCopy #define PSMTXConcat MTXConcat #define PSMTXConcatArray MTXConcatArray #define PSMTXTranspose MTXTranspose #define PSMTXInverse MTXInverse #define PSMTXInvXpose MTXInvXpose #endif #ifdef MTX_USE_PS #define MTXIdentity C_MTXIdentity #define MTXCopy C_MTXCopy #define MTXConcat C_MTXConcat #define MTXConcatArray C_MTXConcatArray #define MTXTranspose C_MTXTranspose #define MTXInverse C_MTXInverse #define MTXInvXpose C_MTXInvXpose #else #define MTXIdentity C_MTXIdentity #define MTXCopy C_MTXCopy #define MTXConcat C_MTXConcat #define MTXConcatArray C_MTXConcatArray #define MTXTranspose C_MTXTranspose #define MTXInverse C_MTXInverse #define MTXInvXpose C_MTXInvXpose #endif void C_MTXMultVec(const Mtx m, const Vec* src, Vec* dst); void C_MTXMultVecArray(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); void C_MTXMultVecSR(const Mtx m, const Vec* src, Vec* dst); void C_MTXMultVecArraySR(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); void C_MTXROMultVecArray(const ROMtx m, const Vec *srcBase, Vec *dstBase, u32 count); #ifdef GEKKO void PSMTXMultVec(const Mtx m, const Vec* src, Vec* dst); void PSMTXMultVecArray(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); void PSMTXMultVecSR(const Mtx m, const Vec* src, Vec* dst); void PSMTXMultVecArraySR(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); void PSMTXMultS16VecArray(const Mtx m, const S16Vec* srcBase, Vec* dstBase, u32 count); void PSMTXROMultVecArray(const ROMtx m, const Vec *srcBase, Vec *dstBase, u32 count); void PSMTXROSkin2VecArray(const ROMtx m0, const ROMtx m1, const f32* wtBase, const Vec* srcBase, Vec* dstBase, u32 count); void PSMTXROMultS16VecArray(const ROMtx m, const S16Vec* srcBase, Vec* dstBase, u32 count); #else #define PSMTXMultVec MTXMultVec #define PSMTXMultVecArray MTXMultVecArray #define PSMTXMultVecSR MTXMultVecSR #define PSMTXMultVecArraySR MTXMultVecArraySR #define PSMTXMultS16VecArray MTXMultS16VecArray #define PSMTXROMultVecArray MTXROMultVecArray #define PSMTXROSkin2VecArray MTXROSkin2VecArray #define PSMTXROMultS16VecArray MTXROMultS16VecArray #endif #ifdef MTX_USE_PS #define MTXMultVec C_MTXMultVec #define MTXMultVecArray C_MTXMultVecArray #define MTXMultVecSR C_MTXMultVecSR #define MTXMultVecArraySR C_MTXMultVecArraySR #define MTXMultS16VecArray PSMTXMultS16VecArray #define MTXROMultVecArray C_MTXROMultVecArray #define MTXROSkin2VecArray PSMTXROSkin2VecArray #define MTXROMultS16VecArray PSMTXROMultS16VecArray #else // MTX_USE_C #define MTXMultVec C_MTXMultVec #define MTXMultVecArray C_MTXMultVecArray #define MTXMultVecSR C_MTXMultVecSR #define MTXMultVecArraySR C_MTXMultVecArraySR #define MTXROMultVecArray C_MTXROMultVecArray #endif void C_MTXQuat(Mtx m, const Quaternion* q); void C_MTXReflect(Mtx m, const Vec* p, const Vec* n); void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT); void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT); void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS); void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS); void C_MTXRotRad(Mtx m, char axis, f32 rad); void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA); void C_MTXRotAxisRad(Mtx m, const Vec* axis, f32 rad); void C_MTXReorder(const Mtx src, ROMtx dst); #ifdef GEKKO void PSMTXQuat(Mtx m, const Quaternion* q); void PSMTXReflect(Mtx m, const Vec* p, const Vec* n); void PSMTXTrans(Mtx m, f32 xT, f32 yT, f32 zT); void PSMTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT); void PSMTXScale(Mtx m, f32 xS, f32 yS, f32 zS); void PSMTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS); void PSMTXRotRad(Mtx m, char axis, f32 rad); void PSMTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA); void PSMTXRotAxisRad(Mtx m, const Vec* axis, f32 rad); void PSMTXReorder(const Mtx src, ROMtx dest); #else #define PSMTXQuat MTXQuat #define PSMTXReflect MTXReflect #define PSMTXTrans MTXTrans #define PSMTXTransApply MTXTransApply #define PSMTXScale MTXScale #define PSMTXScaleApply MTXScaleApply #define PSMTXRotRad MTXRotRad #define PSMTXRotTrig MTXRotTrig #define PSMTXRotAxisRad MTXRotAxisRad #define PSMTXRotRad MTXRotRad #define PSMTXRotAxisRad MTXRotAxisRad #define PSMTXReorder MTXReorder #endif #ifdef MTX_USE_PS #define MTXQuat C_MTXQuat #define MTXReflect C_MTXReflect #define MTXTrans C_MTXTrans #define MTXTransApply C_MTXTransApply #define MTXScale C_MTXScale #define MTXScaleApply C_MTXScaleApply #define MTXRotRad C_MTXRotRad #define MTXRotTrig C_MTXRotTrig #define MTXRotAxisRad C_MTXRotAxisRad #define MTXRotDeg(m, axis, deg) C_MTXRotRad(m, axis, MTXDegToRad(deg)) #define MTXRotAxisDeg(m, axis, deg) C_MTXRotAxisRad(m, axis, MTXDegToRad(deg)) #define MTXReorder C_MTXReorder #else // MTX_USE_C #define MTXQuat C_MTXQuat #define MTXReflect C_MTXReflect #define MTXTrans C_MTXTrans #define MTXTransApply C_MTXTransApply #define MTXScale C_MTXScale #define MTXScaleApply C_MTXScaleApply #define MTXRotRad C_MTXRotRad #define MTXRotTrig C_MTXRotTrig #define MTXRotAxisRad C_MTXRotAxisRad #define MTXRotDeg(m, axis, deg) C_MTXRotRad(m, axis, MTXDegToRad(deg)) #define MTXRotAxisDeg(m, axis, deg) C_MTXRotAxisRad(m, axis, MTXDegToRad(deg)) #define MTXReorder C_MTXReorder #endif void C_MTXLookAt(Mtx m, const Point3d* camPos, const Vec* camUp, const Point3d* target); #define MTXLookAt C_MTXLookAt void C_MTXFrustum(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f); void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f); void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f); #define MTXFrustum C_MTXFrustum #define MTXPerspective C_MTXPerspective #define MTXOrtho C_MTXOrtho void C_MTXLightFrustum(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 scaleS, f32 scaleT, f32 transS, f32 transT); void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, f32 scaleS, f32 scaleT, f32 transS, f32 transT); void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 scaleS, f32 scaleT, f32 transS, f32 transT); #define MTXLightFrustum C_MTXLightFrustum #define MTXLightPerspective C_MTXLightPerspective #define MTXLightOrtho C_MTXLightOrtho void C_VECAdd(const Vec* a, const Vec* b, Vec* ab); void C_VECSubtract(const Vec* a, const Vec* b, Vec* a_b); void C_VECScale(const Vec* src, Vec* dst, f32 scale); void C_VECNormalize(const Vec* src, Vec* unit); f32 C_VECSquareMag(const Vec* v); f32 C_VECMag(const Vec* v); f32 C_VECDotProduct(const Vec* a, const Vec* b); void C_VECCrossProduct(const Vec* a, const Vec* b, Vec* axb); f32 C_VECSquareDistance(const Vec* a, const Vec* b); f32 C_VECDistance(const Vec* a, const Vec* b); void C_VECReflect(const Vec* src, const Vec* normal, Vec* dst); void C_VECHalfAngle(const Vec* a, const Vec* b, Vec* half); void PSVECNormalize(const Vec* src, Vec* unit); f32 PSVECSquareMag(const Vec* v); f32 PSVECMag(const Vec* v); f32 PSVECSquareDistance(const Vec* a, const Vec* b); f32 PSVECDistance(const Vec* a, const Vec* b); #ifdef GEKKO void PSVECAdd(const Vec* a, const Vec* b, Vec* ab); void PSVECSubtract(const Vec* a, const Vec* b, Vec* a_b); void PSVECScale(const Vec* src, Vec* dst, f32 scale); void PSVECNormalize(const Vec* src, Vec* unit); f32 PSVECSquareMag(const Vec* v); f32 PSVECMag(const Vec* v); f32 PSVECDotProduct(const Vec* a, const Vec* b); void PSVECCrossProduct(const Vec* a, const Vec* b, Vec* axb); f32 PSVECSquareDistance(const Vec* a, const Vec* b); f32 PSVECDistance(const Vec* a, const Vec* b); #else #define PSVECAdd VECAdd #define PSVECSubtract VECSubtract #define PSVECScale VECScale #define PSVECDotProduct VECDotProduct #define PSVECCrossProduct VECCrossProduct #endif #if defined(MTX_USE_PS) #define VECAdd C_VECAdd #define VECSubtract C_VECSubtract #define VECScale C_VECScale #define VECNormalize PSVECNormalize #define VECSquareMag PSVECSquareMag #define VECMag PSVECMag #define VECDotProduct C_VECDotProduct #define VECCrossProduct C_VECCrossProduct #define VECSquareDistance PSVECSquareDistance #define VECDistance PSVECDistance #else // MTX_USE_C #define VECAdd C_VECAdd #define VECSubtract C_VECSubtract #define VECScale C_VECScale #define VECNormalize C_VECNormalize #define VECSquareMag C_VECSquareMag #define VECMag C_VECMag #define VECDotProduct C_VECDotProduct #define VECCrossProduct C_VECCrossProduct #define VECSquareDistance C_VECSquareDistance #define VECDistance C_VECDistance #endif #define VECReflect C_VECReflect #define VECHalfAngle C_VECHalfAngle void C_QUATAdd(const Quaternion* p, const Quaternion* q, Quaternion* r); void C_QUATSubtract(const Quaternion* p, const Quaternion* q, Quaternion* r); void C_QUATMultiply(const Quaternion* p, const Quaternion* q, Quaternion* pq); void C_QUATDivide(const Quaternion* p, const Quaternion* q, Quaternion* r); void C_QUATScale(const Quaternion* q, Quaternion* r, f32 scale); f32 C_QUATDotProduct(const Quaternion* p, const Quaternion* q); void C_QUATNormalize(const Quaternion* src, Quaternion* unit); void C_QUATInverse(const Quaternion* src, Quaternion* inv); void C_QUATExp(const Quaternion* q, Quaternion* r); void C_QUATLogN(const Quaternion* q, Quaternion* r); void C_QUATMakeClosest(const Quaternion* q, const Quaternion* qto, Quaternion* r); void C_QUATRotAxisRad(Quaternion* r, const Vec* axis, f32 rad); void C_QUATMtx(Quaternion* r, const Mtx m); void C_QUATLerp(const Quaternion* p, const Quaternion* q, Quaternion* r, f32 t); void C_QUATSlerp(const Quaternion* p, const Quaternion* q, Quaternion* r, f32 t); void C_QUATSquad(const Quaternion* p, const Quaternion* a, const Quaternion* b, const Quaternion* q, Quaternion* r, f32 t); void C_QUATCompA(const Quaternion* qprev, const Quaternion* q, const Quaternion* qnext, Quaternion* a); #ifdef GEKKO void PSQUATAdd(const Quaternion* p, const Quaternion* q, Quaternion* r); void PSQUATSubtract(const Quaternion* p, const Quaternion* q, Quaternion* r); void PSQUATMultiply(const Quaternion* p, const Quaternion* q, Quaternion* pq); void PSQUATDivide(const Quaternion* p, const Quaternion* q, Quaternion* r); void PSQUATScale(const Quaternion* q, Quaternion* r, f32 scale); f32 PSQUATDotProduct(const Quaternion* p, const Quaternion* q); void PSQUATNormalize(const Quaternion* src, Quaternion* unit); void PSQUATInverse(const Quaternion* src, Quaternion* inv); #else #define PSQUATAdd QUATAdd #define PSQUATSubtract QUATSubtract #define PSQUATMultiply QUATMultiply #define PSQUATDivide QUATDivide #define PSQUATScale QUATScale #define PSQUATDotProduct QUATDotProduct #define PSQUATNormalize QUATNormalize #define PSQUATInverse QUATInverse #endif #ifdef MTX_USE_PS #define QUATAdd C_QUATAdd #define QUATSubtract C_QUATSubtract #define QUATMultiply C_QUATMultiply #define QUATDivide C_QUATDivide #define QUATScale C_QUATScale #define QUATDotProduct C_QUATDotProduct #define QUATNormalize C_QUATNormalize #define QUATInverse C_QUATInverse #else // MTX_USE_C #define QUATAdd C_QUATAdd #define QUATSubtract C_QUATSubtract #define QUATMultiply C_QUATMultiply #define QUATDivide C_QUATDivide #define QUATScale C_QUATScale #define QUATDotProduct C_QUATDotProduct #define QUATNormalize C_QUATNormalize #define QUATInverse C_QUATInverse #endif #define QUATExp C_QUATExp #define QUATLogN C_QUATLogN #define QUATMakeClosest C_QUATMakeClosest #define QUATRotAxisRad C_QUATRotAxisRad #define QUATMtx C_QUATMtx #define QUATLerp C_QUATLerp #define QUATSlerp C_QUATSlerp #define QUATSquad C_QUATSquad #define QUATCompA C_QUATCompA void MTXInitStack(MtxStack* sPtr, u32 numMtx); MtxPtr MTXPush(MtxStack* sPtr, const Mtx m); MtxPtr MTXPushFwd(MtxStack* sPtr, const Mtx m); MtxPtr MTXPushInv(MtxStack* sPtr, const Mtx m); MtxPtr MTXPushInvXpose(MtxStack* sPtr, const Mtx m); MtxPtr MTXPop(MtxStack* sPtr); MtxPtr MTXGetStackPtr(const MtxStack* sPtr); #define MTXAllocStack(sPtr, numMtx) \ (((MtxStackPtr)(sPtr))->stackBase = (MtxPtr)OSAlloc(((numMtx) * sizeof(Mtx)))) #define MTXFreeStack(sPtr) (OSFree((void*)(((MtxStackPtr)(sPtr))->stackBase))) #ifdef __cplusplus } #endif #endif // _DOLPHIN_MTX