BEEG functions, m2ctx removed

This commit is contained in:
CreateSource 2023-12-08 21:10:23 -05:00
parent c2a0cec708
commit cb7cb8521f
7 changed files with 468 additions and 133 deletions

View file

@ -1,30 +1,33 @@
#include "game/hsfman.h"
void Hu3DAnimInit(void);
void Hu3DFogClear(void);
void Hu3DLighInit(void);
void Hu3DMotionInit(void);
void Hu3DParManInit(void);
s16 Hu3DCameraExistF;
ModelData Hu3DData[0x200] = {};
ThreeDCameraStruct Hu3DCamera[0x10] = {};
s16 layerNum[8] = {};
void (*layerHook[8])(s16) = {};
AnimData *reflectAnim[5] = {};
AnimData *hiliteAnim[4] = {};
ThreeDProjectionStruct Hu3DProjection[4] = {};
ThreeDShadowStruct Hu3DShadowData = {};
HsfScene FogData = {};
Mtx Hu3DCameraMtx = {};
Mtx Hu3DCameraMtxXPose = {};
s16 Hu3DPauseF;
s16 Hu3DProjectionNum;
ModelData Hu3DData[0x200];
ThreeDCameraStruct Hu3DCamera[0x10];
s16 layerNum[8];
void (*layerHook[8])(s16);
AnimData *reflectAnim[5];
AnimData *hiliteAnim[4];
ThreeDProjectionStruct Hu3DProjection[4];
ShadowData Hu3DShadowData;
HsfScene FogData;
Mtx Hu3DCameraMtx;
LightData Hu3DGlobalLight[0x8];
Mtx Hu3DCameraMtxXPose;
LightData Hu3DLocalLight[0x20];
GXColor BGColor;
s16 reflectMapNo;
AnimData *toonAnim;
s16 Hu3DShadowCamBit;
s32 Hu3DShadowF;
s32 shadowModelDrawF;
s16 Hu3DProjectionNum;
s16 Hu3DCameraNo;
s16 Hu3DCameraBit;
HsfData* Hu3DMallocNo;
s16 Hu3DPauseF;
s16 Hu3DCameraExistF;
u16 NoSyncF;
f32 lbl_801D4AB0;
s32 modelKillAllF;
#include "refMapData0.inc"
#include "refMapData1.inc"
#include "refMapData2.inc"
@ -36,24 +39,6 @@ s32 modelKillAllF;
#include "hiliteData2.inc"
#include "hiliteData3.inc"
#include "hiliteData4.inc"
const char lbl_8012D630[] = "Error: Not Found %s for MipMapSet\n";
s16 reflectMapNo;
AnimData *toonAnim;
GXColor BGColor;
extern s16 Hu3DCameraBit;
extern s16 Hu3DCameraNo;
extern f32 lbl_801D4AB4;
extern f32 lbl_801D4AFC;
extern GXColor lbl_801D6BE0;
extern s32 shadowModelDrawF;
extern u32 totalMatCnt;
extern u32 totalMatCnted;
extern u32 totalPolyCnt;
extern u32 totalTexCacheCnt;
extern u32 totalTexCacheCnted;
extern u32 totalTexCnt;
extern u32 totalTexCnted;
void Hu3DInit(void) {
ModelData* data;
@ -283,6 +268,339 @@ void Hu3DExec(void) {
HuPerfEnd(3);
}
void Hu3DAllKill(void) {
s16 i;
Hu3DModelAllKill();
Hu3DMotionAllKill();
Hu3DCameraAllKill();
Hu3DLightAllKill();
Hu3DAnimAllKill();
if(reflectAnim[0] != (AnimData *)refMapData0) {
HuMemDirectFree(reflectAnim[0]);
}
reflectAnim[0] = HuSprAnimRead(refMapData0);
if(Hu3DShadowData.unk_04) {
HuMemDirectFree(Hu3DShadowData.unk_04);
Hu3DShadowCamBit = 0;
Hu3DShadowData.unk_04 = NULL;
Hu3DShadowF = 0;
}
Hu3DFogClear();
for(i=0; i<8; i++) {
layerNum[i] = 0;
layerHook[i] = NULL;
}
for(i=0; i<4; i++) {
if(Hu3DProjection[i].unk_04) {
Hu3DProjectionKill(i);
}
Hu3DProjection[i].unk_04 = NULL;
}
NoSyncF = 0;
}
void Hu3DBGColorSet(u8 arg0, u8 arg1, u8 arg2) {
BGColor.r = arg0;
BGColor.g = arg1;
BGColor.b = arg2;
}
void Hu3DLayerHookSet(s16 layer, void (*func)(s16)) {
layerHook[layer] = func;
}
void Hu3DPauseSet(s32 arg0) {
Hu3DPauseF = arg0;
}
void Hu3DNoSyncSet(s32 arg0) {
NoSyncF = arg0;
}
s16 Hu3DModelCreate(s32 arg0) {
HsfData* temp_r0;
ModelData* var_r31;
s16 i;
s16 var_r30;
var_r31 = Hu3DData;
for (var_r30 = 0; var_r30 < 0x200; var_r30++, var_r31++) {
if (var_r31->hsfData == 0x0) {
break;
}
}
if (var_r30 == 0x200) {
OSReport("Error: Not Found %s for MipMapSet\n");
return -1;
}
var_r31->hsfData = LoadHSF(arg0);
var_r31->unk_48 = Hu3DMallocNo = var_r31->hsfData;
var_r31->unk_50 = 0;
var_r31->unk_54 = 0;
var_r31->unk_02 = 0;
MakeDisplayList(var_r30, (HsfData* ) var_r31->unk_48);
var_r31->unk_68.x = lbl_801D4AB8;
for (i = 0; i < 4; i++) {
var_r31->unk_10[i] = -1;
}
var_r31->unk_0A = -1;
var_r31->unk_0C = -1;
var_r31->unk_0E = -1;
var_r31->unk_64 = lbl_801D4AB4;
if (var_r31->hsfData->motionCnt != 0) {
var_r31->unk_08 = var_r31->unk_20 = Hu3DMotionModelCreate(var_r30);
if (var_r31->hsfData->cenvCnt != 0) {
Hu3DMotionExec(var_r30, var_r31->unk_08, lbl_801D4AB4, 0);
EnvelopeProc(var_r31->hsfData);
PPCSync();
}
if (var_r31->hsfData->clusterCnt != 0) {
Hu3DMotionClusterSet(var_r30, var_r31->unk_08);
}
if (var_r31->hsfData->shapeCnt != 0) {
Hu3DMotionShapeSet(var_r30, var_r31->unk_08);
}
var_r31->unk_68.y = lbl_801D4AB4;
var_r31->unk_68.z = Hu3DMotionMaxTimeGet(var_r30);
} else {
var_r31->unk_20 = var_r31->unk_08 = -1;
}
var_r31->unk_CC = var_r31->unk_D0 = var_r31->unk_D4 = lbl_801D4AB4;
var_r31->unk_D8 = var_r31->unk_DC = var_r31->unk_E0 = lbl_801D4AB4;
var_r31->unk_E4 = var_r31->unk_E8 = var_r31->unk_EC = lbl_801D4AB8;
var_r31->unk_22 = -1;
var_r31->unk_06 = 0;
var_r31->unk_120 = 0;
var_r31->unk_26 = 0;
var_r31->unk_03 = 0;
var_r31->unk_58.x = var_r31->unk_58.z = var_r31->unk_58.y = lbl_801D4AB8;
var_r31->unk_04 = -1;
var_r31->unk_24 = -1;
for (i = 0; i < 8; i++) {
var_r31->unk_38[i] = -1;
}
var_r31->unk_01 = 0;
var_r31->unk_00 = (u8) var_r30;
PSMTXIdentity(var_r31->unk_F0);
layerNum[0] += 1;
HuMemDCFlush(HEAP_DATA);
if ((var_r31->hsfData->sceneCnt != 0) && ((var_r31->hsfData->scene->start != lbl_801D4AB4) || (var_r31->hsfData->scene->end != lbl_801D4AB4))) {
Hu3DFogSet(var_r31->hsfData->scene->start, var_r31->hsfData->scene->end, var_r31->hsfData->scene->color.r, var_r31->hsfData->scene->color.g, var_r31->hsfData->scene->color.b);
}
return var_r30;
}
s16 Hu3DModelLink(s16 arg0) {
HsfObject* temp_r3_2;
ModelData* temp_r30;
ModelData* var_r31;
s16 var_r28;
s16 i;
s32 temp_r0;
s32 temp_r3;
s32 temp_r5;
s32 var_ctr;
HsfData* var_r4;
HsfData* var_r5;
temp_r30 = &Hu3DData[arg0];
var_r31 = Hu3DData;
for (var_r28 = 0; var_r28 < 0x200; var_r28++, var_r31++) {
if (var_r31->hsfData == 0x0) {
break;
}
}
if (var_r28 == 0x200) {
return -1;
}
var_r31->unk_C8 = temp_r30->hsfData;
var_r31->hsfData = HuMemDirectMallocNum(HEAP_DATA, 0x80, (u32)var_r31->unk_4C);
var_r31->unk_4C = var_r31->hsfData;
*var_r31->hsfData = *temp_r30->hsfData;
temp_r3_2 = Hu3DObjDuplicate(var_r31->hsfData, (u32)var_r31->unk_4C);
var_r31->hsfData->root = (HsfObject*)((u32)temp_r3_2 + ((u32)var_r31->hsfData->root - (u32)var_r31->hsfData->object));
var_r31->hsfData->object = temp_r3_2;
var_r31->unk_48 = temp_r30->unk_48;
var_r31->unk_50 = temp_r30->unk_50;
temp_r30->unk_50 |= 0x100000;
var_r31->unk_54 = temp_r30->unk_54;
var_r31->unk_CC = var_r31->unk_D0 = var_r31->unk_D4 = lbl_801D4AB4;
var_r31->unk_D8 = var_r31->unk_DC = var_r31->unk_E0 = lbl_801D4AB4;
var_r31->unk_E4 = var_r31->unk_E8 = var_r31->unk_EC = lbl_801D4AB8;
var_r31->unk_08 = temp_r30->unk_08;
if (var_r31->unk_08 != -1) {
var_r31->unk_68.y = lbl_801D4AB4;
var_r31->unk_68.z = Hu3DMotionMaxTimeGet(var_r28);
}
var_r31->unk_0C = var_r31->unk_0A = var_r31->unk_0E = -1;
for (i = 0; i < 4; i++) {
var_r31->unk_10[i] = temp_r30->unk_10[i];
if (var_r31->unk_10[i] != -1) {
ClusterAdjustObject(var_r31->hsfData, Hu3DMotion[var_r31->unk_10[i]].unk_04);
var_r31->unk_50 |= 0x400;
}
}
var_r31->unk_64 = temp_r30->unk_64;
var_r31->unk_68.x = temp_r30->unk_68.x;
var_r31->unk_20 = temp_r30->unk_20;
var_r31->unk_22 = -1;
var_r31->unk_06 = 0;
var_r31->unk_120 = 0;
var_r31->unk_26 = 0;
var_r31->unk_03 = 0;
var_r31->unk_02 = 0;
var_r31->unk_58.x = var_r31->unk_58.z = var_r31->unk_58.y = lbl_801D4AB8;
var_r31->unk_04 = -1;
var_r31->unk_24 = arg0;
for (i = 0; i < 8; i++) {
var_r31->unk_38[i] = -1;
}
var_r31->unk_01 = 0;
PSMTXIdentity(var_r31->unk_F0);
layerNum[0] += 1;
return var_r28;
}
s16 Hu3DHookFuncCreate(HsfData* arg0) {
HsfData* sp8;
ModelData* var_r31;
s16 var_r29;
s16 i;
var_r31 = Hu3DData;
for (var_r29 = 0; var_r29 < 0x200; var_r29++, var_r31++) {
if (var_r31->hsfData == 0) {
break;
}
}
if (var_r29 == 0x200) {
return -1;
}
var_r31->hsfData = arg0;
var_r31->unk_48 = (HsfData *)(var_r29 + 0x2710);
var_r31->unk_50 = 0x10;
var_r31->unk_54 = 0;
var_r31->unk_CC = var_r31->unk_D0 = var_r31->unk_D4 = lbl_801D4AB4;
var_r31->unk_D8 = var_r31->unk_DC = var_r31->unk_E0 = lbl_801D4AB4;
var_r31->unk_E4 = var_r31->unk_E8 = var_r31->unk_EC = lbl_801D4AB8;
var_r31->unk_08 = var_r31->unk_0C = var_r31->unk_0A = var_r31->unk_0E = -1;
for (i = 0; i < 4; i++) {
var_r31->unk_10[i] = -1;
}
var_r31->unk_64 = lbl_801D4AB4;
var_r31->unk_68.x = lbl_801D4AB8;
var_r31->unk_20 = -1;
var_r31->unk_22 = -1;
var_r31->unk_06 = 0;
var_r31->unk_120 = 0;
var_r31->unk_26 = 0;
var_r31->unk_03 = 0;
var_r31->unk_24 = -1;
var_r31->unk_02 = 0;
var_r31->unk_04 = -1;
for (i = 0; i < 8; i++) {
var_r31->unk_38[i] = -1;
}
var_r31->unk_01 = 0;
PSMTXIdentity(var_r31->unk_F0);
layerNum[0] += 1;
return var_r29;
}
void Hu3DModelKill(s16 arg0) {
HsfData* var_r28;
ModelData* temp_r31;
ModelData* var_r30;
ParticleData *copy;
s16 var_r27;
s16 i;
temp_r31 = &Hu3DData[arg0];
var_r28 = temp_r31->hsfData;
if (var_r28 != 0) {
if ((temp_r31->unk_50 & 4) != 0) {
Hu3DShadowCamBit -= 1;
}
layerNum[temp_r31->unk_06] -= 1;
if ((temp_r31->unk_50 & 0x10) != 0) {
HuMemDirectFreeNum(HEAP_DATA, (u32) temp_r31->unk_48);
if ((temp_r31->unk_50 & 0x20) != 0) {
copy = temp_r31->unk_120;
HuSprAnimKill(copy->unk_44);
}
temp_r31->hsfData = NULL;
if (modelKillAllF == 0) {
HuMemDCFlush(HEAP_DATA);
}
return;
}
if ((temp_r31->unk_50 & 0x10000) != 0) {
if (temp_r31->unk_08 != -1) {
Hu3DMotionKill(temp_r31->unk_08);
}
HuMemDirectFreeNum(HEAP_DATA, (u32) temp_r31->unk_48);
temp_r31->hsfData = NULL;
return;
}
Hu3DAnimModelKill(arg0);
if (temp_r31->unk_24 != -1) {
HuMemDirectFree(temp_r31->hsfData);
HuMemDirectFreeNum(HEAP_DATA, (u32) temp_r31->unk_4C);
var_r28 = temp_r31->unk_C8;
temp_r31->hsfData = var_r28;
}
var_r30 = Hu3DData;
for (var_r27 = i = 0; i < 0x200; i++, var_r30++) {
if ((var_r30->hsfData != 0) && (var_r30->hsfData == var_r28 || (var_r30->unk_24 != -1 && var_r30->unk_C8 == var_r28))) {
var_r27++;
}
}
if (var_r27 > 1) {
temp_r31->hsfData = NULL;
var_r30 = Hu3DData;
if (temp_r31->unk_20 != -1) {
for (i = 0; i < 0x200; i++, var_r30++) {
if (var_r30->hsfData != 0 && var_r30->unk_24 != -1 && var_r30->unk_C8 == var_r28) {
Hu3DMotion[temp_r31->unk_20].unk_02 = i;
break;
}
}
}
if (modelKillAllF == 0) {
HuMemDCFlush(HEAP_DATA);
}
return;
}
if (temp_r31->unk_20 != -1 && Hu3DMotionKill(temp_r31->unk_20) == 0) {
Hu3DMotion[temp_r31->unk_20].unk_02 = -1;
HuMemDirectFreeNum(HEAP_DATA, (u32) temp_r31->unk_48);
temp_r31->hsfData = NULL;
if (modelKillAllF == 0) {
HuMemDCFlush(HEAP_DATA);
}
return;
}
HuMemDirectFree(temp_r31->hsfData);
HuMemDirectFreeNum(HEAP_DATA, (u32) temp_r31->unk_48);
for (i = 0; i < temp_r31->unk_26; i++) {
Hu3DGLightKill(temp_r31->unk_28[i]);
}
for (i = 0; i < 8; i++) {
if (temp_r31->unk_38[i] != -1) {
Hu3DLLightKill(arg0, i);
}
}
temp_r31->hsfData = NULL;
if (modelKillAllF == 0) {
HuMemDCFlush(HEAP_DATA);
}
}
}
void Hu3DShadowSizeSet(u16 arg0) {
Hu3DShadowData.unk_02 = arg0;
@ -328,7 +646,7 @@ void Hu3DMipMapSet(char* arg0, s16 arg1, s32 arg2, f32 arg8) {
}
}
if (i == temp_r27->attributeCnt) {
OSReport(lbl_8012D630, arg2);
OSReport("Error: Not Found %s for MipMapSet\n", arg2);
return;
}
temp_r31 = var_r26->bitmap;
@ -337,7 +655,7 @@ void Hu3DMipMapSet(char* arg0, s16 arg1, s32 arg2, f32 arg8) {
for ( i = 0, var_r24 = i; i < temp_r3->bmpNum; i++, var_r30++) {
var_r24 += var_r30->dataSize;
}
var_r23 = HuMemDirectMallocNum(HEAP_DATA, var_r24, temp_r25->unk_48);
var_r23 = HuMemDirectMallocNum(HEAP_DATA, var_r24, (u32)temp_r25->unk_48);
temp_r22 = var_r23;
var_r30 = temp_r3->bmp;
temp_r31->data = temp_r22;