Merge pull request #86 from Cuyler36/m_skin_matrix

Match & link m_skin_matrix.c
This commit is contained in:
Cuyler36
2023-07-17 11:36:52 -04:00
committed by GitHub
5 changed files with 268 additions and 215 deletions
+3 -3
View File
@@ -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]
+6 -6
View File
@@ -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
}
+7
View File
@@ -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
+2
View File
@@ -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 */
+250 -206
View File
@@ -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;
}