Merge pull request #580 from dbalatoni13/port

PC port work
This commit is contained in:
Dávid Balatoni 2025-04-09 02:06:50 +02:00 committed by GitHub
commit 909c743527
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
141 changed files with 7242 additions and 3522 deletions

File diff suppressed because it is too large Load diff

View file

@ -1180,4 +1180,7 @@ static void ShadowDraw(ModelData *model, Mtx mtx)
GXPosition3f32(2000.0f, 0, 2000.0f);
GXPosition3f32(-2000.0f, 0, 2000.0f);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&tex);
#endif
}

View file

@ -1308,6 +1308,9 @@ void fn_1_58E4(ModelData *modelData, Mtx arg1)
GXSetTevColor(GX_TEVREG0, sp14);
GXCallDisplayList(var_r31->unk_44, var_r31->unk_48);
}
#ifdef TARGET_PC
GXDestroyTexObj(&sp3C);
#endif
}
AnimData *fn_1_5D64(u16 sizeX, u16 sizeY, s32 arg2)

View file

@ -1002,12 +1002,15 @@ 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, 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);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&spC);
#endif
}
void fn_1_3F1C(ModelData *arg0, Mtx arg1)
@ -1077,6 +1080,9 @@ void fn_1_4024(ModelData *arg0, Mtx arg1)
GXPosition3f32(600.0f, -2.0f, 1250.0f);
GXPosition3f32(-600.0f, -2.0f, 1250.0f);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&sp18);
#endif
}
void fn_1_4700(ModelData *arg0, Mtx arg1)

View file

@ -1111,19 +1111,19 @@ void fn_1_45BC(ModelData *arg0, Mtx arg1)
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
GXSetArray(GX_VA_POS, var_r31->unk_84, sizeof(Vec));
GXSETARRAY(GX_VA_POS, var_r31->unk_84, var_r31->unk_80 * sizeof(Vec), sizeof(Vec));
GXSetVtxDesc(GX_VA_NRM, GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
GXSetArray(GX_VA_NRM, var_r31->unk_88, sizeof(Vec));
GXSETARRAY(GX_VA_NRM, var_r31->unk_88, var_r31->unk_80 * 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, var_r31->unk_90, 4);
GXSETARRAY(GX_VA_CLR0, var_r31->unk_90, var_r31->unk_80 * sizeof(GXColor), sizeof(GXColor));
GXCallDisplayList(var_r31->unk_A4, var_r31->unk_A0);
for (var_r30 = 1; var_r30 < 29; var_r30++) {
var_r29 = var_r30 * 35;
GXSetArray(GX_VA_POS, &var_r31->unk_84[var_r29], sizeof(Vec));
GXSetArray(GX_VA_NRM, &var_r31->unk_88[var_r29], sizeof(Vec));
GXSetArray(GX_VA_CLR0, &var_r31->unk_90[var_r29], sizeof(GXColor));
GXSETARRAY(GX_VA_POS, &var_r31->unk_84[var_r29], 35 * sizeof(Vec), sizeof(Vec));
GXSETARRAY(GX_VA_NRM, &var_r31->unk_88[var_r29], 35 * sizeof(Vec), sizeof(Vec));
GXSETARRAY(GX_VA_CLR0, &var_r31->unk_90[var_r29], 35 * sizeof(GXColor), sizeof(GXColor));
GXCallDisplayList(var_r31->unk_A4, var_r31->unk_A0);
}
}
@ -2956,7 +2956,7 @@ void fn_1_BC18(ModelData *arg0, float (*arg1)[4])
if (HmfInverseMtxF3X3(arg1, sp128) == 0) {
MTXIdentity(sp128);
}
PSMTXReorder(sp128, sp8);
MTXReorder(sp128, sp8);
if (var_r31->unk_4C) {
var_r18 = var_r31->unk_4C;
var_r18(arg0, var_r31, arg1);
@ -2964,7 +2964,7 @@ void fn_1_BC18(ModelData *arg0, float (*arg1)[4])
var_r29 = var_r31->unk_3C;
var_r30 = var_r31->unk_40;
var_r28 = var_r31->unk_44;
PSMTXROMultVecArray(sp8, lbl_1_data_8E0, &sp38[0], 4);
MTXROMultVecArray(sp8, lbl_1_data_8E0, &sp38[0], 4);
for (var_r26 = 0; var_r26 < var_r31->unk_26; var_r26++, var_r29++) {
if (!var_r29->unk_28) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;
@ -3169,7 +3169,7 @@ void fn_1_C86C(ModelData *arg0, Mtx arg1)
if (HmfInverseMtxF3X3(arg1, sp9C) == 0) {
MTXIdentity(sp9C);
}
PSMTXReorder(sp9C, spC);
MTXReorder(sp9C, spC);
if (var_r31->unk_4C) {
var_r23 = var_r31->unk_4C;
var_r23(arg0, var_r31, arg1);
@ -3177,7 +3177,7 @@ void fn_1_C86C(ModelData *arg0, Mtx arg1)
var_r29 = var_r31->unk_3C;
var_r30 = var_r31->unk_40;
sp8 = var_r31->unk_44;
PSMTXROMultVecArray(spC, lbl_1_data_930, (Vec *)sp3C, 4);
MTXROMultVecArray(spC, lbl_1_data_930, (Vec *)sp3C, 4);
for (var_r25 = 0; var_r25 < var_r31->unk_26; var_r25++, var_r29++) {
if (!var_r29->unk_28) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;

View file

@ -8,7 +8,7 @@
#include "game/objsub.h"
#include "game/pad.h"
#include "game/process.h"
#include "math.h"
#include "ext_math.h"
#include "REL/m407dll.h"

View file

@ -1138,6 +1138,10 @@ void fn_1_10830(ModelData *arg0, HsfBitmap *arg1, HsfAttribute *arg2, s16 arg3)
GXInitTexObjLOD(&sp1C, GX_LINEAR, GX_LINEAR, 0, 0, 0, GX_FALSE, GX_FALSE, GX_ANISO_1);
}
GXLoadTexObj(&sp1C, arg3);
#ifdef TARGET_PC
GXDestroyTexObj(&sp1C);
GXDestroyTlutObj(&sp10);
#endif
}
#define SET_TEVCOLOR_ALPHA(reg, color_var, value) \

View file

@ -1385,7 +1385,7 @@ void fn_1_602C(ModelData *arg0, f32 (*arg1)[4])
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_TEX0, temp_r30->unk20, 8);
fn_1_40A4(arg1, sp128);
PSMTXReorder(sp128, spF8);
MTXReorder(sp128, spF8);
if (((u8)omPauseChk() == 0) && (temp_r30->unkC)) {
var_r23 = temp_r30->unkC;
var_r23(arg0, temp_r30, arg1);
@ -1393,7 +1393,7 @@ void fn_1_602C(ModelData *arg0, f32 (*arg1)[4])
var_r29 = temp_r30->unk18;
var_r31 = temp_r30->unk1C;
var_r26 = temp_r30->unk20;
PSMTXROMultVecArray(spF8, &temp_r30->unk2C, &sp68[0], 4);
MTXROMultVecArray(spF8, &temp_r30->unk2C, &sp68[0], 4);
for (var_r25 = 0; var_r25 < temp_r30->unk0; var_r25++, var_r29++, var_r26 += 4) {
if (var_r29->unk4E == 0) {

View file

@ -1144,4 +1144,7 @@ void fn_1_B140(ModelData *arg0, Mtx arg1)
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
}
#ifdef TARGET_PC
GXDestroyTexObj(&sp14);
#endif
}

View file

@ -278,6 +278,9 @@ void fn_1_89BC(ModelData *model, Mtx mtx)
GXTexCoord2f32(0, 1);
GXEnd();
fn_1_8904(lbl_1_bss_1180, GX_FALSE);
#ifdef TARGET_PC
GXDestroyTexObj(&sp14);
#endif
}
void fn_1_8EA0(void)

View file

@ -574,8 +574,8 @@ void fn_1_4E64(omObjData *object)
MTXScale(spC8, var_f31, var_f31, var_f31 * var_r31->unk_28);
MTXConcat(sp68, spC8, sp98);
MTXInverse(sp98, spC8);
PSMTXReorder(spC8, sp38);
PSMTXROMultVecArray(sp38, lbl_1_bss_178.unk_2C, lbl_1_bss_178.unk_34, lbl_1_bss_178.unk_18);
MTXReorder(spC8, sp38);
MTXROMultVecArray(sp38, lbl_1_bss_178.unk_2C, lbl_1_bss_178.unk_34, lbl_1_bss_178.unk_18);
sp2C.x = (0.15f * var_r31->unk_18) * (var_r31->unk_24 * sind(var_r31->unk_10));
sp2C.y = 0.0f;
sp2C.z = (0.15f * var_r31->unk_18) * (var_r31->unk_24 * cosd(var_r31->unk_10));
@ -866,6 +866,9 @@ void fn_1_604C(ModelData *arg0, Mtx arg1)
GXSetTevDirect(GX_TEVSTAGE1);
GXSetTevDirect(GX_TEVSTAGE2);
GXSetTevDirect(GX_TEVSTAGE3);
#ifdef TARGET_PC
GXDestroyTexObj(&sp18);
#endif
}
void fn_1_6B04(ModelData *model, Mtx arg1)

View file

@ -323,6 +323,10 @@ void fn_1_AD0(s16 arg0)
GXPosition3f32(lbl_1_bss_0[arg0].x, lbl_1_bss_0[arg0].y + 192.0f, 0.0f);
GXTexCoord2f32(0.0f, 1.0f);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&sp58);
GXDestroyTexObj(&sp38);
#endif
}
void fn_1_F58(void)

View file

@ -1825,4 +1825,7 @@ void fn_1_ABDC(ModelData *model, Mtx matrix)
GXColor1x8(1);
}
}
#ifdef TARGET_PC
GXDestroyTexObj(&sp8);
#endif
}

View file

@ -4497,6 +4497,9 @@ void fn_1_EF44(ModelData *arg0, Mtx arg1)
}
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
#ifdef TARGET_PC
GXDestroyTexObj(&sp14);
#endif
}
s32 fn_1_F574(Vec arg0, float arg1, s32 arg2)
@ -4911,6 +4914,9 @@ void fn_1_11008(StructBssD0Data *arg0, void *arg1, s16 arg2, GXTexWrapMode arg3,
GXInitTexObjLOD(&sp18, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
}
GXLoadTexObj(&sp18, arg2);
#ifdef TARGET_PC
GXDestroyTexObj(&sp18);
#endif
}
s16 fn_1_11114(AnimData *arg0, s16 arg1)
@ -5148,7 +5154,7 @@ void fn_1_11900(ModelData *arg0, Mtx arg1)
if (HmfInverseMtxF3X3(arg1, sp128) == 0) {
MTXIdentity(sp128);
}
PSMTXReorder(sp128, sp8);
MTXReorder(sp128, sp8);
if (temp_r31->unk4C) {
var_r18 = temp_r31->unk4C;
var_r18(arg0, temp_r31, arg1);
@ -5156,7 +5162,7 @@ void fn_1_11900(ModelData *arg0, Mtx arg1)
var_r29 = temp_r31->unk3C;
var_r30 = temp_r31->unk40;
var_r28 = temp_r31->unk44;
PSMTXROMultVecArray(sp8, lbl_1_data_8C4, sp38, 4);
MTXROMultVecArray(sp8, lbl_1_data_8C4, sp38, 4);
for (i = 0; i < temp_r31->unk26; i++, var_r29++) {
if (!var_r29->unk30) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;

View file

@ -2131,7 +2131,7 @@ void fn_1_101C4(ModelData *var_r29, Mtx var_r28)
if (HmfInverseMtxF3X3(var_r28, sp50) == 0) {
MTXIdentity(sp50);
}
PSMTXReorder(sp50, sp20);
MTXReorder(sp50, sp20);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_INDEX16);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
@ -2694,7 +2694,7 @@ void fn_1_11EE0(ModelData *var_r24, Mtx var_r21)
if (HmfInverseMtxF3X3(var_r21, sp128) == 0) {
MTXIdentity(sp128);
}
PSMTXReorder(sp128, &sp8[0]);
MTXReorder(sp128, &sp8[0]);
if (var_r31->unk_4C) {
var_r18 = var_r31->unk_4C;
var_r18(var_r24, var_r31, var_r21);
@ -2702,7 +2702,7 @@ void fn_1_11EE0(ModelData *var_r24, Mtx var_r21)
var_r29 = var_r31->unk_3C;
var_r30 = var_r31->unk_40;
var_r26 = var_r31->unk_44;
PSMTXROMultVecArray(sp8, lbl_1_data_19C, &sp38[0], 4);
MTXROMultVecArray(sp8, lbl_1_data_19C, &sp38[0], 4);
for (var_r23 = 0; var_r23 < var_r31->unk_24; var_r23++, var_r29++) {
if (!var_r29->unk_28) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;

View file

@ -3045,7 +3045,7 @@ void fn_1_80DC(ModelData *arg0, Mtx arg1)
if (!HmfInverseMtxF3X3(arg1, sp128)) {
MTXIdentity(sp128);
}
PSMTXReorder(sp128, sp8);
MTXReorder(sp128, sp8);
if (var_r31->unk_4C) {
var_r18 = var_r31->unk_4C;
var_r18(arg0, var_r31, arg1);
@ -3053,7 +3053,7 @@ void fn_1_80DC(ModelData *arg0, Mtx arg1)
var_r29 = var_r31->unk_3C;
var_r30 = var_r31->unk_40;
var_r26 = var_r31->unk_44;
PSMTXROMultVecArray(sp8, lbl_1_data_22C, &sp38[0], 4);
MTXROMultVecArray(sp8, lbl_1_data_22C, &sp38[0], 4);
for (var_r23 = 0; var_r23 < var_r31->unk_24; var_r23++, var_r29++) {
if (!var_r29->unk_28) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;
@ -3135,7 +3135,7 @@ void fn_1_88B4(ModelData *arg0, Mtx arg1)
var_f27 = var_r30->pos.y - arg0->pos.y;
var_f30 = var_r30->pos.z - arg0->pos.z;
var_f26 = sqrtf((var_f31 * var_f31) + (var_f30 * var_f30));
arg0->rot.x = (atan2d(var_f26, var_f27)) - 90.0;
arg0->rot.x = (atan2d(var_f26, var_f27))-90.0;
arg0->rot.y = atan2d(var_f31, var_f30);
var_r29 = arg0->unk_120;
GXLoadPosMtxImm(arg1, 0);

View file

@ -1076,6 +1076,9 @@ void fn_1_618C(ModelData *arg0, Mtx arg1)
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&sp14);
#endif
}
s32 lbl_1_data_FC[0xC] = {
@ -2443,6 +2446,9 @@ void fn_1_B3CC(ModelData *model, Mtx matrix)
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&sp44);
#endif
}
void fn_1_BD2C(ModelData *model, Mtx matrix)
@ -3028,7 +3034,7 @@ void fn_1_DCD4(ModelData *model, Mtx matrix)
sp128[0][3] = 0.0f;
sp128[1][3] = 0.0f;
sp128[2][3] = 0.0f;
PSMTXReorder(sp128, spF8);
MTXReorder(sp128, spF8);
if ((omPauseChk() == 0) && (var_r30->unk_0C)) {
var_r23 = var_r30->unk_0C;
var_r23(model, var_r30, matrix);
@ -3036,7 +3042,7 @@ void fn_1_DCD4(ModelData *model, Mtx matrix)
var_r29 = var_r30->unk_18;
var_r31 = var_r30->unk_1C;
var_r26 = var_r30->unk_20;
PSMTXROMultVecArray(spF8, &var_r30->unk_2C, sp68, 4);
MTXROMultVecArray(spF8, &var_r30->unk_2C, sp68, 4);
for (var_r25 = 0; var_r25 < var_r30->unk_00; var_r25++, var_r29++, var_r26 += 4) {
if (var_r29->unk_62 == 0) {
var_r31->x = var_r31->y = var_r31->z = 0.0f;
@ -3058,9 +3064,9 @@ void fn_1_DCD4(ModelData *model, Mtx matrix)
}
else {
fn_1_E420(&var_r30->unk_2C, &sp38, &var_r29->unk_48, 4);
PSMTXRotRad(spC8, 0x5A, MTXDegToRad(var_r29->unk_44));
PSMTXConcat(sp128, spC8, sp98);
PSMTXMultVecArray(sp98, &sp38, &sp8, 4);
MTXRotRad(spC8, 0x5A, MTXDegToRad(var_r29->unk_44));
MTXConcat(sp128, spC8, sp98);
MTXMultVecArray(sp98, &sp38, &sp8, 4);
PSVECAdd(&sp8, &var_r29->unk_54, var_r31++);
PSVECAdd(&sp14, &var_r29->unk_54, var_r31++);
PSVECAdd(&sp20, &var_r29->unk_54, var_r31++);

View file

@ -1645,7 +1645,7 @@ void fn_1_13FBC(ModelData *model, Mtx matrix)
var_r27 = &lbl_1_bss_578[*var_r25];
var_r24 = lbl_1_bss_56C[*var_r25];
GXLoadPosMtxImm(matrix, 0);
PSMTXInvXpose(matrix, sp70);
MTXInvXpose(matrix, sp70);
GXLoadNrmMtxImm(sp70, 0);
GXSetNumTevStages(1);
GXSetNumTexGens(1);

View file

@ -980,6 +980,9 @@ void fn_1_3B64(void)
GXTexCoord2f32(0.0f, 1.0f);
}
}
#ifdef TARGET_PC
GXDestroyTexObj(&sp14);
#endif
}
s32 lbl_1_data_EC[] = {

View file

@ -3109,7 +3109,7 @@ void fn_1_134C0(ModelData *var_r23, Mtx var_r22)
if (HmfInverseMtxF3X3(var_r22, &sp128[0]) == 0) {
MTXIdentity(sp128);
}
PSMTXReorder(sp128, sp8);
MTXReorder(sp128, sp8);
if (var_r31->unk_4C) {
var_r18 = var_r31->unk_4C;
var_r18(var_r23, var_r31, var_r22);
@ -3117,7 +3117,7 @@ void fn_1_134C0(ModelData *var_r23, Mtx var_r22)
var_r29 = var_r31->unk_3C;
var_r30 = var_r31->unk_40;
var_r28 = var_r31->unk_44;
PSMTXROMultVecArray(sp8, lbl_1_data_6A4, &sp38[0], 4);
MTXROMultVecArray(sp8, lbl_1_data_6A4, &sp38[0], 4);
for (var_r26 = 0; var_r26 < var_r31->unk_26; var_r26++, var_r29++) {
if (!var_r29->unk_30) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;

View file

@ -1284,6 +1284,9 @@ void fn_1_8CE0(ModelData *model, Mtx matrix)
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&sp24);
#endif
}
Vec lbl_1_data_60[6] = {

View file

@ -2095,7 +2095,7 @@ void fn_1_72B4(ModelData *model, Mtx mtx)
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_TEX0, temp_r30->unk20, sizeof(HsfVector2f));
fn_1_79FC(mtx, sp128);
PSMTXReorder(sp128, spF8);
MTXReorder(sp128, spF8);
if (!omPauseChk() && temp_r30->unkC) {
temp_r23 = temp_r30->unkC;
temp_r23(model, temp_r30, mtx);
@ -2103,7 +2103,7 @@ void fn_1_72B4(ModelData *model, Mtx mtx)
temp_r29 = temp_r30->unk18;
temp_r31 = temp_r30->unk1C;
temp_r27 = temp_r30->unk20;
PSMTXROMultVecArray(spF8, temp_r30->unk2C, sp68, 4);
MTXROMultVecArray(spF8, temp_r30->unk2C, sp68, 4);
for (temp_r26 = 0; temp_r26 < temp_r30->unk0; temp_r26++, temp_r29++, temp_r27 += 4) {
if (temp_r29->unk56 == 0) {
temp_r31->x = temp_r31->y = temp_r31->z = 0;

View file

@ -348,6 +348,9 @@ void fn_1_2978(ModelData *model, Mtx mtx)
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&spC);
#endif
}
void fn_1_3004(void)
@ -468,6 +471,9 @@ void fn_1_3594(ModelData *model, Mtx mtx)
GXPosition3f32(1000.0f, -5.000001f, 1000.0f);
GXPosition3f32(-1000.0f, -5.000001f, 1000.0f);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&sp10);
#endif
}
GXColor lbl_1_data_170 = { 255, 0, 0, 255 };

File diff suppressed because it is too large Load diff

View file

@ -1843,7 +1843,10 @@ void fn_1_7D60(unkStruct15 *arg0, unkStruct13 *arg1, s16 arg2)
}
GXInitTexObjLOD(&sp1C, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1);
GXLoadTexObj(&sp1C, arg2);
return;
#ifdef TARGET_PC
GXDestroyTexObj(&sp1C);
GXDestroyTlutObj(&sp10);
#endif
}
void fn_1_806C(ModelData *arg0, Mtx arg1)
@ -2132,6 +2135,9 @@ void fn_1_8D1C(void)
GXSetTexCopyDst(0x280, 0x1E0, GX_TF_RGBA8, GX_FALSE);
GXCopyTex(lbl_1_bss_28, 0);
DCFlushRange(lbl_1_bss_28, lbl_1_bss_24);
#ifdef TARGET_PC
GXDestroyTexObj(&sp10);
#endif
}
void fn_1_91A4(Vec *arg0, Vec *arg1, Vec *arg2, f32 arg3[5])
@ -2460,7 +2466,7 @@ void fn_1_9C04(ModelData *arg0, Mtx arg1)
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_TEX0, temp_r30->unk20, 8);
fn_1_9344(arg1, sp128);
PSMTXReorder(sp128, spF8);
MTXReorder(sp128, spF8);
if (((u8)omPauseChk() == 0) && (temp_r30->unkC)) {
var_r23 = temp_r30->unkC;
var_r23(arg0, temp_r30, arg1);
@ -2468,7 +2474,7 @@ void fn_1_9C04(ModelData *arg0, Mtx arg1)
var_r29 = temp_r30->unk18;
var_r31 = temp_r30->unk1C;
var_r27 = temp_r30->unk20;
PSMTXROMultVecArray(spF8, &temp_r30->unk2C, (Vec *)&sp68[0], 4);
MTXROMultVecArray(spF8, &temp_r30->unk2C, (Vec *)&sp68[0], 4);
for (var_r26 = 0; var_r26 < temp_r30->unk0; var_r26++, var_r29++, var_r27 += 4) {
if (var_r29->unk62 == 0) {

View file

@ -1531,8 +1531,8 @@ void fn_1_485C(ModelData *model, Mtx mtx)
GXSetProjection(sp40, GX_PERSPECTIVE);
MTXInverse(mtx, spA0);
spA0[0][3] = spA0[1][3] = spA0[2][3] = 0.0f;
PSMTXReorder(spA0, sp70);
PSMTXROMultVecArray(sp70, &lbl_1_data_1C0[0], &sp10, 4);
MTXReorder(spA0, sp70);
MTXROMultVecArray(sp70, &lbl_1_data_1C0[0], &sp10, 4);
GXLoadPosMtxImm(mtx, 0);
var_r31 = lbl_1_bss_5C;
for (var_r30 = 0; var_r30 < 1024; var_r30++, var_r31++) {
@ -1630,6 +1630,9 @@ void fn_1_54C8(ModelData *model, Mtx mtx)
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&spC);
#endif
}
s16 fn_1_5918(Vec *arg0)

View file

@ -5,7 +5,6 @@
#include "game/frand.h"
#include "game/gamework_data.h"
#include "game/hsfman.h"
#include "game/jmp.h"
#include "game/minigame_seq.h"
#include "game/window.h"
#include "game/wipe.h"

View file

@ -301,6 +301,9 @@ void fn_1_4FC(ModelData *model, Mtx matrix)
}
}
}
#ifdef TARGET_PC
GXDestroyTexObj(&lbl_1_bss_40);
#endif
}
const Vec lbl_1_rodata_100 = { 0.0f, 0.0f, 0.0f };

View file

@ -1608,7 +1608,7 @@ void fn_1_56C4(ModelData *arg0, Mtx arg1)
sp130[0][3] = 0.0f;
sp130[1][3] = 0.0f;
sp130[2][3] = 0.0f;
PSMTXReorder(sp130, sp100);
MTXReorder(sp130, sp100);
if ((omPauseChk() == 0) && (var_r31->unk_00)) {
spC = var_r31->unk_00;
spC(arg0, var_r31, arg1);
@ -1616,7 +1616,7 @@ void fn_1_56C4(ModelData *arg0, Mtx arg1)
var_r29 = var_r31->unk_10;
var_r30 = var_r31->unk_14;
var_r27 = var_r31->unk_18;
PSMTXROMultVecArray(sp100, &var_r31->unk_28, sp70, 4);
MTXROMultVecArray(sp100, &var_r31->unk_28, sp70, 4);
for (var_r19 = 0; var_r19 < var_r31->unk_64; var_r19++, var_r29++, var_r27 += 4) {
if (var_r29->unk_3E < 0) {
var_r30->x = var_r30->y = var_r30->z = 0.0f;
@ -5048,7 +5048,7 @@ void fn_1_15BAC(Vec *arg0, Vec *arg1, float arg8, s32 arg2, float *arg3, float *
else if (0.0f > arg8) {
arg8 += 360.0f;
}
*arg3 = (atan2d(sp14.z, sp14.x)) - 90.0;
*arg3 = (atan2d(sp14.z, sp14.x))-90.0;
*arg4 = atan2d(sp14.y, sqrtf((sp14.x * sp14.x) + (sp14.z * sp14.z)));
if (arg2 == 0) {
*arg3 *= -1.0f;

View file

@ -968,6 +968,9 @@ void fn_1_6144(Work347CUnk4 *fbWork, float x1, float y1, float scale)
GXPosition3f32(x1, y2, 0);
GXTexCoord2f32(0, 1);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&texObj);
#endif
}
void fn_1_6594(s16 arg0, Work347CUnk4 *arg1, GXTexWrapMode arg2, s32 arg3, BOOL arg4)
@ -980,6 +983,9 @@ void fn_1_6594(s16 arg0, Work347CUnk4 *arg1, GXTexWrapMode arg2, s32 arg3, BOOL
GXInitTexObjLOD(&texObj, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
}
GXLoadTexObj(&texObj, arg0);
#ifdef TARGET_PC
GXDestroyTexObj(&texObj);
#endif
}
s32 fn_1_6698(Vec *arg0, float arg1, float arg2, s32 arg3)

View file

@ -857,6 +857,9 @@ void fn_1_5C74(Work2FACUnk4 *fbWork, float x1, float y1, float scale)
GXPosition3f32(x1, y2, 0);
GXTexCoord2f32(0, 1);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&texObj);
#endif
}
void fn_1_60C4(s16 arg0, Work2FACUnk4 *arg1, GXTexWrapMode arg2, s32 arg3, BOOL arg4)
@ -870,6 +873,9 @@ void fn_1_60C4(s16 arg0, Work2FACUnk4 *arg1, GXTexWrapMode arg2, s32 arg3, BOOL
GXInitTexObjLOD(&texObj, GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
}
GXLoadTexObj(&texObj, arg0);
#ifdef TARGET_PC
GXDestroyTexObj(&texObj);
#endif
}
s32 fn_1_61C8(Vec *arg0, float arg1, float arg2, s32 arg3)

View file

@ -398,6 +398,9 @@ void fn_1_7790(ModelData *model, Mtx mtx)
GXPosition3f32(var_f31, var_f30, -var_f29);
GXPosition3f32(var_f31, -var_f30, -var_f29);
GXPosition3f32(-var_f31, -var_f30, -var_f29);
#ifdef TARGET_PC
GXDestroyTexObj(&spC);
#endif
}
void fn_1_7B94(s32 arg0)

View file

@ -859,6 +859,9 @@ void fn_1_2B68(ModelData *mdl, Mtx arg1)
GXSetNumIndStages(0U);
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
#ifdef TARGET_PC
GXDestroyTexObj(&sp30);
#endif
}
// -------------------------------------------------------------------------- //

View file

@ -676,4 +676,7 @@ static void ResultShadowDraw(struct model_data *model, Mtx matrix)
GXPosition3f32(500.0f, 0, 500.0f);
GXPosition3f32(-500.0f, 0, 500.0f);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&tex);
#endif
}

View file

@ -761,7 +761,7 @@ void fn_1_97F8(s32 arg0)
temp_r30 = OM_GET_WORK_PTR(temp_r3, unkTemp2);
temp_r30->unk00_bit0 = 0;
temp_r30->unk4 = arg0;
temp_r30->unk_0C = HuMemDirectMallocNum(0, 0x190, MEMORY_DEFAULT_NUM);
temp_r30->unk_0C = HuMemDirectMallocNum(0, 20 * sizeof(unkTemp), MEMORY_DEFAULT_NUM);
BoardPlayerPosGet(arg0, &sp8);
temp_r30->unk8 = (80.0f + sp8.y);
memset(temp_r30->unk_0C, 0, 0x190);

View file

@ -157,7 +157,7 @@ void fn_1_9D0C(omObjData *arg0)
s32 var_r30;
dataCopy2 *temp_r31;
arg0->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0x34, MEMORY_DEFAULT_NUM);
arg0->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(dataCopy2), MEMORY_DEFAULT_NUM);
temp_r31 = arg0->data;
temp_r31->unk_02 = 5;
temp_r31->unk_04 = 0x3C;
@ -318,7 +318,7 @@ void fn_1_A5B0(omObjData *arg0)
BoardModelVisibilitySet(lbl_1_bss_D4, 1);
BoardModelMotionTimeSet(lbl_1_bss_D4, 110.0f);
lbl_1_bss_C8 = temp_r29 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, fn_1_B3C4);
temp_r29->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0xC, MEMORY_DEFAULT_NUM);
temp_r29->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(Vec), MEMORY_DEFAULT_NUM);
temp_r31 = temp_r29->data;
lbl_1_bss_C8->work[1] = 1;
Hu3DModelObjPosGet(BoardModelIDGet(lbl_1_bss_14[1]), "fish", &sp14);

View file

@ -114,7 +114,7 @@ void fn_1_6B7C(void)
lbl_1_bss_94 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, fn_1_7284);
lbl_1_bss_8C = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, fn_1_78A0);
lbl_1_bss_90 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, NULL);
lbl_1_bss_90->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0x14, MEMORY_DEFAULT_NUM);
lbl_1_bss_90->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(dataCopy), MEMORY_DEFAULT_NUM);
if (lbl_1_bss_78 == NULL) {
lbl_1_bss_78 = HuSprAnimReadFile(DATA_MAKE_NUM(DATADIR_EFFECT, 0x00));
HuSprAnimLock(lbl_1_bss_78);

View file

@ -1538,4 +1538,7 @@ void fn_1_7414(ModelData *model, Mtx matrix)
GXPosition3f32(500.0f, 0.0f, -500.0f);
GXPosition3f32(500.0f, 0.0f, 500.0f);
GXPosition3f32(-500.0f, 0.0f, 500.0f);
#ifdef TARGET_PC
GXDestroyTexObj(&spC);
#endif
}

View file

@ -53,6 +53,9 @@ void DEMOLoadFont(enum _GXTexMapID texMap, enum _GXTexMtx texMtx, DMTexFlt texFl
GXLoadTexMtxImm(fontTMtx, texMtx, 1);
GXSetNumTexGens(1);
GXSetTexCoordGen(0, 1, 4, texMtx);
#ifdef TARGET_PC
GXDestroyTexObj(&fontTexObj);
#endif
}
void DEMOSetupScrnSpc(long width, long height, float depth)

View file

@ -1,4 +1,5 @@
#include "dolphin/mtx.h"
#include "dolphin/gx/GXPriv.h"
static f32 Unit01[] = { 0.0f, 1.0f };
@ -6,17 +7,21 @@ extern f32 sinf(f32);
extern f32 cosf(f32);
extern f32 tanf(f32);
void C_MTXIdentity(Mtx mtx)
void C_MTXIdentity(Mtx m)
{
mtx[0][0] = 1.0f;
mtx[0][1] = 0.0f;
mtx[0][2] = 0.0f;
mtx[1][0] = 0.0f;
mtx[1][1] = 1.0f;
mtx[1][2] = 0.0f;
mtx[2][0] = 0.0f;
mtx[2][1] = 0.0f;
mtx[2][2] = 1.0f;
ASSERTMSGLINE(189, m, "MtxIdentity(): NULL Mtx 'm' ");
m[0][0] = 1;
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = 0;
m[1][0] = 0;
m[1][1] = 1;
m[1][2] = 0;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = 1;
m[2][3] = 0;
}
#ifdef GEKKO
@ -41,27 +46,23 @@ void PSMTXIdentity(register Mtx m)
}
#endif
void C_MTXCopy(const Mtx src, Mtx dst)
{
if (src == dst) {
return;
void C_MTXCopy(const Mtx src, Mtx dst) {
ASSERTMSGLINE(250, src, "MTXCopy(): NULL MtxPtr 'src' ");
ASSERTMSGLINE(251, dst, "MTXCopy(): NULL MtxPtr 'dst' ");
if (src != dst) {
dst[0][0] = src[0][0];
dst[0][1] = src[0][1];
dst[0][2] = src[0][2];
dst[0][3] = src[0][3];
dst[1][0] = src[1][0];
dst[1][1] = src[1][1];
dst[1][2] = src[1][2];
dst[1][3] = src[1][3];
dst[2][0] = src[2][0];
dst[2][1] = src[2][1];
dst[2][2] = src[2][2];
dst[2][3] = src[2][3];
}
dst[0][0] = src[0][0];
dst[0][1] = src[0][1];
dst[0][2] = src[0][2];
dst[0][3] = src[0][3];
dst[1][0] = src[1][0];
dst[1][1] = src[1][1];
dst[1][2] = src[1][2];
dst[1][3] = src[1][3];
dst[2][0] = src[2][0];
dst[2][1] = src[2][1];
dst[2][2] = src[2][2];
dst[2][3] = src[2][3];
}
#ifdef GEKKO
@ -88,33 +89,34 @@ asm void PSMTXCopy(const register Mtx src, register Mtx dst)
}
#endif
void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab)
{
void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab) {
Mtx mTmp;
MtxPtr m;
if ((ab == a) || (ab == b)) {
m = mTmp;
}
ASSERTMSGLINE(324, a, "MTXConcat(): NULL MtxPtr 'a' ");
ASSERTMSGLINE(325, b, "MTXConcat(): NULL MtxPtr 'b' ");
ASSERTMSGLINE(326, ab, "MTXConcat(): NULL MtxPtr 'ab' ");
else {
if (ab == a || ab == b) {
m = mTmp;
} else {
m = ab;
}
m[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0];
m[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] + a[0][2] * b[2][1];
m[0][2] = a[0][0] * b[0][2] + a[0][1] * b[1][2] + a[0][2] * b[2][2];
m[0][3] = a[0][0] * b[0][3] + a[0][1] * b[1][3] + a[0][2] * b[2][3] + a[0][3];
m[0][0] = 0 + a[0][2] * b[2][0] + ((a[0][0] * b[0][0]) + (a[0][1] * b[1][0]));
m[0][1] = 0 + a[0][2] * b[2][1] + ((a[0][0] * b[0][1]) + (a[0][1] * b[1][1]));
m[0][2] = 0 + a[0][2] * b[2][2] + ((a[0][0] * b[0][2]) + (a[0][1] * b[1][2]));
m[0][3] = a[0][3] + (a[0][2] * b[2][3] + (a[0][0] * b[0][3] + (a[0][1] * b[1][3])));
m[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] + a[1][2] * b[2][0];
m[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] + a[1][2] * b[2][1];
m[1][2] = a[1][0] * b[0][2] + a[1][1] * b[1][2] + a[1][2] * b[2][2];
m[1][3] = a[1][0] * b[0][3] + a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3];
m[1][0] = 0 + a[1][2] * b[2][0] + ((a[1][0] * b[0][0]) + (a[1][1] * b[1][0]));
m[1][1] = 0 + a[1][2] * b[2][1] + ((a[1][0] * b[0][1]) + (a[1][1] * b[1][1]));
m[1][2] = 0 + a[1][2] * b[2][2] + ((a[1][0] * b[0][2]) + (a[1][1] * b[1][2]));
m[1][3] = a[1][3] + (a[1][2] * b[2][3] + (a[1][0] * b[0][3] + (a[1][1] * b[1][3])));
m[2][0] = a[2][0] * b[0][0] + a[2][1] * b[1][0] + a[2][2] * b[2][0];
m[2][1] = a[2][0] * b[0][1] + a[2][1] * b[1][1] + a[2][2] * b[2][1];
m[2][2] = a[2][0] * b[0][2] + a[2][1] * b[1][2] + a[2][2] * b[2][2];
m[2][3] = a[2][0] * b[0][3] + a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3];
m[2][0] = 0 + a[2][2] * b[2][0] + ((a[2][0] * b[0][0]) + (a[2][1] * b[1][0]));
m[2][1] = 0 + a[2][2] * b[2][1] + ((a[2][0] * b[0][1]) + (a[2][1] * b[1][1]));
m[2][2] = 0 + a[2][2] * b[2][2] + ((a[2][0] * b[0][2]) + (a[2][1] * b[1][2]));
m[2][3] = a[2][3] + (a[2][2] * b[2][3] + (a[2][0] * b[0][3] + (a[2][1] * b[1][3])));
if (m == mTmp) {
C_MTXCopy(mTmp, ab);
@ -222,12 +224,16 @@ asm void PSMTXConcat(const register Mtx mA, const register Mtx mB, register Mtx
}
#endif
void C_MTXConcatArray(const Mtx a, const Mtx *srcBase, Mtx *dstBase, u32 count)
{
void C_MTXConcatArray(const Mtx a, const Mtx* srcBase, Mtx* dstBase, u32 count) {
u32 i;
ASSERTMSGLINE(580, a != 0, "MTXConcatArray(): NULL MtxPtr 'a' ");
ASSERTMSGLINE(581, srcBase != 0, "MTXConcatArray(): NULL MtxPtr 'srcBase' ");
ASSERTMSGLINE(582, dstBase != 0, "MTXConcatArray(): NULL MtxPtr 'dstBase' ");
ASSERTMSGLINE(583, count > 1, "MTXConcatArray(): count must be greater than 1.");
for (i = 0; i < count; i++) {
C_MTXConcat(a, *srcBase, *dstBase);
srcBase++;
dstBase++;
}
@ -351,31 +357,31 @@ _loop:
#endif
void C_MTXTranspose(const Mtx src, Mtx xPose)
{
void C_MTXTranspose(const Mtx src, Mtx xPose) {
Mtx mTmp;
MtxPtr m;
ASSERTMSGLINE(851, src, "MTXTranspose(): NULL MtxPtr 'src' ");
ASSERTMSGLINE(852, xPose, "MTXTranspose(): NULL MtxPtr 'xPose' ");
if (src == xPose) {
m = mTmp;
}
else {
} else {
m = xPose;
}
m[0][0] = src[0][0];
m[0][1] = src[1][0];
m[0][2] = src[2][0];
m[0][3] = 0.0f;
m[0][3] = 0;
m[1][0] = src[0][1];
m[1][1] = src[1][1];
m[1][2] = src[2][1];
m[1][3] = 0.0f;
m[1][3] = 0;
m[2][0] = src[0][2];
m[2][1] = src[1][2];
m[2][2] = src[2][2];
m[2][3] = 0.0f;
m[2][3] = 0;
if (m == mTmp) {
C_MTXCopy(mTmp, xPose);
}
@ -413,48 +419,48 @@ void PSMTXTranspose(const register Mtx src, register Mtx xPose)
}
#endif
u32 C_MTXInverse(const Mtx src, Mtx inv)
{
u32 C_MTXInverse(const Mtx src, Mtx inv) {
Mtx mTmp;
MtxPtr m;
f32 det;
ASSERTMSGLINE(950, src, "MTXInverse(): NULL MtxPtr 'src' ");
ASSERTMSGLINE(951, inv, "MTXInverse(): NULL MtxPtr 'inv' ");
if (src == inv) {
m = mTmp;
}
else {
} else {
m = inv;
}
det = src[0][0] * src[1][1] * src[2][2] + src[0][1] * src[1][2] * src[2][0] + src[0][2] * src[1][0] * src[2][1]
- src[2][0] * src[1][1] * src[0][2] - src[1][0] * src[0][1] * src[2][2] - src[0][0] * src[2][1] * src[1][2];
if (det == 0.0f) {
det = ((((src[2][1] * (src[0][2] * src[1][0]))
+ ((src[2][2] * (src[0][0] * src[1][1]))
+ (src[2][0] * (src[0][1] * src[1][2]))))
- (src[0][2] * (src[2][0] * src[1][1])))
- (src[2][2] * (src[1][0] * src[0][1])))
- (src[1][2] * (src[0][0] * src[2][1]));
if (0 == det) {
return 0;
}
det = 1 / det;
m[0][0] = (det * +((src[1][1] * src[2][2]) - (src[2][1] * src[1][2])));
m[0][1] = (det * -((src[0][1] * src[2][2]) - (src[2][1] * src[0][2])));
m[0][2] = (det * +((src[0][1] * src[1][2]) - (src[1][1] * src[0][2])));
det = 1.0f / det;
m[1][0] = (det * -((src[1][0] * src[2][2]) - (src[2][0] * src[1][2])));
m[1][1] = (det * +((src[0][0] * src[2][2]) - (src[2][0] * src[0][2])));
m[1][2] = (det * -((src[0][0] * src[1][2]) - (src[1][0] * src[0][2])));
m[0][0] = (src[1][1] * src[2][2] - src[2][1] * src[1][2]) * det;
m[0][1] = -(src[0][1] * src[2][2] - src[2][1] * src[0][2]) * det;
m[0][2] = (src[0][1] * src[1][2] - src[1][1] * src[0][2]) * det;
m[2][0] = (det * +((src[1][0] * src[2][1]) - (src[2][0] * src[1][1])));
m[2][1] = (det * -((src[0][0] * src[2][1]) - (src[2][0] * src[0][1])));
m[2][2] = (det * +((src[0][0] * src[1][1]) - (src[1][0] * src[0][1])));
m[1][0] = -(src[1][0] * src[2][2] - src[2][0] * src[1][2]) * det;
m[1][1] = (src[0][0] * src[2][2] - src[2][0] * src[0][2]) * det;
m[1][2] = -(src[0][0] * src[1][2] - src[1][0] * src[0][2]) * det;
m[2][0] = (src[1][0] * src[2][1] - src[2][0] * src[1][1]) * det;
m[2][1] = -(src[0][0] * src[2][1] - src[2][0] * src[0][1]) * det;
m[2][2] = (src[0][0] * src[1][1] - src[1][0] * src[0][1]) * det;
m[0][3] = -m[0][0] * src[0][3] - m[0][1] * src[1][3] - m[0][2] * src[2][3];
m[1][3] = -m[1][0] * src[0][3] - m[1][1] * src[1][3] - m[1][2] * src[2][3];
m[2][3] = -m[2][0] * src[0][3] - m[2][1] * src[1][3] - m[2][2] * src[2][3];
m[0][3] = ((-m[0][0] * src[0][3]) - (m[0][1] * src[1][3])) - (m[0][2] * src[2][3]);
m[1][3] = ((-m[1][0] * src[0][3]) - (m[1][1] * src[1][3])) - (m[1][2] * src[2][3]);
m[2][3] = ((-m[2][0] * src[0][3]) - (m[2][1] * src[1][3])) - (m[2][2] * src[2][3]);
if (m == mTmp) {
C_MTXCopy(mTmp, inv);
}
return 1;
}
@ -531,48 +537,48 @@ _regular:
}
#endif
u32 C_MTXInvXpose(const Mtx src, Mtx invX)
{
u32 C_MTXInvXpose(const Mtx src, Mtx invX) {
Mtx mTmp;
MtxPtr m;
f32 det;
ASSERTMSGLINE(1185, src, "MTXInvXpose(): NULL MtxPtr 'src' ");
ASSERTMSGLINE(1186, invX, "MTXInvXpose(): NULL MtxPtr 'invX' ");
if (src == invX) {
m = mTmp;
}
else {
} else {
m = invX;
}
det = src[0][0] * src[1][1] * src[2][2] + src[0][1] * src[1][2] * src[2][0] + src[0][2] * src[1][0] * src[2][1]
- src[2][0] * src[1][1] * src[0][2] - src[1][0] * src[0][1] * src[2][2] - src[0][0] * src[2][1] * src[1][2];
if (det == 0.0f) {
det = ((((src[2][1] * (src[0][2] * src[1][0]))
+ ((src[2][2] * (src[0][0] * src[1][1]))
+ (src[2][0] * (src[0][1] * src[1][2]))))
- (src[0][2] * (src[2][0] * src[1][1])))
- (src[2][2] * (src[1][0] * src[0][1])))
- (src[1][2] * (src[0][0] * src[2][1]));
if (0 == det) {
return 0;
}
det = 1 / det;
m[0][0] = (det * +((src[1][1] * src[2][2]) - (src[2][1] * src[1][2])));
m[0][1] = (det * -((src[1][0] * src[2][2]) - (src[2][0] * src[1][2])));
m[0][2] = (det * +((src[1][0] * src[2][1]) - (src[2][0] * src[1][1])));
det = 1.0f / det;
m[1][0] = (det * -((src[0][1] * src[2][2]) - (src[2][1] * src[0][2])));
m[1][1] = (det * +((src[0][0] * src[2][2]) - (src[2][0] * src[0][2])));
m[1][2] = (det * -((src[0][0] * src[2][1]) - (src[2][0] * src[0][1])));
m[0][0] = (src[1][1] * src[2][2] - src[2][1] * src[1][2]) * det;
m[0][1] = -(src[1][0] * src[2][2] - src[2][0] * src[1][2]) * det;
m[0][2] = (src[1][0] * src[2][1] - src[2][0] * src[1][1]) * det;
m[2][0] = (det * +((src[0][1] * src[1][2]) - (src[1][1] * src[0][2])));
m[2][1] = (det * -((src[0][0] * src[1][2]) - (src[1][0] * src[0][2])));
m[2][2] = (det * +((src[0][0] * src[1][1]) - (src[1][0] * src[0][1])));
m[1][0] = -(src[0][1] * src[2][2] - src[2][1] * src[0][2]) * det;
m[1][1] = (src[0][0] * src[2][2] - src[2][0] * src[0][2]) * det;
m[1][2] = -(src[0][0] * src[2][1] - src[2][0] * src[0][1]) * det;
m[2][0] = (src[0][1] * src[1][2] - src[1][1] * src[0][2]) * det;
m[2][1] = -(src[0][0] * src[1][2] - src[1][0] * src[0][2]) * det;
m[2][2] = (src[0][0] * src[1][1] - src[1][0] * src[0][1]) * det;
m[0][3] = 0.0F;
m[1][3] = 0.0F;
m[2][3] = 0.0F;
m[0][3] = 0;
m[1][3] = 0;
m[2][3] = 0;
if (m == mTmp) {
C_MTXCopy(mTmp, invX);
}
return 1;
}
@ -638,10 +644,11 @@ _regular:
}
#endif
void C_MTXRotRad(Mtx m, char axis, f32 rad)
{
void C_MTXRotRad(Mtx m, char axis, f32 rad) {
f32 sinA;
f32 cosA;
f32 sinA, cosA;
ASSERTMSGLINE(1447, m, "MTXRotRad(): NULL MtxPtr 'm' ");
sinA = sinf(rad);
cosA = cosf(rad);
C_MTXRotTrig(m, axis, sinA, cosA);
@ -659,60 +666,57 @@ void PSMTXRotRad(Mtx m, char axis, f32 rad)
}
#endif
void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA)
{
switch (axis) {
case 'x':
case 'X':
m[0][0] = 1.0f;
m[0][1] = 0.0f;
m[0][2] = 0.0f;
m[0][3] = 0.0f;
m[1][0] = 0.0f;
m[1][1] = cosA;
m[1][2] = -sinA;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = sinA;
m[2][2] = cosA;
m[2][3] = 0.0f;
break;
case 'y':
case 'Y':
m[0][0] = cosA;
m[0][1] = 0.0f;
m[0][2] = sinA;
m[0][3] = 0.0f;
m[1][0] = 0.0f;
m[1][1] = 1.0f;
m[1][2] = 0.0f;
m[1][3] = 0.0f;
m[2][0] = -sinA;
m[2][1] = 0.0f;
m[2][2] = cosA;
m[2][3] = 0.0f;
break;
case 'z':
case 'Z':
m[0][0] = cosA;
m[0][1] = -sinA;
m[0][2] = 0.0f;
m[0][3] = 0.0f;
m[1][0] = sinA;
m[1][1] = cosA;
m[1][2] = 0.0f;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = 1.0f;
m[2][3] = 0.0f;
break;
default:
break;
void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA) {
ASSERTMSGLINE(1502, m, "MTXRotTrig(): NULL MtxPtr 'm' ");
switch(axis) {
case 'x':
case 'X':
m[0][0] = 1;
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = 0;
m[1][0] = 0;
m[1][1] = cosA;
m[1][2] = -sinA;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = sinA;
m[2][2] = cosA;
m[2][3] = 0;
break;
case 'y':
case 'Y':
m[0][0] = cosA;
m[0][1] = 0;
m[0][2] = sinA;
m[0][3] = 0;
m[1][0] = 0;
m[1][1] = 1;
m[1][2] = 0;
m[1][3] = 0;
m[2][0] = -sinA;
m[2][1] = 0;
m[2][2] = cosA;
m[2][3] = 0;
break;
case 'z':
case 'Z':
m[0][0] = cosA;
m[0][1] = -sinA;
m[0][2] = 0;
m[0][3] = 0;
m[1][0] = sinA;
m[1][1] = cosA;
m[1][2] = 0;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = 1;
m[2][3] = 0;
break;
default:
ASSERTMSGLINE(1529, FALSE, "MTXRotTrig(): invalid 'axis' value ");
break;
}
}
@ -780,42 +784,43 @@ _end:
#endif
void C_MTXRotAxisRad(Mtx m, const Vec *axis, f32 rad)
{
void C_MTXRotAxisRad(Mtx m, const Vec* axis, f32 rad) {
Vec vN;
f32 s, c;
f32 s;
f32 c;
f32 t;
f32 x, y, z;
f32 xSq, ySq, zSq;
f32 x;
f32 y;
f32 z;
f32 xSq;
f32 ySq;
f32 zSq;
ASSERTMSGLINE(1677, m, "MTXRotAxisRad(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(1678, axis, "MTXRotAxisRad(): NULL VecPtr 'axis' ");
s = sinf(rad);
c = cosf(rad);
t = 1.0f - c;
t = 1 - c;
C_VECNormalize(axis, &vN);
x = vN.x;
y = vN.y;
z = vN.z;
xSq = x * x;
ySq = y * y;
zSq = z * z;
m[0][0] = (t * xSq) + (c);
m[0][1] = (t * x * y) - (s * z);
m[0][2] = (t * x * z) + (s * y);
m[0][3] = 0.0f;
m[1][0] = (t * x * y) + (s * z);
m[1][1] = (t * ySq) + (c);
m[1][2] = (t * y * z) - (s * x);
m[1][3] = 0.0f;
m[2][0] = (t * x * z) - (s * y);
m[2][1] = (t * y * z) + (s * x);
m[2][2] = (t * zSq) + (c);
m[2][3] = 0.0f;
xSq = (x * x);
ySq = (y * y);
zSq = (z * z);
m[0][0] = (c + (t * xSq));
m[0][1] = (y * (t * x)) - (s * z);
m[0][2] = (z * (t * x)) + (s * y);
m[0][3] = 0;
m[1][0] = ((y * (t * x)) + (s * z));
m[1][1] = (c + (t * ySq));
m[1][2] = ((z * (t * y)) - (s * x));
m[1][3] = 0;
m[2][0] = ((z * (t * x)) - (s * y));
m[2][1] = ((z * (t * y)) + (s * x));
m[2][2] = (c + (t * zSq));
m[2][3] = 0;
}
#ifdef GEKKO
@ -875,19 +880,19 @@ void PSMTXRotAxisRad(register Mtx m, const Vec *axis, register f32 rad)
#endif
void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT)
{
m[0][0] = 1.0f;
m[0][1] = 0.0f;
m[0][2] = 0.0f;
void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT) {
ASSERTMSGLINE(1866, m, "MTXTrans(): NULL MtxPtr 'm' ");
m[0][0] = 1;
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = xT;
m[1][0] = 0.0f;
m[1][1] = 1.0f;
m[1][2] = 0.0f;
m[1][0] = 0;
m[1][1] = 1;
m[1][2] = 0;
m[1][3] = yT;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = 1.0f;
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = 1;
m[2][3] = zT;
}
@ -914,8 +919,10 @@ void PSMTXTrans(register Mtx m, register f32 xT, register f32 yT, register f32 z
}
#endif
void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT)
{
void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT) {
ASSERTMSGLINE(1933, src, "MTXTransApply(): NULL MtxPtr 'src' ");
ASSERTMSGLINE(1934, dst, "MTXTransApply(): NULL MtxPtr 'src' "); //! wrong assert string
if (src != dst) {
dst[0][0] = src[0][0];
dst[0][1] = src[0][1];
@ -928,9 +935,9 @@ void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT)
dst[2][2] = src[2][2];
}
dst[0][3] = src[0][3] + xT;
dst[1][3] = src[1][3] + yT;
dst[2][3] = src[2][3] + zT;
dst[0][3] = (src[0][3] + xT);
dst[1][3] = (src[1][3] + yT);
dst[2][3] = (src[2][3] + zT);
}
#ifdef GEKKO
@ -961,20 +968,20 @@ asm void PSMTXTransApply(const register Mtx src, register Mtx dst, register f32
}
#endif
void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS)
{
void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS) {
ASSERTMSGLINE(2008, m, "MTXScale(): NULL MtxPtr 'm' ");
m[0][0] = xS;
m[0][1] = 0.0f;
m[0][2] = 0.0f;
m[0][3] = 0.0f;
m[1][0] = 0.0f;
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = 0;
m[1][0] = 0;
m[1][1] = yS;
m[1][2] = 0.0f;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[1][2] = 0;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = zS;
m[2][3] = 0.0f;
m[2][3] = 0;
}
#ifdef GEKKO
@ -997,22 +1004,21 @@ void PSMTXScale(register Mtx m, register f32 xS, register f32 yS, register f32 z
}
#endif
void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS)
{
dst[0][0] = src[0][0] * xS;
dst[0][1] = src[0][1] * xS;
dst[0][2] = src[0][2] * xS;
dst[0][3] = src[0][3] * xS;
dst[1][0] = src[1][0] * yS;
dst[1][1] = src[1][1] * yS;
dst[1][2] = src[1][2] * yS;
dst[1][3] = src[1][3] * yS;
dst[2][0] = src[2][0] * zS;
dst[2][1] = src[2][1] * zS;
dst[2][2] = src[2][2] * zS;
dst[2][3] = src[2][3] * zS;
void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS) {
ASSERTMSGLINE(2070, src, "MTXScaleApply(): NULL MtxPtr 'src' ");
ASSERTMSGLINE(2071, dst, "MTXScaleApply(): NULL MtxPtr 'dst' ");
dst[0][0] = (src[0][0] * xS);
dst[0][1] = (src[0][1] * xS);
dst[0][2] = (src[0][2] * xS);
dst[0][3] = (src[0][3] * xS);
dst[1][0] = (src[1][0] * yS);
dst[1][1] = (src[1][1] * yS);
dst[1][2] = (src[1][2] * yS);
dst[1][3] = (src[1][3] * yS);
dst[2][0] = (src[2][0] * zS);
dst[2][1] = (src[2][1] * zS);
dst[2][2] = (src[2][2] * zS);
dst[2][3] = (src[2][3] * zS);
}
#ifdef GEKKO
@ -1046,12 +1052,25 @@ asm void PSMTXScaleApply(const register Mtx src, register Mtx dst, register f32
}
#endif
void C_MTXQuat(Mtx m, const Quaternion *q)
{
f32 s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
s = 2.0f / ((q->x * q->x) + (q->y * q->y) + (q->z * q->z) + (q->w * q->w));
void C_MTXQuat(Mtx m, const Quaternion* q) {
f32 s;
f32 xs;
f32 ys;
f32 zs;
f32 wx;
f32 wy;
f32 wz;
f32 xx;
f32 xy;
f32 xz;
f32 yy;
f32 yz;
f32 zz;
ASSERTMSGLINE(2145, m, "MTXQuat(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(2146, q, "MTXQuat(): NULL QuaternionPtr 'q' ");
ASSERTMSGLINE(2147, q->x || q->y || q->z || q->w, "MTXQuat(): zero-value quaternion ");
s = 2 / ((q->w * q->w) + ((q->z * q->z) + ((q->x * q->x) + (q->y * q->y))));
xs = q->x * s;
ys = q->y * s;
zs = q->z * s;
@ -1064,21 +1083,18 @@ void C_MTXQuat(Mtx m, const Quaternion *q)
yy = q->y * ys;
yz = q->y * zs;
zz = q->z * zs;
m[0][0] = 1.0f - (yy + zz);
m[0][1] = xy - wz;
m[0][2] = xz + wy;
m[0][3] = 0.0f;
m[1][0] = xy + wz;
m[1][1] = 1.0f - (xx + zz);
m[1][2] = yz - wx;
m[1][3] = 0.0f;
m[2][0] = xz - wy;
m[2][1] = yz + wx;
m[2][2] = 1.0f - (xx + yy);
m[2][3] = 0.0f;
m[0][0] = (1 - (yy + zz));
m[0][1] = (xy - wz);
m[0][2] = (xz + wy);
m[0][3] = 0;
m[1][0] = (xy + wz);
m[1][1] = (1 - (xx + zz));
m[1][2] = (yz - wx);
m[1][3] = 0;
m[2][0] = (xz - wy);
m[2][1] = (yz + wx);
m[2][2] = (1 - (xx + yy));
m[2][3] = 0;
}
#ifdef GEKKO
@ -1136,29 +1152,28 @@ void PSMTXQuat(register Mtx m, const register Quaternion *q)
}
#endif
void C_MTXReflect(Mtx m, const Vec *p, const Vec *n)
{
f32 vxy, vxz, vyz, pdotn;
void C_MTXReflect(Mtx m, const Vec* p, const Vec* n) {
f32 vxy;
f32 vxz;
f32 vyz;
f32 pdotn;
vxy = -2.0f * n->x * n->y;
vxz = -2.0f * n->x * n->z;
vyz = -2.0f * n->y * n->z;
pdotn = 2.0f * C_VECDotProduct(p, n);
m[0][0] = 1.0f - 2.0f * n->x * n->x;
vxy = -2 * n->x * n->y;
vxz = -2 * n->x * n->z;
vyz = -2 * n->y * n->z;
pdotn = 2 * C_VECDotProduct(p, n);
m[0][0] = (1 - (2 * n->x * n->x));
m[0][1] = vxy;
m[0][2] = vxz;
m[0][3] = pdotn * n->x;
m[0][3] = (pdotn * n->x);
m[1][0] = vxy;
m[1][1] = 1.0f - 2.0f * n->y * n->y;
m[1][1] = (1 - (2 * n->y * n->y));
m[1][2] = vyz;
m[1][3] = pdotn * n->y;
m[1][3] = (pdotn * n->y);
m[2][0] = vxz;
m[2][1] = vyz;
m[2][2] = 1.0f - 2.0f * n->z * n->z;
m[2][3] = pdotn * n->z;
m[2][2] = (1 - (2 * n->z * n->z));
m[2][3] = (pdotn * n->z);
}
#ifdef GEKKO
@ -1202,9 +1217,15 @@ void PSMTXReflect(register Mtx m, const register Vec *p, const register Vec *n)
}
#endif
void C_MTXLookAt(Mtx m, const Vec *camPos, const Vec *camUp, const Vec *target)
{
Vec vLook, vRight, vUp;
void C_MTXLookAt(Mtx m, const Point3d* camPos, const Vec* camUp, const Point3d* target) {
Vec vLook;
Vec vRight;
Vec vUp;
ASSERTMSGLINE(2438, m, "MTXLookAt(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(2439, camPos, "MTXLookAt(): NULL VecPtr 'camPos' ");
ASSERTMSGLINE(2440, camUp, "MTXLookAt(): NULL VecPtr 'camUp' ");
ASSERTMSGLINE(2441, target, "MTXLookAt(): NULL Point3dPtr 'target' ");
vLook.x = camPos->x - target->x;
vLook.y = camPos->y - target->y;
@ -1213,88 +1234,164 @@ void C_MTXLookAt(Mtx m, const Vec *camPos, const Vec *camUp, const Vec *target)
VECCrossProduct(camUp, &vLook, &vRight);
VECNormalize(&vRight, &vRight);
VECCrossProduct(&vLook, &vRight, &vUp);
m[0][0] = vRight.x;
m[0][1] = vRight.y;
m[0][2] = vRight.z;
m[0][3] = -(camPos->x * vRight.x + camPos->y * vRight.y + camPos->z * vRight.z);
m[0][3] = -((camPos->z * vRight.z) + ((camPos->x * vRight.x) + (camPos->y * vRight.y)));
m[1][0] = vUp.x;
m[1][1] = vUp.y;
m[1][2] = vUp.z;
m[1][3] = -(camPos->x * vUp.x + camPos->y * vUp.y + camPos->z * vUp.z);
m[1][3] = -((camPos->z * vUp.z) + ((camPos->x * vUp.x) + (camPos->y * vUp.y)));
m[2][0] = vLook.x;
m[2][1] = vLook.y;
m[2][2] = vLook.z;
m[2][3] = -(camPos->x * vLook.x + camPos->y * vLook.y + camPos->z * vLook.z);
m[2][3] = -((camPos->z * vLook.z) + ((camPos->x * vLook.x) + (camPos->y * vLook.y)));
}
void C_MTXLightFrustum(Mtx m, float t, float b, float l, float r, float n, float scaleS, float scaleT, float transS, float transT)
{
void C_MTXLightFrustum(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 scaleS, f32 scaleT, f32 transS, f32 transT) {
f32 tmp;
tmp = 1.0f / (r - l);
m[0][0] = ((2 * n) * tmp) * scaleS;
m[0][1] = 0.0f;
m[0][2] = (((r + l) * tmp) * scaleS) - transS;
m[0][3] = 0.0f;
ASSERTMSGLINE(2541, m, "MTXLightFrustum(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(2542, (t != b), "MTXLightFrustum(): 't' and 'b' clipping planes are equal ");
ASSERTMSGLINE(2543, (l != r), "MTXLightFrustum(): 'l' and 'r' clipping planes are equal ");
tmp = 1.0f / (t - b);
m[1][0] = 0.0f;
m[1][1] = ((2 * n) * tmp) * scaleT;
m[1][2] = (((t + b) * tmp) * scaleT) - transT;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = -1.0f;
m[2][3] = 0.0f;
tmp = 1 / (r - l);
m[0][0] = (scaleS * (2 * n * tmp));
m[0][1] = 0;
m[0][2] = (scaleS * (tmp * (r + l))) - transS;
m[0][3] = 0;
tmp = 1 / (t - b);
m[1][0] = 0;
m[1][1] = (scaleT * (2 * n * tmp));
m[1][2] = (scaleT * (tmp * (t + b))) - transT;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = -1;
m[2][3] = 0;
}
void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, float scaleS, float scaleT, float transS, float transT)
{
void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, f32 scaleS, f32 scaleT, f32 transS, f32 transT) {
f32 angle;
f32 cot;
angle = fovY * 0.5f;
ASSERTMSGLINE(2605, m, "MTXLightPerspective(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(2606, (fovY > 0.0) && (fovY < 180.0), "MTXLightPerspective(): 'fovY' out of range ");
ASSERTMSGLINE(2607, 0 != aspect, "MTXLightPerspective(): 'aspect' is 0 ");
angle = (0.5f * fovY);
angle = MTXDegToRad(angle);
cot = 1.0f / tanf(angle);
m[0][0] = (cot / aspect) * scaleS;
m[0][1] = 0.0f;
cot = 1 / tanf(angle);
m[0][0] = (scaleS * (cot / aspect));
m[0][1] = 0;
m[0][2] = -transS;
m[0][3] = 0.0f;
m[1][0] = 0.0f;
m[1][1] = cot * scaleT;
m[0][3] = 0;
m[1][0] = 0;
m[1][1] = (cot * scaleT);
m[1][2] = -transT;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = -1.0f;
m[2][3] = 0.0f;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = -1;
m[2][3] = 0;
}
void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, float scaleS, float scaleT, float transS, float transT)
{
void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 scaleS, f32 scaleT, f32 transS, f32 transT) {
f32 tmp;
tmp = 1.0f / (r - l);
m[0][0] = (2.0f * tmp * scaleS);
m[0][1] = 0.0f;
m[0][2] = 0.0f;
m[0][3] = ((-(r + l) * tmp) * scaleS) + transS;
tmp = 1.0f / (t - b);
m[1][0] = 0.0f;
m[1][1] = (2.0f * tmp) * scaleT;
m[1][2] = 0.0f;
m[1][3] = ((-(t + b) * tmp) * scaleT) + transT;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
m[2][2] = 0.0f;
m[2][3] = 1.0f;
ASSERTMSGLINE(2673, m, "MTXLightOrtho(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(2674, (t != b), "MTXLightOrtho(): 't' and 'b' clipping planes are equal ");
ASSERTMSGLINE(2675, (l != r), "MTXLightOrtho(): 'l' and 'r' clipping planes are equal ");
tmp = 1 / (r - l);
m[0][0] = (2 * tmp * scaleS);
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = (transS + (scaleS * (tmp * -(r + l))));
tmp = 1/ (t - b);
m[1][0] = 0;
m[1][1] = (2 * tmp * scaleT);
m[1][2] = 0;
m[1][3] = (transT + (scaleT * (tmp * -(t + b))));
m[2][0] = 0;
m[2][1] = 0;
m[2][2] = 0;
m[2][3] = 1;
}
#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* src, Vec* dst) {
Vec vTmp;
ASSERTMSGLINE(66, m, "MTXMultVec(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(67, src, "MTXMultVec(): NULL VecPtr 'src' ");
ASSERTMSGLINE(68, dst, "MTXMultVec(): NULL VecPtr 'dst' ");
vTmp.x = m[0][3] + ((m[0][2] * src->z) + ((m[0][0] * src->x) + (m[0][1] * src->y)));
vTmp.y = m[1][3] + ((m[1][2] * src->z) + ((m[1][0] * src->x) + (m[1][1] * src->y)));
vTmp.z = m[2][3] + ((m[2][2] * src->z) + ((m[2][0] * src->x) + (m[2][1] * src->y)));
dst->x = vTmp.x;
dst->y = vTmp.y;
dst->z = vTmp.z;
}
void C_MTXMultVecArray(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count) {
u32 i;
Vec vTmp;
ASSERTMSGLINE(168, m, "MTXMultVecArray(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(169, srcBase, "MTXMultVecArray(): NULL VecPtr 'srcBase' ");
ASSERTMSGLINE(170, dstBase, "MTXMultVecArray(): NULL VecPtr 'dstBase' ");
ASSERTMSGLINE(171, count > 1, "MTXMultVecArray(): count must be greater than 1.");
for(i = 0; i < count; i++) {
vTmp.x = m[0][3] + ((m[0][2] * srcBase->z) + ((m[0][0] * srcBase->x) + (m[0][1] * srcBase->y)));
vTmp.y = m[1][3] + ((m[1][2] * srcBase->z) + ((m[1][0] * srcBase->x) + (m[1][1] * srcBase->y)));
vTmp.z = m[2][3] + ((m[2][2] * srcBase->z) + ((m[2][0] * srcBase->x) + (m[2][1] * srcBase->y)));
dstBase->x = vTmp.x;
dstBase->y = vTmp.y;
dstBase->z = vTmp.z;
srcBase++;
dstBase++;
}
}
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 m, const Vec* src, Vec* dst) {
Vec vTmp;
ASSERTMSGLINE(313, m, "MTXMultVecSR(): NULL MtxPtr 'm' ");
ASSERTMSGLINE(314, src, "MTXMultVecSR(): NULL VecPtr 'src' ");
ASSERTMSGLINE(315, dst, "MTXMultVecSR(): NULL VecPtr 'dst' ");
vTmp.x = (m[0][2] * src->z) + ((m[0][0] * src->x) + (m[0][1] * src->y));
vTmp.y = (m[1][2] * src->z) + ((m[1][0] * src->x) + (m[1][1] * src->y));
vTmp.z = (m[2][2] * src->z) + ((m[2][0] * src->x) + (m[2][1] * src->y));
dst->x = vTmp.x;
dst->y = vTmp.y;
dst->z = vTmp.z;
}
#endif

View file

@ -1,82 +1,98 @@
#include "dolphin/mtx.h"
#include "dolphin/gx/GXPriv.h"
#include "math.h"
void C_MTXFrustum(Mtx44 m, f32 arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5, f32 arg6)
{
f32 tmp = 1.0f / (arg4 - arg3);
m[0][0] = (2 * arg5) * tmp;
m[0][1] = 0.0f;
m[0][2] = (arg4 + arg3) * tmp;
m[0][3] = 0.0f;
tmp = 1.0f / (arg1 - arg2);
m[1][0] = 0.0f;
m[1][1] = (2 * arg5) * tmp;
m[1][2] = (arg1 + arg2) * tmp;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
tmp = 1.0f / (arg6 - arg5);
m[2][2] = -(arg5)*tmp;
m[2][3] = -(arg6 * arg5) * tmp;
m[3][0] = 0.0f;
m[3][1] = 0.0f;
m[3][2] = -1.0f;
m[3][3] = 0.0f;
void C_MTXFrustum(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f) {
f32 tmp;
ASSERTMSGLINE(105, m, "MTXFrustum(): NULL Mtx44Ptr 'm' ");
ASSERTMSGLINE(106, t != b, "MTXFrustum(): 't' and 'b' clipping planes are equal ");
ASSERTMSGLINE(107, l != r, "MTXFrustum(): 'l' and 'r' clipping planes are equal ");
ASSERTMSGLINE(108, n != f, "MTXFrustum(): 'n' and 'f' clipping planes are equal ");
tmp = 1 / (r - l);
m[0][0] = (2 * n * tmp);
m[0][1] = 0;
m[0][2] = (tmp * (r + l));
m[0][3] = 0;
tmp = 1 / (t - b);
m[1][0] = 0;
m[1][1] = (2 * n * tmp);
m[1][2] = (tmp * (t + b));
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
tmp = 1 / (f - n);
m[2][2] = (-n * tmp);
m[2][3] = (tmp * -(f * n));
m[3][0] = 0;
m[3][1] = 0;
m[3][2] = -1;
m[3][3] = 0;
}
// Functions match but has issues with float constants
void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f)
{
f32 angle = fovY * 0.5f;
void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f) {
f32 angle;
f32 cot;
f32 tmp;
ASSERTMSGLINE(179, m, "MTXPerspective(): NULL Mtx44Ptr 'm' ");
ASSERTMSGLINE(180, (fovY > 0.0) && (fovY < 180.0), "MTXPerspective(): 'fovY' out of range ");
ASSERTMSGLINE(181, 0.0f != aspect, "MTXPerspective(): 'aspect' is 0 ");
angle = (0.5f * fovY);
angle = MTXDegToRad(angle);
cot = 1.0f / tanf(angle);
m[0][0] = cot / aspect;
m[0][1] = 0.0f;
m[0][2] = 0.0f;
m[0][3] = 0.0f;
m[1][0] = 0.0f;
m[1][1] = cot;
m[1][2] = 0.0f;
m[1][3] = 0.0f;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
tmp = 1.0f / (f - n);
m[2][2] = -(n)*tmp;
m[2][3] = -(f * n) * tmp;
m[3][0] = 0.0f;
m[3][1] = 0.0f;
m[3][2] = -1.0f;
m[3][3] = 0.0f;
cot = 1 / tanf(angle);
m[0][0] = (cot / aspect);
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = 0;
m[1][0] = 0;
m[1][1] = (cot);
m[1][2] = 0;
m[1][3] = 0;
m[2][0] = 0;
m[2][1] = 0;
tmp = 1 / (f - n);
m[2][2] = (-n * tmp);
m[2][3] = (tmp * -(f * n));
m[3][0] = 0;
m[3][1] = 0;
m[3][2] = -1;
m[3][3] = 0;
}
void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f)
{
f32 tmp = 1.0f / (r - l);
m[0][0] = 2.0f * tmp;
m[0][1] = 0.0f;
m[0][2] = 0.0f;
m[0][3] = -(r + l) * tmp;
tmp = 1.0f / (t - b);
m[1][0] = 0.0f;
m[1][1] = 2.0f * tmp;
m[1][2] = 0.0f;
m[1][3] = -(t + b) * tmp;
m[2][0] = 0.0f;
m[2][1] = 0.0f;
tmp = 1.0f / (f - n);
m[2][2] = -(1.0f) * tmp;
m[2][3] = -(f)*tmp;
m[3][0] = 0.0f;
m[3][1] = 0.0f;
m[3][2] = 0.0f;
m[3][3] = 1.0f;
void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f) {
f32 tmp;
ASSERTMSGLINE(254, m, "MTXOrtho(): NULL Mtx44Ptr 'm' ");
ASSERTMSGLINE(255, t != b, "MTXOrtho(): 't' and 'b' clipping planes are equal ");
ASSERTMSGLINE(256, l != r, "MTXOrtho(): 'l' and 'r' clipping planes are equal ");
ASSERTMSGLINE(257, n != f, "MTXOrtho(): 'n' and 'f' clipping planes are equal ");
tmp = 1 / (r - l);
m[0][0] = 2 * tmp;
m[0][1] = 0;
m[0][2] = 0;
m[0][3] = (tmp * -(r + l));
tmp = 1 / (t - b);
m[1][0] = 0;
m[1][1] = 2 * tmp;
m[1][2] = 0;
m[1][3] = (tmp * -(t + b));
m[2][0] = 0;
m[2][1] = 0;
tmp = 1 / (f - n);
m[2][2] = (-1 * tmp);
m[2][3] = (-f * tmp);
m[3][0] = 0;
m[3][1] = 0;
m[3][2] = 0;
m[3][3] = 1;
}
#ifdef GEKKO
asm void PSMTX44Copy(register Mtx44 src, register Mtx44 dest)
{
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc;
psq_l fp1, 0(src), 0, 0;
psq_st fp1, 0(dest), 0, 0;
@ -95,5 +111,6 @@ asm void PSMTX44Copy(register Mtx44 src, register Mtx44 dest)
psq_l fp1, 0x38(src), 0, 0;
psq_st fp1, 0x38(dest), 0, 0;
blr;
#endif // clang-format on
// clang-format on
}
#endif

View file

@ -1,4 +1,5 @@
#include "dolphin/mtx.h"
#include "dolphin/gx/GXPriv.h"
#include "math.h"
#define R_RET fp1
@ -15,9 +16,19 @@
#define FP12 fp12
#define FP13 fp13
void C_VECAdd(const Vec *a, const Vec *b, Vec *c) {
ASSERTMSGLINE(0x57, a, "VECAdd(): NULL VecPtr 'a' ");
ASSERTMSGLINE(0x58, b, "VECAdd(): NULL VecPtr 'b' ");
ASSERTMSGLINE(0x59, c, "VECAdd(): NULL VecPtr 'ab' ");
c->x = a->x + b->x;
c->y = a->y + b->y;
c->z = a->z + b->z;
}
#ifdef GEKKO
asm void PSVECAdd(const register Vec *vec1, const register Vec *vec2, register Vec *ret)
{
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc;
psq_l FP2, 0(vec1), 0, 0;
psq_l FP4, 0(vec2), 0, 0;
@ -28,12 +39,23 @@ asm void PSVECAdd(const register Vec *vec1, const register Vec *vec2, register V
ps_add FP7, FP3, FP5;
psq_st FP7, 8(ret), 1, 0;
blr
#endif // clang-format on
// clang-format on
}
#endif
void C_VECSubtract(const Vec *a, const Vec *b, Vec *c) {
ASSERTMSGLINE(0x9C, a, "VECSubtract(): NULL VecPtr 'a' ");
ASSERTMSGLINE(0x9D, b, "VECSubtract(): NULL VecPtr 'b' ");
ASSERTMSGLINE(0x9E, c, "VECSubtract(): NULL VecPtr 'a_b' ");
c->x = a->x - b->x;
c->y = a->y - b->y;
c->z = a->z - b->z;
}
#ifdef GEKKO
asm void PSVECSubtract(const register Vec *vec1, const register Vec *vec2, register Vec *ret)
{
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc;
psq_l FP2, 0(vec1), 0, 0;
psq_l FP4, 0(vec2), 0, 0;
@ -44,22 +66,9 @@ asm void PSVECSubtract(const register Vec *vec1, const register Vec *vec2, regis
ps_sub FP7, FP3, FP5;
psq_st FP7, 8(ret), 1, 0;
blr
#endif // clang-format on
}
asm void PSVECScale(register const Vec *src, register Vec *dst, register f32 scale)
{
#ifdef __MWERKS__ // clang-format off
nofralloc
psq_l f0, 0(src), 0, 0
psq_l f2, 8(src), 1, 0
ps_muls0 f0, f0, f1
psq_st f0, 0(dst), 0, 0
ps_muls0 f0, f2, f1
psq_st f0, 8(dst), 1, 0
blr
#endif // clang-format on
// clang-format on
}
#endif
void C_VECScale(const Vec *src, Vec *dst, f32 scale)
{
@ -71,9 +80,39 @@ void C_VECScale(const Vec *src, Vec *dst, f32 scale)
dst->z = src->z * s;
}
#ifdef GEKKO
asm void PSVECScale(register const Vec *src, register Vec *dst, register f32 scale)
{
#// clang-format off
nofralloc
psq_l f0, 0(src), 0, 0
psq_l f2, 8(src), 1, 0
ps_muls0 f0, f0, f1
psq_st f0, 0(dst), 0, 0
ps_muls0 f0, f2, f1
psq_st f0, 8(dst), 1, 0
blr
// clang-format on
}
#endif
void C_VECNormalize(const Vec *src, Vec *unit) {
f32 mag;
ASSERTMSGLINE(0x127, src, "VECNormalize(): NULL VecPtr 'src' ");
ASSERTMSGLINE(0x128, unit, "VECNormalize(): NULL VecPtr 'unit' ");
mag = (src->z * src->z) + ((src->x * src->x) + (src->y * src->y));
ASSERTMSGLINE(0x12D, 0.0f != mag, "VECNormalize(): zero magnitude vector ");
mag = 1.0f/ sqrtf(mag);
unit->x = src->x * mag;
unit->y = src->y * mag;
unit->z = src->z * mag;
}
#ifdef GEKKO
void PSVECNormalize(const register Vec *vec1, register Vec *ret)
{
#ifdef __MWERKS__ // clang-format off
// clang-format off
register f32 half = 0.5f;
register f32 three = 3.0f;
register f32 xx_zz, xx_yy;
@ -96,43 +135,60 @@ void PSVECNormalize(const register Vec *vec1, register Vec *ret)
ps_muls0 FP3, FP3, ret_sqrt;
psq_st FP3, 8(ret), 1, 0;
}
#endif // clang-format on
// clang-format on
}
#endif
f32 C_VECSquareMag(const Vec *v) {
f32 sqmag;
ASSERTMSGLINE(0x182, v, "VECMag(): NULL VecPtr 'v' ");
sqmag = v->z * v->z + ((v->x * v->x) + (v->y * v->y));
return sqmag;
}
#ifdef GEKKO
asm f32 PSVECSquareMag(register const Vec *v) {
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc
psq_l f0, 0(v), 0, 0
ps_mul f0, f0, f0
lfs f1, 8(v)
ps_madd f1, f1, f1, f0
ps_sum0 f1, f1, f0, f0
blr
#endif // clang-format on
blr
// clang-format on
}
#endif
f32 C_VECMag(const Vec *v) {
return sqrtf(C_VECSquareMag(v));
}
#ifdef GEKKO
f32 PSVECMag(const register Vec *v)
{
register f32 v_xy, v_zz, square_mag;
register f32 ret_mag, n_0, n_1;
register f32 three, half, zero;
#ifdef __MWERKS__ // clang-format off
// clang-format off
asm {
psq_l v_xy, 0(v), 0, 0
ps_mul v_xy, v_xy, v_xy
lfs v_zz, 8(v)
ps_madd square_mag, v_zz, v_zz, v_xy
}
#endif // clang-format on
// clang-format on
half = 0.5f;
#ifdef __MWERKS__ // clang-format off
// clang-format off
asm {
ps_sum0 square_mag, square_mag, v_xy, v_xy
frsqrte ret_mag, square_mag
}
#endif // clang-format on
// clang-format on
three = 3.0f;
#ifdef __MWERKS__ // clang-format off
// clang-format off
asm {
fmuls n_0, ret_mag, ret_mag
fmuls n_1, ret_mag, half
@ -141,13 +197,24 @@ asm {
fsel ret_mag, ret_mag, ret_mag, square_mag
fmuls square_mag, square_mag, ret_mag
}
#endif // clang-format on
// clang-format on
return square_mag;
}
#endif
f32 C_VECDotProduct(const Vec *a, const Vec *b) {
f32 dot;
ASSERTMSGLINE(0x1D1, a, "VECDotProduct(): NULL VecPtr 'a' ");
ASSERTMSGLINE(0x1D2, b, "VECDotProduct(): NULL VecPtr 'b' ");
dot = (a->z * b->z) + ((a->x * b->x) + (a->y * b->y));
return dot;
}
#ifdef GEKKO
asm f32 PSVECDotProduct(const register Vec *vec1, const register Vec *vec2)
{
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc;
psq_l f2, 4(r3), 0, 0 /* qr0 */
psq_l f3, 4(r4), 0, 0 /* qr0 */
@ -156,13 +223,30 @@ asm f32 PSVECDotProduct(const register Vec *vec1, const register Vec *vec2)
psq_l f4, 0(r4), 0, 0 /* qr0 */
ps_madd f3, f5, f4, f2
ps_sum0 f1, f3, f2, f2
blr
#endif // clang-format on
blr
// clang-format on
}
#endif
void C_VECCrossProduct(const Vec *a, const Vec *b, Vec *axb) {
Vec vTmp;
ASSERTMSGLINE(0x20F, a, "VECCrossProduct(): NULL VecPtr 'a' ");
ASSERTMSGLINE(0x210, b, "VECCrossProduct(): NULL VecPtr 'b' ");
ASSERTMSGLINE(0x211, axb, "VECCrossProduct(): NULL VecPtr 'axb' ");
vTmp.x = (a->y * b->z) - (a->z * b->y);
vTmp.y = (a->z * b->x) - (a->x * b->z);
vTmp.z = (a->x * b->y) - (a->y * b->x);
axb->x = vTmp.x;
axb->y = vTmp.y;
axb->z = vTmp.z;
}
#ifdef GEKKO
asm void PSVECCrossProduct(register const Vec *a, register const Vec *b, register Vec *axb)
{
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc
psq_l f1, 0(b), 0, 0
lfs f2, 8(a)
@ -178,9 +262,10 @@ asm void PSVECCrossProduct(register const Vec *a, register const Vec *b, registe
psq_st f9, 0(axb), 1, 0
ps_neg f10, f10
psq_st f10, 4(axb), 0, 0
blr
#endif // clang-format on
blr
// clang-format on
}
#endif
void C_VECHalfAngle(const Vec *a, const Vec *b, Vec *half)
{
@ -229,8 +314,18 @@ void C_VECReflect(const Vec *src, const Vec *normal, Vec *dst)
VECNormalize(dst, dst);
}
f32 C_VECSquareDistance(const Vec *a, const Vec *b) {
Vec diff;
diff.x = a->x - b->x;
diff.y = a->y - b->y;
diff.z = a->z - b->z;
return (diff.z * diff.z) + ((diff.x * diff.x) + (diff.y * diff.y));
}
#ifdef GEKKO
asm f32 PSVECSquareDistance(register const Vec *a, register const Vec *b) {
#ifdef __MWERKS__ // clang-format off
// clang-format off
nofralloc
psq_l f0, 4(a), 0, 0
psq_l f1, 4(b), 0, 0
@ -241,10 +336,16 @@ asm f32 PSVECSquareDistance(register const Vec *a, register const Vec *b) {
ps_sub f0, f0, f1
ps_madd f1, f0, f0, f2
ps_sum0 f1, f1, f2, f2
blr
#endif // clang-format on
blr
// clang-format on
}
#endif
f32 C_VECDistance(const Vec *a, const Vec *b) {
return sqrtf(C_VECSquareDistance(a, b));
}
#ifdef GEKKO
f32 PSVECDistance(register const Vec *a, register const Vec *b)
{
@ -252,7 +353,7 @@ f32 PSVECDistance(register const Vec *a, register const Vec *b)
register f32 three_c;
register f32 dist;
#ifdef __MWERKS__ // clang-format off
// clang-format off
asm {
psq_l f0, 4(a), 0, 0 /* qr0 */
psq_l f1, 4(b), 0, 0 /* qr0 */
@ -283,5 +384,6 @@ f32 PSVECDistance(register const Vec *a, register const Vec *b)
}
return dist;
#endif // clang-format on
// clang-format on
}
#endif

View file

@ -19,14 +19,22 @@ extern char _db_stack_end[];
extern char *__OSResetSWInterruptHandler[];
#ifdef TARGET_PC
vu16 __OSDeviceCode;
#else
vu16 __OSDeviceCode : (OS_BASE_CACHED | 0x30E6);
#endif
static DVDDriveInfo DriveInfo ATTRIBUTE_ALIGN(32);
static DVDCommandBlock DriveBlock;
static OSBootInfo *BootInfo;
static u32 *BI2DebugFlag;
static u32 *BI2DebugFlagHolder;
#ifdef _MSC_VER
BOOL __OSIsGcam = FALSE;
#else
__declspec(weak) BOOL __OSIsGcam = FALSE;
#endif
static f64 ZeroF;
static f32 ZeroPS[2];
static BOOL AreWeInitialized = FALSE;
@ -56,6 +64,7 @@ void OSDefaultExceptionHandler(__OSException exception, OSContext *context);
extern BOOL __DBIsExceptionMarked(__OSException);
static void OSExceptionInit(void);
#ifdef __MWERKS__
/* clang-format off */
asm void __OSFPRInit(void)
{
@ -143,6 +152,7 @@ SkipPairedSingles:
blr
}
/* clang-format on */
#endif
u32 OSGetConsoleType()
{
@ -155,8 +165,8 @@ u32 OSGetConsoleType()
void *__OSSavedRegionStart;
void *__OSSavedRegionEnd;
extern u32 BOOT_REGION_START : 0x812FDFF0; //(*(u32 *)0x812fdff0)
extern u32 BOOT_REGION_END : 0x812FDFEC; //(*(u32 *)0x812fdfec)
extern u32 BOOT_REGION_START AT_ADDRESS(0x812FDFF0); //(*(u32 *)0x812fdff0)
extern u32 BOOT_REGION_END AT_ADDRESS(0x812FDFEC); //(*(u32 *)0x812fdfec)
void ClearArena(void)
{
@ -477,6 +487,7 @@ static void OSExceptionInit(void)
DBPrintf("Exceptions initialized...\n");
}
#ifdef __MWERKS__
static asm void __OSDBIntegrator(void)
{
/* clang-format off */
@ -505,6 +516,7 @@ entry __OSDBJUMPEND
/* clang-format on */
}
#endif
__OSExceptionHandler __OSSetExceptionHandler(__OSException exception, __OSExceptionHandler handler)
{
@ -519,6 +531,7 @@ __OSExceptionHandler __OSGetExceptionHandler(__OSException exception)
return OSExceptionTable[exception];
}
#ifdef __MWERKS__
static asm void OSExceptionVector(void)
{
/* clang-format off */
@ -603,8 +616,10 @@ entry __OSEVEnd
nop
/* clang-format on */
}
#endif
void __OSUnhandledException(__OSException exception, OSContext *context, u32 dsisr, u32 dar);
#ifdef __MWERKS__
asm void OSDefaultExceptionHandler(register __OSException exception, register OSContext *context)
{
/* clang-format off */
@ -631,6 +646,7 @@ void __OSPSInit(void)
}
// clang-format on
}
#endif
#define DI_CONFIG_IDX 0x9
#define DI_CONFIG_CONFIG_MASK 0xFF

View file

@ -1,6 +1,7 @@
#include <dolphin.h>
#include <dolphin/os.h>
#include <dolphin/os/OSPriv.h>
#include <stdlib.h>
#define ALIGNMENT 32
@ -137,6 +138,9 @@ static long DLSize(struct Cell *list)
void *OSAllocFromHeap(int heap, unsigned long size)
{
#ifdef TARGET_PC
return malloc(size);
#endif
struct HeapDesc *hd;
struct Cell *cell;
struct Cell *newCell;
@ -163,7 +167,6 @@ void *OSAllocFromHeap(int heap, unsigned long size)
return NULL;
}
ASSERTMSG1(0x168, !((s32)cell & 0x1F), "OSAllocFromHeap(): heap is broken.");
ASSERTMSG1(0x169, cell->hd == NULL, "OSAllocFromHeap(): heap is broken.");
leftoverSize = cell->size - size;
if (leftoverSize < 0x40U) {
@ -201,12 +204,12 @@ void *OSAllocFixed(void **rstart, void **rend)
void *end;
void *cellEnd;
start = (void *)((*(u32 *)rstart) & ~((32) - 1));
end = (void *)((*(u32 *)rend + 0x1FU) & ~((32) - 1));
start = (void *)((*(uintptr_t *)rstart) & ~((32) - 1));
end = (void *)((*(uintptr_t *)rend + 0x1FU) & ~((32) - 1));
ASSERTMSG1(0x1B0, HeapArray, "OSAllocFixed(): heap is not initialized.");
ASSERTMSG1(0x1B1, (u32)start < (u32)end, "OSAllocFixed(): invalid range.");
ASSERTMSG1(0x1B3, ((u32)ArenaStart <= (u32)start) && ((u32)end <= (u32)ArenaEnd), "OSAllocFixed(): invalid range.");
ASSERTMSG1(0x1B1, (uintptr_t)start < (uintptr_t)end, "OSAllocFixed(): invalid range.");
ASSERTMSG1(0x1B3, ((uintptr_t)ArenaStart <= (uintptr_t)start) && ((uintptr_t)start <= (uintptr_t)ArenaEnd), "OSAllocFixed(): invalid range.");
for (i = 0; i < NumHeaps; i++) {
hd = &HeapArray[i];
@ -243,7 +246,7 @@ void *OSAllocFixed(void **rstart, void **rend)
ASSERTMSG(0x1F3, MINOBJSIZE <= (char *)cellEnd - (char *)end);
newCell = (struct Cell *)end;
newCell->size = (s32)((char *)cellEnd - (char *)end);
newCell->size = (uintptr_t)((char *)cellEnd - (char *)end);
newCell->next = cell->next;
if (newCell->next) {
newCell->next->prev = newCell;
@ -290,13 +293,16 @@ void *OSAllocFixed(void **rstart, void **rend)
ASSERTMSG(0x225, OFFSET(start, ALIGNMENT) == 0);
ASSERTMSG(0x226, OFFSET(end, ALIGNMENT) == 0);
ASSERTMSG(0x227, start < end);
*(u32 *)rstart = (u32)start;
*(u32 *)rend = (u32)end;
return (void *)*(u32 *)rstart;
*(uintptr_t *)rstart = (uintptr_t)start;
*(uintptr_t *)rend = (uintptr_t)end;
return (void *)*(uintptr_t *)rstart;
}
void OSFreeToHeap(int heap, void *ptr)
{
#ifdef TARGET_PC
free(ptr);
#else
struct HeapDesc *hd;
struct Cell *cell;
@ -306,10 +312,10 @@ void OSFreeToHeap(int heap, void *ptr)
ASSERTMSG1(0x241, HeapArray[heap].size >= 0, "OSFreeToHeap(): invalid heap handle.");
cell = (void *)((u32)ptr - 0x20);
hd = &HeapArray[heap];
ASSERTMSG1(0x246, cell->hd == hd, "OSFreeToHeap(): invalid pointer.");
ASSERTMSG1(0x247, DLLookup(hd->allocated, cell), "OSFreeToHeap(): invalid pointer.");
hd->allocated = DLExtract(hd->allocated, cell);
hd->free = DLInsert(hd->free, cell);
#endif
}
int OSSetCurrentHeap(int heap)
@ -331,8 +337,8 @@ void *OSInitAlloc(void *arenaStart, void *arenaEnd, int maxHeaps)
struct HeapDesc *hd;
ASSERTMSG1(0x283, maxHeaps > 0, "OSInitAlloc(): invalid number of heaps.");
ASSERTMSG1(0x285, (u32)arenaStart < (u32)arenaEnd, "OSInitAlloc(): invalid range.");
ASSERTMSG1(0x288, maxHeaps <= (((u32)arenaEnd - (u32)arenaStart) / 24U), "OSInitAlloc(): too small range.");
ASSERTMSG1(0x285, (uintptr_t)arenaStart < (uintptr_t)arenaEnd, "OSInitAlloc(): invalid range.");
ASSERTMSG1(0x288, maxHeaps <= (((uintptr_t)arenaEnd - (uintptr_t)arenaStart) / 24U), "OSInitAlloc(): too small range.");
arraySize = maxHeaps * sizeof(struct HeapDesc);
HeapArray = arenaStart;
NumHeaps = maxHeaps;
@ -343,34 +349,34 @@ void *OSInitAlloc(void *arenaStart, void *arenaEnd, int maxHeaps)
hd->free = hd->allocated = 0;
}
__OSCurrHeap = -1;
arenaStart = (void *)((u32)((char *)HeapArray + arraySize));
arenaStart = (void *)(((u32)arenaStart + 0x1F) & 0xFFFFFFE0);
arenaStart = (void *)((uintptr_t)((char *)HeapArray + arraySize));
arenaStart = (void *)(((uintptr_t)arenaStart + 0x1F) & ~0x1F);
ArenaStart = arenaStart;
ArenaEnd = (void *)((u32)arenaEnd & 0xFFFFFFE0);
ASSERTMSG1(0x2A4, ((u32)ArenaEnd - (u32)ArenaStart) >= 0x40U, "OSInitAlloc(): too small range.");
ArenaEnd = (void *)((uintptr_t)arenaEnd & ~0x1F);
ASSERTMSG1(0x2A4, ((uintptr_t)ArenaEnd - (uintptr_t)ArenaStart) >= 0x40U, "OSInitAlloc(): too small range.");
return arenaStart;
}
int OSCreateHeap(void *start, void *end)
uintptr_t OSCreateHeap(void *start, void *end)
{
int heap;
s32 heap;
struct HeapDesc *hd;
struct Cell *cell;
ASSERTMSG1(0x2BD, HeapArray, "OSCreateHeap(): heap is not initialized.");
ASSERTMSG1(0x2BE, (u32)start < (u32)end, "OSCreateHeap(): invalid range.");
ASSERTMSG1(0x2BE, start < end, "OSCreateHeap(): invalid range.");
start = (void *)(((u32)start + 0x1FU) & ~((32) - 1));
end = (void *)(((u32)end) & ~((32) - 1));
start = (void *)(((uintptr_t)start + 0x1FU) & ~((32) - 1));
end = (void *)(((uintptr_t)end) & ~((32) - 1));
ASSERTMSG1(0x2C1, (u32)start < (u32)end, "OSCreateHeap(): invalid range.");
ASSERTMSG1(0x2C3, (u32)ArenaStart <= (u32)start && (u32)end <= (u32)ArenaEnd, "OSCreateHeap(): invalid range.");
ASSERTMSG1(0x2C5, ((u32)end - (u32)start) >= 0x40U, "OSCreateHeap(): too small range.");
ASSERTMSG1(0x2C1, (uintptr_t)start < (uintptr_t)end, "OSCreateHeap(): invalid range.");
ASSERTMSG1(0x2C3, (uintptr_t)ArenaStart <= (uintptr_t)start && (uintptr_t)end <= (uintptr_t)ArenaEnd, "OSCreateHeap(): invalid range.");
ASSERTMSG1(0x2C5, ((uintptr_t)end - (uintptr_t)start) >= 0x40U, "OSCreateHeap(): too small range.");
for (heap = 0; heap < NumHeaps; heap++) {
hd = &HeapArray[heap];
if (hd->size < 0) {
hd->size = (u32)end - (u32)start;
hd->size = (uintptr_t)end - (uintptr_t)start;
cell = start;
cell->prev = 0;
cell->next = 0;
@ -481,12 +487,6 @@ unsigned long OSReferentSize(void *ptr)
ASSERTMSG1(0x3BD, InRange(ptr, ArenaStart + HEADERSIZE, ArenaEnd), "OSReferentSize(): invalid pointer.");
ASSERTMSG1(0x3BE, !OFFSET(ptr, 32), "OSReferentSize(): invalid pointer.");
cell = (void *)((u32)ptr - HEADERSIZE);
ASSERTMSG1(0x3C2, cell->hd, "OSReferentSize(): invalid pointer.");
ASSERTMSG1(0x3C4, !(((u32)cell->hd - (u32)HeapArray) % 24), "OSReferentSize(): invalid pointer.");
ASSERTMSG1(0x3C6, ((u32)HeapArray <= (u32)cell->hd) && ((u32)cell->hd < (u32)((u32)HeapArray + (NumHeaps * 0x18))),
"OSReferentSize(): invalid pointer.");
ASSERTMSG1(0x3C7, cell->hd->size >= 0, "OSReferentSize(): invalid pointer.");
ASSERTMSG1(0x3C9, DLLookup(cell->hd->allocated, cell), "OSReferentSize(): invalid pointer.");
return (long)((u32)cell->size - HEADERSIZE);
}

View file

@ -3,8 +3,8 @@
#include <dolphin/os.h>
#include <dolphin/sipriv.h>
extern OSTime __OSGetSystemTime();
extern u32 VIGetCurrentLine(void);
typedef struct SIControl {
s32 chan;

View file

@ -76,7 +76,7 @@ void InitEnvelope(HsfData *arg0) {
nObj = temp_r28->count;
nMesh = temp_r28->base_idx;
}
PSMTXIdentity(sp10);
MTXIdentity(sp10);
SetMtx(arg0->root, sp10);
SetRevMtx();
}
@ -89,19 +89,19 @@ static void SetEnvelopMtx(HsfObject *arg0, HsfObject *arg1, Mtx arg2) {
s32 var_r29;
s32 i;
PSMTXTrans(spC, arg1->data.curr.pos.x, arg1->data.curr.pos.y, arg1->data.curr.pos.z);
PSMTXConcat(arg2, spC, sp3C);
MTXTrans(spC, arg1->data.curr.pos.x, arg1->data.curr.pos.y, arg1->data.curr.pos.z);
MTXConcat(arg2, spC, sp3C);
if (arg1->data.curr.rot.z) {
PSMTXRotRad(sp6C, 'z', MTXDegToRad(arg1->data.curr.rot.z));
PSMTXConcat(sp3C, sp6C, sp3C);
MTXRotRad(sp6C, 'z', MTXDegToRad(arg1->data.curr.rot.z));
MTXConcat(sp3C, sp6C, sp3C);
}
if (arg1->data.curr.rot.y) {
PSMTXRotRad(sp6C, 'y', MTXDegToRad(arg1->data.curr.rot.y));
PSMTXConcat(sp3C, sp6C, sp3C);
MTXRotRad(sp6C, 'y', MTXDegToRad(arg1->data.curr.rot.y));
MTXConcat(sp3C, sp6C, sp3C);
}
if (arg1->data.curr.rot.x) {
PSMTXRotRad(sp6C, 'x', MTXDegToRad(arg1->data.curr.rot.x));
PSMTXConcat(sp3C, sp6C, sp3C);
MTXRotRad(sp6C, 'x', MTXDegToRad(arg1->data.curr.rot.x));
MTXConcat(sp3C, sp6C, sp3C);
}
if (arg1->data.curr.scale.x != 1.0f) {
sp3C[0][0] *= arg1->data.curr.scale.x;
@ -119,7 +119,7 @@ static void SetEnvelopMtx(HsfObject *arg0, HsfObject *arg1, Mtx arg2) {
sp3C[2][2] *= arg1->data.curr.scale.z;
}
var_r29 = arg1 - arg0;
PSMTXCopy(sp3C, MtxTop[nMesh + var_r29]);
MTXCopy(sp3C, MtxTop[nMesh + var_r29]);
for (i = 0; i < arg1->data.childrenCount; i++) {
SetEnvelopMtx(arg0, arg1->data.children[i], sp3C);
}
@ -136,7 +136,7 @@ void EnvelopeProc(HsfData *arg0) {
nObj = temp_r31->count;
nMesh = temp_r31->base_idx;
temp_r29 = arg0->root;
PSMTXIdentity(sp8);
MTXIdentity(sp8);
SetEnvelopMtx(arg0->object, temp_r29, sp8);
SetEnvelopMain(arg0);
}
@ -167,7 +167,7 @@ static void SetEnvelopMain(HsfData *arg0) {
var_r31 = arg0->object;
for (Meshno = i = 0; i < arg0->objectCnt; i++, var_r31++) {
if (var_r31->type == 2) {
PSMTXInverse(MtxTop[&var_r31[nMesh] - arg0->object], MtxTop[Meshno]);
MTXInverse(MtxTop[&var_r31[nMesh] - arg0->object], MtxTop[Meshno]);
temp_r30 = var_r31->data.vertex;
temp_r28 = var_r31->data.normal;
if (var_r31->data.unk120[0] != 0) {
@ -233,37 +233,37 @@ static void SetEnvelop(HsfCenv *arg0) {
temp_r31 = &Vertextop[temp_r21];
temp_r22 = &normenv[temp_r18];
temp_r26 = &normtop[temp_r18];
PSMTXConcat(MtxTop[nMesh + var_r27->target], MtxTop[nMesh + nObj + nObj * Meshno + var_r27->target], sp140);
PSMTXConcat(MtxTop[Meshno], sp140, sp1A0);
MTXConcat(MtxTop[nMesh + var_r27->target], MtxTop[nMesh + nObj + nObj * Meshno + var_r27->target], sp140);
MTXConcat(MtxTop[Meshno], sp140, sp1A0);
Hu3DMtxScaleGet(&sp1A0[0], &sp14);
if (sp14.x != 1.0f || sp14.y != 1.0f || sp14.z != 1.0f) {
PSMTXScale(spE0, 1.0 / sp14.x, 1.0 / sp14.y, 1.0 / sp14.z);
PSMTXConcat(spE0, sp1A0, sp170);
PSMTXInvXpose(sp170, sp170);
MTXScale(spE0, 1.0 / sp14.x, 1.0 / sp14.y, 1.0 / sp14.z);
MTXConcat(spE0, sp1A0, sp170);
MTXInvXpose(sp170, sp170);
} else {
PSMTXInvXpose(sp1A0, sp170);
MTXInvXpose(sp1A0, sp170);
}
if (var_r27->posCnt == 1) {
PSMTXMultVec(sp1A0, temp_r31, temp_r28);
PSMTXMultVec(sp170, temp_r26, temp_r22);
MTXMultVec(sp1A0, temp_r31, temp_r28);
MTXMultVec(sp170, temp_r26, temp_r22);
} else if (var_r27->posCnt <= 6) {
PSMTXMultVecArray(sp1A0, temp_r31, temp_r28, var_r27->posCnt);
PSMTXMultVecArray(sp170, temp_r26, temp_r22, var_r27->normalCnt);
MTXMultVecArray(sp1A0, temp_r31, temp_r28, var_r27->posCnt);
MTXMultVecArray(sp170, temp_r26, temp_r22, var_r27->normalCnt);
} else {
PSMTXReorder(sp1A0, (ROMtxPtr) sp140);
PSMTXReorder(sp170, (ROMtxPtr) sp110);
PSMTXROMultVecArray((ROMtxPtr) sp140, temp_r31, temp_r28, var_r27->posCnt);
PSMTXROMultVecArray((ROMtxPtr) sp110, temp_r26, temp_r22, var_r27->normalCnt);
MTXReorder(sp1A0, (ROMtxPtr) sp140);
MTXReorder(sp170, (ROMtxPtr) sp110);
MTXROMultVecArray((ROMtxPtr) sp140, temp_r31, temp_r28, var_r27->posCnt);
MTXROMultVecArray((ROMtxPtr) sp110, temp_r26, temp_r22, var_r27->normalCnt);
}
}
var_r20 = arg0->dualData;
for (i = 0; i < arg0->dualCount; i++, var_r20++) {
spC = var_r20->target1;
sp8 = var_r20->target2;
PSMTXConcat(MtxTop[nMesh + spC], MtxTop[nMesh + nObj + nObj * Meshno + spC], sp140);
PSMTXConcat(MtxTop[Meshno], sp140, sp1A0);
PSMTXConcat(MtxTop[nMesh + sp8], MtxTop[nMesh + nObj + nObj * Meshno + sp8], sp140);
PSMTXConcat(MtxTop[Meshno], sp140, (float (*)[4]) &spB0[0]);
MTXConcat(MtxTop[nMesh + spC], MtxTop[nMesh + nObj + nObj * Meshno + spC], sp140);
MTXConcat(MtxTop[Meshno], sp140, sp1A0);
MTXConcat(MtxTop[nMesh + sp8], MtxTop[nMesh + nObj + nObj * Meshno + sp8], sp140);
MTXConcat(MtxTop[Meshno], sp140, (float (*)[4]) &spB0[0]);
var_r30 = var_r20->weight;
for (j = 0; j < var_r20->weightCnt; j++, var_r30++) {
temp_r18 = var_r30->normal;
@ -316,32 +316,32 @@ static void SetEnvelop(HsfCenv *arg0) {
var_r29[2][2] = sp110[2][2] + sp140[2][2];
var_r29[2][3] = sp110[2][3] + sp140[2][3];
if (var_r29 == sp50) {
PSMTXCopy(sp50, sp80);
MTXCopy(sp50, sp80);
}
Hu3DMtxScaleGet(&sp80[0], &sp14);
if (sp14.x != 1.0f || sp14.y != 1.0f || sp14.z != 1.0f) {
PSMTXScale(spE0, 1.0 / sp14.x, 1.0 / sp14.y, 1.0 / sp14.z);
PSMTXConcat(spE0, sp80, sp110);
PSMTXInvXpose(sp110, sp110);
MTXScale(spE0, 1.0 / sp14.x, 1.0 / sp14.y, 1.0 / sp14.z);
MTXConcat(spE0, sp80, sp110);
MTXInvXpose(sp110, sp110);
} else {
PSMTXInvXpose(sp80, sp110);
MTXInvXpose(sp80, sp110);
}
if (var_r30->posCnt == 1) {
PSMTXMultVec(sp80, temp_r31, temp_r28);
MTXMultVec(sp80, temp_r31, temp_r28);
} else if (var_r30->posCnt <= 6) {
PSMTXMultVecArray(sp80, temp_r31, temp_r28, var_r30->posCnt);
MTXMultVecArray(sp80, temp_r31, temp_r28, var_r30->posCnt);
} else {
PSMTXReorder(sp80, (ROMtxPtr) sp140);
PSMTXROMultVecArray((ROMtxPtr) sp140, temp_r31, temp_r28, var_r30->posCnt);
MTXReorder(sp80, (ROMtxPtr) sp140);
MTXROMultVecArray((ROMtxPtr) sp140, temp_r31, temp_r28, var_r30->posCnt);
}
if (var_r30->normalCnt != 0) {
if (var_r30->normalCnt == 1) {
PSMTXMultVec(sp110, temp_r26, temp_r22);
MTXMultVec(sp110, temp_r26, temp_r22);
} else if (var_r30->normalCnt <= 6) {
PSMTXMultVecArray(sp110, temp_r26, temp_r22, var_r30->normalCnt);
MTXMultVecArray(sp110, temp_r26, temp_r22, var_r30->normalCnt);
} else {
PSMTXReorder(sp110, (ROMtxPtr) sp140);
PSMTXROMultVecArray((ROMtxPtr) sp140, temp_r26, temp_r22, var_r30->normalCnt);
MTXReorder(sp110, (ROMtxPtr) sp140);
MTXROMultVecArray((ROMtxPtr) sp140, temp_r26, temp_r22, var_r30->normalCnt);
}
}
}
@ -359,11 +359,11 @@ static void SetEnvelop(HsfCenv *arg0) {
sp20.x = sp20.y = sp20.z = 0.0f;
sp10 = 0;
for (j = 0; j < var_r19->weightCnt; j++, var_r25++) {
PSMTXConcat(MtxTop[nMesh + var_r25->target], MtxTop[nMesh + nObj + nObj * Meshno + var_r25->target], sp1A0);
PSMTXConcat(MtxTop[Meshno], sp1A0, sp1A0);
PSMTXInvXpose(sp1A0, sp170);
PSMTXMultVec(sp1A0, temp_r31, &sp44);
PSMTXMultVec(sp170, temp_r26, &sp2C);
MTXConcat(MtxTop[nMesh + var_r25->target], MtxTop[nMesh + nObj + nObj * Meshno + var_r25->target], sp1A0);
MTXConcat(MtxTop[Meshno], sp1A0, sp1A0);
MTXInvXpose(sp1A0, sp170);
MTXMultVec(sp1A0, temp_r31, &sp44);
MTXMultVec(sp170, temp_r26, &sp2C);
sp44.x = var_r25->value * (sp44.x - temp_r31->x);
sp44.y = var_r25->value * (sp44.y - temp_r31->y);
sp44.z = var_r25->value * (sp44.z - temp_r31->z);
@ -410,18 +410,18 @@ static void SetMtx(HsfObject *arg0, Mtx arg1) {
arg0->data.base.scale.y = temp_r3->transform.scale.y;
arg0->data.base.scale.z = temp_r3->transform.scale.z;
}
PSMTXTrans(spFC, arg0->data.base.pos.x, arg0->data.base.pos.y, arg0->data.base.pos.z);
PSMTXScale(spCC, arg0->data.base.scale.x, arg0->data.base.scale.y, arg0->data.base.scale.z);
PSMTXConcat(arg1, spFC, spFC);
PSMTXRotRad(sp9C, 'z', MTXDegToRad(arg0->data.base.rot.z));
PSMTXConcat(spFC, sp9C, spFC);
PSMTXRotRad(sp9C, 'y', MTXDegToRad(arg0->data.base.rot.y));
PSMTXConcat(spFC, sp9C, spFC);
PSMTXRotRad(sp9C, 'x', MTXDegToRad(arg0->data.base.rot.x));
PSMTXConcat(spFC, sp9C, spFC);
PSMTXConcat(spFC, spCC, spFC);
MTXTrans(spFC, arg0->data.base.pos.x, arg0->data.base.pos.y, arg0->data.base.pos.z);
MTXScale(spCC, arg0->data.base.scale.x, arg0->data.base.scale.y, arg0->data.base.scale.z);
MTXConcat(arg1, spFC, spFC);
MTXRotRad(sp9C, 'z', MTXDegToRad(arg0->data.base.rot.z));
MTXConcat(spFC, sp9C, spFC);
MTXRotRad(sp9C, 'y', MTXDegToRad(arg0->data.base.rot.y));
MTXConcat(spFC, sp9C, spFC);
MTXRotRad(sp9C, 'x', MTXDegToRad(arg0->data.base.rot.x));
MTXConcat(spFC, sp9C, spFC);
MTXConcat(spFC, spCC, spFC);
temp_r25 = arg0 - objtop;
PSMTXCopy(spFC, MtxTop[nMesh + temp_r25]);
MTXCopy(spFC, MtxTop[nMesh + temp_r25]);
for (i = 0; i < arg0->data.childrenCount; i++) {
SetMtx(arg0->data.children[i], spFC);
}
@ -438,12 +438,12 @@ static void SetRevMtx(void) {
var_r29 = CurHsf->object;
for (var_r28 = i = 0; i < CurHsf->objectCnt; i++, var_r29++) {
if (var_r29->type == 2) {
PSMTXCopy(MtxTop[nMesh + i], sp8);
MTXCopy(MtxTop[nMesh + i], sp8);
for (var_r30 = 0; var_r30 < CurHsf->objectCnt; var_r30++) {
PSMTXInverse(MtxTop[nMesh + var_r30], sp38);
PSMTXConcat(sp38, sp8, MtxTop[nMesh + nObj + nObj * var_r28 + var_r30]);
MTXInverse(MtxTop[nMesh + var_r30], sp38);
MTXConcat(sp38, sp8, MtxTop[nMesh + nObj + nObj * var_r28 + var_r30]);
}
PSMTXInverse(MtxTop[nMesh + i], sp8);
MTXInverse(MtxTop[nMesh + i], sp8);
var_r28++;
}
}

View file

@ -106,4 +106,9 @@ void THPGXYuv2RgbDraw(u32 *yImage, u32 *uImage, u32 *vImage, s16 x, s16 y, s16 t
GXPosition3s16(x, y + polyHeight, 0);
GXTexCoord2s16(0, 1);
GXEnd();
#ifdef TARGET_PC
GXDestroyTexObj(&sp54);
GXDestroyTexObj(&sp34);
GXDestroyTexObj(&sp14);
#endif
}

View file

@ -478,7 +478,7 @@ static void UpdateExplode(omObjData *arg0) {
break;
case 2:
BoardCameraRotGet(&sp8);
PSMTXRotRad(sp20, 'x', MTXDegToRad(sp8.x + 10.0f));
MTXRotRad(sp20, 'x', MTXDegToRad(sp8.x + 10.0f));
BoardModelMtxSet(temp_r30->unk02, &sp20);
BoardModelRotSet(temp_r30->unk02, 0.0f, 0.0f, 0.0f);
sp14.x = arg0->scale.x;

View file

@ -1035,7 +1035,7 @@ static void ExecItemSwap(void)
}
BoardModelRotGet(suitMdl, &sp3C);
Hu3DCameraSet(0, sp108);
PSMTXInverse(sp108, spD8);
MTXInverse(sp108, spD8);
Hu3DMtxRotGet(spD8, &sp48);
sp3C.x = sp48.x;
for (var_r31 = 0; var_r31 < var_r28 / 2; var_r31++) {

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,11 @@
#include "game/board/pause.h"
#include "game/audio.h"
#include "game/board/main.h"
#include "game/board/model.h"
#include "game/board/player.h"
#include "game/board/roll.h"
#include "game/board/star.h"
#include "game/board/ui.h"
#include "game/data.h"
#include "game/flag.h"
#include "game/gamework_data.h"
@ -11,12 +17,6 @@
#include "game/sprite.h"
#include "game/window.h"
#include "game/wipe.h"
#include "game/board/main.h"
#include "game/board/model.h"
#include "game/board/player.h"
#include "game/board/roll.h"
#include "game/board/star.h"
#include "game/board/ui.h"
typedef struct {
struct {
@ -39,7 +39,6 @@ typedef struct {
u32 unk0C;
} ConfigWork;
static void PauseExit(void);
static void PauseProcess(void);
static void CreatePauseScreen(void);
@ -91,56 +90,25 @@ static s16 controlWin = -1;
static s16 quitWin = -1;
static s16 settingsWin = -1;
static s16 boxModelID[8] = {
-1, -1, -1, -1, -1, -1, -1, -1
};
static s16 boxModelID[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
static float boxPosTbl[8][2] = {
{ 120.0f, 120.0f },
{ 232.0f, 120.0f },
{ 344.0f, 120.0f },
{ 456.0f, 120.0f },
{ 120.0f, 232.0f },
{ 232.0f, 232.0f },
{ 344.0f, 232.0f },
{ 456.0f, 232.0f }
};
static float boxPosTbl[8][2] = { { 120.0f, 120.0f }, { 232.0f, 120.0f }, { 344.0f, 120.0f }, { 456.0f, 120.0f }, { 120.0f, 232.0f },
{ 232.0f, 232.0f }, { 344.0f, 232.0f }, { 456.0f, 232.0f } };
static float padConfigPosTbl[4][2] = {
{ 170.0f, 160.0f },
{ 266.0f, 160.0f },
{ 362.0f, 160.0f },
{ 458.0f, 160.0f }
};
static float padConfigPosTbl[4][2] = { { 170.0f, 160.0f }, { 266.0f, 160.0f }, { 362.0f, 160.0f }, { 458.0f, 160.0f } };
static s32 boardLogoTbl[] = {
DATA_MAKE_NUM(DATADIR_BOARD, 87),
DATA_MAKE_NUM(DATADIR_BOARD, 88),
DATA_MAKE_NUM(DATADIR_BOARD, 89),
DATA_MAKE_NUM(DATADIR_BOARD, 90),
DATA_MAKE_NUM(DATADIR_BOARD, 91),
DATA_MAKE_NUM(DATADIR_BOARD, 92),
DATA_MAKE_NUM(DATADIR_BOARD, 87),
DATA_MAKE_NUM(DATADIR_BOARD, 93),
DATA_MAKE_NUM(DATADIR_BOARD, 94)
};
static s32 boardLogoTbl[] = { DATA_MAKE_NUM(DATADIR_BOARD, 87), DATA_MAKE_NUM(DATADIR_BOARD, 88), DATA_MAKE_NUM(DATADIR_BOARD, 89),
DATA_MAKE_NUM(DATADIR_BOARD, 90), DATA_MAKE_NUM(DATADIR_BOARD, 91), DATA_MAKE_NUM(DATADIR_BOARD, 92), DATA_MAKE_NUM(DATADIR_BOARD, 87),
DATA_MAKE_NUM(DATADIR_BOARD, 93), DATA_MAKE_NUM(DATADIR_BOARD, 94) };
static float turnDigitPosTbl[] = {
145.0f, 188.0f, 285.0f, 328.0f
};
static float turnDigitPosTbl[] = { 145.0f, 188.0f, 285.0f, 328.0f };
static s32 boxMdlTbl[] = {
DATA_MAKE_NUM(DATADIR_BPAUSE, 8),
DATA_MAKE_NUM(DATADIR_BPAUSE, 9),
DATA_MAKE_NUM(DATADIR_BPAUSE, 10),
DATA_MAKE_NUM(DATADIR_BPAUSE, 11),
DATA_MAKE_NUM(DATADIR_BPAUSE, 12),
DATA_MAKE_NUM(DATADIR_BPAUSE, 13),
DATA_MAKE_NUM(DATADIR_BPAUSE, 14),
DATA_MAKE_NUM(DATADIR_BPAUSE, 15)
};
static s32 boxMdlTbl[] = { DATA_MAKE_NUM(DATADIR_BPAUSE, 8), DATA_MAKE_NUM(DATADIR_BPAUSE, 9), DATA_MAKE_NUM(DATADIR_BPAUSE, 10),
DATA_MAKE_NUM(DATADIR_BPAUSE, 11), DATA_MAKE_NUM(DATADIR_BPAUSE, 12), DATA_MAKE_NUM(DATADIR_BPAUSE, 13), DATA_MAKE_NUM(DATADIR_BPAUSE, 14),
DATA_MAKE_NUM(DATADIR_BPAUSE, 15) };
void BoardPauseStart(void) {
void BoardPauseStart(void)
{
mainProcess = HuPrcChildCreate(PauseProcess, 0x2001, 0x3800, 0, boardMainProc);
hostMdl = BoardStarHostMdlGet();
BoardModelMotionStart(hostMdl, 1, 0x40000001);
@ -151,7 +119,8 @@ void BoardPauseStart(void) {
HuPrcDestructorSet2(mainProcess, PauseExit);
}
static void PauseExit(void) {
static void PauseExit(void)
{
if (pauseQuitF == 0) {
BoardRollWinDispSet(1);
BoardRollDispSet(1);
@ -160,7 +129,8 @@ static void PauseExit(void) {
BoardLast5GfxShowSet(1);
HuAudFXPauseAll(0);
HuAudSeqPauseAll(0);
} else {
}
else {
BoardConfettiKill();
BoardAudSeqFadeOutAll();
HuAudAllStop();
@ -173,7 +143,8 @@ static void PauseExit(void) {
omSysPauseCtrl(0);
if (GWMGExplainGet()) {
_SetFlag(FLAG_ID_MAKE(0, 11));
} else {
}
else {
_ClearFlag(FLAG_ID_MAKE(0, 11));
}
if (GWPartyGet() == 0) {
@ -182,7 +153,8 @@ static void PauseExit(void) {
GWGameStat.story_pause.mg_list = GWMGListGet();
GWGameStat.story_pause.mess_speed = GWMessSpeedGet();
GWGameStat.story_pause.save_mode = GWSaveModeGet();
} else {
}
else {
GWGameStat.party_pause.explain_mg = GWMGExplainGet();
GWGameStat.party_pause.show_com_mg = GWMGShowComGet();
GWGameStat.party_pause.mg_list = GWMGListGet();
@ -192,7 +164,8 @@ static void PauseExit(void) {
mainProcess = NULL;
}
static void PauseProcess(void) {
static void PauseProcess(void)
{
s32 temp_r31;
pauseQuitF = 0;
@ -222,14 +195,16 @@ static void PauseProcess(void) {
HuPrcSleep(20);
WipeColorSet(0, 0, 0);
BoardKill();
} else {
}
else {
BoardFilterFadeOut(30);
HuPrcSleep(30);
}
HuPrcEnd();
}
void CreatePauseScreen(void) {
void CreatePauseScreen(void)
{
Mtx sp30;
Vec sp24;
Vec sp18;
@ -294,10 +269,12 @@ void CreatePauseScreen(void) {
if (GWPartyGet() == 1) {
if (GWTeamGet()) {
HuSprBankSet(pauseSprGrp, 2, 2);
} else {
}
else {
HuSprBankSet(pauseSprGrp, 2, 0);
}
} else {
}
else {
HuSprBankSet(pauseSprGrp, 2, 1);
}
for (i = 0; i < 4; i++) {
@ -334,7 +311,8 @@ void CreatePauseScreen(void) {
sp24.x = 68.0f;
if (GWBoardGet() == 3) {
sp24.y = 464.0f;
} else {
}
else {
sp24.y = 434.0f;
}
sp24.z = 1100.0f;
@ -436,7 +414,8 @@ void CreatePauseScreen(void) {
SetBoxVisible(0);
}
static void DeletePauseScreen(void) {
static void DeletePauseScreen(void)
{
ConfigWork *temp_r30;
Mtx sp8;
s32 i;
@ -461,7 +440,7 @@ static void DeletePauseScreen(void) {
HuSprGrpKill(pauseCursorPos);
pauseCursorPos = -1;
}
PSMTXIdentity(sp8);
MTXIdentity(sp8);
BoardModelLayerSet(hostMdl, hostOldLayer);
BoardModelVisibilitySet(hostMdl, 1);
BoardModelMtxSet(hostMdl, &sp8);
@ -471,7 +450,8 @@ static void DeletePauseScreen(void) {
}
}
static void SetBoxVisible(s32 arg0) {
static void SetBoxVisible(s32 arg0)
{
s32 i;
for (i = 0; i < 8; i++) {
@ -479,7 +459,8 @@ static void SetBoxVisible(s32 arg0) {
}
}
static void PauseConfigObjFunc(omObjData *arg0) {
static void PauseConfigObjFunc(omObjData *arg0)
{
ConfigWork *temp_r31;
s16 temp_r28;
s32 var_r29;
@ -578,7 +559,8 @@ static void PauseConfigObjFunc(omObjData *arg0) {
InitPauseQuit(arg0, temp_r31);
break;
}
} else {
}
else {
cursorPos = ExecPauseConfig(arg0, temp_r31);
if (temp_r28 != cursorPos) {
arg0->trans.x = -40.0f + boxPosTbl[cursorPos][0];
@ -590,7 +572,8 @@ static void PauseConfigObjFunc(omObjData *arg0) {
}
}
static void UpdatePauseText(s32 arg0) {
static void UpdatePauseText(s32 arg0)
{
s32 var_r28;
s32 j;
s32 i;
@ -603,7 +586,8 @@ static void UpdatePauseText(s32 arg0) {
if (i == GWPlayer[j].port) {
if (GWPlayer[j].com) {
var_r28 = MAKE_MESSID(16, 30);
} else {
}
else {
var_r28 = MAKE_MESSID(16, 29);
}
HuWinInsertMesSet(settingsWin, var_r28, i);
@ -615,14 +599,16 @@ static void UpdatePauseText(s32 arg0) {
case 1:
if (boxState[arg0] != 0) {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 33));
} else {
}
else {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 34));
}
break;
case 2:
if (boxState[arg0] != 0) {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 35));
} else {
}
else {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 36));
}
break;
@ -642,7 +628,8 @@ static void UpdatePauseText(s32 arg0) {
case 4:
if (boxState[arg0] != 0) {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 40));
} else {
}
else {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 41));
}
break;
@ -678,7 +665,8 @@ static void UpdatePauseText(s32 arg0) {
}
}
static void InitPauseQuit(omObjData *arg0, ConfigWork *arg1) {
static void InitPauseQuit(omObjData *arg0, ConfigWork *arg1)
{
float var_f31;
switch (arg1->unk01) {
@ -696,7 +684,8 @@ static void InitPauseQuit(omObjData *arg0, ConfigWork *arg1) {
if (quitWin != -1 && HuWinStatGet(quitWin) == 3) {
if (HuWinChoiceNowGet(quitWin) != 0) {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 51));
} else {
}
else {
HuWinMesSet(settingsWin, MAKE_MESSID(16, 50));
}
}
@ -725,7 +714,8 @@ static void InitPauseQuit(omObjData *arg0, ConfigWork *arg1) {
}
}
static void PauseQuitProcess(void) {
static void PauseQuitProcess(void)
{
WindowData *temp_r31;
float sp10[2];
float sp8[2];
@ -748,7 +738,8 @@ static void PauseQuitProcess(void) {
HuPrcEnd();
}
static void DeletePauseQuit(void) {
static void DeletePauseQuit(void)
{
if (quitWin != -1) {
HuWinExCleanup(quitWin);
quitWin = -1;
@ -757,7 +748,8 @@ static void DeletePauseQuit(void) {
quitProcess = NULL;
}
static s32 UpdatePadConfig(omObjData *arg0, ConfigWork *arg1) {
static s32 UpdatePadConfig(omObjData *arg0, ConfigWork *arg1)
{
switch (arg1->unk01) {
case 0:
CreatePadConfig(arg0, arg1);
@ -777,12 +769,14 @@ static s32 UpdatePadConfig(omObjData *arg0, ConfigWork *arg1) {
}
if (arg1->unk00_field1 != 0) {
return 0;
} else {
}
else {
return 1;
}
}
static void CreatePadConfig(omObjData *arg0, ConfigWork *arg1) {
static void CreatePadConfig(omObjData *arg0, ConfigWork *arg1)
{
Vec sp14;
Vec sp8;
s32 i;
@ -817,7 +811,8 @@ static void CreatePadConfig(omObjData *arg0, ConfigWork *arg1) {
arg1->unk01 = 1;
}
static void ScrollInPadConfig(omObjData *arg0, ConfigWork *arg1) {
static void ScrollInPadConfig(omObjData *arg0, ConfigWork *arg1)
{
Vec sp8;
s32 i;
@ -834,7 +829,8 @@ static void ScrollInPadConfig(omObjData *arg0, ConfigWork *arg1) {
arg1->unk04 = 0;
arg1->unk05 = 0;
arg1->unk01 = 0;
} else {
}
else {
arg1->unk01 = 2;
}
return;
@ -848,7 +844,8 @@ static void ScrollInPadConfig(omObjData *arg0, ConfigWork *arg1) {
arg1->unk07--;
}
static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1) {
static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1)
{
float sp8[4];
s32 temp_r29;
u32 temp_r30;
@ -861,16 +858,19 @@ static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1) {
if (GWPlayer[temp_r29].com) {
arg1->unk00_field3 = GWPlayer[temp_r29].diff + 1;
arg1->unk05 = GWPlayer[temp_r29].diff + 1;
} else {
}
else {
arg1->unk00_field3 = 0;
arg1->unk05 = 0;
}
HuSprBankSet(padConfigSprGrp, arg1->unk04 + 8, 1);
HuAudFXPlay(2);
} else if (temp_r30 == 0x200) {
}
else if (temp_r30 == 0x200) {
HuAudFXPlay(3);
arg1->unk01 = 4;
} else {
}
else {
if (temp_r30 == 1) {
arg1->unk04--;
}
@ -879,9 +879,11 @@ static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1) {
}
if (arg1->unk04 < 0) {
arg1->unk04 = 0;
} else if (arg1->unk04 >= 4) {
}
else if (arg1->unk04 >= 4) {
arg1->unk04 = 3;
} else if (temp_r30 == 1 || temp_r30 == 2) {
}
else if (temp_r30 == 1 || temp_r30 == 2) {
HuAudFXPlay(0);
arg1->unk06 = 4;
}
@ -891,7 +893,8 @@ static void CursorMovePadConfig(omObjData *arg0, ConfigWork *arg1) {
}
}
static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1)
{
s32 temp_r29;
s32 var_r28;
s32 var_r26;
@ -901,13 +904,15 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
var_r30 = 0;
if (HuPadStkX[pausePad] < -20) {
var_r30 |= 1;
} else if (HuPadStkX[pausePad] > 20) {
}
else if (HuPadStkX[pausePad] > 20) {
var_r30 |= 2;
}
temp_r29 = CheckPort(arg1->unk04);
if (GWGameStat.veryHardUnlock != 0) {
var_r27 = 4;
} else {
}
else {
var_r27 = 3;
}
HuWinMesSet(settingsWin, MAKE_MESSID(16, 32));
@ -916,13 +921,15 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
if (arg1->unk09++ < 10) {
return;
}
} else {
}
else {
if (arg1->unk09++ < 2) {
return;
}
arg1->unk0C = var_r30;
}
} else {
}
else {
arg1->unk0C = 0;
}
arg1->unk09 = 0;
@ -936,7 +943,8 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
if (var_r28 != 0) {
HuAudFXPlay(0);
arg1->unk06 = 4;
} else {
}
else {
if (HuPadBtnDown[pausePad] == 0x100) {
arg1->unk01 = 2;
if (arg1->unk05 != 0) {
@ -944,7 +952,8 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
GWPlayerCfg[temp_r29].iscom = 1;
GWPlayer[temp_r29].diff = arg1->unk05 - 1;
GWPlayerCfg[temp_r29].diff = arg1->unk05 - 1;
} else {
}
else {
GWPlayer[temp_r29].com = 0;
GWPlayerCfg[temp_r29].iscom = 0;
}
@ -967,18 +976,21 @@ static void ChangeDiffPadConfig(omObjData *arg0, ConfigWork *arg1) {
}
if (arg1->unk05 > var_r27) {
arg1->unk05 = 0;
} else if (arg1->unk05 < 0) {
}
else if (arg1->unk05 < 0) {
arg1->unk05 = var_r27;
}
if (arg1->unk05 != 0) {
var_r26 = arg1->unk05 + 3;
} else {
}
else {
var_r26 = arg1->unk04;
}
HuSprBankSet(padConfigSprGrp, arg1->unk04 + 4, var_r26);
}
static void ScrollOutPadConfig(omObjData *arg0, ConfigWork *arg1) {
static void ScrollOutPadConfig(omObjData *arg0, ConfigWork *arg1)
{
Vec sp14;
Vec sp8;
@ -1003,7 +1015,8 @@ static void ScrollOutPadConfig(omObjData *arg0, ConfigWork *arg1) {
arg1->unk00_field2 = 1;
}
static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2)
{
float var_f31;
float var_f30;
float var_f29;
@ -1031,21 +1044,26 @@ static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
}
if (arg1->unk04 < 0) {
arg1->unk04 = 0;
} else if (arg1->unk04 > 1) {
}
else if (arg1->unk04 > 1) {
arg1->unk04 = 1;
} else if (temp_r28 == 1 || temp_r28 == 2) {
}
else if (temp_r28 == 1 || temp_r28 == 2) {
HuAudFXPlay(0);
}
if (temp_r28 == 0x100) {
arg1->unk01 = 3;
HuAudFXPlay(2);
} else if (temp_r28 == 0x200) {
}
else if (temp_r28 == 0x200) {
arg1->unk01 = 4;
HuAudFXPlay(3);
} else if (temp_r27 != arg1->unk04) {
}
else if (temp_r27 != arg1->unk04) {
if (arg1->unk04 != 0) {
var_f30 = 0.0f;
} else {
}
else {
var_f30 = -90.0f;
}
var_f29 = arg0->rot.x;
@ -1058,7 +1076,8 @@ static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
if (arg1->unk07 != 0) {
arg0->rot.x += arg0->rot.y;
arg1->unk07--;
} else {
}
else {
arg1->unk01 = 1;
}
break;
@ -1091,7 +1110,8 @@ static s32 UpdatePauseBox(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
return 0;
}
static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2)
{
float var_f31;
float var_f30;
float var_f29;
@ -1102,7 +1122,8 @@ static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
if (arg2 == 3 && GWGameStat.customPackEnable == 0) {
var_r27 = 1;
} else {
}
else {
var_r27 = 2;
}
switch (arg1->unk01) {
@ -1125,18 +1146,22 @@ static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
}
if (arg1->unk04 < 0) {
arg1->unk04 = 0;
} else if (arg1->unk04 > var_r27) {
}
else if (arg1->unk04 > var_r27) {
arg1->unk04 = var_r27;
} else if (temp_r28 == 1 || temp_r28 == 2) {
}
else if (temp_r28 == 1 || temp_r28 == 2) {
HuAudFXPlay(0);
}
if (temp_r28 == 0x100) {
arg1->unk01 = 3;
HuAudFXPlay(2);
} else if (temp_r28 == 0x200) {
}
else if (temp_r28 == 0x200) {
arg1->unk01 = 4;
HuAudFXPlay(3);
} else if (temp_r26 != arg1->unk04) {
}
else if (temp_r26 != arg1->unk04) {
switch (arg1->unk04) {
case 0:
var_f30 = 90.0f;
@ -1158,7 +1183,8 @@ static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
if (arg1->unk07 != 0) {
arg0->rot.x += arg0->rot.y;
arg1->unk07--;
} else {
}
else {
arg1->unk01 = 1;
}
break;
@ -1191,7 +1217,8 @@ static s32 UpdatePauseBoxExt(omObjData *arg0, ConfigWork *arg1, s32 arg2) {
return 0;
}
static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1) {
static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1)
{
s32 var_r27;
s32 var_r26;
s32 var_r29;
@ -1218,17 +1245,21 @@ static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1) {
arg1->unk03 += var_r28;
if (arg1->unk03 < 0) {
arg1->unk03 = 0;
} else if (arg1->unk03 >= 2) {
}
else if (arg1->unk03 >= 2) {
arg1->unk03 = 1;
} else if (var_r28 != 0) {
}
else if (var_r28 != 0) {
HuAudFXPlay(0);
arg1->unk06 = 4;
}
if (arg1->unk02 < 0) {
arg1->unk02 = 0;
} else if (arg1->unk02 >= 4) {
}
else if (arg1->unk02 >= 4) {
arg1->unk02 = 3;
} else if (var_r29 != 0) {
}
else if (var_r29 != 0) {
HuAudFXPlay(0);
arg1->unk06 = 4;
}
@ -1251,7 +1282,8 @@ static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1) {
}
if (var_r26 != 0) {
HuAudFXPlay(4);
} else if (var_r27 != 0) {
}
else if (var_r27 != 0) {
HuAudFXPlay(2);
arg1->unk00_field1 = 1;
}
@ -1263,7 +1295,8 @@ static s32 ExecPauseConfig(omObjData *arg0, ConfigWork *arg1) {
return arg1->unk02 + arg1->unk03 * 4;
}
static void CreatePauseControlWin(void) {
static void CreatePauseControlWin(void)
{
float sp8[2];
float var_f31;
float var_f30;
@ -1280,7 +1313,8 @@ static void CreatePauseControlWin(void) {
HuWinDispOff(settingsControlWin);
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
var_r31 = MAKE_MESSID(16, 73);
} else {
}
else {
var_r31 = MAKE_MESSID(16, 52);
}
HuWinMesMaxSizeGet(1, sp8, var_r31);
@ -1304,7 +1338,8 @@ static void CreatePauseControlWin(void) {
sp8[1] = 128.0f;
}
static void DeletePauseControlWin(void) {
static void DeletePauseControlWin(void)
{
if (settingsControlWin != -1) {
HuWinKill(settingsControlWin);
settingsControlWin = -1;
@ -1319,7 +1354,8 @@ static void DeletePauseControlWin(void) {
}
}
static s32 WaitPauseInput(void) {
static s32 WaitPauseInput(void)
{
s32 var_r28;
s32 var_r31;
u32 temp_r30;
@ -1327,7 +1363,8 @@ static s32 WaitPauseInput(void) {
mainScreenF = 1;
if (GWBoardGet() == 7 || GWBoardGet() == 8) {
var_r28 = 1;
} else {
}
else {
var_r28 = 0;
}
HuWinDispOn(controlWin);
@ -1344,13 +1381,15 @@ static s32 WaitPauseInput(void) {
var_r31 = 0;
HuAudFXPlay(0x1C);
break;
} else if (var_r28 == 0) {
}
else if (var_r28 == 0) {
if (temp_r30 == 0x100) {
var_r31 = 1;
HuAudFXPlay(1);
break;
}
} else if (temp_r30 == 0x10) {
}
else if (temp_r30 == 0x10) {
pauseQuitF = 1;
var_r31 = 2;
mgQuitExtraF = 1;
@ -1368,7 +1407,8 @@ static s32 WaitPauseInput(void) {
return var_r31;
}
static void ShowPauseConfig(void) {
static void ShowPauseConfig(void)
{
float var_f31;
float var_f30;
@ -1383,7 +1423,8 @@ static void ShowPauseConfig(void) {
var_f30 = boxPosTbl[0][1];
HuSprPosSet(pauseCursorPos, 1, var_f31, var_f30);
HuSprAttrReset(pauseCursorPos, 1, HUSPR_ATTR_DISPOFF);
} else {
}
else {
HuSprAttrSet(pauseCursorPos, 1, HUSPR_ATTR_DISPOFF);
}
while (configObj) {
@ -1391,7 +1432,8 @@ static void ShowPauseConfig(void) {
}
}
static void CreatePadConfigSprite(void) {
static void CreatePadConfigSprite(void)
{
float temp_f31;
float temp_f30;
s32 var_r29;
@ -1415,7 +1457,8 @@ static void CreatePadConfigSprite(void) {
HuSprBankSet(padConfigSprGrp, i, temp_r28);
if (temp_r26 != 0) {
var_r29 = temp_r27 + 4;
} else {
}
else {
var_r29 = i;
}
HuSprBankSet(padConfigSprGrp, i + 4, var_r29);
@ -1427,7 +1470,8 @@ static void CreatePadConfigSprite(void) {
HuSprGrpPosSet(padConfigSprGrp, 0.0f, 0.0f);
}
static void ShowPadConfigSprite(s32 arg0) {
static void ShowPadConfigSprite(s32 arg0)
{
s32 temp_r31;
s32 i;
@ -1437,7 +1481,8 @@ static void ShowPadConfigSprite(s32 arg0) {
HuSprAttrReset(padConfigSprGrp, temp_r31, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(padConfigSprGrp, temp_r31 + 4, HUSPR_ATTR_DISPOFF);
HuSprAttrReset(padConfigSprGrp, temp_r31 + 8, HUSPR_ATTR_DISPOFF);
} else {
}
else {
HuSprAttrSet(padConfigSprGrp, temp_r31, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(padConfigSprGrp, temp_r31 + 4, HUSPR_ATTR_DISPOFF);
HuSprAttrSet(padConfigSprGrp, temp_r31 + 8, HUSPR_ATTR_DISPOFF);
@ -1445,12 +1490,14 @@ static void ShowPadConfigSprite(s32 arg0) {
}
if (arg0 != 0) {
HuSprAttrReset(padConfigSprGrp, 12, HUSPR_ATTR_DISPOFF);
} else {
}
else {
HuSprAttrSet(padConfigSprGrp, 12, HUSPR_ATTR_DISPOFF);
}
}
static void PauseCreateNumber(s32 arg0, s8 arg1) {
static void PauseCreateNumber(s32 arg0, s8 arg1)
{
s32 var_r31;
s32 temp_r30;
s32 temp_r29;
@ -1459,22 +1506,26 @@ static void PauseCreateNumber(s32 arg0, s8 arg1) {
temp_r30 = arg1 / 10;
if (arg0 == 0) {
var_r31 = 3;
} else {
}
else {
var_r31 = 5;
}
if (temp_r30 != 0) {
HuSprBankSet(pauseSprGrp, var_r31, temp_r30);
} else {
}
else {
HuSprAttrSet(pauseSprGrp, var_r31, 4);
}
HuSprBankSet(pauseSprGrp, var_r31 + 1, temp_r29);
}
BOOL BoardPauseActiveCheck(void) {
BOOL BoardPauseActiveCheck(void)
{
return (mainProcess != NULL) ? TRUE : FALSE;
}
BOOL BoardPauseReqCheck(void) {
BOOL BoardPauseReqCheck(void)
{
s32 temp_r30;
s32 i;
@ -1495,7 +1546,8 @@ BOOL BoardPauseReqCheck(void) {
return FALSE;
}
static s32 CheckPort(s32 arg0) {
static s32 CheckPort(s32 arg0)
{
s32 i;
for (i = 0; i < 4; i++) {
@ -1506,7 +1558,8 @@ static s32 CheckPort(s32 arg0) {
return i;
}
static void RotateBox(float arg0, float arg1, Mtx arg2) {
static void RotateBox(float arg0, float arg1, Mtx arg2)
{
Vec sp14;
Mtx spB0;
Mtx sp80;
@ -1514,11 +1567,11 @@ static void RotateBox(float arg0, float arg1, Mtx arg2) {
Mtx sp20;
BoardCameraRotGet(&sp14);
PSMTXRotRad(spB0, 'x', MTXDegToRad(sp14.x));
PSMTXRotRad(sp80, 'y', MTXDegToRad(sp14.y));
PSMTXRotRad(sp50, 'x', MTXDegToRad(arg0));
PSMTXRotRad(sp20, 'y', MTXDegToRad(arg1));
PSMTXConcat(sp80, spB0, sp80);
PSMTXConcat(sp50, sp20, sp20);
PSMTXConcat(sp80, sp20, arg2);
MTXRotRad(spB0, 'x', MTXDegToRad(sp14.x));
MTXRotRad(sp80, 'y', MTXDegToRad(sp14.y));
MTXRotRad(sp50, 'x', MTXDegToRad(arg0));
MTXRotRad(sp20, 'y', MTXDegToRad(arg1));
MTXConcat(sp80, spB0, sp80);
MTXConcat(sp50, sp20, sp20);
MTXConcat(sp80, sp20, arg2);
}

View file

@ -1,13 +1,5 @@
#include "game/board/shop.h"
#include "game/audio.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/object.h"
#include "game/objsub.h"
#include "game/disp.h"
#include "game/pad.h"
#include "game/process.h"
#include "game/sprite.h"
#include "game/board/audio.h"
#include "game/board/com.h"
#include "game/board/com_path.h"
@ -20,6 +12,14 @@
#include "game/board/ui.h"
#include "game/board/view.h"
#include "game/board/window.h"
#include "game/disp.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/object.h"
#include "game/objsub.h"
#include "game/pad.h"
#include "game/process.h"
#include "game/sprite.h"
#include "dolphin.h"
#include "ext_math.h"
@ -103,39 +103,20 @@ static Process *shopProc;
static s16 itemMdl = -1;
static s8 itemChoice = -1;
static BoardModelParam shopMdlParam[1] = {
{ 0x00070094, { 0, 1, 0, 0, 0 }, -1 }
};
static BoardModelParam shopMdlParam[1] = { { 0x00070094, { 0, 1, 0, 0, 0 }, -1 } };
static s16 hostMdl = -1;
static s16 shopMot[3] = { -1, -1, -1 };
static s8 itemCurChoice = -1;
static s8 defaultItemTbl[5] = {
0x05, 0x07, 0x02, 0x03, 0x00
};
static s8 defaultItemTbl[5] = { 0x05, 0x07, 0x02, 0x03, 0x00 };
static s32 hostMessTbl[] = {
MAKE_MESSID(0x0F, 0x04),
MAKE_MESSID(0x0F, 0x07),
MAKE_MESSID(0x0F, 0x0A),
MAKE_MESSID(0x0F, 0x0D),
MAKE_MESSID(0x0F, 0x10),
MAKE_MESSID(0x0F, 0x13),
MAKE_MESSID(0x0F, 0x04),
MAKE_MESSID(0x0F, 0x24),
MAKE_MESSID(0x0F, 0x24)
};
static s32 hostMessTbl[] = { MAKE_MESSID(0x0F, 0x04), MAKE_MESSID(0x0F, 0x07), MAKE_MESSID(0x0F, 0x0A), MAKE_MESSID(0x0F, 0x0D),
MAKE_MESSID(0x0F, 0x10), MAKE_MESSID(0x0F, 0x13), MAKE_MESSID(0x0F, 0x04), MAKE_MESSID(0x0F, 0x24), MAKE_MESSID(0x0F, 0x24) };
static s8 itemPriceTbl[] = {
5, 5, 15, 15,
10, 10, 15, 15,
15, 15, 0, 25,
30, 30, 0, 0
};
static s8 itemPriceTbl[] = { 5, 5, 15, 15, 10, 10, 15, 15, 15, 15, 0, 25, 30, 30, 0, 0 };
static s32 shopMotTbl[9][3] = {
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x01), DATA_MAKE_NUM(DATADIR_BGUEST, 0x03), DATA_MAKE_NUM(DATADIR_BGUEST, 0x04) },
static s32 shopMotTbl[9][3] = { { DATA_MAKE_NUM(DATADIR_BGUEST, 0x01), DATA_MAKE_NUM(DATADIR_BGUEST, 0x03), DATA_MAKE_NUM(DATADIR_BGUEST, 0x04) },
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x09), DATA_MAKE_NUM(DATADIR_BGUEST, 0x0B), DATA_MAKE_NUM(DATADIR_BGUEST, 0x0C) },
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x0E), DATA_MAKE_NUM(DATADIR_BGUEST, 0x10), DATA_MAKE_NUM(DATADIR_BGUEST, 0x11) },
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x18), DATA_MAKE_NUM(DATADIR_BGUEST, 0x1A), DATA_MAKE_NUM(DATADIR_BGUEST, 0x1B) },
@ -143,27 +124,26 @@ static s32 shopMotTbl[9][3] = {
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x22), DATA_MAKE_NUM(DATADIR_BGUEST, 0x24), DATA_MAKE_NUM(DATADIR_BGUEST, 0x25) },
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x09), DATA_MAKE_NUM(DATADIR_BGUEST, 0x0B), DATA_MAKE_NUM(DATADIR_BGUEST, 0x0C) },
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x2A), DATA_MAKE_NUM(DATADIR_BGUEST, 0x2C), DATA_MAKE_NUM(DATADIR_BGUEST, 0x2D) },
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x2A), DATA_MAKE_NUM(DATADIR_BGUEST, 0x2C), DATA_MAKE_NUM(DATADIR_BGUEST, 0x2D) }
};
{ DATA_MAKE_NUM(DATADIR_BGUEST, 0x2A), DATA_MAKE_NUM(DATADIR_BGUEST, 0x2C), DATA_MAKE_NUM(DATADIR_BGUEST, 0x2D) } };
void BoardShopHostSet(s16 arg0) {
void BoardShopHostSet(s16 arg0)
{
hostMdl = arg0;
}
s16 BoardShopHostGet(void) {
s16 BoardShopHostGet(void)
{
return hostMdl;
}
void BoardShopInit(void) {
void BoardShopInit(void)
{
BoardModelParam *var_r29;
Vec sp1C;
Vec sp10;
s32 j;
s32 i;
s32 sp8[2] = {
0x00080000,
0x00100000
};
s32 sp8[2] = { 0x00080000, 0x00100000 };
for (i = 0; i < 2; i++) {
BoardSpaceLinkTransformGet(sp8[i], &sp1C, &sp10, 0);
@ -176,7 +156,8 @@ void BoardShopInit(void) {
BoardModelVisibilitySet(hostMdl, 0);
}
void BoardShopKill(void) {
void BoardShopKill(void)
{
s32 i;
s32 j;
@ -190,7 +171,8 @@ void BoardShopKill(void) {
}
}
void BoardShopExec(s32 player, s32 space) {
void BoardShopExec(s32 player, s32 space)
{
if (BoardPlayerSizeGet(GWSystem.player_curr) == 2) {
return;
}
@ -204,7 +186,8 @@ void BoardShopExec(s32 player, s32 space) {
BoardRollDispSet(1);
}
static void ExecShop(void) {
static void ExecShop(void)
{
Vec sp38;
Vec sp2C;
Vec sp20;
@ -229,7 +212,8 @@ static void ExecShop(void) {
temp_r28 = GWPlayer[shopPlayer].space_curr;
if (BoardSpaceFlagGet(0, temp_r28) & 0x80000) {
shopMdlPtr = shopMdlIdx[0];
} else {
}
else {
shopMdlPtr = shopMdlIdx[1];
}
BoardPlayerIdleSet(shopPlayer);
@ -315,7 +299,8 @@ static void ExecShop(void) {
if (var_r29 > BoardPlayerCoinsGet(shopPlayer)) {
BoardWinChoiceDisable(i);
choiceEnableTbl[i] = 0;
} else {
}
else {
choiceEnableTbl[i] = 1;
}
}
@ -332,7 +317,8 @@ static void ExecShop(void) {
HuPrcSleep(0xF);
if (itemCurChoice == -1 || itemCurChoice == 5 || itemCurChoice == 0x7F) {
PauseShopWin();
} else {
}
else {
PauseShopWin();
while (!BoardStatusStopCheck(shopPlayer)) {
HuPrcVSleep();
@ -346,7 +332,8 @@ static void ExecShop(void) {
temp_r24 = itemPriceTbl[activeItemTbl[itemCurChoice]];
if (temp_r24 >= 20) {
var_r23 = 3;
} else {
}
else {
var_r23 = 6;
}
var_f30 = BoardDAngleCalc(180.0f + BoardPlayerRotYGet(shopPlayer));
@ -391,7 +378,8 @@ static void ExecShop(void) {
HuPrcEnd();
}
static void DestroyShop(void) {
static void DestroyShop(void)
{
s16 temp_r30;
s32 i;
@ -413,7 +401,8 @@ static void DestroyShop(void) {
shopProc = NULL;
}
static void PopupShop(void) {
static void PopupShop(void)
{
s32 i;
for (i = 0; i < 2; i++) {
@ -443,7 +432,8 @@ static void PopupShop(void) {
}
}
static void CloseShop(void) {
static void CloseShop(void)
{
BoardModelMotionStart(shopMdlPtr[0], 0, 0x40000004);
while (BoardModelMotionTimeGet(shopMdlPtr[0]) > 28.0f) {
HuPrcVSleep();
@ -458,7 +448,8 @@ static void CloseShop(void) {
BoardModelVisibilitySet(BoardShopHostGet(), 0);
}
static void CreateShopWin(void) {
static void CreateShopWin(void)
{
Vec sp8;
omObjData *var_r31;
ShopWinWork *var_r30;
@ -473,12 +464,12 @@ static void CreateShopWin(void) {
var_r30->unk01 = 0xC;
var_r30->unk04 = 0;
shopWinObj = var_r31;
var_r30->unk06 = HuWinCreate(36.0f, HU_DISP_HEIGHT-136, 0x1F8, 0x60, 0);
var_r30->unk06 = HuWinCreate(36.0f, HU_DISP_HEIGHT - 136, 0x1F8, 0x60, 0);
HuWinMesSpeedSet(var_r30->unk06, 0);
HuWinDrawNoSet(var_r30->unk06, 0x40);
HuWinExAnimIn(var_r30->unk06);
sp8.x = 84.0f;
sp8.y = HU_DISP_HEIGHT-88;
sp8.y = HU_DISP_HEIGHT - 88;
sp8.z = 400.0f;
var_r31->scale.x = var_r31->scale.y = var_r31->scale.z = 0.25f;
Hu3D2Dto3D(&sp8, 1, &sp8);
@ -488,7 +479,8 @@ static void CreateShopWin(void) {
var_r31->scale.x = var_r31->scale.y = var_r31->scale.z = 1.0f;
}
static void UpdateShopWin(omObjData *arg0) {
static void UpdateShopWin(omObjData *arg0)
{
Vec spC;
float var_f29;
float var_f28;
@ -517,7 +509,8 @@ static void UpdateShopWin(omObjData *arg0) {
if (temp_r28->unk00_field0 == 0) {
BoardModelVisibilitySet(itemMdl, 0);
}
} else {
}
else {
HuWinDispOn(temp_r28->unk06);
SetShopWinItem(temp_r28, arg0);
BoardModelVisibilitySet(itemMdl, 1);
@ -543,9 +536,9 @@ static void UpdateShopWin(omObjData *arg0) {
}
arg0->rot.y = BoardDAngleCalc(arg0->rot.y + 2.0f);
BoardCameraRotGet(&spC);
PSMTXRotRad(sp48, 'y', MTXDegToRad(arg0->rot.y));
PSMTXRotRad(sp18, 'x', MTXDegToRad(spC.x + 10.0f));
PSMTXConcat(sp18, sp48, sp48);
MTXRotRad(sp48, 'y', MTXDegToRad(arg0->rot.y));
MTXRotRad(sp18, 'x', MTXDegToRad(spC.x + 10.0f));
MTXConcat(sp18, sp48, sp48);
BoardModelMtxSet(itemMdl, &sp48);
BoardModelRotSet(itemMdl, 0.0f, 0.0f, 0.0f);
BoardModelPosSet(itemMdl, arg0->trans.x, arg0->trans.y + var_f29, arg0->trans.z);
@ -554,7 +547,8 @@ static void UpdateShopWin(omObjData *arg0) {
}
}
static void SetShopWinItem(ShopWinWork *arg0, omObjData *arg1) {
static void SetShopWinItem(ShopWinWork *arg0, omObjData *arg1)
{
Vec spC;
s32 var_r26;
s8 temp_r28;
@ -581,14 +575,16 @@ static void SetShopWinItem(ShopWinWork *arg0, omObjData *arg1) {
}
}
static void PauseShopWin(void) {
static void PauseShopWin(void)
{
if (shopWinObj) {
OM_GET_WORK_PTR(shopWinObj, ShopWinWork)->unk00_field0 = 1;
shopWinObj = NULL;
}
}
void StartItemGive(void) {
void StartItemGive(void)
{
Vec sp14;
Vec sp8;
omObjData *temp_r30;
@ -605,7 +601,7 @@ void StartItemGive(void) {
BoardModelMotionStart(itemMdl, 0, 0);
BoardModelMotionSpeedSet(itemMdl, 0.0f);
BoardModelPosGet(itemMdl, &sp14);
PSMTXIdentity(sp20);
MTXIdentity(sp20);
BoardModelMtxSet(itemMdl, &sp20);
OSs16tof32(&angleVal, &temp_r30->scale.z);
temp_r30->scale.z = -temp_r30->scale.z / 40.0f;
@ -621,7 +617,8 @@ void StartItemGive(void) {
itemGiveObj = temp_r30;
}
static void ExecItemGive(omObjData *arg0) {
static void ExecItemGive(omObjData *arg0)
{
ItemGiveWork *temp_r29;
float var_f30;
@ -653,7 +650,8 @@ static void ExecItemGive(omObjData *arg0) {
BoardModelRotYSet(itemMdl, var_f30);
}
static void MoveItemGive(omObjData *arg0, ItemGiveWork *arg1) {
static void MoveItemGive(omObjData *arg0, ItemGiveWork *arg1)
{
Vec sp1C;
Vec sp10;
float temp_f27;
@ -665,13 +663,15 @@ static void MoveItemGive(omObjData *arg0, ItemGiveWork *arg1) {
arg1->unk00_field1 = 2;
BoardMakeRandomItem();
BoardItemStart(GWSystem.player_curr, 0xD);
} else {
}
else {
arg1->unk00_field1 = 1;
arg1->unk04 = 0xF;
BoardPlayerPosGet(shopPlayer, &sp1C);
if (BoardPlayerSizeGet(shopPlayer) == 1) {
arg0->rot.x = (sp1C.y + 30.0f - arg0->trans.y) / 22.5f;
} else {
}
else {
arg0->rot.x = (sp1C.y + 70.0f - arg0->trans.y) / 22.5f;
}
arg0->trans.y = arg0->rot.y;
@ -692,7 +692,8 @@ static void MoveItemGive(omObjData *arg0, ItemGiveWork *arg1) {
BoardCameraDirGet(&sp10);
var_f26 = BoardDAngleCalc(atan2d(-sp10.x, -sp10.z));
OSf32tos16(&var_f26, &angleVal);
} else {
}
else {
arg0->scale.x += arg0->scale.y;
arg0->trans.x += arg0->rot.x;
arg0->trans.z += arg0->rot.z;
@ -706,7 +707,8 @@ static void MoveItemGive(omObjData *arg0, ItemGiveWork *arg1) {
arg1->unk02++;
}
static void ShrinkItemGive(omObjData *arg0, ItemGiveWork *arg1) {
static void ShrinkItemGive(omObjData *arg0, ItemGiveWork *arg1)
{
float var_f30;
if (arg1->unk02 == 0) {
@ -733,10 +735,12 @@ static void ShrinkItemGive(omObjData *arg0, ItemGiveWork *arg1) {
arg1->unk02 += 4;
}
static void WaitItemGive(omObjData *arg0, ItemGiveWork *arg1) {
static void WaitItemGive(omObjData *arg0, ItemGiveWork *arg1)
{
if (arg1->unk02 > 20) {
BoardModelVisibilitySet(itemMdl, 0);
} else {
}
else {
arg1->unk02++;
}
if (BoardItemDoneCheck()) {
@ -744,44 +748,25 @@ static void WaitItemGive(omObjData *arg0, ItemGiveWork *arg1) {
}
}
static s8 itemPrioTbl[2][5][14] = {
{
{ 0x14, 0x14, 0x0F, 0x0F, 0x05, 0x07, 0x05, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00 },
{ 0x0F, 0x0F, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x00 },
{ 0x07, 0x07, 0x0E, 0x0C, 0x0A, 0x0A, 0x0A, 0x08, 0x05, 0x09, 0x00, 0x08, 0x00, 0x00 },
{ 0x0A, 0x0A, 0x0D, 0x0C, 0x0A, 0x0A, 0x07, 0x0A, 0x05, 0x05, 0x00, 0x08, 0x00, 0x00 },
{ 0x07, 0x07, 0x0D, 0x0A, 0x0D, 0x07, 0x0A, 0x0A, 0x07, 0x08, 0x00, 0x08, 0x00, 0x00 }
},
{
{ 0x0F, 0x0F, 0x12, 0x0F, 0x05, 0x05, 0x05, 0x05, 0x00, 0x05, 0x00, 0x02, 0x05, 0x05 },
static s8 itemPrioTbl[2][5][14] = { { { 0x14, 0x14, 0x0F, 0x0F, 0x05, 0x07, 0x05, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00 },
{ 0x0F, 0x0F, 0x0D, 0x0A, 0x0A, 0x0A, 0x0A, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x00 },
{ 0x07, 0x07, 0x0E, 0x0C, 0x0A, 0x0A, 0x0A, 0x08, 0x05, 0x09, 0x00, 0x08, 0x00, 0x00 },
{ 0x0A, 0x0A, 0x0D, 0x0C, 0x0A, 0x0A, 0x07, 0x0A, 0x05, 0x05, 0x00, 0x08, 0x00, 0x00 },
{ 0x07, 0x07, 0x0D, 0x0A, 0x0D, 0x07, 0x0A, 0x0A, 0x07, 0x08, 0x00, 0x08, 0x00, 0x00 } },
{ { 0x0F, 0x0F, 0x12, 0x0F, 0x05, 0x05, 0x05, 0x05, 0x00, 0x05, 0x00, 0x02, 0x05, 0x05 },
{ 0x0F, 0x0F, 0x0D, 0x0A, 0x07, 0x0A, 0x07, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x08 },
{ 0x05, 0x04, 0x0D, 0x0C, 0x0A, 0x05, 0x0A, 0x08, 0x05, 0x05, 0x00, 0x05, 0x08, 0x0A },
{ 0x07, 0x04, 0x0D, 0x0C, 0x08, 0x08, 0x07, 0x0A, 0x05, 0x05, 0x00, 0x05, 0x08, 0x08 },
{ 0x03, 0x02, 0x0D, 0x0A, 0x0D, 0x03, 0x08, 0x08, 0x07, 0x07, 0x00, 0x08, 0x08, 0x0A }
}
};
{ 0x03, 0x02, 0x0D, 0x0A, 0x0D, 0x03, 0x08, 0x08, 0x07, 0x07, 0x00, 0x08, 0x08, 0x0A } } };
static s8 rankItemGroupTbl[2][4][3] = {
{
{ 0x00, 0x01, 0x03 }, { 0x00, 0x02, 0x04 },
{ 0x00, 0x02, 0x04 }, { 0x00, 0x02, 0x04 }
},
{
{ 0x00, 0x01, 0x03 }, { 0x00, 0x02, 0x04 },
{ 0x00, 0x02, 0x04 }, { 0x00, 0x02, 0x04 }
}
};
static s8 rankItemGroupTbl[2][4][3] = { { { 0x00, 0x01, 0x03 }, { 0x00, 0x02, 0x04 }, { 0x00, 0x02, 0x04 }, { 0x00, 0x02, 0x04 } },
{ { 0x00, 0x01, 0x03 }, { 0x00, 0x02, 0x04 }, { 0x00, 0x02, 0x04 }, { 0x00, 0x02, 0x04 } } };
static float cursorPosTbl[6][2] = {
{ 190.0f, 182.0f },
{ 190.0f, 208.0f },
{ 190.0f, 234.0f },
{ 190.0f, 260.0f },
{ 190.0f, 286.0f },
{ 190.0f, 312.0f }
};
static float cursorPosTbl[6][2]
= { { 190.0f, 182.0f }, { 190.0f, 208.0f }, { 190.0f, 234.0f }, { 190.0f, 260.0f }, { 190.0f, 286.0f }, { 190.0f, 312.0f } };
static void GetShopItems(s32 arg0) {
static void GetShopItems(s32 arg0)
{
s32 temp_r25;
s32 temp_r20;
s32 temp_r19;
@ -795,10 +780,11 @@ static void GetShopItems(s32 arg0) {
s32 var_r29;
s32 var_r30;
temp_r22 = 3.0f * ((float) GWSystem.turn / GWSystem.max_turn);
temp_r22 = 3.0f * ((float)GWSystem.turn / GWSystem.max_turn);
if (BoardPlayerCoinsGet(arg0) < 30) {
var_r27 = 0;
} else {
}
else {
var_r27 = 1;
}
temp_r19 = rankItemGroupTbl[var_r27][GWPlayer[arg0].rank][temp_r22];
@ -839,7 +825,8 @@ static void GetShopItems(s32 arg0) {
}
}
static void GetDefaultShopItems(s32 arg0) {
static void GetDefaultShopItems(s32 arg0)
{
s32 temp_r29;
s32 var_r31;
s32 var_r30;
@ -847,9 +834,11 @@ static void GetDefaultShopItems(s32 arg0) {
temp_r29 = BoardRandMod(100);
if (temp_r29 > 90) {
var_r30 = 3;
} else if (temp_r29 > 40) {
}
else if (temp_r29 > 40) {
var_r30 = BoardRandMod(2) + 1;
} else {
}
else {
var_r30 = 0;
}
for (var_r31 = 0; var_r31 < 5; var_r31++) {
@ -857,7 +846,8 @@ static void GetDefaultShopItems(s32 arg0) {
}
}
static void SortShopItems(void) {
static void SortShopItems(void)
{
s32 sp8[5];
s32 var_r29;
s32 i;
@ -880,7 +870,8 @@ static void SortShopItems(void) {
}
}
static void DecideComEnter(s32 arg0) {
static void DecideComEnter(s32 arg0)
{
s32 temp_r27;
s32 temp_r30;
s32 temp_r29;
@ -910,14 +901,13 @@ static void DecideComEnter(s32 arg0) {
BoardComKeySetRight();
return;
}
} else {
}
else {
temp_r27 = GWPlayer[arg0].space_curr;
temp_r30 = BoardComPathShortcutLenGet(temp_r27, 8, 0);
temp_r29 = BoardComPathShortcutLenGet(temp_r27, 8, 1);
if ((temp_r30 != 0 || temp_r29 != 0)
&& (BoardPlayerCoinsGet(arg0) >= 17 || (temp_r29 >= temp_r26 && temp_r30 >= temp_r26))
&& BoardPlayerCoinsGet(arg0) < 40
&& ((temp_r30 < 20 && temp_r30 > 0) || (temp_r29 < 10 && temp_r29 > 0))
if ((temp_r30 != 0 || temp_r29 != 0) && (BoardPlayerCoinsGet(arg0) >= 17 || (temp_r29 >= temp_r26 && temp_r30 >= temp_r26))
&& BoardPlayerCoinsGet(arg0) < 40 && ((temp_r30 < 20 && temp_r30 > 0) || (temp_r29 < 10 && temp_r29 > 0))
&& BoardRandMod(100) > var_r28) {
BoardComKeySetRight();
return;
@ -926,18 +916,21 @@ static void DecideComEnter(s32 arg0) {
BoardComKeySetLeft();
}
static void DecideComBuy(s32 arg0) {
static void DecideComBuy(s32 arg0)
{
if (!GWPlayer[arg0].com) {
return;
}
if (comF != 0) {
BoardComKeySetDown();
} else {
}
else {
BoardComKeySetUp();
}
}
static s32 GetComItemChoice(s32 arg0) {
static s32 GetComItemChoice(s32 arg0)
{
s16 sp8;
s32 temp_r26;
s32 var_r28 = 0;
@ -954,7 +947,8 @@ static s32 GetComItemChoice(s32 arg0) {
for (var_r27 = i = 0; i < 5; i++) {
if (temp_r26 >= itemPriceTbl[activeItemTbl[i]]) {
var_r30 = BoardComItemWeightGet(arg0, activeItemTbl[i]);
} else {
}
else {
var_r30 = 0;
}
if (BoardPlayerItemFind(arg0, activeItemTbl[i]) != -1) {
@ -968,28 +962,31 @@ static s32 GetComItemChoice(s32 arg0) {
if (var_r27 == 0) {
comF = 1;
var_r28 = 5;
} else {
}
else {
var_r28 = var_r25;
}
return var_r28;
}
static void WaitItemChoice(void) {
static void WaitItemChoice(void)
{
while (itemChoiceObj) {
HuPrcVSleep();
}
}
static void CreateShopItemChoice(s32 arg0, s32 arg1) {
static void CreateShopItemChoice(s32 arg0, s32 arg1)
{
omObjData *temp_r30;
ItemChoiceWork *var_r31;
s16 spC;
s16 i;
#if VERSION_PAL
for(i=0; i<6; i++) {
#if VERSION_PAL
for (i = 0; i < 6; i++) {
cursorPosTbl[i][0] = 190;
}
#endif
#endif
temp_r30 = omAddObjEx(boardObjMan, 0x7E01, 0, 0, -1, UpdateShopItemChoice);
itemChoiceObj = temp_r30;
itemChoice = -1;
@ -1001,29 +998,30 @@ static void CreateShopItemChoice(s32 arg0, s32 arg1) {
var_r31->unk02 = 0;
var_r31->unk03 = arg1;
var_r31->unk06 = HuSprGrpCreate(1);
#if VERSION_PAL
#if VERSION_PAL
if (GWLanguageGet() != 0) {
s16 winId = BoardWinIDGet();
if(winId != -1) {
if (winId != -1) {
WindowData *winP = &winData[winId];
for(i=0; i<6; i++) {
cursorPosTbl[i][0] = winP->pos_x+96;
for (i = 0; i < 6; i++) {
cursorPosTbl[i][0] = winP->pos_x + 96;
}
} else {
for(i=0; i<6; i++) {
}
else {
for (i = 0; i < 6; i++) {
cursorPosTbl[i][0] = 166;
}
}
}
temp_r30->trans.x = cursorPosTbl[0][0];
temp_r30->trans.y = cursorPosTbl[0][1];
#else
#else
temp_r30->trans.x = cursorPosTbl[0][0];
temp_r30->trans.y = cursorPosTbl[0][1];
if (GWLanguageGet() != 0) {
temp_r30->trans.x -= 24.0f;
}
#endif
#endif
if (GWPlayer[arg0].com) {
var_r31->unk01 = GWMessDelayGet();
}
@ -1033,11 +1031,13 @@ static void CreateShopItemChoice(s32 arg0, s32 arg1) {
HuSprPosSet(var_r31->unk06, 0, temp_r30->trans.x, temp_r30->trans.y);
}
static s32 GetShopItemChoice(void) {
static s32 GetShopItemChoice(void)
{
return itemChoice;
}
static s32 GetShopItemWinChoice(void) {
static s32 GetShopItemWinChoice(void)
{
ItemChoiceWork *var_r31;
if (!itemChoiceObj) {
@ -1047,7 +1047,8 @@ static s32 GetShopItemWinChoice(void) {
return var_r31->unk02;
}
static void MoveShopItemChoice(omObjData *arg0, ItemChoiceWork *arg1) {
static void MoveShopItemChoice(omObjData *arg0, ItemChoiceWork *arg1)
{
u32 sp8;
s32 temp_r28;
s32 temp_r29;
@ -1055,14 +1056,15 @@ static void MoveShopItemChoice(omObjData *arg0, ItemChoiceWork *arg1) {
temp_r28 = arg1->unk02;
arg0->trans.x = cursorPosTbl[arg1->unk02][0];
arg0->trans.y = cursorPosTbl[arg1->unk02][1];
#if VERSION_NTSC
#if VERSION_NTSC
if (GWLanguageGet() != 0) {
arg0->trans.x -= 24.0f;
}
#endif
#endif
if (GWPlayer[arg1->unk00_field1].com) {
GetShopItemChoiceInput(arg1, arg0, &sp8);
} else {
}
else {
temp_r29 = GWPlayer[arg1->unk00_field1].port;
sp8 = HuPadDStkRep[temp_r29] | HuPadBtnDown[temp_r29];
}
@ -1077,7 +1079,8 @@ static void MoveShopItemChoice(omObjData *arg0, ItemChoiceWork *arg1) {
HuAudFXPlay(2);
if (GWPlayer[arg1->unk00_field1].com) {
arg1->unk05 = 0x32;
} else {
}
else {
arg1->unk05 = 5;
}
return;
@ -1105,7 +1108,8 @@ static void MoveShopItemChoice(omObjData *arg0, ItemChoiceWork *arg1) {
}
}
static void UpdateShopItemChoice(omObjData *arg0) {
static void UpdateShopItemChoice(omObjData *arg0)
{
ItemChoiceWork *temp_r31;
temp_r31 = OM_GET_WORK_PTR(arg0, ItemChoiceWork);
@ -1120,25 +1124,31 @@ static void UpdateShopItemChoice(omObjData *arg0) {
if (temp_r31->unk05 == 0) {
temp_r31->unk00_field0 = 1;
}
} else if (temp_r31->unk01 != 0) {
}
else if (temp_r31->unk01 != 0) {
temp_r31->unk01--;
} else if (temp_r31->unk04 != 0) {
}
else if (temp_r31->unk04 != 0) {
temp_r31->unk04--;
} else {
}
else {
MoveShopItemChoice(arg0, temp_r31);
}
HuSprPosSet(temp_r31->unk06, 0, arg0->trans.x, arg0->trans.y);
}
static void GetShopItemChoiceInput(ItemChoiceWork *arg0, omObjData *arg1, u32 *arg2) {
static void GetShopItemChoiceInput(ItemChoiceWork *arg0, omObjData *arg1, u32 *arg2)
{
if (arg0->unk02 == arg0->unk03) {
*arg2 = 0x100;
} else {
}
else {
*arg2 = 4;
}
}
void BoardShopTutorialExec(s32 arg0) {
void BoardShopTutorialExec(s32 arg0)
{
Vec sp48;
Vec sp3C;
Vec sp30;
@ -1155,7 +1165,8 @@ void BoardShopTutorialExec(s32 arg0) {
sp10 = BoardWinPortraitGet();
if (BoardSpaceFlagGet(0, arg0) & 0x80000) {
shopMdlPtr = shopMdlIdx[0];
} else {
}
else {
shopMdlPtr = shopMdlIdx[1];
}
temp_r27 = BoardSpaceLinkFlagSearch(0, arg0, 0x02000000);

View file

@ -1111,4 +1111,8 @@ void BoardSpaceDestroy(void)
HuMemDirectFree(spaceTexData);
spaceTexData = NULL;
}
#ifdef TARGET_PC
GXDestroyTexObj(&spaceHiliteTex);
GXDestroyTexObj(&spaceTex);
#endif
}

View file

@ -3,15 +3,6 @@
#include "game/data.h"
#include "game/disp.h"
#include "game/flag.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/hsfanim.h"
#include "game/hsfman.h"
#include "game/msm.h"
#include "game/objsub.h"
#include "game/window.h"
#include "game/wipe.h"
#include "game/board/audio.h"
#include "game/board/com.h"
#include "game/board/main.h"
@ -21,6 +12,15 @@
#include "game/board/tutorial.h"
#include "game/board/ui.h"
#include "game/board/window.h"
#include "game/flag.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/hsfanim.h"
#include "game/hsfman.h"
#include "game/msm.h"
#include "game/objsub.h"
#include "game/window.h"
#include "game/wipe.h"
#include "ext_math.h"
@ -74,77 +74,28 @@ static Process *starProc;
static s16 starParman = -1;
static s16 hostMdl = -1;
static const s32 starMesTbl1[9] = {
MAKE_MESSID(12, 0),
MAKE_MESSID(12, 9),
MAKE_MESSID(12, 18),
MAKE_MESSID(12, 27),
MAKE_MESSID(12, 36),
MAKE_MESSID(12, 45),
MAKE_MESSID(12, 0),
MAKE_MESSID(12, 0),
MAKE_MESSID(12, 0)
};
static const s32 starMesTbl1[9] = { MAKE_MESSID(12, 0), MAKE_MESSID(12, 9), MAKE_MESSID(12, 18), MAKE_MESSID(12, 27), MAKE_MESSID(12, 36),
MAKE_MESSID(12, 45), MAKE_MESSID(12, 0), MAKE_MESSID(12, 0), MAKE_MESSID(12, 0) };
static const s32 starMesTbl2[9][2] = {
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) },
{ MAKE_MESSID(21, 35), MAKE_MESSID(21, 41) },
{ MAKE_MESSID(21, 36), MAKE_MESSID(21, 42) },
{ MAKE_MESSID(21, 37), MAKE_MESSID(21, 43) },
{ MAKE_MESSID(21, 38), MAKE_MESSID(21, 44) },
{ MAKE_MESSID(21, 39), MAKE_MESSID(21, 45) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) }
};
static const s32 starMesTbl2[9][2]
= { { MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) }, { MAKE_MESSID(21, 35), MAKE_MESSID(21, 41) }, { MAKE_MESSID(21, 36), MAKE_MESSID(21, 42) },
{ MAKE_MESSID(21, 37), MAKE_MESSID(21, 43) }, { MAKE_MESSID(21, 38), MAKE_MESSID(21, 44) }, { MAKE_MESSID(21, 39), MAKE_MESSID(21, 45) },
{ MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) }, { MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) }, { MAKE_MESSID(21, 34), MAKE_MESSID(21, 40) } };
s32 boardStarSndTbl[] = {
0x00000120,
0x00000160,
0x000001A0,
0x000001E0,
0x00000220,
0x00000260,
0x000002A0,
0x000002E0
};
s32 boardStarSndTbl[] = { 0x00000120, 0x00000160, 0x000001A0, 0x000001E0, 0x00000220, 0x00000260, 0x000002A0, 0x000002E0 };
static s32 hostMotTbl[9][2] = {
{ DATA_MAKE_NUM(DATADIR_W01, 33), DATA_MAKE_NUM(DATADIR_BOARD, 157) },
{ DATA_MAKE_NUM(DATADIR_W02, 7), DATA_MAKE_NUM(DATADIR_BOARD, 158) },
{ DATA_MAKE_NUM(DATADIR_W03, 31), DATA_MAKE_NUM(DATADIR_BOARD, 159) },
{ DATA_MAKE_NUM(DATADIR_W04, 11), DATA_MAKE_NUM(DATADIR_BOARD, 160) },
{ DATA_MAKE_NUM(DATADIR_W05, 9), DATA_MAKE_NUM(DATADIR_BOARD, 161) },
{ DATA_MAKE_NUM(DATADIR_W06, 21), DATA_MAKE_NUM(DATADIR_BOARD, 162) }
};
static s32 hostMotTbl[9][2] = { { DATA_MAKE_NUM(DATADIR_W01, 33), DATA_MAKE_NUM(DATADIR_BOARD, 157) },
{ DATA_MAKE_NUM(DATADIR_W02, 7), DATA_MAKE_NUM(DATADIR_BOARD, 158) }, { DATA_MAKE_NUM(DATADIR_W03, 31), DATA_MAKE_NUM(DATADIR_BOARD, 159) },
{ DATA_MAKE_NUM(DATADIR_W04, 11), DATA_MAKE_NUM(DATADIR_BOARD, 160) }, { DATA_MAKE_NUM(DATADIR_W05, 9), DATA_MAKE_NUM(DATADIR_BOARD, 161) },
{ DATA_MAKE_NUM(DATADIR_W06, 21), DATA_MAKE_NUM(DATADIR_BOARD, 162) } };
static HsfanimStruct00 starEffParam = {
0x001E,
{ 0x00, 0x00 }, // padding?
3.3f,
70.0f,
7.0f,
{ 0.0f, -0.05f, 0.0f },
2.0f,
1.0f,
20.0f,
0.98f,
0x0002,
{
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x40, 0xFF,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
},
{
0xFF, 0x80, 0x80, 0x00,
0xFF, 0x40, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
}
};
static HsfanimStruct00 starEffParam = { 0x001E, { 0x00, 0x00 }, // padding?
3.3f, 70.0f, 7.0f, { 0.0f, -0.05f, 0.0f }, 2.0f, 1.0f, 20.0f, 0.98f, 0x0002,
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0xFF, 0x80, 0x80, 0x00, 0xFF, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } };
void BoardStarHostSet(s16 arg0) {
void BoardStarHostSet(s16 arg0)
{
hostMdl = arg0;
if (GWBoardGet() == BOARD_ID_EXTRA1 || GWBoardGet() == BOARD_ID_EXTRA2) {
return;
@ -154,11 +105,13 @@ void BoardStarHostSet(s16 arg0) {
}
}
s16 BoardStarHostMdlGet(void) {
s16 BoardStarHostMdlGet(void)
{
return hostMdl;
}
void BoardStarExec(s32 arg0, s32 arg1) {
void BoardStarExec(s32 arg0, s32 arg1)
{
if (GWBoardGet() == BOARD_ID_EXTRA1 || GWBoardGet() == BOARD_ID_EXTRA2) {
return;
}
@ -173,7 +126,8 @@ void BoardStarExec(s32 arg0, s32 arg1) {
}
}
static void ExecStar(void) {
static void ExecStar(void)
{
Vec sp24;
Vec sp18;
Vec spC;
@ -215,22 +169,23 @@ static void ExecStar(void) {
BoardPlayerIdleSet(temp_r31);
if (BoardDAngleCalc(temp_f30 - temp_f29) < 0.0f) {
var_f28 = -BoardDAngleCalc(temp_f30 - temp_f29);
} else {
}
else {
var_f28 = BoardDAngleCalc(temp_f30 - temp_f29);
}
if (var_f28 > 90.0f) {
var_r25 = 30;
} else {
}
else {
var_r25 = 15;
}
BoardPlayerMotBlendSet(temp_r31, temp_f30, var_r25);
temp_f27 = BoardModelRotYGet(temp_r30);
var_f31 = BoardDAngleCalc(temp_f30 + 180.0f) - temp_f27;
if ((var_f31 <= 4.0f && var_f31 >= 0.0f)
|| (var_f31 <= 360.0f && var_f31 >= 355.0f)
|| (var_f31 <= 0.0f && var_f31 >= -4.0f)) {
if ((var_f31 <= 4.0f && var_f31 >= 0.0f) || (var_f31 <= 360.0f && var_f31 >= 355.0f) || (var_f31 <= 0.0f && var_f31 >= -4.0f)) {
var_r26 = 0;
} else {
}
else {
var_r26 = 1;
}
if (var_r26 != 0) {
@ -253,12 +208,14 @@ static void ExecStar(void) {
BoardWinCreate(0, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
} else if (BoardPlayerCoinsGet(temp_r31) < 20 && GWSystem.last5_effect != 4) {
}
else if (BoardPlayerCoinsGet(temp_r31) < 20 && GWSystem.last5_effect != 4) {
temp_r29 = starMesTbl1[temp_r27] + 2;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
BoardWinKill();
} else {
}
else {
BoardStatusShowSetAll(0);
while (!BoardStatusStopCheck(0) || !BoardStatusStopCheck(1) || !BoardStatusStopCheck(2) || !BoardStatusStopCheck(3)) {
HuPrcVSleep();
@ -286,7 +243,8 @@ static void ExecStar(void) {
if (GWPlayer[temp_r31].com) {
if (BoardPlayerCoinsGet(temp_r31) >= 20) {
BoardComKeySetUp();
} else {
}
else {
BoardComKeySetDown();
}
}
@ -325,7 +283,7 @@ static void ExecStar(void) {
break;
}
}
block_A:
block_A:
temp_r29 = starMesTbl1[temp_r27] + 3;
BoardWinCreate(2, temp_r29, BoardWinPortraitGetStar());
BoardWinWait();
@ -381,7 +339,8 @@ block_B:
HuPrcEnd();
}
static void DestroyStar(void) {
static void DestroyStar(void)
{
s32 i;
_ClearFlag(0x10017);
@ -394,7 +353,8 @@ static void DestroyStar(void) {
starProc = NULL;
}
static void GiveStarMain(omObjData *arg0) {
static void GiveStarMain(omObjData *arg0)
{
GiveStarWork *temp_r30;
temp_r30 = OM_GET_WORK_PTR(arg0, GiveStarWork);
@ -407,7 +367,8 @@ static void GiveStarMain(omObjData *arg0) {
}
if (temp_r30->unk04 != 0) {
temp_r30->unk04--;
} else {
}
else {
switch (temp_r30->unk01) {
case 4:
break;
@ -431,7 +392,8 @@ static void GiveStarMain(omObjData *arg0) {
}
}
static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1) {
static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1)
{
float var_f31;
if (arg0->unk00_field1 != 0) {
@ -446,7 +408,8 @@ static void UpdateStarAngle(GiveStarWork *arg0, omObjData *arg1) {
}
}
static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1) {
static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1)
{
Vec sp8;
BoardPlayerPosGet(arg0->unk00_field3, &sp8);
@ -465,7 +428,8 @@ static void InitGiveStar(GiveStarWork *arg0, omObjData *arg1) {
InitGiveStarEffect();
}
static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1) {
static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1)
{
Vec sp8;
float temp_f31;
@ -482,7 +446,8 @@ static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1) {
arg1->trans.z += arg1->rot.z;
arg1->trans.y += -0.08166667f * temp_f31 * temp_f31 * 0.97f + 50.0f;
arg0->unk0A++;
} else {
}
else {
arg1->trans.y += -4.0f;
if (arg1->trans.y <= sp8.y + 300.0f) {
arg1->trans.y = sp8.y + 300.0f;
@ -491,7 +456,8 @@ static void MoveGiveStar(GiveStarWork *arg0, omObjData *arg1) {
}
}
static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1) {
static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1)
{
Vec sp8;
float var_f30;
@ -505,7 +471,8 @@ static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1) {
if (arg0->unk08 < 90) {
if (BoardPlayerSizeGet(arg0->unk00_field3) != 1) {
arg0->unk08 += 2;
} else {
}
else {
arg0->unk08 += 1.4f;
}
if (arg0->unk08 > 90) {
@ -519,7 +486,8 @@ static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1) {
}
arg1->scale.y = arg1->scale.x;
arg1->scale.z = arg1->scale.x;
} else {
}
else {
omVibrate(arg0->unk00_field3, 12, 0xC, 0);
arg0->unk00_field0 = 1;
arg0->unk01 = 4;
@ -529,7 +497,8 @@ static void ShrinkGiveStar(GiveStarWork *arg0, omObjData *arg1) {
}
}
static void StopGiveStar(void) {
static void StopGiveStar(void)
{
GiveStarWork *temp_r31;
if (giveStarObj) {
@ -538,7 +507,8 @@ static void StopGiveStar(void) {
}
}
static void InitGiveStarEffect(void) {
static void InitGiveStarEffect(void)
{
s16 temp_r3;
void *var_r30;
@ -553,7 +523,8 @@ static void InitGiveStarEffect(void) {
HuDataDirClose(DATADIR_EFFECT);
}
static void KillGiveStarEffect(void) {
static void KillGiveStarEffect(void)
{
if (starParman != -1) {
Hu3DParManKill(starParman);
starParman = -1;
@ -561,13 +532,15 @@ static void KillGiveStarEffect(void) {
}
}
static inline void StarInlineFunc00(void) {
static inline void StarInlineFunc00(void)
{
GiveStarWork *temp_r28 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
temp_r28->unk01 = 0;
}
static inline void StarInlineFunc01(void) {
static inline void StarInlineFunc01(void)
{
GiveStarWork *temp_r27 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
while (temp_r27->unk01 != 4) {
@ -575,7 +548,8 @@ static inline void StarInlineFunc01(void) {
}
}
static inline void StarInlineFunc02(void) {
static inline void StarInlineFunc02(void)
{
GiveStarWork *temp_r29 = OM_GET_WORK_PTR(giveStarObj, GiveStarWork);
temp_r29->unk00_field1 = 1;
@ -584,7 +558,8 @@ static inline void StarInlineFunc02(void) {
temp_r29->unk01 = 2;
}
void BoardStarGive(s32 arg0, Vec *arg1) {
void BoardStarGive(s32 arg0, Vec *arg1)
{
Vec sp8;
s32 temp_r25;
GiveStarWork *temp_r31;
@ -631,7 +606,8 @@ void BoardStarGive(s32 arg0, Vec *arg1) {
HuPrcSleep(10);
if (_CheckFlag(FLAG_ID_MAKE(1, 11))) {
BoardPlayerMotionEndWait(arg0);
} else {
}
else {
temp_r25 = HuAudSStreamPlay(6);
BoardPlayerMotionEndWait(arg0);
while (msmStreamGetStatus(temp_r25) != 0) {
@ -641,7 +617,8 @@ void BoardStarGive(s32 arg0, Vec *arg1) {
BoardPlayerVoiceEnableSet(arg0, 7, 1);
}
void BoardStarShowNext(s32 arg0) {
void BoardStarShowNext(s32 arg0)
{
Mtx spBC;
Mtx sp8C;
Mtx sp5C;
@ -669,7 +646,8 @@ void BoardStarShowNext(s32 arg0) {
while (WipeStatGet() != 0) {
HuPrcVSleep();
}
} else {
}
else {
HuPrcSleep(18);
}
BoardStatusItemSet(0);
@ -703,14 +681,16 @@ void BoardStarShowNext(s32 arg0) {
temp_f31 = VECMag(&sp20);
if (temp_f31 > 3000.0f) {
var_r27 = 0xF0;
} else if (temp_f31 > 1500.0f) {
}
else if (temp_f31 > 1500.0f) {
var_r27 = 0x78;
} else {
}
else {
var_r27 = 0x78;
}
BoardViewMoveStart(&sp38, &sp50, var_r27);
showNextObj->trans.x = 68.0f;
showNextObj->trans.y = HU_DISP_HEIGHT-50;
showNextObj->trans.y = HU_DISP_HEIGHT - 50;
showNextObj->trans.z = 100.0f;
sp44.x = showNextObj->trans.x;
sp44.y = showNextObj->trans.y;
@ -718,9 +698,9 @@ void BoardStarShowNext(s32 arg0) {
Hu3D2Dto3D(&sp44, 1, &sp44);
BoardModelPosSetV(BoardStarHostMdlGet(), &sp44);
BoardCameraRotGet(&sp2C);
PSMTXRotRad(sp5C, 'y', MTXDegToRad(10.0f));
PSMTXRotRad(sp8C, 'x', MTXDegToRad(sp2C.x));
PSMTXConcat(sp8C, sp5C, spBC);
MTXRotRad(sp5C, 'y', MTXDegToRad(10.0f));
MTXRotRad(sp8C, 'x', MTXDegToRad(sp2C.x));
MTXConcat(sp8C, sp5C, spBC);
BoardModelMtxSet(BoardStarHostMdlGet(), &spBC);
BoardModelRotSet(BoardStarHostMdlGet(), 0.0f, 0.0f, 0.0f);
BoardModelScaleSet(BoardStarHostMdlGet(), 0.09f, 0.09f, 0.09f);
@ -735,7 +715,8 @@ void BoardStarShowNext(s32 arg0) {
}
if (var_r28 == 0) {
var_r30 = starMesTbl1[GWBoardGet()] + 6;
} else {
}
else {
var_r30 = starMesTbl2[GWBoardGet()][0];
}
BoardWinCreate(3, var_r30, -1);
@ -749,7 +730,8 @@ void BoardStarShowNext(s32 arg0) {
HuPrcSleep(3);
if (var_r28 == 0) {
var_r30 = starMesTbl1[GWBoardGet()] + 7;
} else {
}
else {
var_r30 = starMesTbl2[GWBoardGet()][1];
}
BoardWinCreate(3, var_r30, -1);
@ -765,7 +747,7 @@ void BoardStarShowNext(s32 arg0) {
HuPrcVSleep();
}
BoardViewWait();
PSMTXIdentity(spBC);
MTXIdentity(spBC);
BoardModelMtxSet(BoardStarHostMdlGet(), &spBC);
HideNextHost(1);
while (showNextObj) {
@ -786,7 +768,8 @@ void BoardStarShowNext(s32 arg0) {
_ClearFlag(FLAG_ID_MAKE(1, 28));
}
static void ShowNextUpdate(omObjData *arg0) {
static void ShowNextUpdate(omObjData *arg0)
{
ShowNextWork *temp_r30 = OM_GET_WORK_PTR(arg0, ShowNextWork);
Vec sp8;
@ -815,7 +798,8 @@ static void ShowNextUpdate(omObjData *arg0) {
BoardModelPosSetV(BoardStarHostMdlGet(), &sp8);
}
static void HideNextHost(s32 arg0) {
static void HideNextHost(s32 arg0)
{
ShowNextWork *temp_r31 = OM_GET_WORK_PTR(showNextObj, ShowNextWork);
temp_r31->unk01 = arg0;

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,6 @@
#include "game/board/view.h"
#include "game/audio.h"
#include "game/disp.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/hsfex.h"
@ -7,7 +8,6 @@
#include "game/pad.h"
#include "game/sprite.h"
#include "game/wipe.h"
#include "game/disp.h"
#include "game/board/main.h"
#include "game/board/model.h"
@ -54,55 +54,28 @@ static Process *viewProc;
static s16 buttonWin = -1;
static s16 focusMdl = -1;
static float overhead2DPos[][2] = {
{ 48.0f, 72.0f },
{ HU_DISP_WIDTH-48, 72.0f },
{ 48.0f, HU_DISP_HEIGHT-72 },
{ HU_DISP_WIDTH-48, HU_DISP_HEIGHT-72 },
{ HU_DISP_CENTERX, 72.0f }
};
static float overhead2DPos[][2] = { { 48.0f, 72.0f }, { HU_DISP_WIDTH - 48, 72.0f }, { 48.0f, HU_DISP_HEIGHT - 72 },
{ HU_DISP_WIDTH - 48, HU_DISP_HEIGHT - 72 }, { HU_DISP_CENTERX, 72.0f } };
static float mapViewMinZ[] = {
-2000.0f, -1500.0f, -2200.0f,
-1800.0f, -2100.0f, -3000.0f,
-3000.0f, -1800.0f, -1800.0f
};
static float mapViewMinZ[] = { -2000.0f, -1500.0f, -2200.0f, -1800.0f, -2100.0f, -3000.0f, -3000.0f, -1800.0f, -1800.0f };
static float mapViewMaxZ[] = {
2300.0f, 2500.0f, 2600.0f,
2000.0f, 2300.0f, 2500.0f,
2500.0f, 2000.0f, 2000.0f
};
static float mapViewMaxZ[] = { 2300.0f, 2500.0f, 2600.0f, 2000.0f, 2300.0f, 2500.0f, 2500.0f, 2000.0f, 2000.0f };
static float mapViewMinX[] = {
-3000.0f, -3000.0f, -3000.0f,
-3000.0f, -3000.0f, -3000.0f,
-3000.0f, -2000.0f, -2000.0f
};
static float mapViewMinX[] = { -3000.0f, -3000.0f, -3000.0f, -3000.0f, -3000.0f, -3000.0f, -3000.0f, -2000.0f, -2000.0f };
static float mapViewMaxX[] = {
3000.0f, 3000.0f, 3000.0f,
3000.0f, 3000.0f, 3000.0f,
3000.0f, 1600.0f, 2000.0f
};
static float mapViewMaxX[] = { 3000.0f, 3000.0f, 3000.0f, 3000.0f, 3000.0f, 3000.0f, 3000.0f, 1600.0f, 2000.0f };
static float overheadCamZoom[] = {
14370.0f, 14500.0f, 15000.0f,
15000.0f, 13000.0f, 15000.0f,
100.0f, 10000.0f, 10000.0f
};
static float overheadCamZoom[] = { 14370.0f, 14500.0f, 15000.0f, 15000.0f, 13000.0f, 15000.0f, 100.0f, 10000.0f, 10000.0f };
static float overheadCamPosZ[] = {
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, -160.0f, 0.0f
};
static float overheadCamPosZ[] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -160.0f, 0.0f };
void BoardViewOverheadExec(s32 arg0) {
void BoardViewOverheadExec(s32 arg0)
{
if (BoardPauseDisableGet() == 0) {
BoardPauseDisableSet(1);
pauseDisableF = 1;
} else {
}
else {
pauseDisableF = 0;
}
_SetFlag(0x1001C);
@ -128,13 +101,15 @@ void BoardViewOverheadExec(s32 arg0) {
_ClearFlag(0x1001C);
}
void BoardViewFocusGetPos(Vec *arg0) {
void BoardViewFocusGetPos(Vec *arg0)
{
if (arg0) {
BoardModelPosGet(focusMdl, arg0);
}
}
static inline void BoardViewInlineFunc00(Vec *arg0, Vec *arg1, u16 arg2) {
static inline void BoardViewInlineFunc00(Vec *arg0, Vec *arg1, u16 arg2)
{
if (arg2 == 0) {
arg2 = 1;
}
@ -150,13 +125,15 @@ static inline void BoardViewInlineFunc00(Vec *arg0, Vec *arg1, u16 arg2) {
}
}
void BoardViewFocusSet(Vec *arg0, u16 arg1) {
void BoardViewFocusSet(Vec *arg0, u16 arg1)
{
u16 var_r31;
if (BoardPauseDisableGet() == 0) {
BoardPauseDisableSet(1);
pauseDisableF = 1;
} else {
}
else {
pauseDisableF = 0;
}
focusDestroyF = 1;
@ -164,13 +141,15 @@ void BoardViewFocusSet(Vec *arg0, u16 arg1) {
HuPrcSleep(2);
}
void BoardViewMoveStart(Vec *arg0, Vec *arg1, u16 arg2) {
void BoardViewMoveStart(Vec *arg0, Vec *arg1, u16 arg2)
{
u16 var_r31;
if (BoardPauseDisableGet() == 0) {
BoardPauseDisableSet(1);
pauseDisableF = 1;
} else {
}
else {
pauseDisableF = 0;
}
viewProc = HuPrcChildCreate(ExecStarView, 0x200A, 0x3800, 0, boardMainProc);
@ -180,26 +159,31 @@ void BoardViewMoveStart(Vec *arg0, Vec *arg1, u16 arg2) {
HuPrcSleep(2);
}
BOOL BoardViewMoveCheck(void) {
BOOL BoardViewMoveCheck(void)
{
return (viewMoveF != 0) ? TRUE : FALSE;
}
void BoardViewMoveEnd(void) {
void BoardViewMoveEnd(void)
{
viewMoveF = 0;
}
void BoardViewWait(void) {
void BoardViewWait(void)
{
viewMoveF = 0;
while (viewProc != NULL) {
HuPrcVSleep();
}
}
void BoardViewMapExec(s32 arg0) {
void BoardViewMapExec(s32 arg0)
{
if (BoardPauseDisableGet() == 0) {
BoardPauseDisableSet(1);
pauseDisableF = 1;
} else {
}
else {
pauseDisableF = 0;
}
viewProc = HuPrcChildCreate(ExecMapView, 0x200A, 0x3800, 0, boardMainProc);
@ -214,7 +198,8 @@ void BoardViewMapExec(s32 arg0) {
}
}
static void ExecMapView(void) {
static void ExecMapView(void)
{
Vec spC;
float var_f29;
float temp_f28;
@ -240,7 +225,8 @@ static void ExecMapView(void) {
}
if (HuPadBtn[GWPlayer[viewPlayer].port] & 0x100) {
var_f29 = 40.0f;
} else {
}
else {
var_f29 = 20.0f;
}
spC.x = spC.y = spC.z = 0.0f;
@ -274,7 +260,8 @@ static void ExecMapView(void) {
HuPrcEnd();
}
static void ExecStarView(void) {
static void ExecStarView(void)
{
Vec sp8;
float temp_f30;
@ -307,7 +294,8 @@ static void ExecStarView(void) {
HuPrcEnd();
}
static void ExecOverheadView(void) {
static void ExecOverheadView(void)
{
u32 var_r31;
if ((GWBoardGet() == BOARD_ID_MAIN3 || GWBoardGet() == BOARD_ID_MAIN6) && boardLightResetHook) {
@ -338,7 +326,8 @@ static void ExecOverheadView(void) {
HuPrcEnd();
}
static void DestroyView(void) {
static void DestroyView(void)
{
if (focusMdl != -1) {
BoardModelKill(focusMdl);
focusMdl = -1;
@ -355,7 +344,8 @@ static void DestroyView(void) {
viewProc = NULL;
}
static void SetTargetView(void) {
static void SetTargetView(void)
{
Vec sp14;
Vec sp8;
@ -370,7 +360,8 @@ static void SetTargetView(void) {
sp8.z = 0.0f;
BoardCameraMotionStartEx(focusMdl, &sp8, NULL, 3000.0f, -1.0f, 21);
BoardCameraMotionWait();
} else {
}
else {
BoardModelPosSet(focusMdl, 0.0f, 0.0f, 0.0f);
sp14.x = 0.0f;
sp14.y = 0.0f;
@ -386,7 +377,8 @@ static void SetTargetView(void) {
}
}
static void DestroyFocus(void) {
static void DestroyFocus(void)
{
if (focusMdl != -1) {
BoardModelKill(focusMdl);
focusMdl = -1;
@ -396,7 +388,8 @@ static void DestroyFocus(void) {
BoardCameraMoveSet(1);
}
static void CreateButtonWin(void) {
static void CreateButtonWin(void)
{
float sp8[2];
float posX;
float posY;
@ -404,39 +397,41 @@ static void CreateButtonWin(void) {
if (viewControls != 2) {
var_r31 = MAKE_MESSID(0x09, 0x05);
#if VERSION_PAL
#if VERSION_PAL
HuWinMesMaxSizeGet(1, sp8, var_r31);
posX = 288-((sp8[0]/2)-32);
#endif
posX = 288 - ((sp8[0] / 2) - 32);
#endif
posY = 286.0f;
} else {
}
else {
var_r31 = MAKE_MESSID(0x10, 0x4D);
#if VERSION_PAL
#if VERSION_PAL
posX = -10000.0f;
posY = 324.0f;
#else
#else
posY = 328.0f;
#endif
#endif
}
HuWinMesMaxSizeGet(1, sp8, var_r31);
#if VERSION_NTSC
#if VERSION_NTSC
posX = -10000.0f;
#endif
#endif
buttonWin = HuWinCreate(posX, posY, sp8[0], sp8[1], 0);
HuWinBGTPLvlSet(buttonWin, 0.0f);
HuWinMesSpeedSet(buttonWin, 0);
HuWinMesSet(buttonWin, var_r31);
}
static void DestroyButtonWin(void) {
static void DestroyButtonWin(void)
{
if (buttonWin != -1) {
HuWinKill(buttonWin);
buttonWin = -1;
}
}
static void InitOverheadView(void) {
static void InitOverheadView(void)
{
Vec sp10;
GXColor spA;
s16 sp8;
@ -444,16 +439,9 @@ static void InitOverheadView(void) {
OverheadWork *temp_r31;
float *temp_r30;
s32 i;
s32 sp1C[8] = {
DATA_MAKE_NUM(DATADIR_BOARD, 0x2E),
DATA_MAKE_NUM(DATADIR_BOARD, 0x2F),
DATA_MAKE_NUM(DATADIR_BOARD, 0x30),
DATA_MAKE_NUM(DATADIR_BOARD, 0x31),
DATA_MAKE_NUM(DATADIR_BOARD, 0x32),
DATA_MAKE_NUM(DATADIR_BOARD, 0x33),
DATA_MAKE_NUM(DATADIR_BOARD, 0x34),
DATA_MAKE_NUM(DATADIR_BOARD, 0x35)
};
s32 sp1C[8] = { DATA_MAKE_NUM(DATADIR_BOARD, 0x2E), DATA_MAKE_NUM(DATADIR_BOARD, 0x2F), DATA_MAKE_NUM(DATADIR_BOARD, 0x30),
DATA_MAKE_NUM(DATADIR_BOARD, 0x31), DATA_MAKE_NUM(DATADIR_BOARD, 0x32), DATA_MAKE_NUM(DATADIR_BOARD, 0x33),
DATA_MAKE_NUM(DATADIR_BOARD, 0x34), DATA_MAKE_NUM(DATADIR_BOARD, 0x35) };
temp_r26 = omAddObjEx(boardObjMan, 0x1000, 0, 0, -1, UpdateOverheadView);
overheadObj = temp_r26;
@ -472,7 +460,8 @@ static void InitOverheadView(void) {
spA.r = 0x50;
spA.g = 0x50;
spA.b = 0x50;
} else {
}
else {
GWCharColorGet(GWPlayer[i].character, &spA);
}
BoardSpriteCreate(DATA_MAKE_NUM(DATADIR_BOARD, 0x6C), 0x1770, 0, &sp8);
@ -505,13 +494,15 @@ static void InitOverheadView(void) {
}
}
static void DestroyOverheadView(void) {
static void DestroyOverheadView(void)
{
if (overheadObj) {
OM_GET_WORK_PTR(overheadObj, OverheadWork)->unk00_field0 = 1;
}
}
static void UpdateOverheadView(omObjData *arg0) {
static void UpdateOverheadView(omObjData *arg0)
{
Vec sp20;
Vec sp14;
Vec sp8;
@ -545,7 +536,8 @@ static void UpdateOverheadView(omObjData *arg0) {
}
if (GWBoardGet() == BOARD_ID_EXTRA1 || GWBoardGet() == BOARD_ID_EXTRA2) {
var_r27 = 1;
} else {
}
else {
var_r27 = 0;
}
for (i = 0; i < 5; i++) {
@ -555,9 +547,11 @@ static void UpdateOverheadView(omObjData *arg0) {
sp20.z = 1000.0f;
if (i != 4) {
BoardSpacePosGet(0, GWPlayer[i].space_curr, &sp14);
} else if (var_r27 != 0) {
}
else if (var_r27 != 0) {
sp14.x = sp14.y = sp14.z = 0.0f;
} else {
}
else {
BoardSpacePosGet(0, BoardSpaceStarGetCurr(), &sp14);
}
Hu3D3Dto2D(&sp14, 1, &sp14);
@ -569,7 +563,8 @@ static void UpdateOverheadView(omObjData *arg0) {
temp_f31 = VECMag(&sp8) / 32;
if (i != 4) {
var_r28 = i + 4;
} else {
}
else {
var_r28 = 8;
}
HuSprZRotSet(temp_r31->unk02, var_r28, temp_f30);
@ -577,13 +572,15 @@ static void UpdateOverheadView(omObjData *arg0) {
HuSprPosSet(temp_r31->unk02, var_r28, var_r29[0], var_r29[1]);
if (i == 4 && (GWBoardGet() == BOARD_ID_EXTRA1 || GWBoardGet() == BOARD_ID_EXTRA2)) {
BoardModelVisibilitySet(temp_r31->unk04, 0);
} else if (temp_r31->unk01 != 0) {
}
else if (temp_r31->unk01 != 0) {
if (i != 4) {
HuSprAttrReset(temp_r31->unk02, i, HUSPR_ATTR_DISPOFF);
}
HuSprAttrReset(temp_r31->unk02, var_r28, HUSPR_ATTR_DISPOFF);
BoardModelVisibilitySet(temp_r31->unk04, 1);
} else {
}
else {
if (i != 4) {
HuSprAttrSet(temp_r31->unk02, i, HUSPR_ATTR_DISPOFF);
}
@ -595,15 +592,16 @@ static void UpdateOverheadView(omObjData *arg0) {
sp20.y = var_r29[1];
sp20.z = 1000.0f;
BoardCameraRotGet(&sp8);
PSMTXRotRad(sp5C, 'x', MTXDegToRad(sp8.x));
PSMTXRotRad(sp2C, 'y', MTXDegToRad(sp8.y));
PSMTXConcat(sp2C, sp5C, sp2C);
MTXRotRad(sp5C, 'x', MTXDegToRad(sp8.x));
MTXRotRad(sp2C, 'y', MTXDegToRad(sp8.y));
MTXConcat(sp2C, sp5C, sp2C);
BoardModelMtxSet(temp_r31->unk04, &sp2C);
Hu3D2Dto3D(&sp20, 1, &sp20);
BoardModelPosSetV(temp_r31->unk04, &sp20);
}
static void WaitOverheadView(void) {
static void WaitOverheadView(void)
{
while (overheadObj) {
HuPrcVSleep();
}

View file

@ -1421,7 +1421,7 @@ static void UpdateItemHook(void)
effectDustParam.unk0C.z = frandmod(10) - 5;
CreateEffectDust(temp_r31->unk02, sp8.x, sp8.y, sp8.z, 20.0f, &effectDustParam);
}
PSMTXIdentity(temp_r30->unk_F0);
MTXIdentity(temp_r30->unk_F0);
temp_r25 = HuPrcCurrentGet();
for (var_r28 = 0; var_r28 < 32; var_r28++) {
if (itemHookProcess[var_r28] == temp_r25) {

View file

@ -281,11 +281,18 @@ static void GetFileInfo(DataReadStat *read_stat, s32 file_num)
{
u32 *temp_ptr;
temp_ptr = (u32 *)PTR_OFFSET(read_stat->dir, (file_num * 4))+1;
#ifdef TARGET_PC
byteswap_u32(temp_ptr);
#endif
read_stat->file = PTR_OFFSET(read_stat->dir, *temp_ptr);
temp_ptr = read_stat->file;
read_stat->raw_len = *temp_ptr++;
read_stat->comp_type = *temp_ptr++;
read_stat->file = temp_ptr;
#ifdef TARGET_PC
byteswap_u32(&read_stat->raw_len);
byteswap_u32(&read_stat->comp_type);
#endif
}
void *HuDataRead(s32 data_num)

View file

@ -23,7 +23,11 @@ static RGBColor XFB_Colors[5] = {
{ 0x40, 0x80, 0x80 }
};
#ifdef TARGET_PC
u8 Ascii8x8_1bpp[0x800];
#else
#include "Ascii8x8_1bpp.inc"
#endif
static XFBGeometry XFB_Geometry;
@ -44,26 +48,29 @@ static void XFB_CR(s32 arg0, s32* arg1, s32* arg2);
void OSPanic(const char* file, int line, const char* msg, ...) {
static char* titleMes = "OSPanic encounterd:";
va_list sp78;
va_list args;
s32 sp74;
s32 sp70;
char sp84[1024];
char buffer[1024];
s32 puts;
sp74 = x_start = 0x10;
sp70 = y_start = 0x20;
puts = XFB_puts((s8*)titleMes, sp74, sp70);
XFB_CR(puts + 1, &sp74, &sp70);
sprintf(sp84, "%s:%d", file, line);
puts = XFB_puts((s8*)sp84, sp74, sp70);
sprintf(buffer, "%s:%d", file, line);
puts = XFB_puts((s8*)buffer, sp74, sp70);
XFB_CR(puts, &sp74, &sp70);
va_start(sp78, msg);
vsnprintf(sp84, 0x400U, msg, &sp78[0]);
puts = XFB_puts((s8*)sp84, sp74, sp70);
va_start(args, msg);
vsnprintf(buffer, 0x400U, msg, &args[0]);
#ifdef TARGET_PC
fputs(buffer, stderr);
#endif
puts = XFB_puts((s8*)buffer, sp74, sp70);
XFB_CR(puts, &sp74, &sp70);
XFB_WriteBackCache();
PPCHalt();
va_end(sp78);
va_end(args);
}
void HuFaultInitXfbDirectDraw(GXRenderModeObj *mode) {

View file

@ -1,6 +1,9 @@
#include "dolphin.h"
#include "game/gamework_data.h"
#ifdef TARGET_PC
#include "string.h"
#endif
static u8 _Sys_Flag[16];
static u8 *GetFlagPtr(u32 flag)
@ -39,4 +42,4 @@ void _ClearFlag(u32 flag)
void _InitFlag(void)
{
memset(_Sys_Flag, 0, sizeof(_Sys_Flag));
}
}

View file

@ -2,6 +2,8 @@
static u32 frand_seed;
extern s32 rand8(void);
static inline u32 frandom(u32 param)
{
s32 rand2, rand3;
@ -36,4 +38,4 @@ u32 frandmod(u32 arg0) {
frand_seed = frandom(frand_seed);
ret = (frand_seed & 0x7FFFFFFF)%arg0;
return ret;
}
}

View file

@ -4,14 +4,14 @@
#include "string.h"
#include "version.h"
s16 GwLanguage = 1;
s16 GwLanguageSave = -1;
SHARED_SYM s16 GwLanguage = 1;
SHARED_SYM s16 GwLanguageSave = -1;
GameStat GWGameStatDefault;
GameStat GWGameStat;
SystemState GWSystem;
PlayerState GWPlayer[4];
PlayerConfig GWPlayerCfg[4];
SHARED_SYM GameStat GWGameStatDefault;
SHARED_SYM GameStat GWGameStat;
SHARED_SYM SystemState GWSystem;
SHARED_SYM PlayerState GWPlayer[4];
SHARED_SYM PlayerConfig GWPlayerCfg[4];
static inline void GWErase(void)
{
@ -39,6 +39,13 @@ static inline void InitPlayerConfig(void)
}
}
// TODO: get these properly declared somewhere
extern void GWRumbleSet(s32 value);
extern void GWMGExplainSet(s32 value);
extern void GWMGShowComSet(s32 value);
extern void GWMessSpeedSet(s32 value);
extern void GWSaveModeSet(s32 value);
static inline void ResetBoardSettings(void)
{
GWRumbleSet(1);

View file

@ -1,4 +1,5 @@
#include "game/hsfanim.h"
#include "dolphin/gx/GXStruct.h"
#include "game/hsfdraw.h"
#include "game/init.h"
#include "game/memory.h"
@ -315,7 +316,7 @@ void Hu3DAnimExec(void) {
for (i = 0; i < HU3D_TEXSCROLL_MAX; i++, var_r31++) {
if (var_r31->unk02 != -1) {
if (Hu3DPauseF != 0 && !(var_r31->unk00 & 8)) {
PSMTXRotRad(var_r31->unk3C, 'Z', MTXDegToRad(var_r31->unk34));
MTXRotRad(var_r31->unk3C, 'Z', MTXDegToRad(var_r31->unk34));
mtxTransCat(var_r31->unk3C, var_r31->unk04.x, var_r31->unk04.y, var_r31->unk04.z);
} else {
if (var_r31->unk00 & 1) {
@ -348,7 +349,7 @@ void Hu3DAnimExec(void) {
var_r31->unk34 += 360.0f;
}
}
PSMTXRotRad(var_r31->unk3C, 'Z', MTXDegToRad(var_r31->unk34));
MTXRotRad(var_r31->unk3C, 'Z', MTXDegToRad(var_r31->unk34));
mtxTransCat(var_r31->unk3C, var_r31->unk04.x, var_r31->unk04.y, var_r31->unk04.z);
}
}
@ -400,7 +401,7 @@ s16 Hu3DTexScrollCreate(s16 arg0, char *arg1) {
var_r31->unk00 = 0;
var_r31->unk04.x = var_r31->unk04.y = var_r31->unk04.z = 0.0f;
var_r31->unk34 = 0.0f;
PSMTXIdentity(var_r31->unk3C);
MTXIdentity(var_r31->unk3C);
return var_r28;
}
@ -686,16 +687,16 @@ static void particleFunc(ModelData *arg0, Mtx arg1) {
temp_r31 = arg0->unk_120;
temp_r22 = temp_r31->unk_44;
if (HmfInverseMtxF3X3(arg1, sp128) == 0) {
PSMTXIdentity(sp128);
MTXIdentity(sp128);
}
PSMTXReorder(sp128, sp8);
MTXReorder(sp128, sp8);
if ((Hu3DPauseF == 0 || (arg0->attr & HU3D_ATTR_NOPAUSE)) && temp_r31->unk_54 && temp_r31->unk_38 != GlobalCounter) {
var_r17 = temp_r31->unk_54;
var_r17(arg0, temp_r31, arg1);
}
var_r29 = temp_r31->unk_48;
var_r30 = temp_r31->unk_4C;
PSMTXROMultVecArray(sp8, &basePos[0], sp38, 4);
MTXROMultVecArray(sp8, &basePos[0], sp38, 4);
for (i = 0, var_r19 = 0; i < temp_r31->unk_30; i++, var_r29++) {
if (var_r29->unk2C && (var_r29->unk06 & Hu3DCameraBit)) {
if (!var_r29->unk30) {
@ -721,9 +722,9 @@ static void particleFunc(ModelData *arg0, Mtx arg1) {
VECScale(&basePos[1], &sp98[1], var_r29->unk2C);
VECScale(&basePos[2], &sp98[2], var_r29->unk2C);
VECScale(&basePos[3], &sp98[3], var_r29->unk2C);
PSMTXRotRad(spC8, 'Z', var_r29->unk30);
PSMTXConcat(sp128, spC8, spF8);
PSMTXMultVecArray(spF8, sp98, sp68, 4);
MTXRotRad(spC8, 'Z', var_r29->unk30);
MTXConcat(sp128, spC8, spF8);
MTXMultVecArray(spF8, sp98, sp68, 4);
VECAdd(&sp68[0], &var_r29->unk34, var_r30++);
VECAdd(&sp68[1], &var_r29->unk34, var_r30++);
VECAdd(&sp68[2], &var_r29->unk34, var_r30++);
@ -799,7 +800,7 @@ static void particleFunc(ModelData *arg0, Mtx arg1) {
temp_r24 = &temp_r22->bmp[temp_r27->bmpNo];
temp_f29 = (float) temp_r27->sizeX / temp_r24->sizeX;
temp_f30 = (float) temp_r27->sizeY / temp_r24->sizeY;
PSMTXScale(sp128, temp_f29, temp_f30, 1.0f);
MTXScale(sp128, temp_f29, temp_f30, 1.0f);
temp_f29 = (float) temp_r27->startX / temp_r24->sizeX;
temp_f30 = (float) temp_r27->startY / temp_r24->sizeY;
mtxTransCat(sp128, temp_f29, temp_f30, 0.0f);
@ -824,13 +825,13 @@ 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, 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, 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, 8);
GXSETARRAY(GX_VA_TEX0, baseST, sizeof(baseST), 8);
GXCallDisplayList(temp_r31->unk_50, temp_r31->unk_40);
}
if (shadowModelDrawF == 0) {

View file

@ -123,7 +123,7 @@ void Hu3DDraw(ModelData *arg0, Mtx arg1, Vec *arg2) {
temp_r28 = arg0->hsfData;
if (arg0->attr & HU3D_ATTR_HOOKFUNC) {
temp_r31 = &DrawObjData[DrawObjIdx];
PSMTXCopy(arg1, temp_r31->matrix);
MTXCopy(arg1, temp_r31->matrix);
sp8.x = temp_r31->matrix[0][3];
sp8.y = temp_r31->matrix[1][3];
sp8.z = temp_r31->matrix[2][3];
@ -139,7 +139,7 @@ void Hu3DDraw(ModelData *arg0, Mtx arg1, Vec *arg2) {
for (i = 0; i < 8; i++) {
BmpPtrBak[i] = (HsfAttribute*) -1;
}
PSMTXCopy(arg1, MTXBuf[0]);
MTXCopy(arg1, MTXBuf[0]);
scaleBuf[0] = *arg2;
MTXIdx = 1;
CancelTRXF = 0;
@ -220,12 +220,12 @@ static void objMesh(ModelData *arg0, HsfObject *arg1) {
if (CancelTRXF == 0) {
if (arg1->data.cenvCnt != 0 && hookIdx == -1) {
temp_r21 = arg1 - temp_r20->object;
PSMTXConcat(MTXBuf[0], temp_r20->matrix->data[temp_r21 + temp_r20->matrix->base_idx], MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[0], temp_r20->matrix->data[temp_r21 + temp_r20->matrix->base_idx], MTXBuf[MTXIdx]);
} else {
PSMTXScale(sp1C, var_r30->scale.x, var_r30->scale.y, var_r30->scale.z);
MTXScale(sp1C, var_r30->scale.x, var_r30->scale.y, var_r30->scale.z);
mtxRotCat(sp1C, var_r30->rot.x, var_r30->rot.y, var_r30->rot.z);
mtxTransCat(sp1C, var_r30->pos.x, var_r30->pos.y, var_r30->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], sp1C, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], sp1C, MTXBuf[MTXIdx]);
}
temp_r28 = &scaleBuf[MTXIdx];
temp_r24 = temp_r28 - 1;
@ -234,29 +234,29 @@ static void objMesh(ModelData *arg0, HsfObject *arg1) {
temp_r28->z = temp_r24->z * var_r30->scale.z;
temp_r29->scale = *temp_r28;
if (arg1->flags & 1) {
PSMTXInverse(MTXBuf[MTXIdx], sp1C);
MTXInverse(MTXBuf[MTXIdx], sp1C);
sp1C[0][3] = sp1C[1][3] = sp1C[2][3] = 0.0f;
PSMTXConcat(MTXBuf[MTXIdx], sp1C, temp_r29->matrix);
MTXConcat(MTXBuf[MTXIdx], sp1C, temp_r29->matrix);
mtxScaleCat(temp_r29->matrix, temp_r28->x, temp_r28->y, temp_r28->z);
} else {
PSMTXCopy(MTXBuf[MTXIdx], temp_r29->matrix);
MTXCopy(MTXBuf[MTXIdx], temp_r29->matrix);
}
MTXIdx++;
var_r18 = 1;
} else {
if (arg1->flags & 1) {
PSMTXInverse(MTXBuf[MTXIdx - 1], sp1C);
MTXInverse(MTXBuf[MTXIdx - 1], sp1C);
sp1C[0][3] = sp1C[1][3] = sp1C[2][3] = 0.0f;
PSMTXConcat(MTXBuf[MTXIdx - 1], sp1C, temp_r29->matrix);
MTXConcat(MTXBuf[MTXIdx - 1], sp1C, temp_r29->matrix);
mtxScaleCat(temp_r29->matrix, scaleBuf[MTXIdx - 1].x, scaleBuf[MTXIdx - 1].y, scaleBuf[MTXIdx - 1].z);
} else {
PSMTXCopy(MTXBuf[MTXIdx - 1], temp_r29->matrix);
MTXCopy(MTXBuf[MTXIdx - 1], temp_r29->matrix);
}
temp_r29->scale = scaleBuf[MTXIdx - 1];
CancelTRXF = 0;
var_r18 = 0;
}
PSMTXCopy(temp_r29->matrix, temp_r25->matrix);
MTXCopy(temp_r29->matrix, temp_r25->matrix);
if (temp_r25->hook != -1) {
temp_r31 = &Hu3DData[temp_r25->hook];
if (!(temp_r31->attr & HU3D_ATTR_DISPOFF)) {
@ -268,11 +268,11 @@ static void objMesh(ModelData *arg0, HsfObject *arg1) {
}
sp8 = hookIdx;
hookIdx = temp_r25->hook;
PSMTXScale(sp1C, temp_r31->scale.x, temp_r31->scale.y, temp_r31->scale.z);
MTXScale(sp1C, temp_r31->scale.x, temp_r31->scale.y, temp_r31->scale.z);
mtxRotCat(sp1C, temp_r31->rot.x, temp_r31->rot.y, temp_r31->rot.z);
mtxTransCat(sp1C, temp_r31->pos.x, temp_r31->pos.y, temp_r31->pos.z);
PSMTXConcat(sp1C, temp_r31->unk_F0, sp1C);
PSMTXConcat(temp_r29->matrix, sp1C, MTXBuf[MTXIdx]);
MTXConcat(sp1C, temp_r31->unk_F0, sp1C);
MTXConcat(temp_r29->matrix, sp1C, MTXBuf[MTXIdx]);
temp_r28 = &scaleBuf[MTXIdx];
temp_r24 = temp_r28 - 1;
temp_r28->x = temp_r24->x * temp_r31->scale.x;
@ -377,8 +377,8 @@ s32 ObjCullCheck(HsfData *arg0, HsfObject *arg1, Mtx arg2) {
temp_f31 = (temp_r29->x - temp_r31->x) * 0.5;
temp_f30 = (temp_r29->y - temp_r31->y) * 0.5;
temp_f29 = (temp_r29->z - temp_r31->z) * 0.5;
PSMTXTrans(sp28, temp_f31 + temp_r31->x, temp_f30 + temp_r31->y, temp_f29 + temp_r31->z);
PSMTXConcat(arg2, sp28, sp28);
MTXTrans(sp28, temp_f31 + temp_r31->x, temp_f30 + temp_r31->y, temp_f29 + temp_r31->z);
MTXConcat(arg2, sp28, sp28);
temp_f21 = var_f26 * sqrtf(temp_f31 * temp_f31 + temp_f30 * temp_f30 + temp_f29 * temp_f29);
temp_f20 = sp28[0][3];
temp_f19 = sp28[1][3];
@ -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);
}
@ -795,7 +795,7 @@ static s32 SetTevStageNoTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
if (var_f31 < 0.1) {
var_f31 = 0.1f;
}
PSMTXCopy(hiliteMtx, sp20);
MTXCopy(hiliteMtx, sp20);
mtxScaleCat(sp20, var_f31, var_f31, var_f31);
GXLoadTexMtxImm(sp20, GX_TEXMTX7, GX_MTX2x4);
var_r30++;
@ -935,12 +935,12 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
var_r30 = var_r31 = 1;
temp_r29 = &temp_r19->data.attribute[arg1->attrs[0]];
if (temp_r29->unk28 != 1.0f || temp_r29->unk2C != 1.0f) {
PSMTXScale(sp54, 1.0f / temp_r29->unk28, 1.0f / temp_r29->unk2C, 1.0f);
MTXScale(sp54, 1.0f / temp_r29->unk28, 1.0f / temp_r29->unk2C, 1.0f);
mtxTransCat(sp54, -temp_r29->unk30, -temp_r29->unk34, 0.0f);
GXLoadTexMtxImm(sp54, texMtxTbl[var_r30], GX_MTX2x4);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, texMtxTbl[var_r30]);
} else if (temp_r29->unk30 != 0.0f || temp_r29->unk34 != 0.0f) {
PSMTXTrans(sp54, -temp_r29->unk30, -temp_r29->unk34, 0.0f);
MTXTrans(sp54, -temp_r29->unk30, -temp_r29->unk34, 0.0f);
GXLoadTexMtxImm(sp54, texMtxTbl[var_r30], GX_MTX2x4);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, texMtxTbl[var_r30]);
} else {
@ -953,13 +953,13 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
GXLoadTexMtxImm(Hu3DTexScrData[temp_r28->unk04].unk3C, GX_TEXMTX0, GX_MTX2x4);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY);
} else if (temp_r28->unk00 & 4) {
PSMTXScale(sp54, 1.0f / temp_r28->unk20, 1.0f / temp_r28->unk24, 1.0f / temp_r28->unk28);
MTXScale(sp54, 1.0f / temp_r28->unk20, 1.0f / temp_r28->unk24, 1.0f / temp_r28->unk28);
mtxRotCat(sp54, temp_r28->unk14, temp_r28->unk18, temp_r28->unk1C);
mtxTransCat(sp54, -temp_r28->unk08, -temp_r28->unk0C, -temp_r28->unk10);
GXLoadTexMtxImm(sp54, GX_TEXMTX0, GX_MTX2x4);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY);
} else if (temp_r28->unk00 & 1) {
PSMTXScale(sp54, temp_r28->unk2C, temp_r28->unk30, 1.0f);
MTXScale(sp54, temp_r28->unk2C, temp_r28->unk30, 1.0f);
mtxTransCat(sp54, temp_r28->unk34, temp_r28->unk38, 0.0f);
GXLoadTexMtxImm(sp54, GX_TEXMTX0, GX_MTX2x4);
GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0, GX_FALSE, GX_PTIDENTITY);
@ -1056,7 +1056,7 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
if (var_f31 < 0.1) {
var_f31 = 0.1f;
}
PSMTXCopy(hiliteMtx, sp54);
MTXCopy(hiliteMtx, sp54);
mtxScaleCat(sp54, var_f31, var_f31, var_f31);
GXLoadTexMtxImm(sp54, GX_TEXMTX7, GX_MTX2x4);
var_r31++;
@ -1131,7 +1131,7 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
temp_r23 = (u16) var_r30;
var_r30++;
} else if (temp_r28->unk00 & 4) {
PSMTXScale(sp54, 1.0f / temp_r28->unk20, 1.0f / temp_r28->unk24, 1.0f / temp_r28->unk28);
MTXScale(sp54, 1.0f / temp_r28->unk20, 1.0f / temp_r28->unk24, 1.0f / temp_r28->unk28);
mtxRotCat(sp54, temp_r28->unk14, temp_r28->unk18, temp_r28->unk1C);
mtxTransCat(sp54, -temp_r28->unk08, -temp_r28->unk0C, -temp_r28->unk10);
GXLoadTexMtxImm(sp54, texMtxTbl[var_r30], GX_MTX2x4);
@ -1139,7 +1139,7 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
temp_r23 = (u16) var_r30;
var_r30++;
} else if (temp_r28->unk00 & 1) {
PSMTXScale(sp54, temp_r28->unk2C, temp_r28->unk30, 1.0f);
MTXScale(sp54, temp_r28->unk2C, temp_r28->unk30, 1.0f);
mtxTransCat(sp54, temp_r28->unk34, temp_r28->unk38, 0.0f);
GXLoadTexMtxImm(sp54, texMtxTbl[var_r30], GX_MTX2x4);
GXSetTexCoordGen(var_r30, GX_TG_MTX2x4, GX_TG_TEX0, texMtxTbl[var_r30]);
@ -1152,12 +1152,12 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
}
} else {
if (temp_r29->unk28 != 1.0f || temp_r29->unk2C != 1.0f) {
PSMTXScale(sp54, 1.0f / temp_r29->unk28, 1.0f / temp_r29->unk2C, 1.0f);
MTXScale(sp54, 1.0f / temp_r29->unk28, 1.0f / temp_r29->unk2C, 1.0f);
mtxTransCat(sp54, -temp_r29->unk30, -temp_r29->unk34, 0.0f);
GXLoadTexMtxImm(sp54, texMtxTbl[var_r30], GX_MTX2x4);
GXSetTexCoordGen(var_r30, GX_TG_MTX2x4, GX_TG_TEX0, texMtxTbl[var_r30]);
} else if (temp_r29->unk30 != 0.0f || temp_r29->unk34 != 0.0f) {
PSMTXTrans(sp54, -temp_r29->unk30, -temp_r29->unk34, 0.0f);
MTXTrans(sp54, -temp_r29->unk30, -temp_r29->unk34, 0.0f);
GXLoadTexMtxImm(sp54, texMtxTbl[var_r30], GX_MTX2x4);
GXSetTexCoordGen(var_r30, GX_TG_MTX2x4, GX_TG_TEX0, texMtxTbl[var_r30]);
} else {
@ -1298,11 +1298,11 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
GXSetTevAlphaIn(var_r31, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV);
GXSetTevAlphaOp(var_r31, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
}
PSMTXScale(sp54, 1.0f / arg0->scale.x, 1.0f / arg0->scale.y, 1.0f / arg0->scale.z);
PSMTXConcat(arg0->matrix, sp54, sp54);
MTXScale(sp54, 1.0f / arg0->scale.x, 1.0f / arg0->scale.y, 1.0f / arg0->scale.z);
MTXConcat(arg0->matrix, sp54, sp54);
sp54[0][3] = sp54[1][3] = sp54[2][3] = 0.0f;
PSMTXConcat(sp54, Hu3DCameraMtxXPose, sp54);
PSMTXConcat(refMtx, sp54, sp54);
MTXConcat(sp54, Hu3DCameraMtxXPose, sp54);
MTXConcat(refMtx, sp54, sp54);
GXLoadTexMtxImm(sp54, 0x36, GX_MTX2x4);
var_r31++;
var_r30++;
@ -1320,7 +1320,7 @@ static void SetTevStageTex(HsfDrawObject *arg0, HsfMaterial *arg1) {
if (var_f31 < 0.1) {
var_f31 = 0.1f;
}
PSMTXCopy(hiliteMtx, sp54);
MTXCopy(hiliteMtx, sp54);
mtxScaleCat(sp54, var_f31, var_f31, var_f31);
GXLoadTexMtxImm(sp54, 0x33, GX_MTX2x4);
if (var_r20 == -1) {
@ -1551,11 +1551,11 @@ static void SetReflect(HsfDrawObject *arg0, s16 arg1, s16 arg2, u8 arg3) {
GXSetTevColorOp(arg1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(arg1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV);
GXSetTevAlphaOp(arg1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV);
PSMTXScale(sp3C, 1.0f / arg0->scale.x, 1.0f / arg0->scale.y, 1.0f / arg0->scale.z);
PSMTXConcat(arg0->matrix, sp3C, spC);
MTXScale(sp3C, 1.0f / arg0->scale.x, 1.0f / arg0->scale.y, 1.0f / arg0->scale.z);
MTXConcat(arg0->matrix, sp3C, spC);
spC[0][3] = spC[1][3] = spC[2][3] = 0.0f;
PSMTXConcat(spC, Hu3DCameraMtxXPose, sp3C);
PSMTXConcat(refMtx, sp3C, spC);
MTXConcat(spC, Hu3DCameraMtxXPose, sp3C);
MTXConcat(refMtx, sp3C, spC);
GXLoadTexMtxImm(spC, GX_TEXMTX8, GX_MTX2x4);
}
@ -1604,6 +1604,9 @@ static s32 SetShadowTex(void) {
GXInitTexObj(&sp8, Hu3DShadowData.unk_04, Hu3DShadowData.unk_02, Hu3DShadowData.unk_02, GX_TF_I8, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(&sp8, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXLoadTexObj(&sp8, shadowMapNo);
#ifdef TARGET_PC
GXDestroyTexObj(&sp8);
#endif
}
static void SetShadow(HsfDrawObject *arg0, s16 arg1, s16 arg2) {
@ -1644,19 +1647,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 +1680,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 +1688,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);
}
@ -1837,6 +1840,10 @@ static s32 LoadTexture(ModelData *arg0, HsfBitmap *arg1, HsfAttribute *arg2, s16
GXInitTexObjLOD(&sp1C, GX_LIN_MIP_LIN, GX_LINEAR, 0.0f, arg1->maxLod - 1, 0.0f, GX_TRUE, GX_TRUE, GX_ANISO_1);
}
GXLoadTexObj(&sp1C, arg3);
#ifdef TARGET_PC
GXDestroyTexObj(&sp1C);
GXDestroyTlutObj(&sp10);
#endif
}
static void objNull(ModelData *arg0, HsfObject *arg1) {
@ -1854,10 +1861,10 @@ static void objNull(ModelData *arg0, HsfObject *arg1) {
var_r31 = &arg1->data.curr;
}
if (arg0->hsfData->cenvCnt == 0 || hookIdx != -1) {
PSMTXScale(sp8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXScale(sp8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
mtxRotCat(sp8, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
mtxTransCat(sp8, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], sp8, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], sp8, MTXBuf[MTXIdx]);
}
temp_r28 = &scaleBuf[MTXIdx];
temp_r27 = temp_r28 - 1;
@ -1893,10 +1900,10 @@ static void objRoot(ModelData *arg0, HsfObject *arg1) {
var_r31 = &arg1->data.curr;
}
if (arg0->hsfData->cenvCnt == 0 || hookIdx != -1) {
PSMTXScale(sp8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXScale(sp8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
mtxRotCat(sp8, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
mtxTransCat(sp8, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], sp8, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], sp8, MTXBuf[MTXIdx]);
}
temp_r30 = &scaleBuf[MTXIdx];
temp_r29 = temp_r30 - 1;
@ -1932,10 +1939,10 @@ static void objJoint(ModelData *arg0, HsfObject *arg1) {
var_r31 = &arg1->data.curr;
}
if (arg0->hsfData->cenvCnt == 0 || hookIdx != -1) {
PSMTXScale(sp8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXScale(sp8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
mtxRotCat(sp8, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
mtxTransCat(sp8, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], sp8, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], sp8, MTXBuf[MTXIdx]);
}
temp_r28 = &scaleBuf[MTXIdx];
temp_r27 = temp_r28 - 1;
@ -1970,10 +1977,10 @@ static void objMap(ModelData *arg0, HsfObject *arg1) {
} else {
var_r31 = &arg1->data.curr;
}
PSMTXScale(spC, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXScale(spC, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
mtxRotCat(spC, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
mtxTransCat(spC, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], spC, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], spC, MTXBuf[MTXIdx]);
temp_r30 = &scaleBuf[MTXIdx];
temp_r29 = temp_r30 - 1;
temp_r30->x = temp_r29->x * var_r31->scale.x;
@ -2004,10 +2011,10 @@ static void objReplica(ModelData *arg0, HsfObject *arg1) {
var_r31 = &arg1->data.curr;
}
mtxRot(spC, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
PSMTXScale(sp3C, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
PSMTXConcat(spC, sp3C, sp3C);
MTXScale(sp3C, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXConcat(spC, sp3C, sp3C);
mtxTransCat(sp3C, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], sp3C, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], sp3C, MTXBuf[MTXIdx]);
scaleBuf[MTXIdx].x = var_r31->scale.x * scaleBuf[MTXIdx - 1].x;
scaleBuf[MTXIdx].y = var_r31->scale.y * scaleBuf[MTXIdx - 1].y;
scaleBuf[MTXIdx].z = var_r31->scale.z * scaleBuf[MTXIdx - 1].z;
@ -2112,13 +2119,13 @@ void Hu3DDrawPost(void) {
DLBufStartP = Hu3DObjInfoP->dlBuf;
DrawData = Hu3DObjInfoP->drawData;
GXLoadPosMtxImm(temp_r28->matrix, GX_PNMTX0);
PSMTXInvXpose(temp_r28->matrix, sp120);
MTXInvXpose(temp_r28->matrix, sp120);
GXLoadNrmMtxImm(sp120, 0);
if (Hu3DShadowF != 0 && Hu3DShadowCamBit != 0 && (Hu3DObjInfoP->flags & 8)) {
PSMTXInverse(Hu3DCameraMtx, spF0);
PSMTXConcat(spF0, temp_r28->matrix, sp120);
PSMTXConcat(Hu3DShadowData.unk_68, Hu3DShadowData.unk_38, sp150);
PSMTXConcat(sp150, sp120, sp120);
MTXInverse(Hu3DCameraMtx, spF0);
MTXConcat(spF0, temp_r28->matrix, sp120);
MTXConcat(Hu3DShadowData.unk_68, Hu3DShadowData.unk_38, sp150);
MTXConcat(sp150, sp120, sp120);
GXLoadTexMtxImm(sp120, GX_TEXMTX9, GX_MTX3x4);
var_r19 = 1;
} else {
@ -2126,13 +2133,13 @@ void Hu3DDrawPost(void) {
}
if (temp_r28->model->unk_02 != 0) {
if (var_r19 == 0) {
PSMTXInverse(Hu3DCameraMtx, spF0);
MTXInverse(Hu3DCameraMtx, spF0);
}
for (i = 0, var_r21 = 1; i < 4; i++, var_r21 <<= 1) {
if (var_r21 & temp_r28->model->unk_02) {
PSMTXConcat(spF0, temp_r28->matrix, sp120);
PSMTXConcat(Hu3DProjection[i].unk_68, Hu3DProjection[i].unk_38, sp150);
PSMTXConcat(sp150, sp120, sp120);
MTXConcat(spF0, temp_r28->matrix, sp120);
MTXConcat(Hu3DProjection[i].unk_68, Hu3DProjection[i].unk_38, sp150);
MTXConcat(sp150, sp120, sp120);
GXLoadTexMtxImm(sp120, texMtxTbl[i + 3], GX_MTX3x4);
}
}
@ -2142,32 +2149,32 @@ void Hu3DDrawPost(void) {
temp_r22 = &Hu3DGlobalLight[temp_r28->model->unk_03];
sp30 = temp_r22->unk_28;
if (temp_r22->unk_00 & 0x8000) {
PSMTXMultVecSR(Hu3DCameraMtx, &sp30, &sp30);
MTXMultVecSR(Hu3DCameraMtx, &sp30, &sp30);
}
temp_f30 = VECDotProduct(&sp30, &sp54);
temp_f30 *= 10000.0f;
OSf32tos16(&temp_f30, &sp8);
if (sp8 == -10000) {
PSMTXScale(hiliteMtx, 0.0f, 0.0f, 0.0f);
MTXScale(hiliteMtx, 0.0f, 0.0f, 0.0f);
} else {
C_VECHalfAngle(&sp30, &sp54, &sp3C);
sp3C.x = -sp3C.x;
sp3C.y = -sp3C.y;
sp3C.z = -sp3C.z;
PSMTXScale(sp60, 1.0f / temp_r28->scale.x, 1.0f / temp_r28->scale.y, 1.0f / temp_r28->scale.z);
PSMTXConcat(temp_r28->matrix, sp60, spC0);
MTXScale(sp60, 1.0f / temp_r28->scale.x, 1.0f / temp_r28->scale.y, 1.0f / temp_r28->scale.z);
MTXConcat(temp_r28->matrix, sp60, spC0);
spC0[0][3] = spC0[1][3] = spC0[2][3] = 0.0f;
PSMTXInvXpose(spC0, sp90);
MTXInvXpose(spC0, sp90);
if (sp8 == 10000) {
PSMTXIdentity(spC0);
MTXIdentity(spC0);
} else {
VECCrossProduct(&sp3C, &sp54, &sp48);
temp_f28 = acosf(VECDotProduct(&sp54, &sp3C));
PSMTXRotAxisRad(spC0, &sp48, temp_f28);
MTXRotAxisRad(spC0, &sp48, temp_f28);
}
PSMTXConcat(spC0, sp90, sp60);
PSMTXTrans(spC0, 0.5f, 0.5f, 0.0f);
PSMTXConcat(spC0, sp60, hiliteMtx);
MTXConcat(spC0, sp90, sp60);
MTXTrans(spC0, 0.5f, 0.5f, 0.0f);
MTXConcat(spC0, sp60, hiliteMtx);
}
}
temp_r24 = temp_r28->object->data.face;
@ -2250,14 +2257,14 @@ static void ObjDraw(HsfDrawObject *arg0) {
DLBufStartP = Hu3DObjInfoP->dlBuf;
DrawData = Hu3DObjInfoP->drawData;
GXLoadPosMtxImm(arg0->matrix, GX_PNMTX0);
PSMTXInvXpose(arg0->matrix, sp110);
MTXInvXpose(arg0->matrix, sp110);
GXLoadNrmMtxImm(sp110, 0);
GXInvalidateVtxCache();
if (Hu3DShadowF != 0 && Hu3DShadowCamBit != 0 && (Hu3DObjInfoP->flags & 8)) {
PSMTXInverse(Hu3DCameraMtx, spE0);
PSMTXConcat(spE0, arg0->matrix, sp110);
PSMTXConcat(Hu3DShadowData.unk_68, Hu3DShadowData.unk_38, sp140);
PSMTXConcat(sp140, sp110, sp110);
MTXInverse(Hu3DCameraMtx, spE0);
MTXConcat(spE0, arg0->matrix, sp110);
MTXConcat(Hu3DShadowData.unk_68, Hu3DShadowData.unk_38, sp140);
MTXConcat(sp140, sp110, sp110);
GXLoadTexMtxImm(sp110, GX_TEXMTX9, GX_MTX3x4);
var_r22 = 1;
} else {
@ -2265,13 +2272,13 @@ static void ObjDraw(HsfDrawObject *arg0) {
}
if (arg0->model->unk_02 != 0) {
if (var_r22 == 0) {
PSMTXInverse(Hu3DCameraMtx, spE0);
MTXInverse(Hu3DCameraMtx, spE0);
}
for (i = 0, var_r23 = 1; i < 4; i++, var_r23 <<= 1) {
if (var_r23 & arg0->model->unk_02) {
PSMTXConcat(spE0, arg0->matrix, sp110);
PSMTXConcat(Hu3DProjection[i].unk_68, Hu3DProjection[i].unk_38, sp140);
PSMTXConcat(sp140, sp110, sp110);
MTXConcat(spE0, arg0->matrix, sp110);
MTXConcat(Hu3DProjection[i].unk_68, Hu3DProjection[i].unk_38, sp140);
MTXConcat(sp140, sp110, sp110);
GXLoadTexMtxImm(sp110, texMtxTbl[i + 3], GX_MTX3x4);
}
}
@ -2281,32 +2288,32 @@ static void ObjDraw(HsfDrawObject *arg0) {
temp_r24 = &Hu3DGlobalLight[arg0->model->unk_03];
sp20 = temp_r24->unk_28;
if (temp_r24->unk_00 & 0x8000) {
PSMTXMultVecSR(Hu3DCameraMtx, &sp20, &sp20);
MTXMultVecSR(Hu3DCameraMtx, &sp20, &sp20);
}
temp_f30 = VECDotProduct(&sp20, &sp44);
temp_f30 *= 10000.0f;
OSf32tos16(&temp_f30, &var_r21);
if (var_r21 == -10000) {
PSMTXScale(hiliteMtx, 0.0f, 0.0f, 0.0f);
MTXScale(hiliteMtx, 0.0f, 0.0f, 0.0f);
} else {
C_VECHalfAngle(&sp20, &sp44, &sp2C);
sp2C.x = -sp2C.x;
sp2C.y = -sp2C.y;
sp2C.z = -sp2C.z;
PSMTXScale(sp50, 1.0f / arg0->scale.x, 1.0f / arg0->scale.y, 1.0f / arg0->scale.z);
PSMTXConcat(arg0->matrix, sp50, spB0);
MTXScale(sp50, 1.0f / arg0->scale.x, 1.0f / arg0->scale.y, 1.0f / arg0->scale.z);
MTXConcat(arg0->matrix, sp50, spB0);
spB0[0][3] = spB0[1][3] = spB0[2][3] = 0.0f;
PSMTXInvXpose(spB0, sp80);
MTXInvXpose(spB0, sp80);
if (var_r21 == 10000) {
PSMTXIdentity(spB0);
MTXIdentity(spB0);
} else {
VECCrossProduct(&sp2C, &sp44, &sp38);
temp_f29 = acosf(VECDotProduct(&sp44, &sp2C));
PSMTXRotAxisRad(spB0, &sp38, temp_f29);
MTXRotAxisRad(spB0, &sp38, temp_f29);
}
PSMTXConcat(spB0, sp80, sp50);
PSMTXTrans(spB0, 0.5f, 0.5f, 0.0f);
PSMTXConcat(spB0, sp50, hiliteMtx);
MTXConcat(spB0, sp80, sp50);
MTXTrans(spB0, 0.5f, 0.5f, 0.0f);
MTXConcat(spB0, sp50, hiliteMtx);
}
}
temp_r26 = arg0->object->data.face;
@ -2857,16 +2864,16 @@ void mtxRotCat(Mtx arg0, float arg1, float arg2, float arg3) {
Mtx sp8;
if (arg1 != 0.0f) {
PSMTXRotRad(sp8, 'X', MTXDegToRad(arg1));
PSMTXConcat(sp8, arg0, arg0);
MTXRotRad(sp8, 'X', MTXDegToRad(arg1));
MTXConcat(sp8, arg0, arg0);
}
if (arg2 != 0.0f) {
PSMTXRotRad(sp8, 'Y', MTXDegToRad(arg2));
PSMTXConcat(sp8, arg0, arg0);
MTXRotRad(sp8, 'Y', MTXDegToRad(arg2));
MTXConcat(sp8, arg0, arg0);
}
if (arg3 != 0.0f) {
PSMTXRotRad(sp8, 'Z', MTXDegToRad(arg3));
PSMTXConcat(sp8, arg0, arg0);
MTXRotRad(sp8, 'Z', MTXDegToRad(arg3));
MTXConcat(sp8, arg0, arg0);
}
}
@ -2875,17 +2882,17 @@ void mtxRot(Mtx arg0, float arg1, float arg2, float arg3) {
Mtx sp8;
if (arg1 != 0.0f) {
PSMTXRotRad(arg0, 'X', MTXDegToRad(arg1));
MTXRotRad(arg0, 'X', MTXDegToRad(arg1));
} else {
PSMTXIdentity(arg0);
MTXIdentity(arg0);
}
if (arg2 != 0.0f) {
PSMTXRotRad(sp38, 'Y', MTXDegToRad(arg2));
PSMTXConcat(sp38, arg0, arg0);
MTXRotRad(sp38, 'Y', MTXDegToRad(arg2));
MTXConcat(sp38, arg0, arg0);
}
if (arg3 != 0.0f) {
PSMTXRotRad(sp8, 'Z', MTXDegToRad(arg3));
PSMTXConcat(sp8, arg0, arg0);
MTXRotRad(sp8, 'Z', MTXDegToRad(arg3));
MTXConcat(sp8, arg0, arg0);
}
}
@ -2980,8 +2987,8 @@ void Hu3DModelObjMtxGet(s16 arg0, char *arg1, Mtx arg2) {
temp_r31 = &Hu3DData[arg0];
temp_r30 = temp_r31->hsfData;
mtxRot(sp70, temp_r31->rot.x, temp_r31->rot.y, temp_r31->rot.z);
PSMTXScale(spA0, temp_r31->scale.x, temp_r31->scale.y, temp_r31->scale.z);
PSMTXConcat(sp70, spA0, MTXBuf[0]);
MTXScale(spA0, temp_r31->scale.x, temp_r31->scale.y, temp_r31->scale.z);
MTXConcat(sp70, spA0, MTXBuf[0]);
mtxTransCat(MTXBuf[0], temp_r31->pos.x, temp_r31->pos.y, temp_r31->pos.z);
PGMaxPos.x = PGMaxPos.y = PGMaxPos.z = -1000000.0f;
PGMinPos.x = PGMinPos.y = PGMinPos.z = 1000000.0f;
@ -2997,10 +3004,10 @@ void Hu3DModelObjMtxGet(s16 arg0, char *arg1, Mtx arg2) {
attachMotionF = 0;
}
PGObjCall(temp_r31, temp_r30->root);
PSMTXCopy(MTXBuf[MTXIdx - 1], arg2);
MTXCopy(MTXBuf[MTXIdx - 1], arg2);
if (PGFinishF == 0 && *PGName != 0) {
OSReport("Error: Not Found %s for ObjPosGet\n", arg1);
PSMTXIdentity(MTXBuf[MTXIdx]);
MTXIdentity(MTXBuf[MTXIdx]);
}
HuMemDirectFree(PGName);
}
@ -3042,10 +3049,10 @@ void PGObjCalc(ModelData *arg0, HsfObject *arg1) {
var_r30 = &arg1->data.curr;
}
mtxRot(spA4, var_r30->rot.x, var_r30->rot.y, var_r30->rot.z);
PSMTXScale(spD4, var_r30->scale.x, var_r30->scale.y, var_r30->scale.z);
PSMTXConcat(spA4, spD4, spD4);
MTXScale(spD4, var_r30->scale.x, var_r30->scale.y, var_r30->scale.z);
MTXConcat(spA4, spD4, spD4);
mtxTransCat(spD4, var_r30->pos.x, var_r30->pos.y, var_r30->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], spD4, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], spD4, MTXBuf[MTXIdx]);
MTXIdx++;
var_r24 = 1;
} else {
@ -3068,11 +3075,11 @@ void PGObjCalc(ModelData *arg0, HsfObject *arg1) {
}
temp_r22 = hookIdx;
hookIdx = temp_r28->hook;
PSMTXScale(spD4, temp_r31->scale.x, temp_r31->scale.y, temp_r31->scale.z);
MTXScale(spD4, temp_r31->scale.x, temp_r31->scale.y, temp_r31->scale.z);
mtxRotCat(spD4, temp_r31->rot.x, temp_r31->rot.y, temp_r31->rot.z);
mtxTransCat(spD4, temp_r31->pos.x, temp_r31->pos.y, temp_r31->pos.z);
PSMTXConcat(spD4, temp_r31->unk_F0, spD4);
PSMTXConcat(MTXBuf[MTXIdx - 1], spD4, MTXBuf[MTXIdx]);
MTXConcat(spD4, temp_r31->unk_F0, spD4);
MTXConcat(MTXBuf[MTXIdx - 1], spD4, MTXBuf[MTXIdx]);
MTXIdx++;
PGObjCall(temp_r31, temp_r31->hsfData->root);
MTXIdx--;
@ -3082,7 +3089,7 @@ void PGObjCalc(ModelData *arg0, HsfObject *arg1) {
}
if (*PGName == 0 && arg1->type == 2) {
var_r23 = arg1;
PSMTXMultVec(MTXBuf[MTXIdx - 1], (Vec*) &var_r23->data.mesh.min, &sp8);
MTXMultVec(MTXBuf[MTXIdx - 1], (Vec*) &var_r23->data.mesh.min, &sp8);
if (sp8.x < PGMinPos.x) {
PGMinPos.x = sp8.x;
}
@ -3101,7 +3108,7 @@ void PGObjCalc(ModelData *arg0, HsfObject *arg1) {
if (sp8.z > PGMaxPos.z) {
PGMaxPos.z = sp8.z;
}
PSMTXMultVec(MTXBuf[MTXIdx - 1], (Vec*) &var_r23->data.mesh.max, &sp8);
MTXMultVec(MTXBuf[MTXIdx - 1], (Vec*) &var_r23->data.mesh.max, &sp8);
if (sp8.x < PGMinPos.x) {
PGMinPos.x = sp8.x;
}
@ -3143,10 +3150,10 @@ void PGObjReplica(ModelData *arg0, HsfObject *arg1) {
var_r31 = &arg1->data.curr;
}
mtxRot(sp188, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
PSMTXScale(sp1B8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
PSMTXConcat(sp188, sp1B8, sp1B8);
MTXScale(sp1B8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXConcat(sp188, sp1B8, sp1B8);
mtxTransCat(sp1B8, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(MTXBuf[MTXIdx - 1], sp1B8, MTXBuf[MTXIdx]);
MTXConcat(MTXBuf[MTXIdx - 1], sp1B8, MTXBuf[MTXIdx]);
MTXIdx++;
CancelTRXF = 1;
PGObjCall(arg0, arg1->data.replica);
@ -3208,7 +3215,7 @@ void Hu3DModelObjDraw(s16 arg0, char *arg1, Mtx arg2) {
sp14.model = &Hu3DData[arg0];
sp14.object = temp_r3 = Hu3DModelObjPtrGet(arg0, arg1);
sp10 = temp_r3->constData;
PSMTXCopy(arg2, sp14.matrix);
MTXCopy(arg2, sp14.matrix);
sp14.scale.x = sp14.scale.y = sp14.scale.z = 1.0f;
ObjDraw(&sp14);
}

View file

@ -441,8 +441,8 @@ void Hu3D2Dto3D(Vec *arg0, s16 arg1, Vec *arg2) {
arg2->y = -(temp_f27 - 0.5) * temp_f31;
arg2->z = -arg0->z;
C_MTXLookAt(spC, &temp_r31->pos, &temp_r31->up, &temp_r31->target);
PSMTXInverse(spC, spC);
PSMTXMultVec(spC, arg2, arg2);
MTXInverse(spC, spC);
MTXMultVec(spC, arg2, arg2);
}
void Hu3D3Dto2D(Vec *arg0, s16 arg1, Vec *arg2) {
@ -460,7 +460,7 @@ void Hu3D3Dto2D(Vec *arg0, s16 arg1, Vec *arg2) {
}
temp_r31 = &Hu3DCamera[i];
C_MTXLookAt(sp1C, &temp_r31->pos, &temp_r31->up, &temp_r31->target);
PSMTXMultVec(sp1C, arg0, &sp10);
MTXMultVec(sp1C, arg0, &sp10);
temp_f31 = (sind(temp_r31->fov / 2) / cosd(temp_r31->fov / 2)) * sp10.z * HU_DISP_ASPECT;
temp_f30 = (sind(temp_r31->fov / 2) / cosd(temp_r31->fov / 2)) * sp10.z;
arg2->x = DISP_HALF_W + sp10.x * (DISP_HALF_W / -temp_f31);

View file

@ -2,6 +2,10 @@
#include "string.h"
#include "ctype.h"
#ifdef TARGET_PC
#include "port/byteswap.h"
#endif
#define AS_S16(field) (*((s16 *)&(field)))
#define AS_U16(field) (*((u16 *)&(field)))
@ -117,11 +121,14 @@ static void FileLoad(void *data)
fileptr = data;
memcpy(&head, fileptr, sizeof(HsfHeader));
memset(&Model, 0, sizeof(HsfData));
NSymIndex = (void **)((u32)fileptr+head.symbol.ofs);
StringTable = (char *)((u32)fileptr+head.string.ofs);
ClusterTop = (HsfCluster *)((u32)fileptr+head.cluster.ofs);
AttributeTop = (HsfAttribute *)((u32)fileptr+head.attribute.ofs);
MaterialTop = (HsfMaterial *)((u32)fileptr+head.material.ofs);
#ifdef TARGET_PC
byteswap_hsfheader(&head);
#endif
NSymIndex = (void **)((uintptr_t)fileptr+head.symbol.ofs);
StringTable = (char *)((uintptr_t)fileptr+head.string.ofs);
ClusterTop = (HsfCluster *)((uintptr_t)fileptr+head.cluster.ofs);
AttributeTop = (HsfAttribute *)((uintptr_t)fileptr + head.attribute.ofs);
MaterialTop = (HsfMaterial *)((uintptr_t)fileptr + head.material.ofs);
}
static HsfData *SetHsfModel(void)

View file

@ -183,14 +183,14 @@ void Hu3DExec(void) {
for (j = 0; j < 8; j++) {
if (layerHook[j] != 0) {
Hu3DCameraSet(Hu3DCameraNo, Hu3DCameraMtx);
PSMTXInvXpose(Hu3DCameraMtx, Hu3DCameraMtxXPose);
MTXInvXpose(Hu3DCameraMtx, Hu3DCameraMtxXPose);
temp = layerHook[j];
temp(j);
}
if (layerNum[j] != 0) {
Hu3DDrawPreInit();
Hu3DCameraSet(Hu3DCameraNo, Hu3DCameraMtx);
PSMTXInvXpose(Hu3DCameraMtx, Hu3DCameraMtxXPose);
MTXInvXpose(Hu3DCameraMtx, Hu3DCameraMtxXPose);
data = Hu3DData;
for (i = 0, var_r23 = i; i < HU3D_MODEL_MAX; i++, data++) {
if (data->hsfData != 0) {
@ -252,8 +252,8 @@ void Hu3DExec(void) {
mtxRot(sp40, data->rot.x, data->rot.y, data->rot.z);
mtxScaleCat(sp40, data->scale.x, data->scale.y, data->scale.z);
mtxTransCat(sp40, data->pos.x, data->pos.y, data->pos.z);
PSMTXConcat(Hu3DCameraMtx, sp40, sp10);
PSMTXConcat(sp10, data->unk_F0, sp10);
MTXConcat(Hu3DCameraMtx, sp40, sp10);
MTXConcat(sp10, data->unk_F0, sp10);
Hu3DDraw(data, sp10, &data->scale);
}
data->unk_00++;
@ -398,7 +398,7 @@ s16 Hu3DModelCreate(void *arg0) {
}
var_r31->unk_01 = 0;
var_r31->unk_00 = (u8) var_r30;
PSMTXIdentity(var_r31->unk_F0);
MTXIdentity(var_r31->unk_F0);
layerNum[0] += 1;
HuMemDCFlush(HEAP_DATA);
if ((var_r31->hsfData->sceneCnt != 0) && ((var_r31->hsfData->scene->start) || (var_r31->hsfData->scene->end))) {
@ -473,7 +473,7 @@ s16 Hu3DModelLink(s16 arg0) {
var_r31->unk_38[i] = -1;
}
var_r31->unk_01 = 0;
PSMTXIdentity(var_r31->unk_F0);
MTXIdentity(var_r31->unk_F0);
layerNum[0] += 1;
return var_r28;
}
@ -521,7 +521,7 @@ s16 Hu3DHookFuncCreate(ModelHookFunc hook) {
var_r31->unk_38[i] = -1;
}
var_r31->unk_01 = 0;
PSMTXIdentity(var_r31->unk_F0);
MTXIdentity(var_r31->unk_F0);
layerNum[0] += 1;
return var_r29;
}
@ -1830,8 +1830,8 @@ void lightSet(LightData* arg0, s16 arg1, Mtx *arg2, Mtx *arg3, f32 arg8) {
break;
}
if ((arg0->unk_00 & 0x8000) != 0) {
PSMTXMultVec(*arg2, &arg0->unk_28, &sp24);
PSMTXMultVec(*arg3, &arg0->unk_1C, &sp18);
MTXMultVec(*arg2, &arg0->unk_28, &sp24);
MTXMultVec(*arg3, &arg0->unk_1C, &sp18);
GXInitLightPos(&sp30, sp18.x, sp18.y, sp18.z);
} else {
GXInitLightPos(&sp30, arg0->unk_1C.x, arg0->unk_1C.y, arg0->unk_1C.z);
@ -1939,7 +1939,7 @@ void Hu3DShadowExec(void) {
test = Hu3DShadowData.unk_02 * Hu3DShadowData.unk_02;
}
C_MTXLookAt(Hu3DCameraMtx, &Hu3DShadowData.unk_14, &Hu3DShadowData.unk_2C, &Hu3DShadowData.unk_20);
PSMTXCopy(Hu3DCameraMtx, Hu3DShadowData.unk_38);
MTXCopy(Hu3DCameraMtx, Hu3DShadowData.unk_38);
var_r31 = Hu3DData;
shadowModelDrawF = 1;
GXInvalidateTexAll();
@ -1986,11 +1986,11 @@ void Hu3DShadowExec(void) {
var_r31->attr |= HU3D_ATTR_MOT_EXEC;
}
mtxRot(sp58, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z);
PSMTXScale(spB8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
PSMTXConcat(sp58, spB8, spB8);
MTXScale(spB8, var_r31->scale.x, var_r31->scale.y, var_r31->scale.z);
MTXConcat(sp58, spB8, spB8);
mtxTransCat(spB8, var_r31->pos.x, var_r31->pos.y, var_r31->pos.z);
PSMTXConcat(Hu3DCameraMtx, spB8, sp88);
PSMTXConcat(sp88, var_r31->unk_F0, sp88);
MTXConcat(Hu3DCameraMtx, spB8, sp88);
MTXConcat(sp88, var_r31->unk_F0, sp88);
Hu3DDraw(var_r31, sp88, &var_r31->scale);
}
}
@ -2020,7 +2020,7 @@ void Hu3DShadowExec(void) {
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_KONST);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1U, GX_TEVPREV);
GXSetNumChans(0);
PSMTXIdentity(sp88);
MTXIdentity(sp88);
GXLoadPosMtxImm(sp88, 0);
GXSetZMode(0, GX_ALWAYS, 1);
GXSetNumChans(1);

View file

@ -843,7 +843,11 @@ void Hu3DSubMotionExec(s16 arg0) {
}
}
#ifdef __MWERKS__
__declspec(weak) float *GetObjTRXPtr(HsfObject *arg0, u16 arg1) {
#else
float *GetObjTRXPtr(HsfObject *arg0, u16 arg1) {
#endif
HsfConstData *temp_r31 = arg0->constData;
switch (arg1) {
@ -1234,7 +1238,11 @@ float GetLinear(s32 arg0, float arg1[][2], float arg2) {
return arg1[arg0 - 1][1];
}
#ifdef __MWERKS__
__declspec(weak) float GetBezier(s32 arg0, HsfTrack *arg1, float arg2) {
#else
float GetBezier(s32 arg0, HsfTrack *arg1, float arg2) {
#endif
float temp_f24;
float temp_f29;
float temp_f28;

View file

@ -1,5 +1,8 @@
#include "game/init.h"
#include "game/memory.h"
#include "game/fault.h"
#include "game/sreset.h"
#include "dolphin/demo/DEMOStats.h"
#include "dolphin/os.h"
#include "dolphin/gx.h"
#include "dolphin/dvd.h"
@ -47,7 +50,11 @@ void HuSysInit(GXRenderModeObj *mode)
OSInit();
DVDInit();
VIInit();
#ifdef TARGET_PC
VISetWindowTitle("Mario Party 4");
#endif
PADInit();
#ifdef __MWERKS__
#if VERSION_NTSC
if(OSGetProgressiveMode() == 1 && VIGetDTVStatus() == 1) {
mode = &GXNtsc480Prog;
@ -55,6 +62,7 @@ void HuSysInit(GXRenderModeObj *mode)
#else
mode->efbHeight = 480;
#endif
#endif
InitRenderMode(mode);
InitMem();
VIConfigure(RenderMode);
@ -132,12 +140,12 @@ static void InitMem()
{
void *arena_lo = OSGetArenaLo();
void *arena_hi = OSGetArenaHi();
u32 fb_size = (u16)(((u16)RenderMode->fbWidth+15) & ~15)*RenderMode->xfbHeight*2;
u32 *fb1;
u32 *fb2;
uintptr_t fb_size = (u16)(((u16)RenderMode->fbWidth+15) & ~15)*RenderMode->xfbHeight*2;
uintptr_t *fb1;
uintptr_t *fb2;
u32 i;
DemoFrameBuffer1 = (void *)OSRoundUp32B((u32)arena_lo);
DemoFrameBuffer2 = (void *)OSRoundUp32B((u32)DemoFrameBuffer1+fb_size);
DemoFrameBuffer1 = (void *)OSRoundUp32B((uintptr_t)arena_lo);
DemoFrameBuffer2 = (void *)OSRoundUp32B((uintptr_t)DemoFrameBuffer1 + fb_size);
DemoCurrentBuffer = DemoFrameBuffer2;
#if VERSION_PAL
fb1 = DemoFrameBuffer1;
@ -148,7 +156,7 @@ static void InitMem()
DCStoreRangeNoSync(DemoFrameBuffer1, fb_size);
DCStoreRangeNoSync(DemoFrameBuffer2, fb_size);
#endif
arena_lo = (void *)OSRoundUp32B((u32)DemoFrameBuffer2+fb_size);
arena_lo = (void *)OSRoundUp32B((uintptr_t)DemoFrameBuffer2 + fb_size);
OSSetArenaLo(arena_lo);
if(OSGetConsoleType() == OS_CONSOLE_DEVHW1 && OSGetPhysicalMemSize() != 0x400000 && OSGetConsoleSimulatedMemSize() < 0x1800000) {
LoadMemInfo();
@ -157,8 +165,8 @@ static void InitMem()
arena_hi = OSGetArenaHi();
arena_lo = OSInitAlloc(arena_lo, arena_hi, 1);
OSSetArenaLo(arena_lo);
arena_lo = (void *)OSRoundUp32B((u32)arena_lo);
arena_hi = (void *)OSRoundDown32B((u32)arena_hi);
arena_lo = (void *)OSRoundUp32B((uintptr_t)arena_lo);
arena_hi = (void *)OSRoundDown32B((uintptr_t)arena_hi);
OSSetCurrentHeap(currentHeapHandle = OSCreateHeap(arena_lo, arena_hi));
arena_lo = arena_hi;
OSSetArenaLo(arena_lo);
@ -295,4 +303,4 @@ static void LoadMemInfo()
DVDClose(&file);
OSDumpHeap(__OSCurrHeap);
}
}
}

View file

@ -1,6 +1,7 @@
#include "game/jmp.h"
s32 gcsetjmp(register jmp_buf *jump) {
s32 gcsetjmp(register jmp_buf *jump)
{
// clang-format off
asm {
mflr r5

View file

@ -1,17 +1,33 @@
#include "game/gamework_data.h"
#include "game/dvd.h"
#include "game/printfunc.h"
#include "game/object.h"
#include "game/wipe.h"
#include "game/init.h"
#include "game/process.h"
#include "game/pad.h"
#include "game/data.h"
#include "game/sprite.h"
#include "game/dvd.h"
#include "game/gamework.h"
#include "game/gamework_data.h"
#include "game/hsfformat.h"
#include "game/hsfman.h"
#include "game/init.h"
#include "game/minigame_seq.h"
#include "game/msm.h"
#include "game/object.h"
#include "game/pad.h"
#include "game/perf.h"
#include "game/gamework.h"
#include "game/printfunc.h"
#include "game/process.h"
#include "game/sprite.h"
#include "game/sreset.h"
#include "game/wipe.h"
#include "version.h"
#ifdef TARGET_PC
#include "port/imgui.h"
#include <aurora/aurora.h>
#include <aurora/event.h>
#include <aurora/main.h>
const char *__asan_default_options()
{
return "new_delete_type_mismatch=0,sleep_before_dying=5,allocator_may_return_null=1";
}
#endif
extern FileListEntry _ovltbl[];
u32 GlobalCounter;
@ -35,25 +51,74 @@ static u32 pe_req;
static u32 rf_req;
static u32 fi_req;
s32 HuDvdErrWait;
s32 SystemInitF;
SHARED_SYM s32 SystemInitF;
void main(void)
#ifdef TARGET_PC
#include <stdio.h>
void aurora_log_callback(AuroraLogLevel level, const char* module, const char *message, unsigned int len)
{
const char *levelStr = "??";
FILE *out = stdout;
switch (level) {
case LOG_DEBUG:
levelStr = "DEBUG";
break;
case LOG_INFO:
levelStr = "INFO";
break;
case LOG_WARNING:
levelStr = "WARNING";
break;
case LOG_ERROR:
levelStr = "ERROR";
out = stderr;
break;
case LOG_FATAL:
levelStr = "FATAL";
out = stderr;
break;
}
fprintf(out, "[%s | %s] %s\n", levelStr, module, message);
if (level == LOG_FATAL) {
fflush(out);
abort();
}
}
#endif
#ifdef TARGET_PC
int game_main(int argc, char *argv[])
#else
void main(void)
#endif
{
#ifdef TARGET_PC
const AuroraInfo auroraInfo = aurora_initialize(argc, argv,
&(AuroraConfig) {
.appName = "Mario Party 4",
.logCallback = &aurora_log_callback,
.desiredBackend = BACKEND_VULKAN,
.windowPosX = 100,
.windowPosY = 100,
.windowWidth = 640,
.windowHeight = 480,
});
#endif
u32 met0;
u32 met1;
s16 i;
s32 retrace;
#if VERSION_PAL
#if VERSION_PAL
s16 temp = 0;
#endif
#endif
HuDvdErrWait = 0;
SystemInitF = 0;
#if VERSION_NTSC
#if VERSION_NTSC
HuSysInit(&GXNtsc480IntDf);
#else
#else
HuSysInit(&GXPal528IntDf);
#endif
#endif
HuPrcInit();
HuPadInit();
GWInit();
@ -66,25 +131,43 @@ void main(void)
HuPerfCreate("USR0", 0xFF, 0xFF, 0xFF, 0xFF);
HuPerfCreate("USR1", 0, 0xFF, 0xFF, 0xFF);
WipeInit(RenderMode);
for (i = 0; i < 4; i++) {
GWPlayerCfg[i].character = -1;
}
omMasterInit(0, _ovltbl, OVL_COUNT, OVL_BOOT);
VIWaitForRetrace();
if (VIGetNextField() == 0) {
OSReport("VI_FIELD_BELOW\n");
VIWaitForRetrace();
}
while (1) {
#ifdef TARGET_PC
const AuroraEvent *event = aurora_update();
bool exiting = false;
while (event != NULL && event->type != AURORA_NONE) {
if (event->type == AURORA_EXIT) {
exiting = true;
break;
}
++event;
}
if (exiting) {
break;
}
#endif
retrace = VIGetRetraceCount();
if (HuSoftResetButtonCheck() != 0 || HuDvdErrWait != 0) {
continue;
}
HuPerfZero();
HuPerfBegin(2);
#ifdef TARGET_PC
aurora_begin_frame();
#endif
HuSysBeforeRender();
GXSetGPMetric(GX_PERF0_CLIP_VTX, GX_PERF1_VERTICES);
GXClearGPMetric();
@ -92,10 +175,12 @@ void main(void)
GXClearVCacheMetric();
GXClearPixMetric();
GXClearMemMetric();
HuPerfBegin(0);
Hu3DPreProc();
HuPadRead();
pfClsScr();
HuPrcCall(1);
MGSeqMain();
HuPerfBegin(1);
@ -103,8 +188,10 @@ void main(void)
HuDvdErrorWatch();
WipeExecAlways();
HuPerfEnd(0);
pfDrawFonts();
HuPerfEnd(1);
msmMusFdoutEnd();
HuSysDoneRender(retrace);
GXReadGPMetric(&met0, &met1);
@ -113,7 +200,17 @@ void main(void)
GXReadMemMetric(&cp_req, &tc_req, &cpu_rd_req, &cpu_wr_req, &dsp_req, &io_req, &vi_req, &pe_req, &rf_req, &fi_req);
HuPerfEnd(2);
GlobalCounter++;
#ifdef TARGET_PC
imgui_main(&auroraInfo);
aurora_end_frame();
frame_limiter();
#endif
}
#ifdef TARGET_PC
aurora_shutdown();
#endif
}
void HuSysVWaitSet(s16 vcount)
@ -124,7 +221,7 @@ void HuSysVWaitSet(s16 vcount)
s16 HuSysVWaitGet(s16 param)
{
return (s16) minimumVcount;
return (s16)minimumVcount;
}
s32 rnd_seed = 0x0000D9ED;

View file

@ -47,39 +47,55 @@ void HuMemDCFlush(HeapID heap)
void *HuMemDirectMalloc(HeapID heap, s32 size)
{
#ifdef TARGET_PC
u32 retaddr = 0;
#else
register u32 retaddr;
asm {
mflr retaddr
}
#endif
size = (size+31) & 0xFFFFFFE0;
return HuMemMemoryAlloc(HeapTbl[heap], size, retaddr);
}
void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num)
{
#ifdef TARGET_PC
u32 retaddr = 0;
#else
register u32 retaddr;
asm {
mflr retaddr
}
#endif
size = (size+31) & 0xFFFFFFE0;
return HuMemMemoryAllocNum(HeapTbl[heap], size, num, retaddr);
}
void HuMemDirectFree(void *ptr)
{
#ifdef TARGET_PC
u32 retaddr = 0;
#else
register u32 retaddr;
asm {
mflr retaddr
}
#endif
HuMemMemoryFree(ptr, retaddr);
}
void HuMemDirectFreeNum(HeapID heap, u32 num)
{
#ifdef TARGET_PC
u32 retaddr = 0;
#else
register u32 retaddr;
asm {
mflr retaddr
}
#endif
HuMemMemoryFreeNum(HeapTbl[heap], num, retaddr);
}
@ -101,4 +117,4 @@ u32 HuMemHeapSizeGet(HeapID heap)
void *HuMemHeapPtrGet(HeapID heap)
{
return HeapTbl[heap];
}
}

View file

@ -94,8 +94,8 @@ void MapWallCheck(float *arg0, float *arg1, HsfMapAttr *arg2) {
MTRAdd.x = AddX;
MTRAdd.z = AddZ;
MTRAdd.y = 0.0f;
PSMTXInvXpose(MapMT, sp10);
PSMTXMultVec(sp10, &MTRAdd, &MTRAdd);
MTXInvXpose(MapMT, sp10);
MTXMultVec(sp10, &MTRAdd, &MTRAdd);
for (var_r30 = 0; var_r30 < arg2->dataLen;) {
temp_r29 = *var_r31;
if (temp_r29 & 0x8000) {
@ -142,7 +142,7 @@ float MapPos(float arg0, float arg1, float arg2, float arg3, Vec *arg4) {
sp14.x = var_f29;
sp14.y = sp10;
sp14.z = var_f28;
PSMTXMultVec(MapMT, &sp14, &sp14);
MTXMultVec(MapMT, &sp14, &sp14);
sp10 = sp14.y;
if (sp10 > arg1 + arg3 || fabs(arg1 - sp10) > fabs(arg1 - var_f31)) {
continue;
@ -151,8 +151,8 @@ float MapPos(float arg0, float arg1, float arg2, float arg3, Vec *arg4) {
arg4->x = FieldVec.x;
arg4->y = FieldVec.y;
arg4->z = FieldVec.z;
PSMTXInvXpose(MapMT, sp20);
PSMTXMultVec(sp20, arg4, arg4);
MTXInvXpose(MapMT, sp20);
MTXMultVec(sp20, arg4, arg4);
var_f31 = sp14.y;
}
}
@ -205,7 +205,7 @@ BOOL PolygonRangeCheck(HsfMapAttr *arg0, float arg1, float arg2, float *arg3, fl
sp20.x = arg1;
sp20.y = temp_f29;
sp20.z = arg2;
PSMTXMultVec(MapMT, &sp20, &sp20);
MTXMultVec(MapMT, &sp20, &sp20);
if (arg4 > sp20.y && var_f27 > fabs(arg4 - sp20.y)) {
var_f27 = fabs(arg4 - sp20.y);
*arg3 = temp_f29;
@ -224,7 +224,7 @@ BOOL PolygonRangeCheck(HsfMapAttr *arg0, float arg1, float arg2, float *arg3, fl
sp20.x = arg1;
sp20.y = temp_f29;
sp20.z = arg2;
PSMTXMultVec(MapMT, &sp20, &sp20);
MTXMultVec(MapMT, &sp20, &sp20);
if (arg4 > sp20.y) {
if (var_f27 > fabs(arg4 - sp20.y)) {
var_f27 = fabs(arg4 - sp20.y);
@ -711,7 +711,7 @@ static BOOL GetPolygonCircleMtx(s16 *arg0, Vec *arg1, float *arg2, float *arg3)
spD0[0] = arg2[0] + AddX;
spD0[1] = arg2[1];
spD0[2] = arg2[2] + AddZ;
PSMTXMultVec(MapMT, &spC4, &spC4);
MTXMultVec(MapMT, &spC4, &spC4);
DefSetHitFace(spC4.x, spC4.y, spC4.z);
temp_r29 = &HitFaceVec[HitFaceCount];
MapspaceInlineFunc01(temp_r29, &arg1[arg0[0]], &arg1[arg0[1]], &arg1[arg0[2]]);
@ -724,7 +724,7 @@ static BOOL GetPolygonCircleMtx(s16 *arg0, Vec *arg1, float *arg2, float *arg3)
spE0[0] = OldXYZ.x;
spE0[1] = OldXYZ.y;
spE0[2] = OldXYZ.z;
PSMTXMultVec(MapMTR, (Vec*) &spE0, (Vec*) &spE0);
MTXMultVec(MapMTR, (Vec*) &spE0, (Vec*) &spE0);
if (MapspaceInlineFunc03(spE0, temp_r31, arg1) < 0) {
spB8.x = spE0[0] - spD0[0];
spB8.y = spE0[1] - spD0[1];
@ -742,8 +742,8 @@ static BOOL GetPolygonCircleMtx(s16 *arg0, Vec *arg1, float *arg2, float *arg3)
MTRAdd.x = AddX;
MTRAdd.z = AddZ;
MTRAdd.y = 0.0f;
PSMTXInvXpose(MapMT, spF0);
PSMTXMultVec(spF0, &MTRAdd, &MTRAdd);
MTXInvXpose(MapMT, spF0);
MTXMultVec(spF0, &MTRAdd, &MTRAdd);
}
}
return var_r17;
@ -893,19 +893,19 @@ void AppendAddXZ(float arg0, float arg1, float arg2) {
void CharRotInv(Mtx arg0, Mtx arg1, Vec *arg2, omObjData *arg3) {
Mtx sp8;
PSMTXTrans(arg0, arg3->trans.x, arg3->trans.y, arg3->trans.z);
MTXTrans(arg0, arg3->trans.x, arg3->trans.y, arg3->trans.z);
if (arg3->rot.z) {
PSMTXRotRad(sp8, 'z', MTXDegToRad(arg3->rot.z));
PSMTXConcat(arg0, sp8, arg0);
MTXRotRad(sp8, 'z', MTXDegToRad(arg3->rot.z));
MTXConcat(arg0, sp8, arg0);
}
if (arg3->rot.y) {
PSMTXRotRad(sp8, 'y', MTXDegToRad(arg3->rot.y));
PSMTXConcat(arg0, sp8, arg0);
MTXRotRad(sp8, 'y', MTXDegToRad(arg3->rot.y));
MTXConcat(arg0, sp8, arg0);
}
if (arg3->rot.x) {
PSMTXRotRad(sp8, 'x', MTXDegToRad(arg3->rot.x));
PSMTXConcat(arg0, sp8, arg0);
MTXRotRad(sp8, 'x', MTXDegToRad(arg3->rot.x));
MTXConcat(arg0, sp8, arg0);
}
PSMTXInverse(arg0, arg1);
PSMTXMultVec(arg1, arg2, arg2);
MTXInverse(arg0, arg1);
MTXMultVec(arg1, arg2, arg2);
}

View file

@ -1,10 +1,10 @@
#include "game/memory.h"
#include "dolphin/os.h"
#define DATA_GET_BLOCK(ptr) ((struct memory_block *)(((char *)(ptr))-32))
#define BLOCK_GET_DATA(block) (((char *)(block))+32)
#define DATA_GET_BLOCK(ptr) ((struct memory_block *)(((char *)(ptr)) - 32))
#define BLOCK_GET_DATA(block) (((char *)(block)) + 32)
#define MEM_ALLOC_SIZE(size) (((size)+63) & 0xFFFFFFE0)
#define MEM_ALLOC_SIZE(size) (((size) + 63) & 0xFFFFFFE0)
struct memory_block {
s32 size;
@ -13,10 +13,10 @@ struct memory_block {
struct memory_block *prev;
struct memory_block *next;
u32 num;
u32 retaddr;
uintptr_t retaddr;
};
static void *HuMemMemoryAlloc2(void *heap_ptr, s32 size, u32 num, u32 retaddr);
static void *HuMemMemoryAlloc2(void *heap_ptr, s32 size, u32 num, uintptr_t retaddr);
void *HuMemHeapInit(void *ptr, s32 size)
{
@ -31,25 +31,29 @@ void *HuMemHeapInit(void *ptr, s32 size)
return block;
}
void *HuMemMemoryAllocNum(void *heap_ptr, s32 size, u32 num, u32 retaddr)
void *HuMemMemoryAllocNum(void *heap_ptr, s32 size, u32 num, uintptr_t retaddr)
{
return HuMemMemoryAlloc2(heap_ptr, size, num, retaddr);
}
void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr)
void *HuMemMemoryAlloc(void *heap_ptr, s32 size, uintptr_t retaddr)
{
return HuMemMemoryAlloc2(heap_ptr, size, -256, retaddr);
}
static void *HuMemMemoryAlloc2(void *heap_ptr, s32 size, u32 num, u32 retaddr)
static void *HuMemMemoryAlloc2(void *heap_ptr, s32 size, u32 num, uintptr_t retaddr)
{
s32 alloc_size = MEM_ALLOC_SIZE(size);
struct memory_block *block = heap_ptr;
do {
if(!block->flag && block->size >= alloc_size) {
if(block->size-alloc_size > 32u) {
struct memory_block *new_block = (struct memory_block *)(((u32)block)+alloc_size);
new_block->size = block->size-alloc_size;
if (!block->flag && block->size >= alloc_size) {
if (block->size - alloc_size > 32u) {
#ifdef TARGET_PC
struct memory_block *new_block = (struct memory_block *)(((char *)block) + alloc_size);
#else
struct memory_block *new_block = (struct memory_block *)(((u32)block) + alloc_size);
#endif
new_block->size = block->size - alloc_size;
new_block->magic = 205;
new_block->flag = 0;
new_block->retaddr = retaddr;
@ -66,50 +70,49 @@ static void *HuMemMemoryAlloc2(void *heap_ptr, s32 size, u32 num, u32 retaddr)
return BLOCK_GET_DATA(block);
}
block = block->next;
} while(block != heap_ptr);
} while (block != heap_ptr);
OSReport("HuMem>memory alloc error %08x(%08X): Call %08x\n", size, num, retaddr);
HuMemHeapDump(heap_ptr, -1);
return NULL;
}
void HuMemMemoryFreeNum(void *heap_ptr, u32 num, u32 retaddr)
void HuMemMemoryFreeNum(void *heap_ptr, u32 num, uintptr_t retaddr)
{
struct memory_block *block = heap_ptr;
do {
struct memory_block *block_next = block->next;
if(block->flag && block->num == num) {
if (block->flag && block->num == num) {
HuMemMemoryFree(BLOCK_GET_DATA(block), retaddr);
}
block = block_next;
} while(block != heap_ptr);
} while (block != heap_ptr);
}
static void HuMemTailMemoryAlloc2() //Required for string literal
static void HuMemTailMemoryAlloc2() // Required for string literal
{
OSReport("memory allocation(tail) error.\n");
}
void HuMemMemoryFree(void *ptr, u32 retaddr)
void HuMemMemoryFree(void *ptr, uintptr_t retaddr)
{
struct memory_block *block;
if(!ptr) {
if (!ptr) {
return;
}
block = DATA_GET_BLOCK(ptr);
if(block->magic != 165) {
if (block->magic != 165) {
OSReport("HuMem>memory free error. %08x( call %08x)\n", ptr, retaddr);
return;
}
if(block->prev < block && !block->prev->flag) {
block->flag = 0;
if (block->prev < block && !block->prev->flag) {
block->flag = 0;
block->magic = 205;
block->next->prev = block->prev;
block->prev->next = block->next;
block->prev->size += block->size;
block = block->prev;
}
if(block->next > block && !block->next->flag) {
if (block->next > block && !block->next->flag) {
block->next->next->prev = block;
block->size += block->next->size;
block->next = block->next->next;
@ -124,11 +127,11 @@ s32 HuMemUsedMemorySizeGet(void *heap_ptr)
struct memory_block *block = heap_ptr;
s32 size = 0;
do {
if(block->flag == 1) {
if (block->flag == 1) {
size += block->size;
}
block = block->next;
} while(block != heap_ptr);
} while (block != heap_ptr);
return size;
}
@ -137,11 +140,11 @@ s32 HuMemUsedMemoryBlockGet(void *heap_ptr)
struct memory_block *block = heap_ptr;
s32 num_blocks = 0;
do {
if(block->flag == 1) {
if (block->flag == 1) {
num_blocks++;
}
block = block->next;
} while(block != heap_ptr);
} while (block != heap_ptr);
return num_blocks;
}
@ -159,45 +162,49 @@ void HuMemHeapDump(void *heap_ptr, s16 status)
s32 num_unused_blocks = 0;
u8 dump_type;
if(status < 0) {
if (status < 0) {
dump_type = 10;
} else if(status == 0) {
}
else if (status == 0) {
dump_type = 0;
} else {
}
else {
dump_type = 1;
}
OSReport("======== HuMem heap dump %08x ========\n", heap_ptr);
OSReport("MCB-----+Size----+MG+FL+Prev----+Next----+UNum----+Body----+Call----\n");
do {
if(dump_type == 10 || block->flag == dump_type) {
OSReport("%08x %08x %02x %02x %08x %08x %08x %08x %08x\n", block, block->size, block->magic, block->flag,
block->prev, block->next, block->num, BLOCK_GET_DATA(block), block->retaddr);
if (dump_type == 10 || block->flag == dump_type) {
OSReport("%08x %08x %02x %02x %08x %08x %08x %08x %08x\n", block, block->size, block->magic, block->flag, block->prev, block->next,
block->num, BLOCK_GET_DATA(block), block->retaddr);
}
if(block->flag == 1) {
if (block->flag == 1) {
size += block->size;
num_blocks++;
} else {
}
else {
inactive_size += block->size;
num_unused_blocks++;
}
block = block->next;
} while(block != heap_ptr);
OSReport("MCB:%d(%d/%d) MEM:%08x(%08x/%08x)\n", num_blocks+num_unused_blocks, num_blocks, num_unused_blocks,
size+inactive_size, size, inactive_size);
} while (block != heap_ptr);
OSReport("MCB:%d(%d/%d) MEM:%08x(%08x/%08x)\n", num_blocks + num_unused_blocks, num_blocks, num_unused_blocks, size + inactive_size, size,
inactive_size);
OSReport("======== HuMem heap dump %08x end =====\n", heap_ptr);
}
s32 HuMemMemorySizeGet(void *ptr)
{
struct memory_block *block;
if(!ptr) {
if (!ptr) {
return 0;
}
block = DATA_GET_BLOCK(ptr);
if(block->flag == 1 && block->magic == 165) {
return block->size-32;
} else {
if (block->flag == 1 && block->magic == 165) {
return block->size - 32;
}
else {
return 0;
}
}

View file

@ -5,6 +5,10 @@
typedef s32 (*DLLProlog)(void);
typedef void (*DLLEpilog)(void);
#ifdef TARGET_PC
typedef void (*DLLObjectSetup)(void);
#endif
omDllData *omDLLinfoTbl[OM_DLL_MAX];
static FileListEntry *omDLLFileList;
@ -31,6 +35,10 @@ s32 omDLLStart(s16 overlay, s16 flag)
dllno = omDLLSearch(overlay);
if(dllno >= 0 && !flag) {
omDllData *dll = omDLLinfoTbl[dllno];
#ifdef TARGET_PC
// TODO PC
OSReport("objdll>Already Loaded %s\n", dll->name);
#else
OSReport("objdll>Already Loaded %s(%08x %08x)\n", dll->name, dll->module, dll->bss);
omDLLInfoDump(&dll->module->info);
@ -38,6 +46,7 @@ s32 omDLLStart(s16 overlay, s16 flag)
memset(dll->bss, 0, dll->module->bssSize);
HuMemDCFlushAll();
dll->ret = ((DLLProlog)dll->module->prolog)();
#endif
OSReport("objdll> %s prolog end\n", dll->name);
return dllno;
} else {
@ -80,8 +89,10 @@ void omDLLEnd(s16 dllno, s16 flag)
} else {
omDllData *dll;
dll = omDLLinfoTbl[dllno];
#ifdef __MWERKS__
OSReport("objdll>Call Epilog\n");
((DLLEpilog)dll->module->epilog)();
#endif
OSReport("objdll>End DLL stayed:%s\n", omDLLinfoTbl[dllno]->name);
}
OSReport("objdll>End DLL finish\n");
@ -95,6 +106,12 @@ omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
dll = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(omDllData));
*dll_ptr = dll;
dll->name = dllFile->name;
#ifdef _WIN32
dll->hModule = LoadLibrary(dllFile->name);
if (dll->hModule == NULL) {
OSReport("objdll>++++++++++++++++ DLL Link Failed\n");
}
#else
dll->module = HuDvdDataReadDirect(dllFile->name, HEAP_SYSTEM);
dll->bss = HuMemDirectMalloc(HEAP_SYSTEM, dll->module->bssSize);
if(OSLink(&dll->module->info, dll->bss) != TRUE) {
@ -103,9 +120,17 @@ omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
omDLLInfoDump(&dll->module->info);
omDLLHeaderDump(dll->module);
OSReport("objdll>LinkOK %08x %08x\n", dll->module, dll->bss);
#endif
if(flag == 1) {
OSReport("objdll> %s prolog start\n", dllFile->name);
#ifdef _WIN32
{
DLLObjectSetup objectSetup = (DLLObjectSetup)GetProcAddress(dll->hModule, "ObjectSetup");
objectSetup();
}
#else
dll->ret = ((DLLProlog)dll->module->prolog)();
#endif
OSReport("objdll> %s prolog end\n", dllFile->name);
}
return dll;
@ -114,6 +139,9 @@ omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag)
void omDLLUnlink(omDllData *dll_ptr, s16 flag)
{
OSReport("odjdll>Unlink DLL:%s\n", dll_ptr->name);
#ifdef _WIN32
FreeLibrary(dll_ptr->hModule);
#else
if(flag == 1) {
OSReport("objdll>Unlink DLL epilog\n");
((DLLEpilog)dll_ptr->module->epilog)();
@ -124,6 +152,7 @@ void omDLLUnlink(omDllData *dll_ptr, s16 flag)
}
HuMemDirectFree(dll_ptr->bss);
HuMemDirectFree(dll_ptr->module);
#endif
HuMemDirectFree(dll_ptr);
}
@ -169,4 +198,4 @@ void omDLLHeaderDump(OSModuleHeader *module)
OSReport(" epilog func:0x%08x\n", module->epilog);
OSReport(" unresolved func:0x%08x\n", module->unresolved);
OSReport("================================\n");
}
}

View file

@ -1,12 +1,12 @@
#include "game/audio.h"
#include "game/chrman.h"
#include "game/esprite.h"
#include "game/flag.h"
#include "game/hsfdraw.h"
#include "game/hsfman.h"
#include "game/printfunc.h"
#include "game/object.h"
#include "game/pad.h"
#include "game/flag.h"
#include "game/printfunc.h"
#define OM_OVL_HIS_MAX 16
#define OM_MAX_GROUPS 10
@ -33,15 +33,15 @@ typedef struct om_obj_man {
omObjData *omDBGSysKeyObj;
Process *omwatchproc;
OverlayID omnextovl;
OverlayID omcurovl;
SHARED_SYM OverlayID omcurovl;
s32 omcurdll;
s32 omovlhisidx;
s32 omovlevtno;
SHARED_SYM s32 omovlhisidx;
SHARED_SYM s32 omovlevtno;
s32 omnextovlevtno;
u32 omovlstat;
SHARED_SYM u32 omovlstat;
static s32 omnextovlstat;
char omUPauseFlag;
s16 omSysExitReq;
SHARED_SYM s16 omSysExitReq;
s16 omdispinfo;
static omOvlHisData omovlhis[OM_OVL_HIS_MAX];
@ -61,14 +61,17 @@ void omMasterInit(s32 prio, FileListEntry *ovl_list, s32 ovl_count, OverlayID st
omovlhisidx = -1;
omOvlCallEx(start_ovl, 1, 0, 0);
omDBGSysKeyObj = NULL;
#ifdef __MWERKS__
// TODO PC
omSysPauseEnable(TRUE);
#endif
}
static void omWatchOverlayProc(void)
{
while(1) {
if(omcurovl == OVL_INVALID) {
if(omnextovl >= 0 && fadeStat == 0) {
while (1) {
if (omcurovl == OVL_INVALID) {
if (omnextovl >= 0 && fadeStat == 0) {
HuPrcSleep(0);
OSReport("++++++++++++++++++++ Start New OVL %d (EVT:%d STAT:0x%08x) ++++++++++++++++++\n", omnextovl, omnextovlevtno, omnextovlstat);
HuMemHeapDump(HuMemHeapPtrGet(HEAP_SYSTEM), -1);
@ -79,28 +82,37 @@ static void omWatchOverlayProc(void)
OSReport("objman>Init esp\n");
espInit();
OSReport("objman>Call objectsetup\n");
#ifdef __MWERKS__
// TODO PC
HuAudVoiceInit(omnextovl);
HuAudDllSndGrpSet(omnextovl);
#endif
omcurovl = omnextovl;
omovlevtno = omnextovlevtno;
omovlstat = omnextovlstat;
omnextovl = OVL_INVALID;
if(_CheckFlag(FLAG_ID_MAKE(1, 12))) {
#ifdef __MWERKS__
// TODO PC
if (_CheckFlag(FLAG_ID_MAKE(1, 12))) {
MGSeqPracticeInit();
}
omSysPauseEnable(TRUE);
#endif
omcurdll = omDLLStart(omcurovl, 0);
OSReport("objman>ObjectSetup end\n");
if(omcurovl != OVL_INVALID) {
if (omcurovl != OVL_INVALID) {
goto watch_child;
} else {
}
else {
continue;
}
} else {
}
else {
HuPrcVSleep();
}
} else {
watch_child:
}
else {
watch_child:
HuPrcChildWatch();
}
}
@ -109,7 +121,7 @@ static void omWatchOverlayProc(void)
void omOvlCallEx(OverlayID overlay, s16 arg2, s32 event, s32 stat)
{
OSReport("objman>Call New Ovl %d(%d)\n", overlay, arg2);
if(omovlhisidx >= OM_OVL_HIS_MAX) {
if (omovlhisidx >= OM_OVL_HIS_MAX) {
OSReport("objman>OVL Call over error\n");
return;
}
@ -122,7 +134,7 @@ void omOvlCallEx(OverlayID overlay, s16 arg2, s32 event, s32 stat)
void omOvlGotoEx(OverlayID overlay, s16 arg2, s32 event, s32 stat)
{
omprevovl = omcurovl;
if(omcurovl >= 0) {
if (omcurovl >= 0) {
omOvlKill(arg2);
}
omnextovl = overlay;
@ -134,7 +146,7 @@ void omOvlReturnEx(s16 level, s16 arg2)
{
omovlhisidx -= level;
OSReport("objman>Ovl Return %d=%d(%d)\n", level, omovlhisidx, arg2);
if(omovlhisidx < 0) {
if (omovlhisidx < 0) {
OSReport("objman>OVL under error\n");
omovlhisidx = 0;
}
@ -143,10 +155,16 @@ void omOvlReturnEx(s16 level, s16 arg2)
void omOvlKill(s16 arg)
{
#ifdef __MWERKS__
// TODO PC
CharModelKill(-1);
MGSeqKillAll();
#endif
Hu3DAllKill();
#ifdef __MWERKS__
// TODO PC
HuWinAllKill();
#endif
HuSprClose();
HuPrcChildKill(omwatchproc);
HuMemDirectFreeNum(HEAP_SYSTEM, MEMORY_DEFAULT_NUM);
@ -154,7 +172,10 @@ void omOvlKill(s16 arg)
HuMemDirectFreeNum(HEAP_DVD, MEMORY_DEFAULT_NUM);
HuMemDirectFreeNum(HEAP_DATA, MEMORY_DEFAULT_NUM);
HuPadRumbleAllStop();
#ifdef __MWERKS__
// TODO PC
HuAudFXListnerKill();
#endif
OSReport("OvlKill %d\n", arg);
omSysExitReq = FALSE;
omDLLNumEnd(omcurovl, arg);
@ -165,11 +186,11 @@ void omOvlKill(s16 arg)
void omOvlHisChg(s32 level, OverlayID overlay, s32 event, s32 stat)
{
omOvlHisData *history;
if(omovlhisidx-level < 0 || omovlhisidx-level >= OM_OVL_HIS_MAX) {
if (omovlhisidx - level < 0 || omovlhisidx - level >= OM_OVL_HIS_MAX) {
OSReport("objman> omOvlHisChg: overlay 実行履歴の範囲外を変更しようとしました\n");
return;
}
history = &omovlhis[omovlhisidx-level];
history = &omovlhis[omovlhisidx - level];
history->overlay = overlay;
history->event = event;
history->stat = stat;
@ -177,11 +198,11 @@ void omOvlHisChg(s32 level, OverlayID overlay, s32 event, s32 stat)
omOvlHisData *omOvlHisGet(s32 level)
{
if(omovlhisidx-level < 0 || omovlhisidx-level >= OM_OVL_HIS_MAX) {
if (omovlhisidx - level < 0 || omovlhisidx - level >= OM_OVL_HIS_MAX) {
OSReport("objman> omOvlHisGet: overlay 実行履歴の範囲外を参照しようとしました\n");
return NULL;
}
return &omovlhis[omovlhisidx-level];
return &omovlhis[omovlhisidx - level];
}
Process *omInitObjMan(s16 max_objs, s32 prio)
@ -196,7 +217,7 @@ Process *omInitObjMan(s16 max_objs, s32 prio)
max_objs += 2;
omSysExitReq = FALSE;
process = HuPrcChildCreate(omMain, prio, 16384, 0, omwatchproc);
HuPrcSetStat(process, PROCESS_STAT_PAUSE_EN|PROCESS_STAT_UPAUSE_EN);
HuPrcSetStat(process, PROCESS_STAT_PAUSE_EN | PROCESS_STAT_UPAUSE_EN);
objman = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(omObjMan), MEMORY_DEFAULT_NUM);
objman->max_objs = max_objs;
process->user_data = objman;
@ -205,24 +226,24 @@ Process *omInitObjMan(s16 max_objs, s32 prio)
objman->next_idx = 0;
objman->obj_last = -1;
objman->obj_first = -1;
obj_all = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData), MEMORY_DEFAULT_NUM);
objman->obj = obj_all;
group_all = HuMemDirectMallocNum(HEAP_SYSTEM, OM_MAX_GROUPS*sizeof(omObjGroup), MEMORY_DEFAULT_NUM);
obj_all = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs * sizeof(omObjData), MEMORY_DEFAULT_NUM);
objman->obj = obj_all;
group_all = HuMemDirectMallocNum(HEAP_SYSTEM, OM_MAX_GROUPS * sizeof(omObjGroup), MEMORY_DEFAULT_NUM);
objman->group = group_all;
for(i=0; i<max_objs;i++) {
for (i = 0; i < max_objs; i++) {
obj = &obj_all[i];
obj->stat = 1;
obj->prio = obj->prev =obj->next = -1;
obj->prio = obj->prev = obj->next = -1;
obj->unk10 = 0;
obj->trans.x = obj->trans.y = obj->trans.z = obj->rot.x = obj->rot.y = obj->rot.z = 0.0f;
obj->scale.x = obj->scale.y = obj->scale.z = 1.0f;
obj->model = obj->motion = NULL;
obj->func = obj->data = NULL;
obj->next_idx = i+1;
obj->next_idx = i + 1;
obj->mtncnt = 0;
obj->motion = NULL;
}
for(i=0; i<OM_MAX_GROUPS;i++) {
for (i = 0; i < OM_MAX_GROUPS; i++) {
group_all[i].max_objs = 0;
group_all[i].num_objs = 0;
group_all[i].next_idx = 0;
@ -250,7 +271,7 @@ omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt,
s16 next_idx;
omObjMan *objman = objman_process->user_data;
omObjData *obj_base = objman->obj;
if(objman->num_objs == objman->max_objs) {
if (objman->num_objs == objman->max_objs) {
return NULL;
}
next_idx = objman->next_idx;
@ -258,26 +279,29 @@ omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt,
object->next_idx_alloc = next_idx;
object->prio = prio;
omInsertObj(objman_process, object);
if(mdlcnt) {
object->model = HuMemDirectMallocNum(HEAP_SYSTEM, mdlcnt*sizeof(s16), MEMORY_DEFAULT_NUM);
if (mdlcnt) {
object->model = HuMemDirectMallocNum(HEAP_SYSTEM, mdlcnt * sizeof(s16), MEMORY_DEFAULT_NUM);
object->mdlcnt = mdlcnt;
for(i=0; i<mdlcnt; i++) {
for (i = 0; i < mdlcnt; i++) {
object->model[i] = -1;
}
} else {
}
else {
object->model = NULL;
object->mdlcnt = 0;
}
if(mtncnt) {
object->motion = HuMemDirectMallocNum(HEAP_SYSTEM, mtncnt*sizeof(s16), MEMORY_DEFAULT_NUM);
if (mtncnt) {
object->motion = HuMemDirectMallocNum(HEAP_SYSTEM, mtncnt * sizeof(s16), MEMORY_DEFAULT_NUM);
object->mtncnt = mtncnt;
} else {
}
else {
object->motion = NULL;
object->mtncnt = 0;
}
if(group >= 0) {
if (group >= 0) {
omAddMember(objman_process, group, object);
} else {
}
else {
object->group = group;
object->group_idx = 0;
}
@ -302,31 +326,33 @@ static void omInsertObj(Process *objman_process, omObjData *object)
s16 prio = object->prio;
s16 obj_idx;
s16 prev_idx;
if(objman->obj_first == -1) {
if (objman->obj_first == -1) {
object->prev = -1;
object->next = -1;
objman->obj_first = next_idx_alloc;
objman->obj_last = next_idx_alloc;
(void)objman; //HACK for matching
(void)objman; // HACK for matching
return;
}
for(obj_idx = objman->obj_first; obj_idx != -1; obj_idx = obj_new->next) {
for (obj_idx = objman->obj_first; obj_idx != -1; obj_idx = obj_new->next) {
obj_new = &obj_all[obj_idx];
if(obj_new->prio <= prio) {
if (obj_new->prio <= prio) {
break;
}
prev_idx = obj_idx;
}
if(obj_idx != -1) {
if (obj_idx != -1) {
object->prev = obj_new->prev;
object->next = obj_idx;
if(obj_new->prev != -1) {
if (obj_new->prev != -1) {
obj_all[obj_new->prev].next = next_idx_alloc;
} else {
}
else {
objman->obj_first = next_idx_alloc;
}
obj_new->prev = next_idx_alloc;
} else {
}
else {
object->next = -1;
object->prev = prev_idx;
obj_new->next = next_idx_alloc;
@ -338,7 +364,7 @@ void omAddMember(Process *objman_process, u16 group, omObjData *object)
{
omObjMan *objman = objman_process->user_data;
omObjGroup *group_ptr = &objman->group[group];
if(group_ptr->num_objs != group_ptr->max_objs) {
if (group_ptr->num_objs != group_ptr->max_objs) {
object->group = group;
object->group_idx = group_ptr->next_idx;
group_ptr->obj[group_ptr->next_idx] = object;
@ -352,40 +378,41 @@ void omDelObjEx(Process *objman_process, omObjData *object)
omObjMan *objman = objman_process->user_data;
omObjData *obj_all = objman->obj;
s16 next_idx_alloc = object->next_idx_alloc;
if(objman->num_objs == 0 || object->stat == 1) {
if (objman->num_objs == 0 || object->stat == 1) {
return;
}
objman->num_objs--;
if(object->group >= 0) {
if (object->group >= 0) {
omDelMember(objman_process, object);
}
if(object->motion != NULL) {
if (object->motion != NULL) {
HuMemDirectFree(object->motion);
object->motion = NULL;
}
if(object->model != NULL) {
if (object->model != NULL) {
HuMemDirectFree(object->model);
object->model = NULL;
}
if(object->data != NULL) {
if (object->data != NULL) {
HuMemDirectFree(object->data);
object->data = NULL;
}
object->stat = OM_STAT_DELETED;
if(object->next >= 0) {
if (object->next >= 0) {
obj_all[object->next].prev = object->prev;
}
if(object->prev >= 0) {
if (object->prev >= 0) {
obj_all[object->prev].next = object->next;
}
if(objman->num_objs != 0) {
if(object->prev < 0) {
if (objman->num_objs != 0) {
if (object->prev < 0) {
objman->obj_first = obj_all[object->next].next_idx_alloc;
}
if(object->next < 0) {
if (object->next < 0) {
objman->obj_last = obj_all[object->prev].next_idx_alloc;
}
} else {
}
else {
objman->obj_first = objman->obj_last = -1;
}
object->next_idx = objman->next_idx;
@ -394,7 +421,7 @@ void omDelObjEx(Process *objman_process, omObjData *object)
void omDelMember(Process *objman_process, omObjData *object)
{
if(object->group != -1) {
if (object->group != -1) {
omObjMan *objman = objman_process->user_data;
omObjData *obj_all = objman->obj;
omObjGroup *group = &objman->group[object->group];
@ -411,20 +438,20 @@ void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs)
s32 i;
omObjMan *objman = objman_process->user_data;
omObjGroup *group_ptr = &objman->group[group];
if(group_ptr->obj != NULL) {
if (group_ptr->obj != NULL) {
HuMemDirectFree(group_ptr->obj);
}
if(group_ptr->next != NULL) {
if (group_ptr->next != NULL) {
HuMemDirectFree(group_ptr->next);
}
group_ptr->next_idx = 0;
group_ptr->max_objs = max_objs;
group_ptr->num_objs = 0;
group_ptr->obj = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData *), MEMORY_DEFAULT_NUM);
group_ptr->next = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(u16), MEMORY_DEFAULT_NUM);
for(i=0; i<max_objs; i++) {
group_ptr->obj = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs * sizeof(omObjData *), MEMORY_DEFAULT_NUM);
group_ptr->next = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs * sizeof(u16), MEMORY_DEFAULT_NUM);
for (i = 0; i < max_objs; i++) {
group_ptr->obj[i] = NULL;
group_ptr->next[i] = i+1;
group_ptr->next[i] = i + 1;
}
}
@ -473,38 +500,38 @@ void omMain(void)
omObjData *object;
s16 obj_index;
omDLLDBGOut();
while(1) {
if(omdispinfo) {
while (1) {
if (omdispinfo) {
float scale = 1.5f;
GXColor color;
color.a = 96;
color.r = 0;
color.g = 0;
color.b = 255;
printWin(7, 23, 128*scale, 40*scale, &color);
printWin(7, 23, 128 * scale, 40 * scale, &color);
fontcolor = FONT_COLOR_YELLOW;
print8(8, 24, scale, "\xFD\x01H:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_SYSTEM), HuMemUsedMallocBlockGet(HEAP_SYSTEM));
print8(8, 24+(8*scale), scale, "\xFD\x01M:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_DATA), HuMemUsedMallocBlockGet(HEAP_DATA));
print8(8, 24+(16*scale), scale, "\xFD\x01OBJ:%d/%d", objman->num_objs, objman->max_objs);
print8(8, 24+(24*scale), scale, "\xFD\x01OVL:%ld(%ld<%ld)", omovlhisidx, omcurovl, omprevovl);
print8(8, 24+(32*scale), scale, "\xFD\x01POL:%ld", totalPolyCnted);
print8(8, 24 + (8 * scale), scale, "\xFD\x01M:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_DATA), HuMemUsedMallocBlockGet(HEAP_DATA));
print8(8, 24 + (16 * scale), scale, "\xFD\x01OBJ:%d/%d", objman->num_objs, objman->max_objs);
print8(8, 24 + (24 * scale), scale, "\xFD\x01OVL:%ld(%ld<%ld)", omovlhisidx, omcurovl, omprevovl);
print8(8, 24 + (32 * scale), scale, "\xFD\x01POL:%ld", totalPolyCnted);
}
obj_index = objman->obj_last;
while(obj_index != -1) {
while (obj_index != -1) {
object = &obj_all[obj_index];
obj_index = object->prev;
if((object->stat & (OM_STAT_DELETED|OM_STAT_DISABLED)) == 0) {
if(object->func != NULL && (object->stat & (0x40|0x8|OM_STAT_PAUSED)) == 0) {
if ((object->stat & (OM_STAT_DELETED | OM_STAT_DISABLED)) == 0) {
if (object->func != NULL && (object->stat & (0x40 | 0x8 | OM_STAT_PAUSED)) == 0) {
object->func(object);
}
if(omcurovl == -1 || objman->obj_last == -1) {
if (omcurovl == -1 || objman->obj_last == -1) {
break;
}
if((object->stat & (OM_STAT_DELETED|OM_STAT_DISABLED)) == 0) {
if((obj_all[obj_index].stat & (OM_STAT_DELETED|OM_STAT_DISABLED)) != 0) {
if ((object->stat & (OM_STAT_DELETED | OM_STAT_DISABLED)) == 0) {
if ((obj_all[obj_index].stat & (OM_STAT_DELETED | OM_STAT_DISABLED)) != 0) {
obj_index = object->prev;
}
if(object->model != NULL && object->model[0] != -1 && !(object->stat & OM_STAT_MODEL_PAUSED)) {
if (object->model != NULL && object->model[0] != -1 && !(object->stat & OM_STAT_MODEL_PAUSED)) {
Hu3DModelPosSet(object->model[0], object->trans.x, object->trans.y, object->trans.z);
Hu3DModelRotSet(object->model[0], object->rot.x, object->rot.y, object->rot.z);
Hu3DModelScaleSet(object->model[0], object->scale.x, object->scale.y, object->scale.z);
@ -516,7 +543,7 @@ void omMain(void)
}
}
//Dummy function to force string literals in binary
// Dummy function to force string literals in binary
static void omDumpObj(Process *objman_process)
{
omObjMan *objman = objman_process->user_data;
@ -524,14 +551,12 @@ static void omDumpObj(Process *objman_process)
s32 i;
OSReport("=================== 現在登録されている OBJECT ==================\n");
OSReport("STAT PRI GRPN MEMN PROG (TRA) (ROT) (SCA) mdlcnt mtncnt work[0] work[1] work[2] work[3] *data\n");
for(i=0; i<objman->max_objs; i++) {
for (i = 0; i < objman->max_objs; i++) {
omObjData *object = &obj_all[i];
OSReport("%04d:%04X %04X %d %d %08X (%.2f %.2f %.2f) (%.2f %.2f %.2f) (%.2f %.2f %.2f) %d %d %08X %08X %08X %08X %08X\n",
object->stat, object->stat, object->prio, object->group, object->unk10, object->func,
object->trans.x, object->trans.y, object->trans.z,
object->rot.x, object->rot.y, object->rot.z,
object->scale.x, object->scale.y, object->scale.z,
object->mdlcnt, object->mtncnt, object->work[0], object->work[1], object->work[2], object->work[3], object->data);
OSReport("%04d:%04X %04X %d %d %08X (%.2f %.2f %.2f) (%.2f %.2f %.2f) (%.2f %.2f %.2f) %d %d %08X %08X %08X %08X %08X\n", object->stat,
object->stat, object->prio, object->group, object->unk10, object->func, object->trans.x, object->trans.y, object->trans.z, object->rot.x,
object->rot.y, object->rot.z, object->scale.x, object->scale.y, object->scale.z, object->mdlcnt, object->mtncnt, object->work[0],
object->work[1], object->work[2], object->work[3], object->data);
}
OSReport("================================================================\n");
}
@ -541,15 +566,16 @@ void omAllPause(BOOL pause)
Process *objman_process = HuPrcCurrentGet();
omObjMan *objman = objman_process->user_data;
s32 i;
if(pause) {
for(i=0; i<objman->max_objs; i++) {
if((objman->obj[i].stat & (OM_STAT_DELETED|OM_STAT_NOPAUSE)) == 0) {
if (pause) {
for (i = 0; i < objman->max_objs; i++) {
if ((objman->obj[i].stat & (OM_STAT_DELETED | OM_STAT_NOPAUSE)) == 0) {
omSetStatBit(&objman->obj[i], OM_STAT_PAUSED);
}
}
} else {
for(i=0; i<objman->max_objs; i++) {
if((objman->obj[i].stat & (OM_STAT_DELETED|OM_STAT_NOPAUSE)) == 0) {
}
else {
for (i = 0; i < objman->max_objs; i++) {
if ((objman->obj[i].stat & (OM_STAT_DELETED | OM_STAT_NOPAUSE)) == 0) {
omResetStatBit(&objman->obj[i], OM_STAT_PAUSED);
}
}
@ -558,9 +584,10 @@ void omAllPause(BOOL pause)
char omPauseChk(void)
{
if(omDBGSysKeyObj == NULL) {
if (omDBGSysKeyObj == NULL) {
return 0;
} else {
}
else {
return omDBGSysKeyObj->work[0] & 0x1;
}
}

View file

@ -1,11 +1,15 @@
#include "game/dvd.h"
#include "game/object.h"
#define OVL_DEFINE(name, path) { path, 0 },
#ifdef _WIN32
#define OVL_DEFINE(name, path) { path ".dll", 0 },
#else
#define OVL_DEFINE(name, path) { "dll/" path ".rel", 0 },
#endif
FileListEntry _ovltbl[OVL_COUNT+1] = {
#include "ovl_table.h"
{ NULL, -1 }
};
#undef OVL_DEFINE
#undef OVL_DEFINE

View file

@ -2,6 +2,9 @@
#include "game/msm.h"
#include "game/pad.h"
#ifdef TARGET_PC
#include <stdlib.h>
#endif
typedef struct pad_rumble {
s16 duration;
@ -16,17 +19,17 @@ static void PadADConv(s16 pad, PADStatus *status);
static int padStatErrOld[4];
static PadRumble rumbleData[4];
u16 HuPadBtn[4];
u16 HuPadBtnDown[4];
u16 HuPadBtnRep[4];
s8 HuPadStkX[4];
s8 HuPadStkY[4];
s8 HuPadSubStkX[4];
s8 HuPadSubStkY[4];
u8 HuPadTrigL[4];
u8 HuPadTrigR[4];
u8 HuPadDStk[4];
u8 HuPadDStkRep[4];
SHARED_SYM u16 HuPadBtn[4];
SHARED_SYM u16 HuPadBtnDown[4];
SHARED_SYM u16 HuPadBtnRep[4];
SHARED_SYM s8 HuPadStkX[4];
SHARED_SYM s8 HuPadStkY[4];
SHARED_SYM s8 HuPadSubStkX[4];
SHARED_SYM s8 HuPadSubStkY[4];
SHARED_SYM u8 HuPadTrigL[4];
SHARED_SYM u8 HuPadTrigR[4];
SHARED_SYM u8 HuPadDStk[4];
SHARED_SYM u8 HuPadDStkRep[4];
s8 HuPadErr[4];
u16 _PadBtn[4];
u16 _PadBtnDown[4];
@ -254,4 +257,4 @@ s16 HuPadStatGet(s16 pad)
u32 HuPadRumbleGet(void)
{
return RumbleBit;
}
}

View file

@ -1,10 +1,10 @@
#include "dolphin.h"
#include "game/printfunc.h"
#include "game/init.h"
#include "dolphin.h"
#include "game/disp.h"
#include "game/init.h"
#include "stdio.h"
#include "stdarg.h"
#include "stdio.h"
extern u8 ank8x8_4b[];
@ -31,31 +31,16 @@ BOOL saftyFrameF;
static void WireDraw(void);
static GXColor ATTRIBUTE_ALIGN(32) fcoltbl[16] = {
{ 0, 0, 0, 255 },
{ 0, 0, 128, 255 },
{ 128, 0, 0, 255 },
{ 128, 0, 128, 255 },
{ 0, 128, 0, 255 },
{ 0, 128, 128, 255 },
{ 128, 128, 0, 255 },
{ 128, 128, 128, 255 },
{ 128, 128, 128, 128 },
{ 0, 0, 255, 255 },
{ 255, 0, 0, 255 },
{ 255, 0, 255, 255 },
{ 0, 255, 0, 255 },
{ 0, 255, 255, 255 },
{ 255, 255, 0, 255 },
{ 255, 255, 255, 255 }
};
static GXColor ATTRIBUTE_ALIGN(32) fcoltbl[16] = { { 0, 0, 0, 255 }, { 0, 0, 128, 255 }, { 128, 0, 0, 255 }, { 128, 0, 128, 255 }, { 0, 128, 0, 255 },
{ 0, 128, 128, 255 }, { 128, 128, 0, 255 }, { 128, 128, 128, 255 }, { 128, 128, 128, 128 }, { 0, 0, 255, 255 }, { 255, 0, 0, 255 },
{ 255, 0, 255, 255 }, { 0, 255, 0, 255 }, { 0, 255, 255, 255 }, { 255, 255, 0, 255 }, { 255, 255, 255, 255 } };
void pfInit(void)
{
int i;
fontcolor = 15;
empstrline = 0;
for (i = 0; i < 256; i++) {
strline[i].str[0] = 0;
}
@ -68,7 +53,7 @@ void pfClsScr(void)
empstrline = 0;
strlinecnt = 0;
for (i = 0; i < 256; i++) {
strline[i].empstrline_next = i+1;
strline[i].empstrline_next = i + 1;
strline[i].type = 0;
if (strline[i].str[0] != 0) {
strline[i].str[0] = 0;
@ -84,7 +69,7 @@ s16 print8(s16 x, s16 y, float scale, char *str, ...)
s16 ret;
va_list list;
strline_curr = &strline[empstrline];
if(strlinecnt >= 256) {
if (strlinecnt >= 256) {
return -1;
}
va_start(list, str);
@ -98,7 +83,7 @@ s16 print8(s16 x, s16 y, float scale, char *str, ...)
strline_curr->y = y;
strline_curr->scale = scale;
dst = strline_curr->str;
while(*src) {
while (*src) {
*dst++ = *src++;
}
*dst = 0;
@ -112,7 +97,7 @@ s16 printWin(s16 x, s16 y, s16 w, s16 h, GXColor *color)
s16 ret;
char *src = pfStrBuf;
strline_curr = &strline[empstrline];
if(strlinecnt >= 256) {
if (strlinecnt >= 256) {
return -1;
}
strlinecnt++;
@ -137,9 +122,9 @@ void pfDrawFonts(void)
Mtx modelview;
int i;
s16 x, y, w, h;
u16 strline_count = strlinecnt;
if(saftyFrameF) {
if (saftyFrameF) {
WireDraw();
}
MTXOrtho(proj, 0, HU_FB_HEIGHT, 0, HU_FB_WIDTH, 0, 10);
@ -156,7 +141,7 @@ void pfDrawFonts(void)
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_CLR0, fcoltbl, sizeof(GXColor));
GXSETARRAY(GX_VA_CLR0, fcoltbl, sizeof(fcoltbl), sizeof(GXColor));
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXInvalidateTexAll();
GXInitTexObj(&font_tex, ank8x8_4b, 128, 128, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE);
@ -173,10 +158,10 @@ void pfDrawFonts(void)
GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
GXSetAlphaUpdate(GX_TRUE);
for(i=0; i<256; i++) {
for (i = 0; i < 256; i++) {
x = strline[i].x;
y = strline[i].y;
if(strline[i].type == 1) {
if (strline[i].type == 1) {
w = strline[i].w;
h = strline[i].h;
GXClearVtxDesc();
@ -192,9 +177,9 @@ void pfDrawFonts(void)
GXSetNumTexGens(0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition2s16(x, y);
GXPosition2s16(x+w, y);
GXPosition2s16(x+w, y+h);
GXPosition2s16(x, y+h);
GXPosition2s16(x + w, y);
GXPosition2s16(x + w, y + h);
GXPosition2s16(x, y + h);
GXEnd();
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
@ -203,14 +188,15 @@ void pfDrawFonts(void)
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_CLR0, fcoltbl, sizeof(GXColor));
GXSETARRAY(GX_VA_CLR0, fcoltbl, sizeof(fcoltbl), sizeof(GXColor));
GXSetNumTevStages(1);
GXSetNumTexGens(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE);
} else {
if(strline[i].str[0] != '\0') {
}
else {
if (strline[i].str[0] != '\0') {
float shadow_ofs_x, shadow_ofs_y;
float char_w;
float char_h;
@ -219,79 +205,80 @@ void pfDrawFonts(void)
u16 color;
s16 shadow_color;
float scale;
char_w = char_h = 8.0f*strline[i].scale;
char_w = char_h = 8.0f * strline[i].scale;
str = strline[i].str;
color = strline[i].color;
shadow_color = -1;
scale = 1.0f;
while(*str) {
while (*str) {
char c = *str++;
switch(c) {
switch (c) {
case 255:
c = *str++;
scale = c/16.0f;
char_w = 8.0f*strline[i].scale*scale;
char_h = 8.0f*strline[i].scale*scale;
scale = c / 16.0f;
char_w = 8.0f * strline[i].scale * scale;
char_h = 8.0f * strline[i].scale * scale;
break;
case 254:
color = (*str++)-1;
color = (*str++) - 1;
break;
case 253:
shadow_color = (*str++)-1;
shadow_ofs_x = 1.3333333f*strline[i].scale*scale;
shadow_ofs_y = 1.3333333f*strline[i].scale*scale;
shadow_color = (*str++) - 1;
shadow_ofs_x = 1.3333333f * strline[i].scale * scale;
shadow_ofs_y = 1.3333333f * strline[i].scale * scale;
break;
default:
texcoord_x = (c%16)/16.0f;
texcoord_y = ((c/16)/16.0f)+(1/128.0f);
if(shadow_color < 0) {
texcoord_x = (c % 16) / 16.0f;
texcoord_y = ((c / 16) / 16.0f) + (1 / 128.0f);
if (shadow_color < 0) {
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s16(x, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y);
GXPosition3s16(x+char_w, y, 0);
GXPosition3s16(x + char_w, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y);
GXPosition3s16(x+char_w, y+char_h, 0);
GXTexCoord2f32(texcoord_x + (1 / 16.0f), texcoord_y);
GXPosition3s16(x + char_w, y + char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y+(1/16.0f));
GXPosition3s16(x, y+char_h, 0);
GXTexCoord2f32(texcoord_x + (1 / 16.0f), texcoord_y + (1 / 16.0f));
GXPosition3s16(x, y + char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y+(1/16.0f));
GXTexCoord2f32(texcoord_x, texcoord_y + (1 / 16.0f));
GXEnd();
} else {
}
else {
GXBegin(GX_QUADS, GX_VTXFMT0, 8);
GXPosition3s16(x+shadow_ofs_x, y+shadow_ofs_y, 0);
GXPosition3s16(x + shadow_ofs_x, y + shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x, texcoord_y);
GXPosition3s16(x+char_w+shadow_ofs_x, y+shadow_ofs_y, 0);
GXPosition3s16(x + char_w + shadow_ofs_x, y + shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y);
GXPosition3s16(x+char_w+shadow_ofs_x, y+char_h+shadow_ofs_y, 0);
GXTexCoord2f32(texcoord_x + (1 / 16.0f), texcoord_y);
GXPosition3s16(x + char_w + shadow_ofs_x, y + char_h + shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y+(1/16.0f));
GXPosition3s16(x+shadow_ofs_x, y+char_h+shadow_ofs_y, 0);
GXTexCoord2f32(texcoord_x + (1 / 16.0f), texcoord_y + (1 / 16.0f));
GXPosition3s16(x + shadow_ofs_x, y + char_h + shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x, texcoord_y+(1/16.0f));
GXTexCoord2f32(texcoord_x, texcoord_y + (1 / 16.0f));
GXPosition3s16(x, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y);
GXPosition3s16(x+char_w, y, 0);
GXPosition3s16(x + char_w, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y);
GXPosition3s16(x+char_w, y+char_h, 0);
GXTexCoord2f32(texcoord_x + (1 / 16.0f), texcoord_y);
GXPosition3s16(x + char_w, y + char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y+(1/16.0f));
GXPosition3s16(x, y+char_h, 0);
GXTexCoord2f32(texcoord_x + (1 / 16.0f), texcoord_y + (1 / 16.0f));
GXPosition3s16(x, y + char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y+(1/16.0f));
GXTexCoord2f32(texcoord_x, texcoord_y + (1 / 16.0f));
GXEnd();
}
x += char_w;
if(x > HU_FB_WIDTH) {
if (x > HU_FB_WIDTH) {
x = 0;
y += char_h;
}
@ -301,6 +288,9 @@ void pfDrawFonts(void)
}
}
}
#ifdef TARGET_PC
GXDestroyTexObj(&font_tex);
#endif
}
#define SAFETY_W 16
@ -312,9 +302,10 @@ static void WireDraw(void)
Mtx modelview;
MTXOrtho(proj, 0, HU_DISP_HEIGHT, 0, HU_DISP_WIDTH, 0, 10);
GXSetProjection(proj, GX_ORTHOGRAPHIC);
if(RenderMode->field_rendering) {
if (RenderMode->field_rendering) {
GXSetViewportJitter(0, 0, HU_FB_WIDTH, HU_FB_HEIGHT, 0, 1, VIGetNextField());
} else {
}
else {
GXSetViewport(0, 0, HU_FB_WIDTH, HU_FB_HEIGHT, 0, 1);
}
GXSetScissor(0, 0, HU_FB_WIDTH, HU_FB_HEIGHT);
@ -338,19 +329,19 @@ static void WireDraw(void)
GXBegin(GX_LINES, 0, 8);
GXPosition2f32(SAFETY_W, SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(SAFETY_W, HU_DISP_HEIGHT-SAFETY_H);
GXPosition2f32(SAFETY_W, HU_DISP_HEIGHT - SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(SAFETY_W, SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(HU_DISP_WIDTH-SAFETY_W, SAFETY_H);
GXPosition2f32(HU_DISP_WIDTH - SAFETY_W, SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(HU_DISP_WIDTH-SAFETY_W, HU_DISP_HEIGHT-SAFETY_H);
GXPosition2f32(HU_DISP_WIDTH - SAFETY_W, HU_DISP_HEIGHT - SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(HU_DISP_WIDTH-SAFETY_W, SAFETY_H);
GXPosition2f32(HU_DISP_WIDTH - SAFETY_W, SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(HU_DISP_WIDTH-SAFETY_W, HU_DISP_HEIGHT-SAFETY_H);
GXPosition2f32(HU_DISP_WIDTH - SAFETY_W, HU_DISP_HEIGHT - SAFETY_H);
GXColor3u8(255, 0, 0);
GXPosition2f32(SAFETY_W, HU_DISP_HEIGHT-SAFETY_H);
GXPosition2f32(SAFETY_W, HU_DISP_HEIGHT - SAFETY_H);
GXColor3u8(255, 0, 0);
GXEnd();
}

View file

@ -1,9 +1,14 @@
#include "game/process.h"
#include "game/memory.h"
#include "dolphin/os.h"
#include "game/jmp.h"
#include "game/memory.h"
#define FAKE_RETADDR 0xA5A5A5A5
#ifdef TARGET_PC
#include <stdio.h>
#endif
#define EXEC_NORMAL 0
#define EXEC_SLEEP 1
#define EXEC_CHILDWATCH 2
@ -21,8 +26,9 @@ void HuPrcInit(void)
processtop = NULL;
}
static void LinkProcess(Process** root, Process* process) {
Process* src_process = *root;
static void LinkProcess(Process **root, Process *process)
{
Process *src_process = *root;
if (src_process && (src_process->prio >= process->prio)) {
while (src_process->next && src_process->next->prio >= process->prio) {
@ -35,7 +41,8 @@ static void LinkProcess(Process** root, Process* process) {
if (process->next) {
process->next->prev = process;
}
} else {
}
else {
process->next = (*root);
process->prev = NULL;
*root = process;
@ -44,13 +51,15 @@ static void LinkProcess(Process** root, Process* process) {
}
}
}
static void UnlinkProcess(Process **root, Process *process) {
static void UnlinkProcess(Process **root, Process *process)
{
if (process->next) {
process->next->prev = process->prev;
}
if (process->prev) {
process->prev->next = process->next;
} else {
}
else {
*root = process->next;
}
}
@ -60,13 +69,11 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz
Process *process;
s32 alloc_size;
void *heap;
if(stack_size == 0) {
if (stack_size == 0) {
stack_size = 2048;
}
alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process))
+HuMemMemoryAllocSizeGet(stack_size)
+HuMemMemoryAllocSizeGet(extra_size);
if(!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) {
alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process)) + HuMemMemoryAllocSizeGet(stack_size) + HuMemMemoryAllocSizeGet(extra_size);
if (!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) {
OSReport("process> malloc error size %d\n", alloc_size);
return NULL;
}
@ -77,10 +84,10 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz
process->stat = 0;
process->prio = prio;
process->sleep_time = 0;
process->base_sp = ((u32)HuMemMemoryAlloc(heap, stack_size, FAKE_RETADDR))+stack_size-8;
gcsetjmp(&process->jump);
process->jump.lr = (u32)func;
process->jump.sp = process->base_sp;
process->base_sp = ((uintptr_t)HuMemMemoryAlloc(heap, stack_size, FAKE_RETADDR)) + stack_size - 8;
SETJMP(process->jump);
SETJMP_SET_IP(process->jump, func);
SETJMP_SET_SP(process->jump, process->base_sp);
process->dtor = NULL;
process->user_data = NULL;
LinkProcess(&processtop, process);
@ -93,7 +100,7 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz
void HuPrcChildLink(Process *parent, Process *child)
{
HuPrcChildUnlink(child);
if(parent->child) {
if (parent->child) {
parent->child->first_child = child;
}
child->next_child = parent->child;
@ -104,13 +111,14 @@ void HuPrcChildLink(Process *parent, Process *child)
void HuPrcChildUnlink(Process *process)
{
if(process->parent) {
if(process->next_child) {
if (process->parent) {
if (process->next_child) {
process->next_child->first_child = process->first_child;
}
if(process->first_child) {
if (process->first_child) {
process->first_child->next_child = process->next_child;
} else {
}
else {
process->parent->child = process->next_child;
}
process->parent = NULL;
@ -127,10 +135,11 @@ Process *HuPrcChildCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extr
void HuPrcChildWatch()
{
Process *curr = HuPrcCurrentGet();
if(curr->child) {
if (curr->child) {
curr->exec = EXEC_CHILDWATCH;
if(!gcsetjmp(&curr->jump)) {
gclongjmp(&processjmpbuf, 1);
if (SETJMP(curr->jump) == 0)
{
LONGJMP(processjmpbuf, 1);
}
}
}
@ -142,18 +151,19 @@ Process *HuPrcCurrentGet()
static s32 SetKillStatusProcess(Process *process)
{
if(process->exec != EXEC_KILLED) {
if (process->exec != EXEC_KILLED) {
HuPrcWakeup(process);
process->exec = EXEC_KILLED;
return 0;
} else {
}
else {
return -1;
}
}
s32 HuPrcKill(Process *process)
{
if(process == NULL) {
if (process == NULL) {
process = HuPrcCurrentGet();
}
HuPrcChildKill(process);
@ -164,8 +174,8 @@ s32 HuPrcKill(Process *process)
void HuPrcChildKill(Process *process)
{
Process *child = process->child;
while(child) {
if(child->child) {
while (child) {
if (child->child) {
HuPrcChildKill(child);
}
SetKillStatusProcess(child);
@ -176,12 +186,12 @@ void HuPrcChildKill(Process *process)
static void gcTerminateProcess(Process *process)
{
if(process->dtor) {
if (process->dtor) {
process->dtor();
}
UnlinkProcess(&processtop, process);
processcnt--;
gclongjmp(&processjmpbuf, 2);
LONGJMP(processjmpbuf, 2);
}
void HuPrcEnd()
@ -195,12 +205,12 @@ void HuPrcEnd()
void HuPrcSleep(s32 time)
{
Process *process = HuPrcCurrentGet();
if(time != 0 && process->exec != EXEC_KILLED) {
if (time != 0 && process->exec != EXEC_KILLED) {
process->exec = EXEC_SLEEP;
process->sleep_time = time;
}
if(!gcsetjmp(&process->jump)) {
gclongjmp(&processjmpbuf, 1);
if (SETJMP(process->jump) == 0) {
LONGJMP(processjmpbuf, 1);
}
}
@ -230,54 +240,64 @@ void HuPrcCall(s32 tick)
Process *process;
s32 ret;
processcur = processtop;
ret = gcsetjmp(&processjmpbuf);
while(1) {
switch(ret) {
ret = SETJMP(processjmpbuf);
while (1) {
switch (ret) {
case 2:
HuMemDirectFree(processcur->heap);
case 1:
if(((u8 *)(processcur->heap))[4] != 165) {
#ifdef TARGET_PC
processcur = processcur->next;
#else
if (((u8 *)(processcur->heap))[4] != 165) {
printf("stack overlap error.(process pointer %x)\n", processcur);
while(1);
} else {
while (1)
;
}
else {
processcur = processcur->next;
}
#endif
break;
}
process = processcur;
if(!process) {
if (!process) {
return;
}
#ifdef __MWERKS__
// unused
procfunc = process->jump.lr;
if((process->stat & (PROCESS_STAT_PAUSE|PROCESS_STAT_UPAUSE)) && process->exec != EXEC_KILLED) {
#endif
if ((process->stat & (PROCESS_STAT_PAUSE | PROCESS_STAT_UPAUSE)) && process->exec != EXEC_KILLED) {
ret = 1;
continue;
}
switch(process->exec) {
switch (process->exec) {
case EXEC_SLEEP:
if(process->sleep_time > 0) {
if (process->sleep_time > 0) {
process->sleep_time -= tick;
if(process->sleep_time <= 0) {
if (process->sleep_time <= 0) {
process->sleep_time = 0;
process->exec = EXEC_NORMAL;
}
}
ret = 1;
break;
case EXEC_CHILDWATCH:
if(process->child) {
ret = 1;
} else {
if (process->child) {
ret = 1;
}
else {
process->exec = EXEC_NORMAL;
ret = 0;
}
break;
case EXEC_KILLED:
process->jump.lr = (u32)HuPrcEnd;
SETJMP_SET_IP(process->jump, HuPrcEnd);
case EXEC_NORMAL:
gclongjmp(&process->jump, 1);
LONGJMP(process->jump, 1);
break;
}
}
@ -307,20 +327,21 @@ void HuPrcResetStat(Process *process, u16 value)
void HuPrcAllPause(s32 flag)
{
Process *process = processtop;
if(flag) {
while(process != NULL) {
if(!(process->stat & PROCESS_STAT_PAUSE_EN)) {
if (flag) {
while (process != NULL) {
if (!(process->stat & PROCESS_STAT_PAUSE_EN)) {
HuPrcSetStat(process, PROCESS_STAT_PAUSE);
}
process = process->next;
}
} else {
while(process != NULL) {
if(process->stat & PROCESS_STAT_PAUSE) {
}
else {
while (process != NULL) {
if (process->stat & PROCESS_STAT_PAUSE) {
HuPrcResetStat(process, PROCESS_STAT_PAUSE);
}
process = process->next;
}
}
@ -329,20 +350,21 @@ void HuPrcAllPause(s32 flag)
void HuPrcAllUPause(s32 flag)
{
Process *process = processtop;
if(flag) {
while(process != NULL) {
if(!(process->stat & PROCESS_STAT_UPAUSE_EN)) {
if (flag) {
while (process != NULL) {
if (!(process->stat & PROCESS_STAT_UPAUSE_EN)) {
HuPrcSetStat(process, PROCESS_STAT_UPAUSE);
}
process = process->next;
}
} else {
while(process != NULL) {
if(process->stat & PROCESS_STAT_UPAUSE) {
}
else {
while (process != NULL) {
if (process->stat & PROCESS_STAT_UPAUSE) {
HuPrcResetStat(process, PROCESS_STAT_UPAUSE);
}
process = process->next;
}
}

View file

@ -3,6 +3,9 @@
#include "game/init.h"
#include "dolphin/mtx.h"
#include <stdint.h>
#include "port/byteswap.h"
#define SPRITE_DIRTY_ATTR 0x1
#define SPRITE_DIRTY_XFORM 0x2
@ -212,27 +215,58 @@ AnimData *HuSprAnimRead(void *data)
AnimBmpData *bmp;
AnimBankData *bank;
AnimPatData *pat;
#ifdef TARGET_PC
AnimBmpData *bmp2;
AnimBankData *bank2;
AnimPatData *pat2;
#endif
#ifdef TARGET_PC
AnimData *anim = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimData), MEMORY_DEFAULT_NUM);
byteswap_animdata(data, anim);
#else
AnimData *anim = (AnimData *)data;
if((u32)anim->bank & 0xFFFF0000) {
#endif
if((uintptr_t)anim->bank & ~0xFFFF) {
anim->useNum++;
return anim;
}
bank = (AnimBankData *)((u32)anim->bank+(u32)data);
bank = (AnimBankData *)((uintptr_t)anim->bank+(uintptr_t)data);
#ifdef TARGET_PC
bank2 = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimBankData), MEMORY_DEFAULT_NUM);
byteswap_animbankdata(bank, bank2);
bank = bank2;
#endif
anim->bank = bank;
pat = (AnimPatData *)((u32)anim->pat+(u32)data);
pat = (AnimPatData *)((uintptr_t)anim->pat+(uintptr_t)data);
#ifdef TARGET_PC
pat2 = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimPatData), MEMORY_DEFAULT_NUM);
byteswap_animpatdata(pat, pat2);
pat = pat2;
#endif
anim->pat = pat;
bmp = (AnimBmpData *)((u32)anim->bmp+(u32)data);
bmp = (AnimBmpData *)((uintptr_t)anim->bmp+(uintptr_t)data);
#ifdef TARGET_PC
bmp2 = HuMemDirectMallocNum(HEAP_DATA, sizeof(AnimBmpData), MEMORY_DEFAULT_NUM);
byteswap_animbmpdata(bmp, bmp2);
bmp = bmp2;
#endif
anim->bmp = bmp;
for(i=0; i<anim->bankNum; i++, bank++) {
bank->frame = (AnimFrameData *)((u32)bank->frame+(u32)data);
bank->frame = (AnimFrameData *)((uintptr_t)bank->frame+(uintptr_t)data);
#ifdef TARGET_PC
byteswap_animframedata(bank->frame);
#endif
}
for(i=0; i<anim->patNum; i++, pat++) {
pat->layer = (AnimLayerData *)((u32)pat->layer+(u32)data);
pat->layer = (AnimLayerData *)((uintptr_t)pat->layer+(uintptr_t)data);
#ifdef TARGET_PC
byteswap_animlayerdata(pat->layer);
#endif
}
for(i=0; i<anim->bmpNum; i++, bmp++) {
bmp->palData = (void *)((u32)bmp->palData+(u32)data);
bmp->data = (void *)((u32)bmp->data+(u32)data);
bmp->palData = (void *)((uintptr_t)bmp->palData+(uintptr_t)data);
bmp->data = (void *)((uintptr_t)bmp->data+(uintptr_t)data);
}
anim->useNum = 0;
return anim;
@ -401,6 +435,11 @@ void HuSprAnimKill(AnimData *anim)
HuMemDirectFree(anim->bmp->palData);
}
}
#ifdef TARGET_PC
HuMemDirectFree(anim->bank);
HuMemDirectFree(anim->pat);
HuMemDirectFree(anim->bmp);
#endif
HuMemDirectFree(anim);
}
}
@ -720,4 +759,4 @@ void AnimDebug(AnimData *anim)
OSReport("\tpixSize %d,palNum %d,size (%d,%d)\n", bmp->pixSize, bmp->palNum, bmp->sizeX, bmp->sizeY);
bmp++;
}
}
}

View file

@ -240,6 +240,10 @@ void HuSprTexLoad(AnimData *anim, short bmp, short slot, GXTexWrapMode wrap_s, G
}
GXInitTexObjLOD(&tex_obj, filter, filter, 0, 0, 0, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXLoadTexObj(&tex_obj, slot);
#ifdef TARGET_PC
GXDestroyTexObj(&tex_obj);
GXDestroyTlutObj(&tlut_obj);
#endif
}
void HuSprExecLayerSet(short draw_no, short layer)
@ -252,4 +256,4 @@ static void HuSprLayerHook(short layer)
{
HuSprDispInit();
HuSprExec(HuSprLayerDrawNo[layer]);
}
}

View file

@ -243,15 +243,15 @@ static void THPViewSprFunc(HuSprite *arg0)
sp8.b = arg0->b;
sp8.a = arg0->a;
if (arg0->z_rot != 0.0f) {
PSMTXRotAxisRad(sp18, &spC, MTXDegToRad(arg0->z_rot));
PSMTXScale(sp48, arg0->scale_x, arg0->scale_y, 1.0f);
PSMTXConcat(sp18, sp48, sp48);
MTXRotAxisRad(sp18, &spC, MTXDegToRad(arg0->z_rot));
MTXScale(sp48, arg0->scale_x, arg0->scale_y, 1.0f);
MTXConcat(sp18, sp48, sp48);
}
else {
PSMTXScale(sp48, arg0->scale_x, arg0->scale_y, 1.0f);
MTXScale(sp48, arg0->scale_x, arg0->scale_y, 1.0f);
}
mtxTransCat(sp48, arg0->x, arg0->y, 0.0f);
PSMTXConcat(*arg0->group_mtx, sp48, sp48);
MTXConcat(*arg0->group_mtx, sp48, sp48);
temp_r30 = -((s32)audioTrack.unk00 / 2);
temp_r29 = -((s32)audioTrack.unk04 / 2);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);

View file

@ -45,8 +45,8 @@ static void GetMesMaxSizeSub(u32 mess);
static s32 GetMesMaxSizeSub2(WindowData *window, u8 *mess_data);
void mtxTransCat(Mtx, float, float, float);
WindowData ATTRIBUTE_ALIGN(32) winData[32];
u32 winKey[4];
SHARED_SYM WindowData ATTRIBUTE_ALIGN(32) winData[32];
static u32 winKey[4];
keyBufData winComKeyBuf[256];
static AnimData *iconAnim;
@ -54,7 +54,7 @@ static AnimData *cursorAnim;
static AnimData *cardAnimA;
static AnimData *cardAnimB;
static Process *winProc;
void *messDataPtr;
SHARED_SYM void *messDataPtr;
static s32 messDataNo;
static s16 winMaxWidth;
static s16 winMaxHeight;
@ -1313,6 +1313,8 @@ void HuWinMesRead(s32 mess_data_no)
void HuWinMesSet(s16 window, u32 mess)
{
#ifdef __MWERKS__
// TODO PC
WindowData *window_ptr = &winData[window];
window_ptr->stat = 1;
@ -1339,10 +1341,13 @@ void HuWinMesSet(s16 window, u32 mess)
window_ptr->mess_time = 0;
#endif
}
#endif
}
void HuWinInsertMesSet(s16 window, u32 mess, s16 index)
{
#ifdef __MWERKS__
// TODO PC
WindowData *window_ptr = &winData[window];
if (!(mess & 0x80000000)) {
@ -1358,6 +1363,7 @@ void HuWinInsertMesSet(s16 window, u32 mess, s16 index)
else {
window_ptr->insert_mess[index] = (u8 *)mess;
}
#endif
}
s16 HuWinChoiceGet(s16 window, s16 start_choice)
@ -1662,6 +1668,8 @@ void HuWinMesMaxSizeBetGet(float *size, u32 start, u32 end)
static void GetMesMaxSizeSub(u32 mess)
{
#ifdef __MWERKS__
// TODO PC
s16 line_h;
s16 char_w;
s16 line_w;
@ -1765,6 +1773,7 @@ static void GetMesMaxSizeSub(u32 mess)
if (winMaxHeight < line_h) {
winMaxHeight = line_h;
}
#endif
}
static s32 GetMesMaxSizeSub2(WindowData *window, u8 *mess_data)
@ -1845,6 +1854,8 @@ s16 HuWinKeyWaitNumGet(u32 mess)
{
s16 wait_num;
u8 *mess_data;
#ifdef __MWERKS__
// TODO PC
if (mess > 0x80000000) {
mess_data = (u8 *)mess;
@ -1857,6 +1868,7 @@ s16 HuWinKeyWaitNumGet(u32 mess)
wait_num++;
}
}
#endif
return wait_num;
}

View file

@ -9,7 +9,7 @@ s16 HuSysVWaitGet(s16 old);
typedef s32 (*fadeFunc)(void);
WipeState wipeData;
SHARED_SYM WipeState wipeData;
BOOL wipeFadeInF;
static void WipeColorFill(GXColor color);
@ -111,9 +111,11 @@ void WipeExecAlways(void)
void WipeCreate(s16 mode, s16 type, s16 duration)
{
WipeState *wipe;
#ifdef __MWERKS__ // TODO PC
if(_CheckFlag(FLAG_ID_MAKE(1, 11)) && boardTutorialF) {
return;
}
#endif
wipe = &wipeData;
if(wipe->stat) {
return;
@ -330,4 +332,7 @@ static void WipeFrameStill(GXColor color)
GXTexCoord2f32(0, 1);
GXEnd();
GXSetChanMatColor(GX_COLOR0A0, colorN);
#ifdef TARGET_PC
GXDestroyTexObj(&tex);
#endif
}

89
src/port/OS.c Normal file
View file

@ -0,0 +1,89 @@
#include <stdio.h>
#include <stdlib.h>
#include <dolphin.h>
#ifndef _WIN32
#include <sys/time.h>
#include <unistd.h>
#if __APPLE__
#include <mach/mach_time.h>
#endif
#endif
#ifdef _WIN32
#include <windows.h>
#endif
#if __APPLE__
static u64 MachToDolphinNum;
static u64 MachToDolphinDenom;
#elif _WIN32
static LARGE_INTEGER PerfFrequency;
#endif
// Credits: Super Monkey Ball
#define MEM_SIZE (64 * 1024 * 1024)
u8 LC_CACHE_BASE[4096];
static u64 GetGCTicks()
{
#if __APPLE__
return mach_absolute_time() * MachToDolphinNum / MachToDolphinDenom;
#elif __linux__ || __FreeBSD__
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp);
return u64((tp.tv_sec * 1000000000ull) + tp.tv_nsec) * GetGCTicksPerSec() / 1000000000ull;
#elif _WIN32
LARGE_INTEGER perf;
QueryPerformanceCounter(&perf);
perf.QuadPart *= OS_CORE_CLOCK;
perf.QuadPart /= PerfFrequency.QuadPart;
return perf.QuadPart;
#else
return 0;
#endif
}
void OSInit()
{
puts("OSInit is a stub");
u8 *arena = malloc(MEM_SIZE);
OSSetArenaLo(arena);
OSSetArenaHi(arena + MEM_SIZE);
#if __APPLE__
mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
MachToDolphinNum = OS_CORE_CLOCK * timebase.numer;
MachToDolphinDenom = 1000000000ull * timebase.denom;
#elif _WIN32
QueryPerformanceFrequency(&PerfFrequency);
#endif
}
OSTime OSGetTime(void)
{
return (OSTime)GetGCTicks();
}
OSTick OSGetTick(void)
{
return (OSTick)GetGCTicks();
}
u32 OSGetPhysicalMemSize(void)
{
puts("OSGetPhysicalMemSize is a stub");
return MEM_SIZE;
}
u32 OSGetConsoleSimulatedMemSize(void)
{
puts("OSGetSimulatedMemSize is a stub");
return MEM_SIZE;
}

41
src/port/ar.c Normal file
View file

@ -0,0 +1,41 @@
#include <stdio.h>
#include <string.h>
#include <dolphin.h>
u8 ARAM[16 * 1024 * 1024];
u32 ARInit(u32 *stack_index_addr, u32 num_entries)
{
puts("ARInit");
return 0x4000;
}
BOOL ARCheckInit()
{
return TRUE;
}
u32 ARGetSize()
{
// TODO
return 0x8000;
}
void ARStartDMA(u32 type, u32 mainmem_addr, u32 aram_addr, u32 length)
{
switch (type)
{
case ARAM_DIR_MRAM_TO_ARAM:
memcpy(ARAM + aram_addr, (void *)mainmem_addr, length);
break;
case ARAM_DIR_ARAM_TO_MRAM:
memcpy((void *)mainmem_addr, ARAM + aram_addr, length);
break;
}
}
u32 ARGetDMAStatus(void)
{
puts("ARGetDMAStatus");
return 0;
}

23
src/port/arq.c Normal file
View file

@ -0,0 +1,23 @@
#include <stdio.h>
#include <string.h>
#include <dolphin.h>
extern u8 ARAM[16 * 1024 * 1024];
void ARQPostRequest(ARQRequest *task, u32 owner, u32 type, u32 priority,
u32 source, u32 dest, u32 length, ARQCallback callback)
{
printf("ARQPostRequest: 0x%X, 0x%X, 0x%X\n",
(unsigned int)source, (unsigned int)dest, (unsigned int)length);
switch (type)
{
case ARQ_TYPE_MRAM_TO_ARAM:
memcpy(ARAM + dest, (void *)source, length);
callback((u32)task);
break;
case ARQ_TYPE_ARAM_TO_MRAM:
memcpy((void *)dest, ARAM + source, length);
callback((u32)task);
break;
}
}

678
src/port/audio.c Normal file
View file

@ -0,0 +1,678 @@
#include "game/audio.h"
#include "game/memory.h"
#include "game/msm.h"
#include "game/object.h"
#include "game/wipe.h"
#include "game/gamework_data.h"
static int HuSePlay(int seId, MSM_SEPARAM *param);
extern s16 omSysExitReq;
s32 charVoiceGroupStat[8];
static s32 sndFXBuf[64][2];
static s16 Hu3DAudVol;
static s16 sndGroupBak;
static s32 auxANoBak;
static s32 auxBNoBak;
static s8 HuAuxAVol;
static s8 HuAuxBVol;
float Snd3DBackSurDisOffset;
float Snd3DFrontSurDisOffset;
float Snd3DStartDisOffset;
float Snd3DSpeedOffset;
float Snd3DDistOffset;
s32 musicOffF;
u8 fadeStat;
static char *lbl_8012E9AC[] = {
"sound/MPNGC02.son",
"sound/MPNGC16.son",
""
};
void HuAudInit(void)
{
MSM_INIT msmInit;
MSM_ARAM msmAram;
s32 result;
s16 i;
msmInit.heap = HuMemDirectMalloc(HEAP_MUSIC, 0x13FC00);
msmInit.heapSize = 0x13FC00;
msmInit.msmPath = "/sound/mpgcsnd.msm";
msmInit.pdtPath = "/sound/mpgcstr.pdt";
msmInit.open = NULL;
msmInit.read = NULL;
msmInit.close = NULL;
msmAram.skipARInit = TRUE;
msmAram.aramEnd = 0x808000;
// result = msmSysInit(&msmInit, &msmAram);
// if (result < 0) {
// OSReport("MSM(Sound Manager) Error:Error Code %d\n", result);
// while (1);
// }
if (OSGetSoundMode() == OS_SOUND_MODE_MONO) {
// msmSysSetOutputMode(SND_OUTPUTMODE_MONO);
} else {
// msmSysSetOutputMode(SND_OUTPUTMODE_SURROUND);
}
for (i = 0; i < 64; i++) {
sndFXBuf[i][0] = -1;
}
for (i = 0; i < 8; i++) {
charVoiceGroupStat[i] = 0;
}
sndGroupBak = -1;
auxANoBak = auxBNoBak = -1;
fadeStat = 0;
musicOffF = 0;
}
s32 HuAudStreamPlay(char *name, BOOL flag) {
return 0;
}
void HuAudStreamVolSet(s16 vol) {
// AISetStreamVolLeft(vol);
// AISetStreamVolRight(vol);
Hu3DAudVol = vol;
}
void HuAudStreamPauseOn(void) {
// AISetStreamPlayState(0);
}
void HuAudStreamPauseOff(void) {
// AISetStreamPlayState(1);
}
void HuAudStreamFadeOut(s32 arg0) {
}
void HuAudAllStop(void) {
HuAudSeqAllStop();
HuAudFXAllStop();
HuAudSStreamAllStop();
}
void HuAudFadeOut(s32 speed) {
HuAudFXAllStop();
HuAudSeqAllFadeOut(speed);
HuAudSStreamAllFadeOut(speed);
}
int HuAudFXPlay(int seId)
{
return 5;
}
int HuAudFXPlayVol(int seId, s16 vol) {
if (omSysExitReq != 0) {
return 0;
}
return HuAudFXPlayVolPan(seId, vol, MSM_PAN_CENTER);
}
int HuAudFXPlayVolPan(int seId, s16 vol, s16 pan)
{
MSM_SEPARAM seParam;
if (omSysExitReq != 0) {
return 0;
}
seParam.flag = MSM_SEPARAM_VOL|MSM_SEPARAM_PAN;
seParam.vol = vol;
seParam.pan = pan;
return HuSePlay(seId, &seParam);
}
void HuAudFXStop(int seNo) {
// msmSeStop(seNo, 0);
}
void HuAudFXAllStop(void) {
// msmSeStopAll(0, 0);
}
void HuAudFXFadeOut(int seNo, s32 speed) {
// msmSeStop(seNo, speed);
}
void HuAudFXPanning(int seNo, s16 pan) {
MSM_SEPARAM seParam;
if (omSysExitReq == 0) {
seParam.flag = MSM_SEPARAM_PAN;
seParam.pan = pan;
// msmSeSetParam(seNo, &seParam);
}
}
void HuAudFXListnerSet(Vec *pos, Vec *heading, float sndDist, float sndSpeed)
{
if(omSysExitReq) {
return;
}
HuAudFXListnerSetEX(pos, heading,
sndDist + Snd3DDistOffset,
sndSpeed + Snd3DSpeedOffset,
Snd3DStartDisOffset,
Snd3DFrontSurDisOffset + (0.25 * sndDist + Snd3DStartDisOffset),
Snd3DBackSurDisOffset + (0.25 * sndDist + Snd3DStartDisOffset));
}
void HuAudFXListnerSetEX(Vec *pos, Vec *heading, float sndDist, float sndSpeed, float startDis, float frontSurDis, float backSurDis)
{
MSM_SELISTENER listener;
if(omSysExitReq) {
return;
}
listener.flag = MSM_LISTENER_STARTDIS|MSM_LISTENER_FRONTSURDIS|MSM_LISTENER_BACKSURDIS;
listener.startDis = startDis + Snd3DStartDisOffset;
listener.frontSurDis = frontSurDis + Snd3DFrontSurDisOffset;
listener.backSurDis = backSurDis + Snd3DBackSurDisOffset;
// msmSeSetListener(pos, heading, sndDist + Snd3DDistOffset, sndSpeed + Snd3DSpeedOffset, &listener);
OSReport("//////////////////////////////////\n");
OSReport("sndDist %f\n", sndDist);
OSReport("sndSpeed %f\n", sndSpeed);
OSReport("startDis %f\n", listener.startDis);
OSReport("frontSurDis %f\n", listener.frontSurDis);
OSReport("backSurDis %f\n", listener.backSurDis);
OSReport("//////////////////////////////////\n");
}
void HuAudFXListnerUpdate(Vec *pos, Vec *heading)
{
if (omSysExitReq == 0) {
// msmSeUpdataListener(pos, heading);
}
}
int HuAudFXEmiterPlay(int seId, Vec *pos)
{
MSM_SEPARAM seParam;
if(omSysExitReq) {
return 0;
}
seParam.flag = MSM_SEPARAM_POS;
seParam.pos.x = pos->x;
seParam.pos.y = pos->y;
seParam.pos.z = pos->z;
// return HuSePlay(seId, &seParam);
return 12;
}
void HuAudFXEmiterUpDate(int seNo, Vec *pos)
{
MSM_SEPARAM param;
if(omSysExitReq) {
return;
}
param.flag = MSM_SEPARAM_POS;
param.pos.x = pos->x;
param.pos.y = pos->y;
param.pos.z = pos->z;
// msmSeSetParam(seNo, &param);
}
void HuAudFXListnerKill(void) {
// msmSeDelListener();
}
void HuAudFXPauseAll(s32 pause) {
// msmSePauseAll(pause, 0x64);
return 12;
}
s32 HuAudFXStatusGet(int seNo) {
// return msmSeGetStatus(seNo);
return 12;
}
s32 HuAudFXPitchSet(int seNo, s16 pitch)
{
MSM_SEPARAM param;
if(omSysExitReq) {
return 0;
}
param.flag = MSM_SEPARAM_PITCH;
param.pitch = pitch;
// return msmSeSetParam(seNo, &param);
return 12;
}
s32 HuAudFXVolSet(int seNo, s16 vol)
{
MSM_SEPARAM param;
if(omSysExitReq) {
return 0;
}
param.flag = MSM_SEPARAM_VOL;
param.vol = vol;
// return msmSeSetParam(seNo, &param);
return 12;
}
s32 HuAudSeqPlay(s16 musId) {
s32 channel;
if (musicOffF != 0 || omSysExitReq != 0) {
return 0;
}
// channel = msmMusPlay(musId, NULL);
return channel;
}
void HuAudSeqStop(s32 musNo) {
if (musicOffF != 0 || omSysExitReq != 0) {
return;
}
// msmMusStop(musNo, 0);
}
void HuAudSeqFadeOut(s32 musNo, s32 speed) {
if (musicOffF == 0) {
// msmMusStop(musNo, speed);
}
}
void HuAudSeqAllFadeOut(s32 speed) {
s16 i;
for (i = 0; i < 4; i++) {
// if (msmMusGetStatus(i) == 2) {
// msmMusStop(i, speed);
// }
}
}
void HuAudSeqAllStop(void) {
// msmMusStopAll(0, 0);
}
void HuAudSeqPauseAll(s32 pause) {
// msmMusPauseAll(pause, 0x64);
}
void HuAudSeqPause(s32 musNo, s32 pause, s32 speed) {
if (musicOffF != 0 || omSysExitReq != 0) {
return;
}
// msmMusPause(musNo, pause, speed);
}
s32 HuAudSeqMidiCtrlGet(s32 musNo, s8 channel, s8 ctrl) {
if (musicOffF != 0 || omSysExitReq != 0) {
return 0;
}
// return msmMusGetMidiCtrl(musNo, channel, ctrl);
return 12;
}
s32 HuAudSStreamPlay(s16 streamId) {
MSM_STREAMPARAM param;
s32 result;
if (musicOffF != 0 || omSysExitReq != 0) {
return 0;
}
param.flag = MSM_STREAMPARAM_NONE ;
// result = msmStreamPlay(streamId, &param);
return result;
}
void HuAudSStreamStop(s32 seNo) {
if (musicOffF == 0) {
// msmStreamStop(seNo, 0);
}
}
void HuAudSStreamFadeOut(s32 seNo, s32 speed) {
if (musicOffF == 0) {
// msmStreamStop(seNo, speed);
}
}
void HuAudSStreamAllFadeOut(s32 speed) {
// msmStreamStopAll(speed);
}
void HuAudSStreamAllStop(void) {
// msmStreamStopAll(0);
}
s32 HuAudSStreamStatGet(s32 seNo) {
return 12;
// return msmStreamGetStatus(seNo);
}
SNDGRPTBL sndGrpTable[] = {
{ OVL_BOOT, -1, 0, 1, -1, -1 },
{ OVL_INST, -1, 0, 1, -1, -1 },
{ OVL_M401, 18, 0, 2, 64, 64 },
{ OVL_M402, 19, 0, 3, 48, 32 },
{ OVL_M403, 20, 0, 1, -1, -1 },
{ OVL_M404, 21, 0, 1, -1, -1 },
{ OVL_M405, 22, 0, 1, 64, 32 },
{ OVL_M406, 23, 0, 1, -1, -1 },
{ OVL_M407, 24, 0, 1, -1, -1 },
{ OVL_M408, 25, 0, 1, -1, -1 },
{ OVL_M409, 26, 0, 4, -1, -1 },
{ OVL_M410, 27, 0, 1, -1, -1 },
{ OVL_M411, 28, 0, 1, -1, -1 },
{ OVL_M412, 29, 0, 1, -1, -1 },
{ OVL_M413, 30, 0, 1, -1, -1 },
{ OVL_M414, 31, 0, 1, -1, -1 },
{ OVL_M415, 32, 0, 1, -1, -1 },
{ OVL_M416, 33, 0, 1, -1, -1 },
{ OVL_M417, 34, 0, 1, -1, -1 },
{ OVL_M418, 35, 0, 1, 64, 64 },
{ OVL_M419, 36, 0, 6, -1, -1 },
{ OVL_M420, 37, 0, 1, -1, -1 },
{ OVL_M421, 38, 0, 1, -1, -1 },
{ OVL_M422, 39, 0, 1, -1, -1 },
{ OVL_M423, 40, 0, 1, -1, -1 },
{ OVL_M424, 41, 0, 1, -1, -1 },
{ OVL_M425, 42, 0, 1, -1, -1 },
{ OVL_M426, 43, 0, 1, -1, -1 },
{ OVL_M427, 44, 0, 1, 64, 72 },
{ OVL_M428, 45, 0, 1, -1, -1 },
{ OVL_M429, 46, 0, 1, -1, -1 },
{ OVL_M430, 47, 0, 1, -1, -1 },
{ OVL_M431, 48, 0, 1, -1, -1 },
{ OVL_M432, 49, 0, 1, 48, 32 },
{ OVL_M433, 50, 0, 1, -1, -1 },
{ OVL_M434, 51, 0, 1, -1, -1 },
{ OVL_M435, 52, 0, 9, 32, 64 },
{ OVL_M436, 53, 0, 10, 32, 64 },
{ OVL_M437, 54, 0, 1, 32, 64 },
{ OVL_M438, 55, 0, 11, -1, -1 },
{ OVL_M439, 56, 0, 12, 48, 32 },
{ OVL_M440, 57, 0, 1, -1, -1 },
{ OVL_M441, 58, 0, 1, -1, -1 },
{ OVL_M442, 59, 0, 1, -1, -1 },
{ OVL_M443, 60, 0, 1, -1, -1 },
{ OVL_M444, 61, 0, 1, -1, -1 },
{ OVL_M445, 62, 0, 1, -1, -1 },
{ OVL_M446, 63, 0, 1, -1, -1 },
{ OVL_M447, 64, 0, 1, -1, -1 },
{ OVL_M448, 65, 0, 1, -1, -1 },
{ OVL_M449, 66, 0, 1, -1, -1 },
{ OVL_M450, 67, 0, 13, 64, 64 },
{ OVL_M451, 68, 0, 1, -1, -1 },
{ OVL_M453, 69, 0, 1, -1, -1 },
{ OVL_M455, 70, 0, 1, -1, -1 },
{ OVL_M456, 71, 0, 1, -1, -1 },
{ OVL_M457, 72, 0, 14, 64, 32 },
{ OVL_M458, 73, 0, 15, 64, 32 },
{ OVL_M459, 74, 0, 1, -1, -1 },
{ OVL_M460, 75, 0, 1, -1, -1 },
{ OVL_M461, 76, 0, 1, -1, -1 },
{ OVL_M462, 77, 0, 1, -1, -1 },
{ OVL_M463, 78, 0, 1, -1, -1 },
{ OVL_MENT, -1, 0, 1, -1, -1 },
{ OVL_MGMODE, 1, 0, 1, -1, -1 },
{ OVL_MODESEL, 0, 0, 1, -1, -1 },
{ OVL_MODELTEST, 18, 0, 1, -1, -1 },
{ OVL_MSETUP, 0, 0, 1, -1, -1 },
{ OVL_MSTORY, 5, 0, 1, -1, -1 },
{ OVL_MSTORY2, 5, 0, 1, -1, -1 },
{ OVL_MSTORY3, 8, 0, 1, -1, -1 },
{ OVL_NIS, 9, 0, 1, -1, -1 },
{ OVL_OPTION, -1, 0, 1, -1, -1 },
{ OVL_PRESENT, -1, 0, 1, -1, -1 },
{ OVL_RESULT, -1, 0, 1, -1, -1 },
{ OVL_SAF, 0, 0, 2, 127, 127 },
{ OVL_SELMENU, 0, 0, 1, -1, -1 },
{ OVL_W01, 9, 0, 1, -1, -1 },
{ OVL_W02, 10, 0, 1, -1, -1 },
{ OVL_W03, 11, 0, 1, -1, -1 },
{ OVL_W04, 12, 0, 1, -1, -1 },
{ OVL_W05, 13, 0, 1, -1, -1 },
{ OVL_W06, 14, 0, 1, -1, -1 },
{ OVL_W10, 15, 0, 1, -1, -1 },
{ OVL_W20, 16, 0, 1, -1, -1 },
{ OVL_W21, 17, 0, 1, -1, -1 },
{ OVL_MPEX, 4, 0, 1, -1, -1 },
{ OVL_ZTAR, -1, 0, 1, -1, -1 },
{ OVL_E3SETUP, 0, 0, 1, -1, -1 },
{ OVL_STAFF, -1, 0, 1, -1, -1 },
{ OVL_INVALID, -1, 0, 1, 0, 0 }
};
void HuAudDllSndGrpSet(u16 ovl) {
SNDGRPTBL *sndGrp;
s16 grpSet;
sndGrp = sndGrpTable;
while (1) {
if (sndGrp->ovl == ovl) {
grpSet = sndGrp->grpSet;
break;
}
if (sndGrp->ovl == OVL_INVALID) {
grpSet = 0x12;
break;
}
sndGrp++;
}
if (grpSet != -1) {
OSReport("SOUND ##########################\n");
HuAudSndGrpSetSet(grpSet);
if (sndGrp->auxANo != auxANoBak || sndGrp->auxBNo != auxBNoBak) {
// msmSysSetAux(sndGrp->auxANo, sndGrp->auxBNo);
OSReport("Change AUX %d,%d\n", sndGrp->auxANo, sndGrp->auxBNo);
auxANoBak = sndGrp->auxANo;
auxBNoBak = sndGrp->auxBNo;
HuPrcVSleep();
}
HuAudAUXVolSet(sndGrp->auxAVol, sndGrp->auxBVol);
OSReport("##########################\n");
}
}
void HuAudSndGrpSetSet(s16 dataSize) {
}
void HuAudSndGrpSet(s16 grpId) {
void *buf;
// buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(grpId));
// msmSysLoadGroup(grpId, buf, 0);
HuMemDirectFree(buf);
}
void HuAudSndCommonGrpSet(s16 grpId, s32 groupCheck) {
s16 err;
OSTick osTick;
void *buf;
s16 i;
for (i = 0; i < 8; i++) {
charVoiceGroupStat[i] = 0;
}
// msmMusStopAll(1, 0);
// msmSeStopAll(1, 0);
osTick = OSGetTick();
// while ((msmMusGetNumPlay(1) != 0 || msmSeGetNumPlay(1) != 0)
// && OSTicksToMilliseconds(OSGetTick() - osTick) < 500);
OSReport("CommonGrpSet %d\n", grpId);
if (groupCheck != 0) {
// err = msmSysDelGroupBase(0);
if (err < 0) {
OSReport("Del Group Error %d\n", err);
}
}
// buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(grpId));
// msmSysLoadGroupBase(grpId, buf);
// HuMemDirectFree(buf);
sndGroupBak = -1;
}
void HuAudAUXSet(s32 auxA, s32 auxB) {
if (auxA == -1) {
auxA = 0;
}
if (auxB == -1) {
auxB = 1;
}
// msmSysSetAux(auxA, auxB);
}
void HuAudAUXVolSet(s8 auxA, s8 auxB) {
HuAuxAVol = auxA;
HuAuxBVol = auxB;
}
void HuAudVoiceInit(s16 ovl) {
SNDGRPTBL *sndGrp;
OSTick osTick;
s16 numNotChars;
s16 grpId;
s16 temp_r25;
s16 character;
void *buf;
s16 i;
if (ovl != OVL_INVALID) {
sndGrp = sndGrpTable;
while (1) {
if (sndGrp->ovl == ovl && sndGrp->grpSet == -1) {
return;
}
if (sndGrp->ovl == OVL_INVALID) {
break;
}
sndGrp++;
}
}
for (i = numNotChars = 0; i < 4; i++) {
character = GWPlayerCfg[i].character;
if (character < 0 || character >= 8 || character == 0xFF || charVoiceGroupStat[character] != 0) {
numNotChars++;
}
}
if (numNotChars < 4) {
for (i = 0; i < 8; i++) {
charVoiceGroupStat[i] = 0;
}
// msmMusStopAll(1, 0);
// msmSeStopAll(1, 0);
osTick = OSGetTick();
// while ((msmMusGetNumPlay(1) != 0 || msmSeGetNumPlay(1) != 0)
// && OSTicksToMilliseconds(OSGetTick() - osTick) < 500);
OSReport("############CharGrpSet\n");
// temp_r25 = msmSysDelGroupBase(0);
if (temp_r25 < 0) {
OSReport("Del Group Error %d\n", temp_r25);
} else {
OSReport("Del Group OK\n");
}
for (i = 0; i < 4; i++) {
character = GWPlayerCfg[i].character;
if (character >= 0 && character < 8 && character != 0xFF) {
charVoiceGroupStat[character] = 1;
grpId = character + 10;
// buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(grpId));
#if VERSION_NTSC
// msmSysLoadGroupBase(grpId, buf);
#else
temp_r25 = msmSysLoadGroupBase(grpId, buf);
#endif
// HuMemDirectFree(buf);
}
}
sndGroupBak = -1;
}
}
s32 HuAudPlayerVoicePlay(s16 player, s16 seId) {
s16 charNo = GWPlayerCfg[player].character;
return HuAudCharVoicePlay(charNo, seId);
}
s32 HuAudPlayerVoicePlayPos(s16 player, s16 seId, Vec *pos) {
s16 charNo = GWPlayerCfg[player].character;
return HuAudCharVoicePlayPos(charNo, seId, pos);
}
void HuAudPlayerVoicePlayEntry(s16 player, s16 seId) {
s16 charNo = GWPlayerCfg[player].character;
HuAudCharVoicePlayEntry(charNo, seId);
}
s32 HuAudCharVoicePlay(s16 charNo, s16 seId)
{
MSM_SEPARAM param;
// if (omSysExitReq != 0) {
// return 0;
// }
// seId += (charNo << 6);
// param.flag = MSM_SEPARAM_NONE;
// if (HuAuxAVol != -1) {
// param.flag |= MSM_SEPARAM_AUXVOLA;
// }
// if (HuAuxBVol != -1) {
// param.flag |= MSM_SEPARAM_AUXVOLB;
// }
// param.auxAVol = HuAuxAVol;
// param.auxBVol = HuAuxBVol;
return HuSePlay(seId, &param);
}
s32 HuAudCharVoicePlayPos(s16 charNo, s16 seId, Vec *pos) {
MSM_SEPARAM param;
// if (omSysExitReq != 0) {
// return 0;
// }
// seId += (charNo << 6);
// param.flag = MSM_SEPARAM_POS;
// if (HuAuxAVol != -1) {
// param.flag |= MSM_SEPARAM_AUXVOLA;
// }
// if (HuAuxBVol != -1) {
// param.flag |= MSM_SEPARAM_AUXVOLB;
// }
// param.auxAVol = HuAuxAVol;
// param.auxBVol = HuAuxBVol;
// param.pos.x = pos->x;
// param.pos.y = pos->y;
// param.pos.z = pos->z;
return HuSePlay(seId, &param);
}
void HuAudCharVoicePlayEntry(s16 charNo, s16 seId) {
// int seNoTbl[MSM_ENTRY_SENO_MAX]; // size unknown (min: 30, max: 33)
// u16 id;
// u16 i;
// seId += (charNo << 6);
// id = msmSeGetEntryID(seId, seNoTbl);
// for (i = 0; i < id; i++) {
// msmSeStop(seNoTbl[i], 0);
// }
}
static int HuSePlay(int seId, MSM_SEPARAM *param)
{
s32 result;
// result = msmSePlay(seId, param);
// if (result < 0) {
// OSReport("#########SE Entry Error<SE %d:ErrorNo %d>\n", seId, result);
// }
return 12;
// return result;
}

401
src/port/byteswap.cpp Normal file
View file

@ -0,0 +1,401 @@
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <dolphin.h>
#include <ext_math.h>
#include <unordered_set>
extern "C"
{
#include "port/byteswap.h"
typedef struct AnimData32b {
s16 bankNum;
s16 patNum;
s16 bmpNum;
s16 useNum;
u32 bank;
u32 pat;
u32 bmp;
} AnimData32b;
typedef struct AnimBankData32b {
s16 timeNum;
s16 unk;
u32 frame;
} AnimBankData32b;
typedef struct AnimPatData32b {
s16 layerNum;
s16 centerX;
s16 centerY;
s16 sizeX;
s16 sizeY;
u32 layer;
} AnimPatData32b;
typedef struct AnimBmpData32b {
u8 pixSize;
u8 dataFmt;
s16 palNum;
s16 sizeX;
s16 sizeY;
u32 dataSize;
u32 palData;
u32 data;
} AnimBmpData32b;
}
template <typename T> [[nodiscard]] constexpr T bswap16(T val) noexcept
{
static_assert(sizeof(T) == sizeof(u16));
union {
u16 u;
T t;
} v{.t = val};
#if __GNUC__
v.u = __builtin_bswap16(v.u);
#elif _WIN32
v.u = _byteswap_ushort(v.u);
#else
v.u = (v.u << 8) | ((v.u >> 8) & 0xFF);
#endif
return v.t;
}
template <typename T> [[nodiscard]] constexpr T bswap32(T val) noexcept
{
static_assert(sizeof(T) == sizeof(u32));
union {
u32 u;
T t;
} v{.t = val};
#if __GNUC__
v.u = __builtin_bswap32(v.u);
#elif _WIN32
v.u = _byteswap_ulong(v.u);
#else
v.u = ((v.u & 0x0000FFFF) << 16) | ((v.u & 0xFFFF0000) >> 16) | ((v.u & 0x00FF00FF) << 8) |
((v.u & 0xFF00FF00) >> 8);
#endif
return v.t;
}
static void bswap16_unaligned(u8 *ptr)
{
u8 temp = ptr[0];
ptr[0] = ptr[1];
ptr[1] = temp;
}
static void bswap32_unaligned(u8 *ptr)
{
u8 temp = ptr[0];
ptr[0] = ptr[3];
ptr[3] = temp;
temp = ptr[1];
ptr[1] = ptr[2];
ptr[2] = temp;
}
static std::unordered_set<void *> sVisitedPtrs;
template <typename B, typename T> T *offset_ptr(B &base, T *ptr)
{
return reinterpret_cast<T *>(reinterpret_cast<uintptr_t>(&base) +
reinterpret_cast<uintptr_t>(ptr));
}
template <typename B, typename T> T *offset_ptr(B &base, T *ptr, void *extra)
{
return reinterpret_cast<T *>(reinterpret_cast<uintptr_t>(&base) +
reinterpret_cast<uintptr_t>(ptr) +
reinterpret_cast<uintptr_t>(extra));
}
template <typename B, typename T> static inline void bswap(B &base, T &data);
template <typename B, typename P> void bswap(B &base, P *&ptr)
{
ptr = bswap32(ptr);
}
template <typename B, typename T> void bswap(B &base, T *&ptr, s32 count)
{
ptr = bswap32(ptr);
if (ptr == nullptr)
{
return;
}
T *objBase = offset_ptr(base, ptr);
for (s32 i = 0; i < count; ++i)
{
if (sVisitedPtrs.contains(objBase))
{
continue;
}
sVisitedPtrs.insert(objBase);
bswap(base, *objBase);
++objBase;
}
}
template <typename B, typename T> void bswap_list(B &base, T **&ptr)
{
ptr = bswap32(ptr);
if (ptr == nullptr)
{
return;
}
T **objBase = offset_ptr(base, ptr);
while (*objBase != nullptr)
{
bswap(base, *objBase, 1);
++objBase;
}
}
template <typename B, typename T> void bswap_list(B &base, T *(&ptr)[])
{
T **objBase = ptr;
while (*objBase != nullptr)
{
bswap(base, *objBase, 1);
++objBase;
}
}
template <typename B, typename T> void bswap_flat(B &base, T *start, s32 count)
{
T *objBase = start;
for (s32 i = 0; i < count; ++i)
{
bswap(base, objBase[i]);
}
}
template <typename B> void bswap(B &base, f32 &v)
{
v = bswap32(v);
}
template <typename B> void bswap(B &base, s32 &v)
{
v = bswap32(v);
}
template <typename B> void bswap(B &base, u32 &v)
{
v = bswap32(v);
}
template <typename B> void bswap(B &base, s16 &v)
{
v = bswap16(v);
}
template <typename B> void bswap(B &base, u16 &v)
{
v = bswap16(v);
}
template <typename B> void bswap(B &base, u8 &v)
{
// no-op
}
template <typename B> void bswap(B &base, s8 &v)
{
// no-op
}
template <typename B> void bswap(B &base, char &v)
{
// no-op
}
template <typename B> void bswap(B &base, Vec &vec)
{
bswap(base, vec.x);
bswap(base, vec.y);
bswap(base, vec.z);
}
template <typename B> void bswap(B &base, S16Vec &vec)
{
bswap(base, vec.x);
bswap(base, vec.y);
bswap(base, vec.z);
}
template <typename B> void bswap(B &base, Vec2f &vec)
{
bswap(base, vec.x);
bswap(base, vec.y);
}
template <typename B> void bswap(B &base, AnimData32b &obj, AnimData &dest)
{
bswap(base, obj.bankNum);
bswap(base, obj.patNum);
bswap(base, obj.bmpNum);
bswap(base, obj.useNum);
bswap(base, obj.bank);
bswap(base, obj.pat);
bswap(base, obj.bmp);
dest.bankNum = obj.bankNum;
dest.patNum = obj.patNum;
dest.bmpNum = obj.bmpNum;
dest.useNum = obj.useNum;
dest.bank = reinterpret_cast<AnimBankData *>(obj.bank);
dest.pat = reinterpret_cast<AnimPatData *>(obj.pat);
dest.bmp = reinterpret_cast<AnimBmpData *>(obj.bmp);
}
template <typename B> void bswap(B &base, AnimBankData32b &obj, AnimBankData &dest)
{
bswap(base, obj.timeNum);
bswap(base, obj.unk);
bswap(base, obj.frame);
dest.timeNum = obj.timeNum;
dest.unk = obj.unk;
dest.frame = reinterpret_cast<AnimFrameData *>(obj.frame);
}
template <typename B> void bswap(B &base, AnimPatData32b &obj, AnimPatData &dest)
{
bswap(base, obj.layerNum);
bswap(base, obj.centerX);
bswap(base, obj.centerY);
bswap(base, obj.sizeX);
bswap(base, obj.sizeY);
bswap(base, obj.layer);
dest.layerNum = obj.layerNum;
dest.centerX = obj.centerX;
dest.centerY = obj.centerY;
dest.sizeX = obj.sizeX;
dest.sizeY = obj.sizeY;
dest.layer = reinterpret_cast<AnimLayerData *>(obj.layer);
}
template <typename B> void bswap(B &base, AnimBmpData32b &obj, AnimBmpData &dest)
{
bswap(base, obj.pixSize);
bswap(base, obj.dataFmt);
bswap(base, obj.palNum);
bswap(base, obj.sizeX);
bswap(base, obj.sizeY);
bswap(base, obj.dataSize);
bswap(base, obj.palData);
bswap(base, obj.data);
dest.pixSize = obj.pixSize;
dest.dataFmt = obj.dataFmt;
dest.palNum = obj.palNum;
dest.sizeX = obj.sizeX;
dest.sizeY = obj.sizeY;
dest.dataSize = obj.dataSize;
dest.palData = reinterpret_cast<void *>(obj.palData);
dest.data = reinterpret_cast<void *>(obj.data);
}
template <typename B> void bswap(B &base, AnimFrameData &obj)
{
bswap(base, obj.pat);
bswap(base, obj.time);
bswap(base, obj.shiftX);
bswap(base, obj.shiftY);
bswap(base, obj.flip);
bswap(base, obj.pad);
}
template <typename B> void bswap(B &base, AnimLayerData &obj)
{
bswap(base, obj.alpha);
bswap(base, obj.flip);
bswap(base, obj.bmpNo);
bswap(base, obj.startX);
bswap(base, obj.startY);
bswap(base, obj.sizeX);
bswap(base, obj.sizeY);
bswap(base, obj.shiftX);
bswap(base, obj.shiftY);
bswap_flat(base, obj.vtx, sizeof(obj.vtx) / sizeof(s16));
}
template <typename B> void bswap(B &base, HsfSection &obj)
{
bswap(base, obj.ofs);
bswap(base, obj.count);
}
template <typename B> void bswap(B &base, HsfHeader &obj)
{
bswap(base, obj.scene);
bswap(base, obj.color);
bswap(base, obj.material);
bswap(base, obj.attribute);
bswap(base, obj.vertex);
bswap(base, obj.normal);
bswap(base, obj.st);
bswap(base, obj.face);
bswap(base, obj.object);
bswap(base, obj.bitmap);
bswap(base, obj.palette);
bswap(base, obj.motion);
bswap(base, obj.cenv);
bswap(base, obj.skeleton);
bswap(base, obj.part);
bswap(base, obj.cluster);
bswap(base, obj.shape);
bswap(base, obj.mapAttr);
bswap(base, obj.matrix);
bswap(base, obj.symbol);
bswap(base, obj.string);
}
void byteswap_u32(u32 *src)
{
bswap(*src, *src);
sVisitedPtrs.clear();
}
void byteswap_s32(s32 *src)
{
bswap(*src, *src);
sVisitedPtrs.clear();
}
void byteswap_animdata(void *src, AnimData *dest)
{
auto *anim = reinterpret_cast<AnimData32b *>(src);
bswap(*anim, *anim, *dest);
sVisitedPtrs.clear();
}
void byteswap_animbankdata(void *src, AnimBankData *dest)
{
auto *bank = reinterpret_cast<AnimBankData32b *>(src);
bswap(*bank, *bank, *dest);
sVisitedPtrs.clear();
}
void byteswap_animpatdata(void *src, AnimPatData *dest)
{
auto *pat = reinterpret_cast<AnimPatData32b *>(src);
bswap(*pat, *pat, *dest);
sVisitedPtrs.clear();
}
void byteswap_animbmpdata(void *src, AnimBmpData *dest)
{
auto *bmp = reinterpret_cast<AnimBmpData32b *>(src);
bswap(*bmp, *bmp, *dest);
sVisitedPtrs.clear();
}
void byteswap_animframedata(AnimFrameData *src)
{
bswap(*src, *src);
sVisitedPtrs.clear();
}
void byteswap_animlayerdata(AnimLayerData *src)
{
bswap(*src, *src);
sVisitedPtrs.clear();
}
void byteswap_hsfheader(HsfHeader *src)
{
bswap(*src, *src);
sVisitedPtrs.clear();
}

168
src/port/dvd.c Normal file
View file

@ -0,0 +1,168 @@
// Credits: Super Monkey Ball
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <direct.h>
#include <windows.h>
#else
#include <unistd.h>
#endif
#include <dolphin.h>
#ifndef PATH_MAX
#define PATH_MAX 256
#endif
static char (*s_pathEntries)[PATH_MAX] = NULL;
static int s_pathEntriesCount = 0;
static char s_rootDir[PATH_MAX];
void DVDInit(void)
{
chdir("GMPE01_00/files");
if (getcwd(s_rootDir, sizeof(s_rootDir)) == NULL)
exit(1);
}
BOOL DVDChangeDir(char *dir)
{
printf("DVDChangeDir: %s\n", dir);
if (dir[0] == '/') {
char path[PATH_MAX];
if (snprintf(path, sizeof(path), "%s/%s", s_rootDir, dir) >= PATH_MAX)
return FALSE;
return chdir(path) == 0;
}
else
return chdir(dir) == 0;
}
s32 DVDConvertPathToEntrynum(char *pathPtr)
{
int i;
FILE *f;
char absolute[PATH_MAX];
printf("DVDConvertPathToEntrynum: %s\n", pathPtr);
#ifdef _WIN32
if (GetFullPathNameA(pathPtr, sizeof(absolute), absolute, NULL) == 0)
return -1;
#else
if (realpath(pathPtr, absolute) == NULL)
return -1;
#endif
for (i = 0; i < s_pathEntriesCount; i++) {
if (strcmp(absolute, s_pathEntries[i]) == 0)
return i;
}
if (strlen(absolute) + 1 > PATH_MAX)
return -1;
// check if file exists
f = fopen(absolute, "rb");
if (f == NULL)
return -1;
fclose(f);
// add new entry
printf("size = %i\n", sizeof(*s_pathEntries));
s_pathEntries = realloc(s_pathEntries, (s_pathEntriesCount + 1) * sizeof(*s_pathEntries));
strcpy(s_pathEntries[s_pathEntriesCount], absolute);
return s_pathEntriesCount++;
}
BOOL DVDOpen(char *fileName, DVDFileInfo *fileInfo)
{
FILE *f;
printf("DVDOpen: %s\n", fileName);
f = fopen(fileName, "rb");
if (f == NULL) {
puts("open failed\n");
return FALSE;
}
fileInfo->cb.addr = f;
fseek(f, 0, SEEK_END);
fileInfo->length = ftell(f);
return TRUE;
}
BOOL DVDFastOpen(s32 entrynum, DVDFileInfo *fileInfo)
{
printf("DVDFastOpen: %li\n", entrynum);
if (entrynum < s_pathEntriesCount)
return DVDOpen(s_pathEntries[entrynum], fileInfo);
return FALSE;
}
BOOL DVDClose(DVDFileInfo *fileInfo)
{
FILE *f = fileInfo->cb.addr;
if (f != NULL)
fclose(f);
fileInfo->cb.addr = NULL;
return TRUE;
}
BOOL DVDReadPrio(DVDFileInfo *fileInfo, void *addr, s32 length, s32 offset, s32 prio)
{
FILE *f = fileInfo->cb.addr;
BOOL success;
printf("DVDReadPrio: length %li, offset %li\n", length, offset);
fseek(f, offset, SEEK_SET);
success = (fread(addr, length, 1, f) == 1) || feof(f);
if (!success)
puts("read failed");
return TRUE;
}
BOOL DVDReadAsyncPrio(DVDFileInfo *fileInfo, void *addr, s32 length, s32 offset, DVDCallback callback, s32 prio)
{
FILE *f = fileInfo->cb.addr;
BOOL success;
printf("DVDReadAsyncPrio: length %li, offset %li\n", length, offset);
fseek(f, offset, SEEK_SET);
success = (fread(addr, length, 1, f) == 1) || feof(f);
if (!success)
puts("read failed");
callback(success ? 0 : -1, fileInfo);
return TRUE;
}
BOOL DVDOpenDir(char *dirName, DVDDir *dir)
{
puts("DVDOpenDir is a stub");
return FALSE;
}
BOOL DVDCloseDir(DVDDir *dir)
{
puts("DVDCloseDir is a stub");
return FALSE;
}
BOOL DVDReadDir(DVDDir *dir, DVDDirEntry *dirent)
{
puts("DVDReadDir is a stub");
return FALSE;
}
s32 DVDGetDriveStatus(void)
{
// puts("DVDGetDriveStatus is a stub");
return 0;
}
s32 DVDGetCommandBlockStatus(const DVDCommandBlock *block)
{
// TODO
return 0;
}

268
src/port/imgui.cpp Normal file
View file

@ -0,0 +1,268 @@
#include "port/imgui.h"
#include <array>
#include <atomic>
#include <chrono>
#include <cmath>
#include <fmt/format.h>
#include <imgui.h>
#include <numeric>
#include <thread>
#if _WIN32
#include "Windows.h"
#endif
static bool m_frameRate = true;
static bool m_pipelineInfo = true;
static bool m_graphicsBackend = true;
static int m_debugOverlayCorner = 0; // top-left
using namespace std::string_literals;
using namespace std::string_view_literals;
namespace aurora::gfx
{
extern std::atomic_uint32_t queuedPipelines;
extern std::atomic_uint32_t createdPipelines;
extern size_t g_drawCallCount;
extern size_t g_mergedDrawCallCount;
extern size_t g_lastVertSize;
extern size_t g_lastUniformSize;
extern size_t g_lastIndexSize;
extern size_t g_lastStorageSize;
} // namespace aurora::gfx
static void SetOverlayWindowLocation(int corner)
{
const ImGuiViewport *viewport = ImGui::GetMainViewport();
ImVec2 workPos = viewport->WorkPos; // Use work area to avoid menu-bar/task-bar, if any!
ImVec2 workSize = viewport->WorkSize;
ImVec2 windowPos;
ImVec2 windowPosPivot;
constexpr float padding = 10.0f;
windowPos.x = (corner & 1) != 0 ? (workPos.x + workSize.x - padding) : (workPos.x + padding);
windowPos.y = (corner & 2) != 0 ? (workPos.y + workSize.y - padding) : (workPos.y + padding);
windowPosPivot.x = (corner & 1) != 0 ? 1.0f : 0.0f;
windowPosPivot.y = (corner & 2) != 0 ? 1.0f : 0.0f;
ImGui::SetNextWindowPos(windowPos, ImGuiCond_Always, windowPosPivot);
}
static void ImGuiStringViewText(std::string_view text)
{
// begin()/end() do not work on MSVC
ImGui::TextUnformatted(text.data(), text.data() + text.size());
}
static std::string BytesToString(size_t bytes)
{
constexpr std::array suffixes{"B"sv, "KB"sv, "MB"sv, "GB"sv, "TB"sv, "PB"sv, "EB"sv};
uint32_t s = 0;
auto count = static_cast<double>(bytes);
while (count >= 1024.0 && s < 7)
{
s++;
count /= 1024.0;
}
if (count - floor(count) == 0.0)
{
return fmt::format(FMT_STRING("{}{}"), static_cast<size_t>(count), suffixes[s]);
}
return fmt::format(FMT_STRING("{:.1f}{}"), count, suffixes[s]);
}
void imgui_main(const AuroraInfo *info)
{
ImGuiIO &io = ImGui::GetIO();
ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoDecoration |
ImGuiWindowFlags_AlwaysAutoResize |
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav;
if (m_debugOverlayCorner != -1)
{
SetOverlayWindowLocation(m_debugOverlayCorner);
windowFlags |= ImGuiWindowFlags_NoMove;
}
ImGui::SetNextWindowBgAlpha(0.65f);
if (ImGui::Begin("Debug Overlay", nullptr, windowFlags))
{
bool hasPrevious = false;
if (m_frameRate)
{
if (hasPrevious)
{
ImGui::Separator();
}
hasPrevious = true;
ImGuiStringViewText(fmt::format(FMT_STRING("FPS: {:.1f}\n"), io.Framerate));
}
if (m_graphicsBackend)
{
if (hasPrevious)
{
ImGui::Separator();
}
hasPrevious = true;
std::string_view backendString = "Unknown"sv;
switch (info->backend)
{
case BACKEND_D3D12:
backendString = "D3D12"sv;
break;
case BACKEND_METAL:
backendString = "Metal"sv;
break;
case BACKEND_VULKAN:
backendString = "Vulkan"sv;
break;
case BACKEND_OPENGL:
backendString = "OpenGL"sv;
break;
case BACKEND_OPENGLES:
backendString = "OpenGL ES"sv;
break;
case BACKEND_WEBGPU:
backendString = "WebGPU"sv;
break;
case BACKEND_NULL:
backendString = "Null"sv;
break;
}
ImGuiStringViewText(fmt::format(FMT_STRING("Backend: {}\n"), backendString));
}
if (m_pipelineInfo)
{
if (hasPrevious)
{
ImGui::Separator();
}
hasPrevious = true;
ImGuiStringViewText(
fmt::format(FMT_STRING("Queued pipelines: {}\n"), aurora::gfx::queuedPipelines.load()));
ImGuiStringViewText(
fmt::format(FMT_STRING("Done pipelines: {}\n"), aurora::gfx::createdPipelines.load()));
ImGuiStringViewText(
fmt::format(FMT_STRING("Draw call count: {}\n"), aurora::gfx::g_drawCallCount));
ImGuiStringViewText(fmt::format(FMT_STRING("Merged draw calls: {}\n"),
aurora::gfx::g_mergedDrawCallCount));
ImGuiStringViewText(fmt::format(FMT_STRING("Vertex size: {}\n"),
BytesToString(aurora::gfx::g_lastVertSize)));
ImGuiStringViewText(fmt::format(FMT_STRING("Uniform size: {}\n"),
BytesToString(aurora::gfx::g_lastUniformSize)));
ImGuiStringViewText(fmt::format(FMT_STRING("Index size: {}\n"),
BytesToString(aurora::gfx::g_lastIndexSize)));
ImGuiStringViewText(fmt::format(FMT_STRING("Storage size: {}\n"),
BytesToString(aurora::gfx::g_lastStorageSize)));
ImGuiStringViewText(fmt::format(
FMT_STRING("Total: {}\n"),
BytesToString(aurora::gfx::g_lastVertSize + aurora::gfx::g_lastUniformSize +
aurora::gfx::g_lastIndexSize + aurora::gfx::g_lastStorageSize)));
}
}
ImGui::End();
}
class Limiter
{
using delta_clock = std::chrono::high_resolution_clock;
using duration_t = std::chrono::nanoseconds;
public:
void Reset()
{
m_oldTime = delta_clock::now();
}
void Sleep(duration_t targetFrameTime)
{
if (targetFrameTime.count() == 0)
{
return;
}
auto start = delta_clock::now();
duration_t adjustedSleepTime = SleepTime(targetFrameTime);
if (adjustedSleepTime.count() > 0)
{
NanoSleep(adjustedSleepTime);
duration_t overslept = TimeSince(start) - adjustedSleepTime;
if (overslept < duration_t{targetFrameTime})
{
m_overheadTimes[m_overheadTimeIdx] = overslept;
m_overheadTimeIdx = (m_overheadTimeIdx + 1) % m_overheadTimes.size();
}
}
Reset();
}
duration_t SleepTime(duration_t targetFrameTime)
{
const auto sleepTime = duration_t{targetFrameTime} - TimeSince(m_oldTime);
m_overhead = std::accumulate(m_overheadTimes.begin(), m_overheadTimes.end(), duration_t{}) /
m_overheadTimes.size();
if (sleepTime > m_overhead)
{
return sleepTime - m_overhead;
}
return duration_t{0};
}
private:
delta_clock::time_point m_oldTime;
std::array<duration_t, 4> m_overheadTimes{};
size_t m_overheadTimeIdx = 0;
duration_t m_overhead = duration_t{0};
duration_t TimeSince(delta_clock::time_point start)
{
return std::chrono::duration_cast<duration_t>(delta_clock::now() - start);
}
#if _WIN32
bool m_initialized;
double m_countPerNs;
void NanoSleep(const duration_t duration)
{
if (!m_initialized)
{
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
m_countPerNs = static_cast<double>(freq.QuadPart) / 1000000000.0;
m_initialized = true;
}
DWORD ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
auto tickCount =
static_cast<LONGLONG>(static_cast<double>(duration.count()) * m_countPerNs);
LARGE_INTEGER count;
QueryPerformanceCounter(&count);
if (ms > 10)
{
// Adjust for Sleep overhead
::Sleep(ms - 10);
}
auto end = count.QuadPart + tickCount;
do
{
QueryPerformanceCounter(&count);
} while (count.QuadPart < end);
}
#else
void NanoSleep(const duration_t duration)
{
std::this_thread::sleep_for(duration);
}
#endif
};
static Limiter g_frameLimiter;
void frame_limiter()
{
g_frameLimiter.Sleep(
std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::seconds{1}) / 60);
}

7
src/port/portmain.c Normal file
View file

@ -0,0 +1,7 @@
int game_main(int argc, char *argv[]);
int main(int argc, char *argv[])
{
game_main(argc, argv);
}

662
src/port/stubs.c Normal file
View file

@ -0,0 +1,662 @@
#include "dolphin/gx/GXVert.h"
#include <dolphin.h>
#include <stdarg.h>
#include <stdio.h>
#include <types.h>
#include <game/dvd.h>
#include <game/object.h>
// Credits: Super Monkey Ball
static VIRetraceCallback sVIRetraceCallback = NULL;
void OSReport(const char *msg, ...)
{
va_list args;
va_start(args, msg);
vprintf(msg, args);
va_end(args);
}
u32 OSGetConsoleType()
{
return OS_CONSOLE_RETAIL1;
}
u32 OSGetSoundMode()
{
return 2;
}
s32 CARDCancel(CARDFileInfo *fileInfo)
{
puts("CARDCancel is a stub");
return 0;
}
s32 CARDCheck(s32 chan)
{
puts("CARDCheck is a stub");
return 0;
}
s32 CARDCheckAsync(s32 chan, CARDCallback callback)
{
puts("CARDCheckAsync is a stub");
return 0;
}
s32 CARDClose(CARDFileInfo *fileInfo)
{
puts("CARDClose is a stub");
return 0;
}
s32 CARDCreate(s32 chan, const char *fileName, u32 size, CARDFileInfo *fileInfo)
{
puts("CARDCreate is a stub");
return 0;
}
s32 CARDCreateAsync(s32 chan, const char *fileName, u32 size, CARDFileInfo *fileInfo, CARDCallback callback)
{
puts("CARDCreateAsync is a stub");
return 0;
}
s32 CARDDelete(s32 chan, const char *fileName)
{
puts("CARDDelete is a stub");
return 0;
}
s32 CARDDeleteAsync(s32 chan, const char *fileName, CARDCallback callback)
{
puts("CARDDeleteAsync is a stub");
return 0;
}
s32 CARDFastDeleteAsync(s32 chan, s32 fileNo, CARDCallback callback)
{
puts("CARDFastDeleteAsync is a stub");
return 0;
}
s32 CARDFastOpen(s32 chan, s32 fileNo, CARDFileInfo *fileInfo)
{
puts("CARDFastOpen is a stub");
return 0;
}
s32 CARDFormat(s32 chan)
{
puts("CARDFormat is a stub");
return 0;
}
s32 CARDFreeBlocks(s32 chan, s32 *byteNotUsed, s32 *filesNotUsed)
{
puts("CARDFreeBlocks is a stub");
return 0;
}
s32 CARDGetResultCode(s32 chan)
{
puts("CARDGetResultCode is a stub");
return 0;
}
s32 CARDGetStatus(s32 chan, s32 fileNo, CARDStat *stat)
{
puts("CARDGetStatus is a stub");
return 0;
}
s32 CARDGetSectorSize(s32 chan, u32 *size)
{
puts("CARDGetSectorSize is a stub");
return 0;
}
void CARDInit()
{
puts("CARDInit is a stub");
}
s32 CARDMount(s32 chan, void *workArea, CARDCallback detachCallback)
{
puts("CARDMount is a stub");
return 0;
}
s32 CARDMountAsync(s32 chan, void *workArea, CARDCallback detachCallback, CARDCallback attachCallback)
{
puts("CARDMountAsync is a stub");
return 0;
}
s32 CARDOpen(s32 chan, const char *fileName, CARDFileInfo *fileInfo)
{
puts("CARDOpen is a stub");
return 0;
}
s32 CARDProbeEx(s32 chan, s32 *memSize, s32 *sectorSize)
{
puts("CARDProbeEx is a stub");
return 0;
}
s32 CARDRead(CARDFileInfo *fileInfo, void *addr, s32 length, s32 offset)
{
puts("CARDRead is a stub");
return 0;
}
s32 CARDReadAsync(CARDFileInfo *fileInfo, void *addr, s32 length, s32 offset, CARDCallback callback)
{
puts("CARDReadAsync is a stub");
return 0;
}
s32 CARDRename(s32 chan, const char *oldName, const char *newName)
{
puts("CARDRename is a stub");
return 0;
}
s32 CARDRenameAsync(s32 chan, const char *oldName, const char *newName, CARDCallback callback)
{
puts("CARDRenameAsync is a stub");
return 0;
}
s32 CARDSetStatusAsync(s32 chan, s32 fileNo, CARDStat *stat, CARDCallback callback)
{
puts("CARDSetStatusAsync is a stub");
return 0;
}
s32 CARDUnmount(s32 chan)
{
puts("CARDUnmount is a stub");
return 0;
}
s32 CARDWrite(CARDFileInfo *fileInfo, const void *addr, s32 length, s32 offset)
{
puts("CARDWrite is a stub");
return 0;
}
s32 CARDWriteAsync(CARDFileInfo *fileInfo, const void *addr, s32 length, s32 offset, CARDCallback callback)
{
puts("CARDWriteAsync is a stub");
return 0;
}
void DCFlushRange(void *addr, u32 nBytes)
{
puts("DCFlushRange is a stub");
}
void DCFlushRangeNoSync(void *addr, u32 nBytes)
{
puts("DCFlushRangeNoSync is a stub");
}
void DCInvalidateRange(void *addr, u32 nBytes)
{
puts("DCInvalidateRange is a stub");
}
void DCStoreRange(void *addr, u32 nBytes)
{
puts("DCStoreRange is a stub");
}
void DCStoreRangeNoSync(void *addr, u32 nBytes)
{
puts("DCStoreRangeNoSync is a stub");
}
void DEMOUpdateStats(unsigned char inc)
{
puts("DEMOUpdateStats is a stub");
}
void DEMOPrintStats(void)
{
puts("DEMOPrintStats is a stub");
}
s32 DVDCancel(DVDCommandBlock *block)
{
puts("DVDCancel is a stub");
return 0;
}
void DVDReadAbsAsyncForBS(void *a, struct bb2struct *b, int c, int d, void (*e)())
{
puts("DVDReadAbsAsyncForBS is a stub");
}
void DVDReadDiskID(void *a, DVDDiskID *b, void (*c)())
{
puts("DVDReadDiskID is a stub");
}
void DVDReset()
{
puts("DVDReset is a stub");
}
BOOL EXIDeselect(int chan)
{
puts("EXIDeselect is a stub");
return FALSE;
}
BOOL EXIDma(int chan, void *buffer, s32 size, int d, int e)
{
puts("EXIDma is a stub");
return FALSE;
}
BOOL EXIImm(int chan, u32 *b, int c, int d, int e)
{
puts("EXIImm is a stub");
return FALSE;
}
BOOL EXILock(int chan, int b, int c)
{
puts("EXILock is a stub");
return FALSE;
}
BOOL EXISelect(int chan, int b, int c)
{
puts("EXISelect is a stub");
return FALSE;
}
BOOL EXISync(int chan)
{
puts("EXISync is a stub");
return FALSE;
}
BOOL EXIUnlock(int chan)
{
puts("EXIUnlock is a stub");
return FALSE;
}
void LCEnable()
{
puts("LCEnable is a stub");
}
void OSClearContext(OSContext *context)
{
puts("OSClearContext is a stub");
}
BOOL OSDisableInterrupts()
{
puts("OSDisableInterrupts is a stub");
return FALSE;
}
void OSDumpContext(OSContext *context)
{
puts("OSDumpContext is a stub");
}
OSThread *OSGetCurrentThread()
{
puts("OSGetCurrentThread is a stub");
return 0;
}
u16 OSGetFontEncode()
{
puts("OSGetFontEncode is a stub");
return 0;
}
char *OSGetFontTexture(char *string, void **image, s32 *x, s32 *y, s32 *width)
{
puts("OSGetFontTexture is a stub");
return 0;
}
char *OSGetFontWidth(char *string, s32 *width)
{
puts("OSGetFontWidth is a stub");
return 0;
}
BOOL OSGetResetButtonState()
{
puts("OSGetResetButtonState is a stub");
return FALSE;
}
u32 OSGetStackPointer()
{
puts("OSGetStackPointer is a stub");
return 0;
}
BOOL OSInitFont(OSFontHeader *fontData)
{
puts("OSInitFont is a stub");
return FALSE;
}
BOOL OSLink(OSModuleInfo *newModule, void *bss)
{
puts("OSLink is a stub");
return TRUE;
}
void OSLoadContext(OSContext *context)
{
puts("OSLoadContext is a stub");
}
void OSResetSystem(int reset, u32 resetCode, BOOL forceMenu)
{
puts("OSResetSystem is a stub");
}
BOOL OSRestoreInterrupts(BOOL level)
{
puts("OSRestoreInterrupts is a stub");
return FALSE;
}
s32 OSResumeThread(OSThread *thread)
{
puts("OSResumeThread is a stub");
return 0;
}
void OSSetCurrentContext(OSContext *context)
{
puts("OSSetCurrentContext is a stub");
}
void OSSetStringTable(const void *stringTable)
{
puts("OSSetStringTable is a stub");
}
s32 OSSuspendThread(OSThread *thread)
{
puts("OSSuspendThread is a stub");
return 0;
}
void OSTicksToCalendarTime(OSTime ticks, OSCalendarTime *td)
{
puts("OSTicksToCalendarTime is a stub");
}
BOOL OSUnlink(OSModuleInfo *oldModule)
{
puts("OSUnlink is a stub");
return FALSE;
}
void OSWakeupThread(OSThreadQueue *queue)
{
puts("OSWakeupThread is a stub");
}
void PPCHalt()
{
puts("PPCHalt is a stub");
}
void SoundChoID(int a, int b)
{
puts("SoundChoID is a stub");
}
void SoundPan(int a, int b, int c)
{
puts("SoundPan is a stub");
}
void SoundPitch(u16 a, int b)
{
puts("SoundPitch is a stub");
}
void SoundRevID(int a, int b)
{
puts("SoundRevID is a stub");
}
void VIConfigure(const GXRenderModeObj *rm)
{
puts("VIConfigure is a stub");
}
void VIConfigurePan(u16 xOrg, u16 yOrg, u16 width, u16 height)
{
puts("VIConfigurePan is a stub");
}
u32 VIGetRetraceCount()
{
// puts("VIGetRetraceCount is a stub");
return 0; // TODO this might be important
}
u32 VIGetNextField()
{
puts("VIGetNextField is a stub");
return 0;
}
void VISetBlack(BOOL black)
{
puts("VISetBlack is a stub");
}
void VISetNextFrameBuffer(void *fb)
{
// puts("VISetNextFrameBuffer is a stub");
}
void VIWaitForRetrace()
{
if (sVIRetraceCallback)
{
sVIRetraceCallback(0);
}
}
s32 __CARDFormatRegionAsync(int a, int b)
{
puts("__CARDFormatRegionAsync is a stub");
return 0;
}
void __GXSetSUTexSize()
{
puts("__GXSetSUTexSize is a stub");
}
void __GXSetVAT()
{
puts("__GXSetVAT is a stub");
}
void __GXSetVCD()
{
puts("__GXSetVCD is a stub");
}
void __GXUpdateBPMask()
{
puts("__GXUpdateBPMask is a stub");
}
u32 __OSGetDIConfig()
{
puts("__OSGetDIConfig is a stub");
return 0;
}
__OSInterruptHandler __OSSetInterruptHandler(__OSInterrupt interrupt, __OSInterruptHandler handler)
{
puts("__OSSetInterruptHandler is a stub");
return 0;
}
OSInterruptMask __OSUnmaskInterrupts(OSInterruptMask mask)
{
puts("__OSUnmaskInterrupts is a stub");
return 0;
}
void SISetSamplingRate(u32 msec)
{
// Maybe we could include SI later
puts("SISetSamplingRate is a stub");
}
VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback)
{
sVIRetraceCallback = callback;
return callback;
}
void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1)
{
// puts("GXSetGPMetric is a stub");
}
void GXReadGPMetric(u32 *cnt0, u32 *cnt1)
{
// puts("GXReadGPMetric is a stub");
}
void GXClearGPMetric(void)
{
// puts("GXClearGPMetric is a stub");
}
void GXReadMemMetric(
u32 *cp_req, u32 *tc_req, u32 *cpu_rd_req, u32 *cpu_wr_req, u32 *dsp_req, u32 *io_req, u32 *vi_req, u32 *pe_req, u32 *rf_req, u32 *fi_req)
{
// puts("GXReadMemMetric is a stub");
}
void GXClearMemMetric(void)
{
// puts("GXClearMemMetric is a stub");
}
void GXClearVCacheMetric(void)
{
// puts("GXClearVCacheMetric is a stub");
}
void GXReadPixMetric(u32 *top_pixels_in, u32 *top_pixels_out, u32 *bot_pixels_in, u32 *bot_pixels_out, u32 *clr_pixels_in, u32 *copy_clks)
{
// puts("GXReadPixMetric is a stub");
}
void GXClearPixMetric(void)
{
// puts("GXClearPixMetric is a stub");
}
void GXSetVCacheMetric(GXVCachePerf attr)
{
// puts("GXSetVCacheMetric is a stub");
}
void GXReadVCacheMetric(u32 *check, u32 *miss, u32 *stall)
{
// puts("GXReadVCacheMetric is a stub");
}
void GXSetDrawSync(u16 token)
{
// puts("GXSetDrawSync is a stub");
}
GXDrawSyncCallback GXSetDrawSyncCallback(GXDrawSyncCallback cb)
{
puts("GXSetDrawSyncCallback is a stub");
// TODO
return cb;
}
void PPCSync(void)
{
puts("PPCSync is a stub");
}
void GXUnknownu16(const u16 x)
{
puts("GXUnknownu16 is a stub");
}
void GXWaitDrawDone(void)
{
puts("GXWaitDrawDone is a stub");
}
void GXSetTevIndTile(GXTevStageID tev_stage, GXIndTexStageID ind_stage, u16 tilesize_s, u16 tilesize_t, u16 tilespacing_s, u16 tilespacing_t,
GXIndTexFormat format, GXIndTexMtxID matrix_sel, GXIndTexBiasSel bias_sel, GXIndTexAlphaSel alpha_sel)
{
puts("GXSetTevIndTile is a stub");
}
void GXSetTexCoordScaleManually(GXTexCoordID coord, u8 enable, u16 ss, u16 ts)
{
puts("GXSetTexCoordScaleManually is a stub");
}
void GXResetWriteGatherPipe(void)
{
puts("GXResetWriteGatherPipe is a stub");
}
void ARQInit(void) {
puts("ARQInit is a stub");
}
// Hudson
void HuDvdErrDispInit(GXRenderModeObj *rmode, void *xfb1, void *xfb2) { }
void msmSysRegularProc(void)
{
}
void msmMusFdoutEnd(void)
{
}
s32 HuSoftResetButtonCheck(void)
{
//puts("HuSoftResetButtonCheck is a stub");
return 0;
}
void MGSeqMain(void)
{
// puts("MGSeqMain is a stub");
}
// TODO remove
u8 fadeStat = 0;