From 70540815a5f6190b8bc77463a0ca29339075f250 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Mon, 17 Jul 2023 11:36:19 -0400 Subject: [PATCH] Match & link m_skin_matrix.c --- config/rel_slices.yml | 6 +- include/m_skin_matrix.h | 12 +- include/types.h | 7 + rel/m_actor.c | 2 + rel/m_skin_matrix.c | 456 ++++++++++++++++++++++------------------ 5 files changed, 268 insertions(+), 215 deletions(-) diff --git a/config/rel_slices.yml b/config/rel_slices.yml index ab0c3498..ef4b798d 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -126,9 +126,9 @@ m_room_type/mRmTp_FtrItemNo2FtrIdx.c: # .rodata: [0x806433B0, 0x806433D8] # .data: [0x8065E378, 0x8065E438] # .bss: [0x8129F410, 0x8129F420] -#m_skin_matrix.c: -# .text: [0x803f1528, 0x803f1bb4] -# .rodata: [0x80643310, 0x80643318] +m_skin_matrix.c: + .text: [0x803f1528, 0x803f1bb4] + .rodata: [0x80643310, 0x80643318] m_view.c: .text: [0x803F3E58, 0x803F4E08] .rodata: [0x806433D8, 0x80643408] diff --git a/include/m_skin_matrix.h b/include/m_skin_matrix.h index 9f4e91f4..bab6cc0e 100644 --- a/include/m_skin_matrix.h +++ b/include/m_skin_matrix.h @@ -1,6 +1,7 @@ #ifndef SKIN_MATRIX_H #define SKIN_MATRIX_H +#include "types.h" #include "libultra/ultratypes.h" #include "libu64/u64types.h" @@ -8,12 +9,11 @@ extern "C"{ #endif -void Skin_Matrix_PrjMulVector(MtxF*, xyz_t*, xyz_t*, f32*); -void Skin_Matrix_MulMatrix(MtxF*, MtxF*, MtxF*); -void Skin_Matrix_SetScale(MtxF* , f32 , f32, f32); -void Skin_Matrix_SetTranslate(MtxF*, f32, f32, f32); -void Skin_Matrix_SetRotateXyz_s(MtxF*, s16, s16, s16); - +extern void Skin_Matrix_PrjMulVector(MtxF* mf, xyz_t* src, xyz_t* dst, f32* w); +extern void Skin_Matrix_MulMatrix(MtxF* mfA, MtxF* mfB, MtxF* dest); +extern void Skin_Matrix_SetScale(MtxF* mf, f32 x, f32 y, f32 z); +extern void Skin_Matrix_SetRotateXyz_s(MtxF* mf, s16 x, s16 y, s16 z); +extern void Skin_Matrix_SetTranslate(MtxF* mf, f32 x, f32 y, f32 z); #ifdef __cplusplus } diff --git a/include/types.h b/include/types.h index a2a0bbec..6461fe43 100644 --- a/include/types.h +++ b/include/types.h @@ -66,4 +66,11 @@ typedef u32 unknown; #define GPACK_RGB5A3(r, g, b, a) ARGB8_to_RGB5A3((((a) & 0xFF) << 24) | (((r) & 0xFF) << 16) | (((g) & 0xFF) << 8) | ((b) & 0xFF)) +#pragma section RX "forcestrip" +#ifndef __INTELLISENSE__ + #define FORCESTRIP __declspec(section "forcestrip") +#else + #define FORCESTRIP +#endif + #endif \ No newline at end of file diff --git a/rel/m_actor.c b/rel/m_actor.c index f30238ad..a2f64a9a 100644 --- a/rel/m_actor.c +++ b/rel/m_actor.c @@ -28,11 +28,13 @@ void _restfpr_29(); static char lbl_8064d600[] = ""; #endif +#ifdef MUST_MATCH /* @unused | necessary for proper float ordering*/ extern void __declspec(section "forcestrip") projection_pos_set(GAME_PLAY* play, xyz_t* pos, xyz_t* proj_pos, f32* proj_w) { Skin_Matrix_PrjMulVector(&play->projection_matrix, pos, proj_pos, proj_w); *proj_w = *proj_w < 1.0f ? 1.0f : 1.0f / *proj_w; } +#endif extern void Actor_world_to_eye(ACTOR* actor, f32 eye_height) { /* Update position */ diff --git a/rel/m_skin_matrix.c b/rel/m_skin_matrix.c index dab1cdf6..d8706bcb 100644 --- a/rel/m_skin_matrix.c +++ b/rel/m_skin_matrix.c @@ -1,235 +1,279 @@ #include "m_skin_matrix.h" + #include "m_lib.h" -#include "orderfloats/80643310_80643318.inc" +// #include "orderfloats/80643310_80643318.inc" -void Skin_Matrix_PrjMulVector(MtxF* mf, xyz_t* src, xyz_t* xyzDest, f32* wDest) { - xyzDest->x = mf->xw + ((src->x * mf->xx) + (src->y * mf->xy) + (src->z * mf->xz)); - xyzDest->y = mf->yw + ((src->x * mf->yx) + (src->y * mf->yy) + (src->z * mf->yz)); - xyzDest->z = mf->zw + ((src->x * mf->zx) + (src->y * mf->zy) + (src->z * mf->zz)); - *wDest = mf->ww + ((src->x * mf->wx) + (src->y * mf->wy) + (src->z * mf->wz)); +extern void Skin_Matrix_PrjMulVector(MtxF* mf, xyz_t* src, xyz_t* dst, f32* w) { + dst->x = mf->xw + ((src->x * mf->xx) + (src->y * mf->xy) + (src->z * mf->xz)); + dst->y = mf->yw + ((src->x * mf->yx) + (src->y * mf->yy) + (src->z * mf->yz)); + dst->z = mf->zw + ((src->x * mf->zx) + (src->y * mf->zy) + (src->z * mf->zz)); + *w = mf->ww + ((src->x * mf->wx) + (src->y * mf->wy) + (src->z * mf->wz)); } -void Skin_Matrix_MulMatrix(MtxF* mfA, MtxF* mfB, MtxF* dest) { - f32 cx; - f32 cy; - f32 cz; - f32 cw; - //---ROW1--- - f32 rx = mfA->xx; - f32 ry = mfA->xy; - f32 rz = mfA->xz; - f32 rw = mfA->xw; - //-------- +/* @unused void Skin_matrix_MulVector(MtxF* mf, xyz_t* src, xyz_t* dst) */ - cx = mfB->xx; - cy = mfB->yx; - cz = mfB->zx; - cw = mfB->wx; - dest->xx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); +extern void Skin_Matrix_MulMatrix(MtxF* mfA, MtxF* mfB, MtxF* dest) { + f32 cx; + f32 cy; + f32 cz; + f32 cw; + //---ROW1--- + f32 rx = mfA->xx; + f32 ry = mfA->xy; + f32 rz = mfA->xz; + f32 rw = mfA->xw; + //-------- - cx = mfB->xy; - cy = mfB->yy; - cz = mfB->zy; - cw = mfB->wy; - dest->xy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xx; + cy = mfB->yx; + cz = mfB->zx; + cw = mfB->wx; + dest->xx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xz; - cy = mfB->yz; - cz = mfB->zz; - cw = mfB->wz; - dest->xz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xy; + cy = mfB->yy; + cz = mfB->zy; + cw = mfB->wy; + dest->xy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xw; - cy = mfB->yw; - cz = mfB->zw; - cw = mfB->ww; - dest->xw = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xz; + cy = mfB->yz; + cz = mfB->zz; + cw = mfB->wz; + dest->xz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - //---ROW2--- - rx = mfA->yx; - ry = mfA->yy; - rz = mfA->yz; - rw = mfA->yw; - //-------- - cx = mfB->xx; - cy = mfB->yx; - cz = mfB->zx; - cw = mfB->wx; - dest->yx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xw; + cy = mfB->yw; + cz = mfB->zw; + cw = mfB->ww; + dest->xw = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xy; - cy = mfB->yy; - cz = mfB->zy; - cw = mfB->wy; - dest->yy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + //---ROW2--- + rx = mfA->yx; + ry = mfA->yy; + rz = mfA->yz; + rw = mfA->yw; + //-------- + cx = mfB->xx; + cy = mfB->yx; + cz = mfB->zx; + cw = mfB->wx; + dest->yx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xz; - cy = mfB->yz; - cz = mfB->zz; - cw = mfB->wz; - dest->yz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xy; + cy = mfB->yy; + cz = mfB->zy; + cw = mfB->wy; + dest->yy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xw; - cy = mfB->yw; - cz = mfB->zw; - cw = mfB->ww; - dest->yw = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xz; + cy = mfB->yz; + cz = mfB->zz; + cw = mfB->wz; + dest->yz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - //---ROW3--- - rx = mfA->zx; - ry = mfA->zy; - rz = mfA->zz; - rw = mfA->zw; - //-------- - cx = mfB->xx; - cy = mfB->yx; - cz = mfB->zx; - cw = mfB->wx; - dest->zx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xw; + cy = mfB->yw; + cz = mfB->zw; + cw = mfB->ww; + dest->yw = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xy; - cy = mfB->yy; - cz = mfB->zy; - cw = mfB->wy; - dest->zy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + //---ROW3--- + rx = mfA->zx; + ry = mfA->zy; + rz = mfA->zz; + rw = mfA->zw; + //-------- + cx = mfB->xx; + cy = mfB->yx; + cz = mfB->zx; + cw = mfB->wx; + dest->zx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xz; - cy = mfB->yz; - cz = mfB->zz; - cw = mfB->wz; - dest->zz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xy; + cy = mfB->yy; + cz = mfB->zy; + cw = mfB->wy; + dest->zy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xw; - cy = mfB->yw; - cz = mfB->zw; - cw = mfB->ww; - dest->zw = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xz; + cy = mfB->yz; + cz = mfB->zz; + cw = mfB->wz; + dest->zz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - //---ROW4--- - rx = mfA->wx; - ry = mfA->wy; - rz = mfA->wz; - rw = mfA->ww; - //-------- - cx = mfB->xx; - cy = mfB->yx; - cz = mfB->zx; - cw = mfB->wx; - dest->wx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xw; + cy = mfB->yw; + cz = mfB->zw; + cw = mfB->ww; + dest->zw = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xy; - cy = mfB->yy; - cz = mfB->zy; - cw = mfB->wy; - dest->wy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + //---ROW4--- + rx = mfA->wx; + ry = mfA->wy; + rz = mfA->wz; + rw = mfA->ww; + //-------- + cx = mfB->xx; + cy = mfB->yx; + cz = mfB->zx; + cw = mfB->wx; + dest->wx = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xz; - cy = mfB->yz; - cz = mfB->zz; - cw = mfB->wz; - dest->wz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xy; + cy = mfB->yy; + cz = mfB->zy; + cw = mfB->wy; + dest->wy = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); - cx = mfB->xw; - cy = mfB->yw; - cz = mfB->zw; - cw = mfB->ww; - dest->ww = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + cx = mfB->xz; + cy = mfB->yz; + cz = mfB->zz; + cw = mfB->wz; + dest->wz = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); + + cx = mfB->xw; + cy = mfB->yw; + cz = mfB->zw; + cw = mfB->ww; + dest->ww = (rx * cx) + (ry * cy) + (rz * cz) + (rw * cw); } +/* @unused Skin_Matrix_getUnitMatrixPointer(MtxF* mf_p) */ -void Skin_Matrix_SetScale(MtxF* mf, f32 x, f32 y, f32 z) { - mf->yx = 0.0f; - mf->zx = 0.0f; - mf->wx = 0.0f; - mf->xy = 0.0f; - mf->zy = 0.0f; - mf->wy = 0.0f; - mf->xz = 0.0f; +/* @unused Skin_Matrix_SetUnitMatrix(MtxF* mf_p) */ + +#ifdef MUST_MATCH +/* @unused | necessary for float ordering, from DnM */ +extern void FORCESTRIP Skin_Matrix_SetUnitMatrix(MtxF* mf_p) { + mf_p->xx = 1.0f; + mf_p->yx = 0.0f; + mf_p->zx = 0.0f; + mf_p->wx = 0.0f; + + mf_p->xy = 0.0f; + mf_p->yy = 1.0f; + mf_p->zy = 0.0f; + mf_p->wy = 0.0f; + + mf_p->xz = 0.0f; + mf_p->yz = 0.0f; + mf_p->zz = 1.0f; + mf_p->wz = 0.0f; + + mf_p->xw = 0.0f; + mf_p->yw = 0.0f; + mf_p->zw = 0.0f; + mf_p->ww = 1.0f; +} +#endif + +/* @unused Skin_Matrix_Copy */ + +/* @unused Skin_Matrix_InverseMatrix */ + +extern void Skin_Matrix_SetScale(MtxF* mf, f32 x, f32 y, f32 z) { + mf->yx = 0.0f; + mf->zx = 0.0f; + mf->wx = 0.0f; + mf->xy = 0.0f; + mf->zy = 0.0f; + mf->wy = 0.0f; + mf->xz = 0.0f; + mf->yz = 0.0f; + mf->wz = 0.0f; + mf->xw = 0.0f; + mf->yw = 0.0f; + mf->zw = 0.0f; + mf->ww = 1.0f; + mf->xx = x; + mf->yy = y; + mf->zz = z; +} + +extern void Skin_Matrix_SetRotateXyz_s(MtxF* mf, s16 x, s16 y, s16 z) { + f32 cos; + f32 sinZ = sin_s(z); + f32 cosZ = cos_s(z); + f32 xy; + f32 sin; + f32 xz; + f32 yy; + f32 yz; + f32 zz; + + mf->yy = cosZ; + mf->xy = -sinZ; + + mf->wz = 0.0f; + mf->wy = 0.0f; + mf->wx = 0.0f; + + mf->zw = 0.0f; + mf->yw = 0.0f; + mf->xw = 0.0f; + mf->ww = 1.0f; + + if (y != 0) { + sin = sin_s(y); + cos = cos_s(y); + + mf->xx = cosZ * cos; + mf->xz = cosZ * sin; + + mf->yx = sinZ * cos; + mf->yz = sinZ * sin; + mf->zx = -sin; + mf->zz = cos; + + } else { + mf->xx = cosZ; + mf->yx = sinZ; mf->yz = 0.0f; - mf->wz = 0.0f; - mf->xw = 0.0f; - mf->yw = 0.0f; - mf->zw = 0.0f; - mf->ww = 1.0f; - mf->xx = x; - mf->yy = y; - mf->zz = z; -} - -void Skin_Matrix_SetRotateXyz_s(MtxF* mf, s16 x, s16 y, s16 z) { - f32 cos; - f32 sinZ = sin_s(z); - f32 cosZ = cos_s(z); - f32 xy; - f32 sin; - f32 xz; - f32 yy; - f32 yz; - f32 zz; - - mf->yy = cosZ; - mf->xy = -sinZ; - mf->wx = mf->wy = mf->wz = 0; - mf->xw = mf->yw = mf->zw = 0; - mf->ww = 1; - - if (y != 0) { - sin = sin_s(y); - cos = cos_s(y); - - mf->xx = cosZ * cos; - mf->xz = cosZ * sin; - - mf->yx = sinZ * cos; - mf->yz = sinZ * sin; - mf->zx = -sin; - mf->zz = cos; - - } else { - mf->xx = cosZ; - mf->yx = sinZ; - mf->zx = mf->xz = mf->yz = 0; - mf->zz = 1; - } - - if (x != 0) { - sin = sin_s(x); - cos = cos_s(x); - - xy = mf->xy; - xz = mf->xz; - mf->xy = (xy * cos) + (xz * sin); - mf->xz = - (xy * sin) + (xz * cos) ; - - yy = mf->yy; - yz = mf->yz; - mf->yy = (yy * cos) + (yz * sin); - mf->yz = - (yy * sin) + (yz * cos) ; - - zz = mf->zz; - mf->zy = zz * sin; - mf->zz = zz * cos; - } else { - mf->zy = 0; - } -} - -void Skin_Matrix_SetTranslate(MtxF* mf, f32 x, f32 y, f32 z) { - mf->yx = 0.0f; - mf->zx = 0.0f; - mf->wx = 0.0f; - mf->xy = 0.0f; - mf->zy = 0.0f; - mf->wy = 0.0f; mf->xz = 0.0f; - mf->yz = 0.0f; - mf->wz = 0.0f; - mf->xx = 1.0f; - mf->yy = 1.0f; + mf->zx = 0.0f; mf->zz = 1.0f; - mf->ww = 1.0f; - mf->xw = x; - mf->yw = y; - mf->zw = z; + } + + if (x != 0) { + sin = sin_s(x); + cos = cos_s(x); + + xy = mf->xy; + xz = mf->xz; + mf->xy = (xy * cos) + (xz * sin); + mf->xz = -(xy * sin) + (xz * cos); + + yy = mf->yy; + yz = mf->yz; + mf->yy = (yy * cos) + (yz * sin); + mf->yz = -(yy * sin) + (yz * cos); + + zz = mf->zz; + + mf->zy = zz * sin; + mf->zz = zz * cos; + } else { + mf->zy = 0.0f; + } +} + +extern void Skin_Matrix_SetTranslate(MtxF* mf, f32 x, f32 y, f32 z) { + mf->yx = 0.0f; + mf->zx = 0.0f; + mf->wx = 0.0f; + mf->xy = 0.0f; + mf->zy = 0.0f; + mf->wy = 0.0f; + mf->xz = 0.0f; + mf->yz = 0.0f; + mf->wz = 0.0f; + mf->xx = 1.0f; + mf->yy = 1.0f; + mf->zz = 1.0f; + mf->ww = 1.0f; + mf->xw = x; + mf->yw = y; + mf->zw = z; } \ No newline at end of file