More MTX functions and fix gxsetarrays
This commit is contained in:
parent
4713782189
commit
b942deb12b
4 changed files with 75 additions and 21 deletions
|
|
@ -1002,7 +1002,7 @@ void fn_1_37A4(ModelData *arg0, Mtx arg1)
|
|||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_RGBA6, 0);
|
||||
GXSETARRAY(GX_VA_POS, lbl_1_bss_5AC.unk14, 900 * sizeof(Vec), 0xC);
|
||||
GXSETARRAY(GX_VA_POS, lbl_1_bss_5AC.unk14, 900 * sizeof(Vec), sizeof(Vec));
|
||||
GXSetCullMode(GX_CULL_BACK);
|
||||
GXCallDisplayList(lbl_1_bss_5AC.unk24, lbl_1_bss_5AC.unk28);
|
||||
GXSetNumIndStages(0);
|
||||
|
|
|
|||
|
|
@ -1298,3 +1298,57 @@ void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, float scaleS, float scal
|
|||
m[2][2] = 0.0f;
|
||||
m[2][3] = 1.0f;
|
||||
}
|
||||
|
||||
#ifdef TARGET_PC
|
||||
void C_MTXReorder(const Mtx src, ROMtx dest)
|
||||
{
|
||||
u32 i, j;
|
||||
for (i = 0; i < 3; j++) {
|
||||
for (int j = 0; j < 4; j++) {
|
||||
dest[j][i] = src[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void C_MTXMultVec(const Mtx m, const Vec *in, Vec *out)
|
||||
{
|
||||
out->x = m[0][0] * in->x + m[0][1] * in->y + m[0][2] * in->z + m[0][3];
|
||||
out->y = m[1][0] * in->x + m[1][1] * in->y + m[1][2] * in->z + m[1][3];
|
||||
out->z = m[2][0] * in->x + m[2][1] * in->y + m[2][2] * in->z + m[2][3];
|
||||
}
|
||||
|
||||
void C_MTXMultVecArray(const Mtx m, const Vec *srcBase, Vec *dstBase, u32 count)
|
||||
{
|
||||
u32 i;
|
||||
for (i = 0; i < count; i++) {
|
||||
dstBase[i].x = m[0][0] * srcBase[i].x + m[0][1] * srcBase[i].y + m[0][2] * srcBase[i].z + m[0][3];
|
||||
dstBase[i].y = m[1][0] * srcBase[i].x + m[1][1] * srcBase[i].y + m[1][2] * srcBase[i].z + m[1][3];
|
||||
dstBase[i].z = m[2][0] * srcBase[i].x + m[2][1] * srcBase[i].y + m[2][2] * srcBase[i].z + m[2][3];
|
||||
}
|
||||
}
|
||||
|
||||
void C_MTXROMultVecArray(const ROMtx m, const Vec *srcBase, Vec *dstBase, u32 count)
|
||||
{
|
||||
u32 i;
|
||||
for (u32 i = 0; i < count; ++i) {
|
||||
Vec* src = &srcBase[i];
|
||||
Vec* dst = &dstBase[i];
|
||||
|
||||
// Perform matrix-vector multiplication: ROMtx * Vec -> Vec
|
||||
dst->x = m[0][0] * src->x + m[0][1] * src->y + m[0][2] * src->z;
|
||||
dst->y = m[1][0] * src->x + m[1][1] * src->y + m[1][2] * src->z;
|
||||
dst->z = m[2][0] * src->x + m[2][1] * src->y + m[2][2] * src->z;
|
||||
}
|
||||
}
|
||||
|
||||
void C_MTXMultVecSR(const Mtx mtx, const Vec* in, Vec* out) {
|
||||
float x = in->x;
|
||||
float y = in->y;
|
||||
float z = in->z;
|
||||
|
||||
out->x = mtx[0][0] * x + mtx[0][1] * y + mtx[0][2] * z;
|
||||
out->y = mtx[1][0] * x + mtx[1][1] * y + mtx[1][2] * z;
|
||||
out->z = mtx[2][0] * x + mtx[2][1] * y + mtx[2][2] * z;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -825,10 +825,10 @@ static void particleFunc(ModelData *arg0, Mtx arg1) {
|
|||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_RGBA6, 0);
|
||||
GXSETARRAY(GX_VA_POS, temp_r31->unk_4C, temp_r31->unk_30 * 4, 0xC);
|
||||
GXSETARRAY(GX_VA_POS, temp_r31->unk_4C, temp_r31->unk_30 * 4 * sizeof(Vec), sizeof(Vec));
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXSETARRAY(GX_VA_CLR0, &temp_r31->unk_48->unk40, temp_r31->unk_30, 0x44);
|
||||
GXSETARRAY(GX_VA_CLR0, &temp_r31->unk_48->unk40, temp_r31->unk_30 * sizeof(GXColor), 0x44);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_RGBA6, 0);
|
||||
GXSETARRAY(GX_VA_TEX0, baseST, sizeof(baseST), 8);
|
||||
|
|
|
|||
|
|
@ -483,19 +483,19 @@ static void FaceDraw(HsfDrawObject *arg0, HsfFace *arg1) {
|
|||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_POS, temp_r28->data.vertex->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_POS, temp_r28->data.vertex->data, temp_r28->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
GXSetVtxDesc(GX_VA_NRM, GX_INDEX16);
|
||||
if (temp_r29->hsfData->cenvCnt == 0) {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_S8, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r28->data.normal->data, 3);
|
||||
GXSETARRAY(GX_VA_NRM, temp_r28->data.normal->data, temp_r28->data.vertex->count * 3, 3);
|
||||
} else {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r28->data.normal->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_NRM, temp_r28->data.normal->data, temp_r28->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
}
|
||||
if (var_r22 & 4) {
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXSetArray(GX_VA_CLR0, temp_r28->data.color->data, 4);
|
||||
GXSETARRAY(GX_VA_CLR0, temp_r28->data.color->data, temp_r28->data.vertex->count * sizeof(GXColor), sizeof(GXColor));
|
||||
}
|
||||
GXSetZCompLoc(1);
|
||||
}
|
||||
|
|
@ -556,7 +556,7 @@ static void FaceDraw(HsfDrawObject *arg0, HsfFace *arg1) {
|
|||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_POS, temp_r28->data.vertex->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_POS, temp_r28->data.vertex->data, temp_r28->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
if (var_r22 & 2) {
|
||||
GXSetVtxDesc(GX_VA_NBT, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NBT, GX_NRM_NBT, GX_S16, 8);
|
||||
|
|
@ -564,19 +564,19 @@ static void FaceDraw(HsfDrawObject *arg0, HsfFace *arg1) {
|
|||
GXSetVtxDesc(GX_VA_NRM, GX_INDEX16);
|
||||
if (temp_r29->hsfData->cenvCnt == 0) {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_S8, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r28->data.normal->data, 3);
|
||||
GXSETARRAY(GX_VA_NRM, temp_r28->data.normal->data, temp_r28->data.normal->count * 3, 3);
|
||||
} else {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r28->data.normal->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_NRM, temp_r28->data.normal->data, temp_r28->data.normal->count * sizeof(Vec), sizeof(Vec));
|
||||
}
|
||||
}
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
|
||||
GXSetArray(GX_VA_TEX0, temp_r28->data.st->data, 2 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_TEX0, temp_r28->data.st->data, temp_r28->data.st->count * sizeof(Vec2f), sizeof(Vec2f));
|
||||
if (var_r22 & 4) {
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXSetArray(GX_VA_CLR0, temp_r28->data.color->data, 4);
|
||||
GXSETARRAY(GX_VA_CLR0, temp_r28->data.color->data, temp_r28->data.color->count * sizeof(GXColor), sizeof(GXColor));
|
||||
}
|
||||
GXSetZCompLoc(0);
|
||||
}
|
||||
|
|
@ -1644,19 +1644,19 @@ static void FaceDrawShadow(HsfDrawObject *arg0, HsfFace *arg1) {
|
|||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_POS, temp_r31->data.vertex->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_POS, temp_r31->data.vertex->data, temp_r31->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
GXSetVtxDesc(GX_VA_NRM, GX_INDEX16);
|
||||
if (temp_r28->hsfData->cenvCnt == 0) {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_S8, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r31->data.normal->data, 3);
|
||||
GXSETARRAY(GX_VA_NRM, temp_r31->data.normal->data, temp_r31->data.vertex->count * 3, 3);
|
||||
} else {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r31->data.normal->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_NRM, temp_r31->data.normal->data, temp_r31->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
}
|
||||
if (var_r30 & 4) {
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXSetArray(GX_VA_CLR0, temp_r31->data.color->data, 4);
|
||||
GXSETARRAY(GX_VA_CLR0, temp_r31->data.color->data, temp_r31->data.vertex->count * sizeof(GXColor), sizeof(GXColor));
|
||||
}
|
||||
GXSetZCompLoc(1);
|
||||
}
|
||||
|
|
@ -1677,7 +1677,7 @@ static void FaceDrawShadow(HsfDrawObject *arg0, HsfFace *arg1) {
|
|||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_POS, temp_r31->data.vertex->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_POS, temp_r31->data.vertex->data, temp_r31->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
if (var_r30 & 2) {
|
||||
GXSetVtxDesc(GX_VA_NBT, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NBT, GX_NRM_NBT, GX_S16, 8);
|
||||
|
|
@ -1685,19 +1685,19 @@ static void FaceDrawShadow(HsfDrawObject *arg0, HsfFace *arg1) {
|
|||
GXSetVtxDesc(GX_VA_NRM, GX_INDEX16);
|
||||
if (temp_r28->hsfData->cenvCnt == 0) {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_RGB8, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r31->data.normal->data, 3);
|
||||
GXSETARRAY(GX_VA_NRM, temp_r31->data.normal->data, temp_r31->data.vertex->count * 3, 3);
|
||||
} else {
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
|
||||
GXSetArray(GX_VA_NRM, temp_r31->data.normal->data, 3 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_NRM, temp_r31->data.normal->data, temp_r31->data.vertex->count * sizeof(Vec), sizeof(Vec));
|
||||
}
|
||||
}
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
|
||||
GXSetArray(GX_VA_TEX0, temp_r31->data.st->data, 2 * sizeof(float));
|
||||
GXSETARRAY(GX_VA_TEX0, temp_r31->data.st->data, temp_r31->data.vertex->count * sizeof(Vec2f), sizeof(Vec2f));
|
||||
if (var_r30 & 4) {
|
||||
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
|
||||
GXSetArray(GX_VA_CLR0, temp_r31->data.color->data, 4);
|
||||
GXSETARRAY(GX_VA_CLR0, temp_r31->data.color->data, temp_r31->data.vertex->count * sizeof(GXColor), sizeof(GXColor));
|
||||
}
|
||||
GXSetZCompLoc(0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue