#include "game/hsfman.h" #include "game/ClusterExec.h" #include "game/data.h" #include "game/EnvelopeExec.h" #include "game/hsfdraw.h" #include "game/hsfload.h" #include "game/hsfmotion.h" #include "game/init.h" #include "game/memory.h" #include "game/perf.h" #include "game/ShapeExec.h" #include "game/sprite.h" #include "game/disp.h" #include "dolphin/gx/GXVert.h" #include "ext_math.h" #ifndef __MWERKS__ #include "string.h" #endif #define SHADOW_HEAP_SIZE 0x9000 SHARED_SYM ModelData Hu3DData[HU3D_MODEL_MAX]; CameraData Hu3DCamera[HU3D_CAM_MAX]; static s16 layerNum[8]; static void (*layerHook[8])(s16); AnimData *reflectAnim[5]; AnimData *hiliteAnim[4]; ThreeDProjectionStruct Hu3DProjection[4]; ShadowData Hu3DShadowData; HsfScene FogData; Mtx Hu3DCameraMtx; Mtx Hu3DCameraMtxXPose; LightData Hu3DGlobalLight[0x8]; LightData Hu3DLocalLight[0x20]; Mtx lbl_8018D39C; GXColor BGColor; s16 reflectMapNo; AnimData *toonAnim; s16 Hu3DShadowCamBit; s32 Hu3DShadowF; s32 shadowModelDrawF; s16 Hu3DProjectionNum; s16 Hu3DCameraNo; s16 Hu3DCameraBit; uintptr_t Hu3DMallocNo; s16 Hu3DPauseF; u16 Hu3DCameraExistF; static u16 NoSyncF; s32 modelKillAllF; #include "refMapData0.inc" #include "refMapData1.inc" #include "refMapData2.inc" #include "refMapData3.inc" #include "refMapData4.inc" #include "toonMapData.inc" #include "toonMapData2.inc" #include "hiliteData.inc" #include "hiliteData2.inc" #include "hiliteData3.inc" #include "hiliteData4.inc" void Hu3DInit(void) { ModelData* data; CameraData* camera; s16 i; data = Hu3DData; for (i = 0; i < HU3D_MODEL_MAX; i++, data++) { data->hsfData = NULL; } camera = Hu3DCamera; for (i = 0; i < HU3D_CAM_MAX; i++, camera++) { camera->fov = -1.0f; } Hu3DMotionInit(); Hu3DLighInit(); BGColor.r = BGColor.g = BGColor.b = 0; BGColor.a = 0xFF; for (i = 0; i < 8; i++) { layerNum[i] = 0; layerHook[i] = 0; } reflectAnim[0] = HuSprAnimRead(refMapData0); reflectAnim[1] = HuSprAnimRead(refMapData1); reflectAnim[2] = HuSprAnimRead(refMapData2); reflectAnim[3] = HuSprAnimRead(refMapData3); reflectAnim[4] = HuSprAnimRead(refMapData4); reflectMapNo = 0; toonAnim = HuSprAnimRead(toonMapData); hiliteAnim[0] = HuSprAnimRead(hiliteData); hiliteAnim[1] = HuSprAnimRead(hiliteData2); hiliteAnim[2] = HuSprAnimRead(hiliteData3); hiliteAnim[3] = HuSprAnimRead(hiliteData4); Hu3DFogClear(); Hu3DAnimInit(); Hu3DParManInit(); for (i = 0; i < 4; i++) { Hu3DProjection[i].unk_04 = NULL; } Hu3DShadowCamBit = 0; Hu3DShadowData.unk_04 = 0; Hu3DShadowF = 0; Hu3DProjectionNum = 0; Hu3DCameraExistF = 0; modelKillAllF = 0; Hu3DPauseF = 0; NoSyncF = 0; } void Hu3DPreProc(void) { ModelData *data; s16 i; GXSetCopyClear(BGColor, 0xFFFFFF); data = &Hu3DData[0]; for (i = 0; i < HU3D_MODEL_MAX; i++, data++) { if (data->hsfData != 0) { data->attr &= ~HU3D_ATTR_MOT_EXEC; } } totalPolyCnted = totalPolyCnt; totalMatCnted = totalMatCnt; totalTexCnted = totalTexCnt; totalTexCacheCnted = totalTexCacheCnt; totalPolyCnt = totalMatCnt = totalTexCnt = totalTexCacheCnt = 0; } #define HU3D_ATTR_CAMERA_UPDATE (HU3D_ATTR_CAMERA_MOTON|HU3D_ATTR_DISPOFF) void Hu3DExec(void) { GXColor unusedColor = {0, 0, 0, 0}; CameraData* camera; ModelData* data; s16 temp_r22; s16 var_r23; s16 var_r25; s16 var_r24; s16 j; s16 i; void (* temp)(s16); Mtx sp40; Mtx sp10; ThreeDProjectionStruct* var_r26; HuPerfBegin(3); GXSetCurrentMtx(0U); camera = Hu3DCamera; shadowModelDrawF = 0; HuSprBegin(); var_r24 = 0; for (Hu3DCameraNo = 0; Hu3DCameraNo < HU3D_CAM_MAX; Hu3DCameraNo++, camera++) { if (-1.0f != camera->fov) { GXInvalidateVtxCache(); temp_r22 = (s16) (1 << Hu3DCameraNo); Hu3DCameraBit = temp_r22; if (NoSyncF == 0) { if (Hu3DCameraNo == 0 && Hu3DShadowF != 0 && Hu3DShadowCamBit != 0) { Hu3DShadowExec(); var_r24 = 1; GXSetDrawDone(); } else if (Hu3DCameraNo != 0) { var_r24 = 1; GXSetDrawDone(); } } else if (Hu3DCameraNo == 0 && Hu3DShadowF != 0 && Hu3DShadowCamBit != 0) { Hu3DShadowExec(); } var_r26 = &Hu3DProjection[0]; for (i = 0; i < 4; i++, var_r26++) { if (var_r26->unk_04 != 0) { C_MTXLookAt(var_r26->unk_38, &var_r26->unk_14, &var_r26->unk_2C, &var_r26->unk_20); } } if (Hu3DCameraNo == 0) { HuSprDispInit(); HuSprExec(0x7F); } if (FogData.fogType != GX_FOG_NONE) { GXSetFog(FogData.fogType, FogData.start, FogData.end, camera->nnear, camera->ffar, FogData.color); } for (j = 0; j < 8; j++) { if (layerHook[j] != 0) { Hu3DCameraSet(Hu3DCameraNo, Hu3DCameraMtx); MTXInvXpose(Hu3DCameraMtx, Hu3DCameraMtxXPose); temp = layerHook[j]; temp(j); } if (layerNum[j] != 0) { Hu3DDrawPreInit(); Hu3DCameraSet(Hu3DCameraNo, Hu3DCameraMtx); MTXInvXpose(Hu3DCameraMtx, Hu3DCameraMtxXPose); data = Hu3DData; for (i = 0, var_r23 = i; i < HU3D_MODEL_MAX; i++, data++) { if (data->hsfData != 0) { if ((data->attr & HU3D_ATTR_CAMERA) != 0) { Hu3DCameraMotionExec(i); } else { if ((data->attr & HU3D_ATTR_CAMERA_UPDATE) == HU3D_ATTR_CAMERA_UPDATE && data->unk_08 != -1) { Hu3DMotionExec(i, data->unk_08, data->unk_64, 0); } if ((data->attr & (HU3D_ATTR_DISPOFF|HU3D_ATTR_MOTION_OFF)) == 0 && (data->camera & temp_r22) != 0 && data->layer == j) { if (((data->attr & HU3D_ATTR_MOT_EXEC) == 0 && (data->attr & HU3D_ATTR_MOT_SLOW) == 0) || ((data->attr & HU3D_ATTR_MOT_SLOW) != 0 && (data->unk_00 & 1) != 0)) { var_r25 = 0; data->motion_attr &= ~HU3D_MOTATTR; if (data->unk_08 != -1) { Hu3DMotionExec(i, data->unk_08, data->unk_64, 0); } if (data->unk_0C != -1) { Hu3DSubMotionExec(i); } if (data->unk_0A != -1) { Hu3DMotionExec(i, data->unk_0A, data->unk_74, 1); } if ((data->attr & HU3D_ATTR_CLUSTER_ON) != 0) { ClusterMotionExec(data); var_r25 = 1; } if (data->unk_0E != -1) { if (data->unk_08 == -1) { Hu3DMotionExec(i, data->unk_0E, data->unk_94, 0); } else { Hu3DMotionExec(i, data->unk_0E, data->unk_94, 1); } var_r25 = 1; } if ((data->attr & (HU3D_ATTR_ENVELOPE_OFF|HU3D_ATTR_HOOKFUNC)) == 0 && (data->motion_attr & HU3D_MOTATTR_PAUSE) == 0) { var_r25 = 1; InitVtxParm(data->hsfData); if (data->unk_0E != -1) { ShapeProc(data->hsfData); } if ((data->attr & 0x400) != 0) { ClusterProc(data); } if (data->hsfData->cenvCnt != 0) { EnvelopeProc(data->hsfData); } PPCSync(); } if (var_r25 != 0) { GXInvalidateVtxCache(); } data->attr |= 0x800; } if (var_r24 != 0 && (data->attr & HU3D_ATTR_HOOKFUNC) != 0) { GXWaitDrawDone(); var_r24 = 0; } if ((data->attr & HU3D_ATTR_HOOK) == 0 && (0.0f != data->scale.x || 0.0f != data->scale.y || 0.0f != data->scale.z)) { 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); MTXConcat(Hu3DCameraMtx, sp40, sp10); MTXConcat(sp10, data->unk_F0, sp10); Hu3DDraw(data, sp10, &data->scale); } data->unk_00++; var_r23++; if (var_r23 >= layerNum[j]) { break; } } } } } Hu3DDrawPost(); } } } } HuSprDispInit(); HuSprExec(0); data = Hu3DData; for (i = 0; i < HU3D_MODEL_MAX; i++, data++) { if (data->hsfData != 0 && (data->unk_08 != -1 || (data->attr & HU3D_ATTR_CLUSTER_ON) != 0 || data->unk_0E != -1) && (Hu3DPauseF == 0 || (data->attr & HU3D_ATTR_NOPAUSE) != 0)) { Hu3DMotionNext(i); } } HuSprFinish(); Hu3DAnimExec(); 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(void *arg0) { HsfData* temp_r0; ModelData* var_r31; s16 i; s16 var_r30; var_r31 = Hu3DData; for (var_r30 = 0; var_r30 < HU3D_MODEL_MAX; var_r30++, var_r31++) { if (var_r31->hsfData == 0x0) { break; } } if (var_r30 == HU3D_MODEL_MAX) { OSReport("Error: Create Model Over!\n"); return -1; } var_r31->hsfData = LoadHSF(arg0); var_r31->unk_48 = Hu3DMallocNo = (uintptr_t)var_r31->hsfData; var_r31->attr = HU3D_ATTR_NONE; var_r31->motion_attr = HU3D_ATTR_NONE; var_r31->unk_02 = 0; MakeDisplayList(var_r30, var_r31->unk_48); var_r31->unk_68 = 1.0f; 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 = 0.0f; 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, 0.0f, 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_6C = 0.0f; var_r31->unk_70 = Hu3DMotionMaxTimeGet(var_r30); } else { var_r31->unk_20 = var_r31->unk_08 = -1; } var_r31->pos.x = var_r31->pos.y = var_r31->pos.z = 0.0f; var_r31->rot.x = var_r31->rot.y = var_r31->rot.z = 0.0f; var_r31->scale.x = var_r31->scale.y = var_r31->scale.z = 1.0f; var_r31->camera = -1; var_r31->layer = 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 = 1.0f; 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; 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))) { 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 < HU3D_MODEL_MAX; var_r28++, var_r31++) { if (var_r31->hsfData == 0x0) { break; } } if (var_r28 == HU3D_MODEL_MAX) { return -1; } var_r31->unk_C8 = temp_r30->hsfData; var_r31->hsfData = HuMemDirectMallocNum(HEAP_DATA, 0x80, var_r31->unk_4C); var_r31->unk_4C = (u32)var_r31->hsfData; *var_r31->hsfData = *temp_r30->hsfData; temp_r3_2 = Hu3DObjDuplicate(var_r31->hsfData, 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->attr = temp_r30->attr; temp_r30->attr |= HU3D_ATTR_LINK; var_r31->motion_attr = temp_r30->motion_attr; var_r31->pos.x = var_r31->pos.y = var_r31->pos.z = 0.0f; var_r31->rot.x = var_r31->rot.y = var_r31->rot.z = 0.0f; var_r31->scale.x = var_r31->scale.y = var_r31->scale.z = 1.0f; var_r31->unk_08 = temp_r30->unk_08; if (var_r31->unk_08 != -1) { var_r31->unk_6C = 0.0f; var_r31->unk_70 = 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]].hsfData); var_r31->attr |= HU3D_ATTR_CLUSTER_ON; } } var_r31->unk_64 = temp_r30->unk_64; var_r31->unk_68 = temp_r30->unk_68; var_r31->unk_20 = temp_r30->unk_20; var_r31->camera = -1; var_r31->layer = 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 = 1.0f; 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; MTXIdentity(var_r31->unk_F0); layerNum[0] += 1; return var_r28; } s16 Hu3DHookFuncCreate(ModelHookFunc hook) { HsfData* sp8; ModelData* var_r31; s16 var_r29; s16 i; var_r31 = Hu3DData; for (var_r29 = 0; var_r29 < HU3D_MODEL_MAX; var_r29++, var_r31++) { if (var_r31->hsfData == 0) { break; } } if (var_r29 == HU3D_MODEL_MAX) { return -1; } var_r31->hook = hook; var_r31->unk_48 = var_r29+10000; var_r31->attr = HU3D_ATTR_HOOKFUNC; var_r31->motion_attr = HU3D_ATTR_NONE; var_r31->pos.x = var_r31->pos.y = var_r31->pos.z = 0.0f; var_r31->rot.x = var_r31->rot.y = var_r31->rot.z = 0.0f; var_r31->scale.x = var_r31->scale.y = var_r31->scale.z = 1.0f; 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 = 0.0f; var_r31->unk_68 = 1.0f; var_r31->unk_20 = -1; var_r31->camera = -1; var_r31->layer = 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; MTXIdentity(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->attr & HU3D_ATTR_SHADOW) != 0) { Hu3DShadowCamBit -= 1; } layerNum[temp_r31->layer] -= 1; if ((temp_r31->attr & HU3D_ATTR_HOOKFUNC) != 0) { HuMemDirectFreeNum(HEAP_DATA, temp_r31->unk_48); if ((temp_r31->attr & HU3D_ATTR_PARTICLE_KILL) != 0) { copy = temp_r31->unk_120; HuSprAnimKill(copy->unk_44); } temp_r31->hsfData = NULL; if (modelKillAllF == 0) { HuMemDCFlush(HEAP_DATA); } return; } if ((temp_r31->attr & HU3D_ATTR_CAMERA) != 0) { if (temp_r31->unk_08 != -1) { Hu3DMotionKill(temp_r31->unk_08); } HuMemDirectFreeNum(HEAP_DATA, temp_r31->unk_48); temp_r31->hsfData = NULL; return; } Hu3DAnimModelKill(arg0); if (temp_r31->unk_24 != -1) { #ifdef TARGET_PC KillHSF(temp_r31->hsfData); #endif HuMemDirectFree(temp_r31->hsfData); HuMemDirectFreeNum(HEAP_DATA, temp_r31->unk_4C); var_r28 = temp_r31->unk_C8; temp_r31->hsfData = var_r28; } var_r30 = Hu3DData; for (var_r27 = i = 0; i < HU3D_MODEL_MAX; 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 < HU3D_MODEL_MAX; i++, var_r30++) { if (var_r30->hsfData != 0 && var_r30->unk_24 != -1 && var_r30->unk_C8 == var_r28) { Hu3DMotion[temp_r31->unk_20].modelId = 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].modelId = -1; HuMemDirectFreeNum(HEAP_DATA, temp_r31->unk_48); temp_r31->hsfData = NULL; if (modelKillAllF == 0) { HuMemDCFlush(HEAP_DATA); } return; } #ifdef TARGET_PC KillHSF(temp_r31->hsfData); #endif HuMemDirectFree(temp_r31->hsfData); HuMemDirectFreeNum(HEAP_DATA, 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 Hu3DModelAllKill(void) { ModelData* var_r30; s16 i; modelKillAllF = 1; var_r30 = Hu3DData; for (i = 0; i < HU3D_MODEL_MAX; i++, var_r30++) { if (var_r30->hsfData != 0) { Hu3DModelKill(i); } } modelKillAllF = 0; for (i = 0; i < 8; i++) { layerNum[i] = 0; layerHook[i] = NULL; } Hu3DParManAllKill(); HuMemDCFlush(HEAP_DATA); } void Hu3DModelPosSet(s16 index, f32 x, f32 y, f32 z) { ModelData* temp_r31; temp_r31 = &Hu3DData[index]; temp_r31->pos.x = x; temp_r31->pos.y = y; temp_r31->pos.z = z; } void Hu3DModelPosSetV(s16 arg0, Vec *arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->pos = *arg1; } void Hu3DModelRotSet(s16 index, f32 x, f32 y, f32 z) { ModelData* temp_r31; temp_r31 = &Hu3DData[index]; temp_r31->rot.x = x; temp_r31->rot.y = y; temp_r31->rot.z = z; } void Hu3DModelRotSetV(s16 arg0, Vec *arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->rot = *arg1; } void Hu3DModelScaleSet(s16 index, f32 x, f32 y, f32 z) { ModelData* temp_r31; temp_r31 = &Hu3DData[index]; temp_r31->scale.x = x; temp_r31->scale.y = y; temp_r31->scale.z = z; } void Hu3DModelScaleSetV(s16 arg0, Vec *arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->scale = *arg1; } void Hu3DModelAttrSet(s16 arg0, u32 arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; if ((arg1 & HU3D_MOTATTR) != 0) { temp_r31->motion_attr |= arg1 & ~HU3D_MOTATTR; } else { temp_r31->attr |= arg1; } } void Hu3DModelAttrReset(s16 arg0, u32 arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; if ((arg1 & HU3D_MOTATTR) != 0) { temp_r31->motion_attr &= ~arg1; } else { temp_r31->attr &= ~arg1; } } u32 Hu3DModelAttrGet(s16 arg0) { ModelData *copy = &Hu3DData[arg0]; return copy->attr; } u32 Hu3DModelMotionAttrGet(s16 arg0) { ModelData *copy = &Hu3DData[arg0]; return copy->motion_attr; } void Hu3DModelClusterAttrSet(s16 arg0, s16 arg1, s32 arg2) { ModelData* temp_r31; s32 temp_r6; temp_r31 = &Hu3DData[arg0]; temp_r31->cluster_attr[arg1] |= arg2; } void Hu3DModelClusterAttrReset(s16 arg0, s16 arg1, s32 arg2) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->cluster_attr[arg1] &= ~arg2; } void Hu3DModelCameraSet(s16 arg0, u16 arg1) { ModelData* copy = &Hu3DData[arg0]; copy->camera = arg1; } void Hu3DModelLayerSet(s16 arg0, s16 arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; layerNum[temp_r31->layer] -= 1; temp_r31->layer = arg1; layerNum[arg1] += 1; } HsfObject* Hu3DModelObjPtrGet(s16 arg0, char *arg1) { char name[0x100]; s32 spC; s16 sp8; HsfData* temp_r31; s16 var_r30; HsfObject* var_r29; HsfObject* var_r28; u32 var_r4; temp_r31 = Hu3DData[arg0].hsfData; var_r29 = temp_r31->object; strcpy(&name, MakeObjectName(arg1)); for (var_r30 = 0; var_r30 < temp_r31->objectCnt; var_r29++, var_r30++) { var_r28 = var_r29; if (strcmp(&name, var_r28->name) == 0) { return var_r29; } } if (var_r30 == temp_r31->objectCnt) { OSReport("Error: OBJPtr Error!\n"); } return NULL; } static inline void inlineFunc(HsfObject* var_r26, u32 a) { HsfConstData* temp_r25; HsfObject* copy = var_r26; if (copy->type == HSF_OBJ_MESH) { temp_r25 = copy->constData; temp_r25->flags |= a; } } void Hu3DModelTPLvlSet(s16 arg0, f32 arg8) { HsfMaterial* var_r31; HsfData* temp_r30; s16 i; ModelData* temp_r28; HsfObject* var_r27; HsfObject* var_r26; HsfConstData* temp_r25; temp_r28 = &Hu3DData[arg0]; temp_r30 = temp_r28->hsfData; var_r31 = temp_r30->material; for (i = 0; i < temp_r30->materialCnt; i++, var_r31++) { var_r31->invAlpha = 1.0f - arg8; if (1.0f != arg8) { var_r31->pass = (var_r31->pass & 0xF0) | 1; } else { var_r31->pass &= 0xF0; } } var_r26 = temp_r30->object; for (i = 0; i < temp_r30->objectCnt; var_r26++, i++) { var_r27 = var_r26; if (var_r27->type == 2) { temp_r25 = var_r27->constData; temp_r25->flags |= 1; } } temp_r28->attr |= HU3D_ATTR_TPLVL_SET; } void Hu3DModelHiliteMapSet(s16 arg0, AnimData *arg1) { HsfObject* copy; ModelData* temp_r30; HsfData* temp_r29; s16 i; HsfObject* var_r27; HsfConstData* temp_r25; temp_r30 = &Hu3DData[arg0]; temp_r29 = temp_r30->hsfData; var_r27 = temp_r29->object; for (i = 0; i < temp_r29->objectCnt; var_r27++, i++) { copy = var_r27; if (copy->type == HSF_OBJ_MESH) { copy->flags |= 0x100; temp_r25 = copy->constData; temp_r25->flags |= 0x8000; temp_r25->hiliteMap = arg1; } } } static inline void constDataFlagSet(HsfObject* var_r26, u32 a) { HsfConstData* temp_r25; HsfObject* copy = var_r26; if (copy->constData != 0) { temp_r25 = copy->constData; temp_r25->flags |= a; } } static inline void constDataFlagReset(HsfObject* var_r26, u32 a) { HsfConstData* temp_r25; HsfObject* copy = var_r26; if (copy->constData != 0) { temp_r25 = copy->constData; temp_r25->flags &= ~a; } } void Hu3DModelShadowSet(s16 arg0) { HsfConstData* temp_r26; HsfData* temp_r30; HsfConstData* temp_r25; HsfObject* copy; s16 var_r28; HsfObject* var_r27; ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r30 = temp_r31->hsfData; if ((temp_r31->attr & HU3D_ATTR_SHADOW) == 0) { Hu3DShadowCamBit++; } temp_r31->attr |= HU3D_ATTR_SHADOW; var_r27 = temp_r30->object; for (var_r28 = 0; var_r28 < temp_r30->objectCnt; var_r28++, var_r27++) { constDataFlagSet(var_r27, 0x400); } } void Hu3DModelShadowReset(s16 arg0) { s16 var_r28; HsfObject* var_r27; HsfConstData* temp_r26; ModelData* temp_r31; HsfData* temp_r30; HsfObject* copy; temp_r31 = &Hu3DData[(s16) arg0]; temp_r30 = temp_r31->hsfData; temp_r31->attr &= ~HU3D_ATTR_SHADOW; Hu3DShadowCamBit -= 1; var_r27 = temp_r30->object; for (var_r28 = 0; var_r28 < temp_r30->objectCnt; var_r28++, var_r27++) { constDataFlagReset(var_r27, 0x400); } } void Hu3DModelShadowDispOn(s16 arg0) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->attr |= HU3D_ATTR_SHADOW; } void Hu3DModelShadowDispOff(s16 arg0) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->attr &= ~HU3D_ATTR_SHADOW; } void Hu3DModelShadowMapSet(s16 arg0) { HsfConstData* temp_r27; HsfData* temp_r31; s16 i; HsfObject* var_r28; HsfObject* copy; temp_r31 = Hu3DData[arg0].hsfData; var_r28 = temp_r31->object; for (i = 0; i < temp_r31->objectCnt; i++, var_r28++) { constDataFlagSet(var_r28, 8); } } void Hu3DModelShadowMapObjSet(s16 arg0, char *arg1) { char name[0x100]; HsfData* temp_r30; s16 i; HsfObject* var_r28; HsfObject* copy; HsfConstData* temp_r27; temp_r30 = Hu3DData[arg0].hsfData; var_r28 = temp_r30->object; strcpy(&name, MakeObjectName(arg1)); for (i = 0; i < temp_r30->objectCnt; i++, var_r28++) { copy = var_r28; if (copy->constData != 0x0 && strcmp(&name, copy->name) == 0) { temp_r27 = copy->constData; temp_r27->flags |= 8; break; } } } void Hu3DModelAmbSet(s16 arg0, f32 arg8, f32 arg9, f32 argA) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->unk_58.x = arg8; temp_r31->unk_58.z = arg9; temp_r31->unk_58.y = argA; } void Hu3DModelHookSet(s16 arg0, char *arg1, s16 arg2) { char name[0x100]; ModelData* data; HsfData* temp_r30; s16 i; HsfConstData *constData; HsfObject* copy; HsfObject* var_r27; temp_r30 = Hu3DData[arg0].hsfData; var_r27 = temp_r30->object; strcpy(&name, MakeObjectName(arg1)); for (i = 0; i < temp_r30->objectCnt; i++, var_r27++) { copy = var_r27; if (copy->constData != 0) { if (strcmp(&name, copy->name) == 0) { constData = copy->constData; constData->hook = arg2; data = &Hu3DData[arg2]; data->attr |= HU3D_ATTR_HOOK; (void)data; return; } } } OSReport("Error: Not Found %s for HookSet\n", arg1); } void Hu3DModelHookReset(s16 arg0) { HsfConstData* temp_r31; HsfData* temp_r30; HsfObject* copy; ModelData* temp_r28; s16 var_r27; HsfObject* var_r26; s16 temp_r0; temp_r30 = Hu3DData[arg0].hsfData; var_r26 = temp_r30->object; for (var_r27 = 0; var_r27 < temp_r30->objectCnt; var_r27++, var_r26++) { copy = var_r26; if (copy->constData != 0) { temp_r31 = copy->constData; if (temp_r31->hook != -1) { temp_r0 = temp_r31->hook; temp_r28 = &Hu3DData[temp_r0]; temp_r28->attr &= ~HU3D_ATTR_HOOK; temp_r31->hook = -1; (void)temp_r28; } } } } void Hu3DModelHookObjReset(s16 arg0, char *arg1) { char name[0x100]; ModelData* temp_r28; HsfData* temp_r30; HsfObject* copy; HsfConstData* temp_r29; s16 i; HsfObject* var_r26; s16 temp_r0; temp_r30 = Hu3DData[arg0].hsfData; var_r26 = temp_r30->object; strcpy(&name, MakeObjectName(arg1)); for (i = 0; i < temp_r30->objectCnt; i++, var_r26++) { copy = var_r26; if (copy->constData != 0) { if (strcmp(&name, copy->name) == 0) { temp_r29 = copy->constData; temp_r0 = temp_r29->hook; temp_r28 = &Hu3DData[temp_r0]; temp_r28->attr &= ~HU3D_ATTR_HOOK; temp_r29->hook = -1; (void)temp_r28; return; } } } OSReport("Error: Not Found %s for HookReset\n", arg1); } void Hu3DModelProjectionSet(s16 arg0, s16 arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->unk_02 = temp_r31->unk_02 | (1 << arg1); } void Hu3DModelProjectionReset(s16 arg0, s16 arg1) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->unk_02 &= ~(1 << arg1); } void Hu3DModelHiliteTypeSet(s16 arg0, s16 arg1) { HsfData* temp_r30; HsfMaterial* var_r31; ModelData* temp_r29; ModelData* temp_r5; s16 i; s32 temp; temp_r5 = &Hu3DData[arg0]; temp_r30 = temp_r5->hsfData; var_r31 = temp_r30->material; arg1 = ((s16) arg1) * 0x10; arg1 &= 0xF0; for (i = 0; i < temp_r30->materialCnt; i++, var_r31++) { var_r31->pass = var_r31->pass & 0xF | arg1; var_r31->flags |= 0x100; } temp_r29 = &Hu3DData[arg0]; temp_r29->attr |= HU3D_ATTR_HILITE; (void)temp_r29; } void Hu3DModelReflectTypeSet(s16 arg0, s16 arg1) { ModelData *copy = &Hu3DData[arg0]; copy->unk_04 = arg1; } CameraData defCamera = { 45.0f, 20.0f, 5000.0f, 0.0f, HU_DISP_ASPECT, {0.0f, 0.0f, 100.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, 0, 0, HU_FB_WIDTH, HU_FB_HEIGHT, 0.0f, 0.0f, HU_FB_WIDTH, HU_FB_HEIGHT, 0.0f, 1.0f }; void Hu3DCameraCreate(s32 cam) { s16 mask; s16 i; CameraData* cam_ptr; defCamera.viewport_w = RenderMode->fbWidth; defCamera.viewport_h = RenderMode->efbHeight; defCamera.scissor_w = RenderMode->fbWidth; defCamera.scissor_h = RenderMode->efbHeight; Hu3DCameraExistF |= cam; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; *cam_ptr = defCamera; } } } void Hu3DCameraPerspectiveSet(s32 cam, f32 fov, f32 nnear, f32 ffar, f32 aspect) { s16 mask; s16 i; CameraData* cam_ptr; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; cam_ptr->fov = fov; cam_ptr->nnear = nnear; cam_ptr->ffar = ffar; cam_ptr->aspect = aspect; } } } void Hu3DCameraViewportSet(s32 cam, f32 vx, f32 vy, f32 vw, f32 vh, f32 nz, f32 fz) { s16 mask; s16 i; CameraData* cam_ptr; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; cam_ptr->viewport_x = vx; cam_ptr->viewport_y = vy; cam_ptr->viewport_w = vw; cam_ptr->viewport_h = vh; cam_ptr->near_z = nz; cam_ptr->far_z = fz; } } } void Hu3DCameraScissorSet(s32 cam, u32 x, u32 y, u32 w, u32 h) { s16 mask; s16 i; CameraData* cam_ptr; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; cam_ptr->scissor_x = x; cam_ptr->scissor_y = y; cam_ptr->scissor_w = w; cam_ptr->scissor_h = h; } } } void Hu3DCameraPosSet(s32 cam, f32 x, f32 y, f32 z, f32 ux, f32 uy, f32 uz, f32 tx, f32 ty, f32 tz) { s16 mask; s16 i; CameraData* cam_ptr; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; cam_ptr->pos.x = x; cam_ptr->pos.y = y; cam_ptr->pos.z = z; cam_ptr->up.x = ux; cam_ptr->up.y = uy; cam_ptr->up.z = uz; cam_ptr->target.x = tx; cam_ptr->target.y = ty; cam_ptr->target.z = tz; } } } void Hu3DCameraPosSetV(s32 cam, Vec *pos, Vec *up, Vec *target) { s16 mask; s16 i; CameraData* cam_ptr; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; cam_ptr->pos = *pos; cam_ptr->up = *up; cam_ptr->target = *target; } } } void Hu3DCameraKill(s32 cam) { s16 mask; s16 i; CameraData* cam_ptr; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1) { if ((cam & mask) != 0) { cam_ptr = &Hu3DCamera[i]; cam_ptr->fov = -1.0f; } } } void Hu3DCameraAllKill(void) { CameraData* cam_ptr; CameraData* cam_ptr2; s16 i; s16 mask; s16 j; s16 mask2; cam_ptr = &Hu3DCamera[0]; for (i = 0, mask = 1; i < HU3D_CAM_MAX; i++, mask <<= 1, cam_ptr++) { if (-1.0f != cam_ptr->fov) { for (j = 0, mask2 = 1; j < HU3D_CAM_MAX; j++, mask2 <<= 1) { if ((mask & mask2) != 0) { cam_ptr2 = &Hu3DCamera[j]; cam_ptr2->fov = -1.0f; } } } } Hu3DCameraExistF = 0; } void Hu3DCameraSet(s32 arg0, Mtx arg1) { Mtx44 sp10; Mtx44 spC; CameraData* temp_r31; temp_r31 = &Hu3DCamera[arg0]; C_MTXPerspective(sp10, temp_r31->fov, temp_r31->aspect, temp_r31->nnear, temp_r31->ffar); GXSetProjection(sp10, GX_PERSPECTIVE); if (RenderMode->field_rendering != 0) { GXSetViewportJitter(temp_r31->viewport_x, temp_r31->viewport_y, temp_r31->viewport_w, temp_r31->viewport_h, temp_r31->near_z, temp_r31->far_z, VIGetNextField()); } else { GXSetViewport(temp_r31->viewport_x, temp_r31->viewport_y, temp_r31->viewport_w, temp_r31->viewport_h, temp_r31->near_z, temp_r31->far_z); } GXSetScissor(temp_r31->scissor_x, temp_r31->scissor_y, temp_r31->scissor_w, temp_r31->scissor_h); C_MTXLookAt(arg1, &temp_r31->pos, &temp_r31->up, &temp_r31->target); } BOOL Hu3DModelCameraInfoSet(s16 arg0, u16 arg1) { CameraData* cam; CameraData* temp_r30; CameraData* temp_r29; HsfObject* obj_copy; ModelData* temp_r24; ModelData* temp_r28; HsfObject* var_r23; HsfData* temp_r27; Point3d sp14; Point3d sp8; f32 temp_f31; s16 i; s16 var_r25; s16 var_r26; s16 var_r21; s16 var_r20; temp_r28 = &Hu3DData[arg0]; temp_r27 = temp_r28->hsfData; cam = &Hu3DCamera[arg1]; var_r23 = temp_r27->object; for (i = 0; i < temp_r27->objectCnt; i++, var_r23++) { obj_copy = var_r23; if (obj_copy->type == 7) { temp_f31 = obj_copy->data.base.rot.x; cam->aspect_dupe = temp_f31; VECSubtract((Point3d* ) &obj_copy->camera.target, (Point3d* ) &obj_copy->camera.pos, &sp8); sp14.x = ((sp8.x * sp8.y * (1.0 - cosd(temp_f31))) - (sp8.z * sind(temp_f31))); sp14.y = ((sp8.y * sp8.y) + (1.0f - (sp8.y * sp8.y)) * cosd(temp_f31)); sp14.z = (((sp8.y * sp8.z) * (1.0 - cosd(temp_f31))) + (sp8.x * sind(temp_f31))); VECNormalize(&sp14, &sp8); Hu3DCameraPosSet(arg1, obj_copy->camera.target.x, obj_copy->camera.target.y, obj_copy->camera.target.z, sp8.x, sp8.y, sp8.z, obj_copy->camera.pos.x, obj_copy->camera.pos.y, obj_copy->camera.pos.z); Hu3DCameraPerspectiveSet(arg1, obj_copy->camera.fov, obj_copy->camera.nnear, obj_copy->camera.ffar, HU_DISP_ASPECT); temp_r28->unk_01 = arg1; temp_r24 = &Hu3DData[arg0]; temp_r24->attr |= HU3D_ATTR_CAMERA_MOTON; (void)temp_r24; return 1; } } return 0; } s16 Hu3DModelCameraCreate(s16 arg0, u16 arg1) { ModelData* temp_r31; s16 temp_r3; temp_r3 = Hu3DHookFuncCreate((ModelHookFunc)-1); temp_r31 = &Hu3DData[(s16) temp_r3]; temp_r31->attr &= ~HU3D_ATTR_HOOKFUNC; temp_r31->attr |= HU3D_ATTR_CAMERA | HU3D_ATTR_CAMERA_MOTON; temp_r31->unk_08 = arg0; temp_r31->unk_01 = arg1; return temp_r3; } void Hu3DCameraMotionOn(s16 arg0, s8 arg1) { ModelData* copy; ModelData* copy2; copy2 = &Hu3DData[arg0]; copy2->unk_01 = arg1; copy = &Hu3DData[arg0]; copy->attr |= HU3D_ATTR_CAMERA_MOTON; } void Hu3DCameraMotionStart(s16 arg0, u16 arg1) { ModelData* temp_r30; ModelData* temp_r29; ModelData* temp_r28; ModelData* temp_r27; temp_r28 = &Hu3DData[arg0]; temp_r27 = &Hu3DData[arg0]; temp_r27->unk_01 = arg1; temp_r29 = &Hu3DData[arg0]; temp_r29->attr |= HU3D_ATTR_CAMERA_MOTON; temp_r30 = &Hu3DData[arg0]; temp_r30->motion_attr &= ~HU3D_MOTATTR_PAUSE; Hu3DMotionStartEndSet(arg0, 0.0f, Hu3DMotionMotionMaxTimeGet(temp_r28->unk_08)); Hu3DMotionTimeSet(arg0, 0.0f); } void Hu3DCameraMotionOff(s16 arg0) { ModelData* temp_r31; temp_r31 = &Hu3DData[arg0]; temp_r31->attr &= ~HU3D_ATTR_CAMERA_MOTON; } void Hu3DLighInit(void) { LightData* var_r31; s16 var_r30; var_r31 = Hu3DGlobalLight; for (var_r30 = 0; var_r30 < 8; var_r30++, var_r31++) { var_r31->unk_00 = -1; } var_r31 = Hu3DLocalLight; for (var_r30 = 0; var_r30 < 0x20; var_r30++, var_r31++) { var_r31->unk_00 = -1; } } s16 Hu3DGLightCreate(f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD, u8 arg0, u8 arg1, u8 arg2) { Vec vec1; Vec vec2; GXColor color; vec1.x = arg8; vec1.y = arg9; vec1.z = argA; vec2.x = argB; vec2.y = argC; vec2.z = argD; color.r = arg0; color.g = arg1; color.b = arg2; color.a = 0xFF; return Hu3DGLightCreateV(&vec1, &vec2, &color); } inline s16 Hu3DLightCreateV(LightData *light, Vec *arg0, Vec *arg1, GXColor *arg2) { light->unk_00 = 0; light->unk_1C = *arg0; light->unk_28 = *arg1; light->unk_34.x = light->unk_34.y = light->unk_34.z = 0.0f; light->unk_04 = 30.0f; light->unk_02 = 2; VECNormalize(&light->unk_28, &light->unk_28); light->color = *arg2; } s16 Hu3DGLightCreateV(Vec* pos, Vec* dir, GXColor* color) { s16 var_r30; LightData* var_r31; var_r31 = Hu3DGlobalLight; for (var_r30 = 0; var_r30 < 8; var_r30++, var_r31++) { if (var_r31->unk_00 == -1) { break; } } if (var_r30 == 8) { return -1; } Hu3DLightCreateV(var_r31, pos, dir, color); return var_r30; } s16 Hu3DLLightCreate(s16 arg0, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD, u8 arg1, u8 arg2, u8 arg3) { Vec vec1; Vec vec2; GXColor color; vec1.x = arg8; vec1.y = arg9; vec1.z = argA; vec2.x = argB; vec2.y = argC; vec2.z = argD; color.r = arg1; color.g = arg2; color.b = arg3; color.a = 0xFF; return Hu3DLLightCreateV(arg0, &vec1, &vec2, &color); } s16 Hu3DLLightCreateV(s16 arg0, Vec* arg1, Vec* arg2, GXColor* arg3) { ModelData* temp_r29; s16 var_r28; s16 var_r30; LightData* var_r31; temp_r29 = &Hu3DData[arg0]; var_r31 = Hu3DLocalLight; for (var_r28 = 0; var_r28 < 0x20; var_r28++, var_r31++) { if (var_r31->unk_00 == -1) { break; } } if (var_r28 == 0x20) { return -1; } Hu3DLightCreateV(var_r31, arg1, arg2, arg3); for (var_r30 = 0; var_r30 < 8; var_r30++) { if (temp_r29->unk_38[var_r30] == -1) { break; } } if (var_r30 == 8) { return -1; } temp_r29->unk_38[var_r30] = var_r28; temp_r29->attr |= HU3D_ATTR_LLIGHT; return var_r30; } inline void Hu3DLightSpotSet(LightData *light, u16 arg1, f32 arg8) { light->unk_00 &= 0xFF00; light->unk_04 = arg8; light->unk_02 = arg1; } void Hu3DGLightSpotSet(s16 arg0, f32 arg8, u16 arg1) { LightData *light = &Hu3DGlobalLight[arg0]; Hu3DLightSpotSet(light, arg1, arg8); } void Hu3DLLightSpotSet(s16 arg0, s16 arg1, f32 arg8, u16 arg2) { ModelData* data; LightData* light; data = &Hu3DData[arg0]; light = &Hu3DLocalLight[data->unk_38[arg1]]; Hu3DLightSpotSet(light, arg2, arg8); } inline void Hu3DLightInfinitytSet(LightData *light) { light->unk_00 &= 0xFF00; light->unk_00 |= 1; } void Hu3DGLightInfinitytSet(s16 lightIndex) { LightData* light = &Hu3DGlobalLight[lightIndex]; Hu3DLightInfinitytSet(light); } void Hu3DLLightInfinitytSet(s16 dataIndex, s16 lightIndex) { ModelData* data; LightData* light; data = &Hu3DData[dataIndex]; light = &Hu3DLocalLight[data->unk_38[lightIndex]]; Hu3DLightInfinitytSet(light); } inline void Hu3DLightPointSet(LightData *light, f32 arg8, f32 arg9, u16 arg1) { light->unk_00 &= 0xFF00; light->unk_00 |= 2; light->unk_04 = arg8; light->unk_08 = arg9; light->unk_02 = arg1; } void Hu3DGLightPointSet(s16 arg0, f32 arg8, f32 arg9, u16 arg1) { LightData* light = &Hu3DGlobalLight[arg0]; Hu3DLightPointSet(light, arg8, arg9, arg1); } void Hu3DLLightPointSet(s16 arg0, s16 arg1, f32 arg8, f32 arg9, u16 arg2) { ModelData* data; LightData* light; data = &Hu3DData[arg0]; light = &Hu3DLocalLight[data->unk_38[arg1]]; Hu3DLightPointSet(light, arg8, arg9, arg2); } void Hu3DGLightKill(s16 index) { Hu3DGlobalLight[index].unk_00 = -1; } void Hu3DLLightKill(s16 dataIndex, s16 lightIndex) { ModelData* temp_r31; LightData* light; s16 var_r30; temp_r31 = &Hu3DData[dataIndex]; light = &Hu3DLocalLight[temp_r31->unk_38[lightIndex]]; light->unk_00 = -1; temp_r31->unk_38[lightIndex] = -1; for (var_r30 = 0; var_r30 < 8; var_r30++) { if (temp_r31->unk_38[var_r30] == -1) { break; } } if (var_r30 == 8) { temp_r31->attr &= ~HU3D_ATTR_LLIGHT; } } void Hu3DLightAllKill(void) { s16 i; LightData* light; light = Hu3DGlobalLight; for (i = 0; i < 8; i++, light++) { if (light->unk_00 != -1) { Hu3DGlobalLight[i].unk_00 = -1; } } } inline void Hu3DLightColorSet(LightData *light, u8 r, u8 g, u8 b, u8 a) { light->color.r = r; light->color.g = g; light->color.b = b; light->color.a = a; } void Hu3DGLightColorSet(s16 index, u8 r, u8 g, u8 b, u8 a) { LightData* light = &Hu3DGlobalLight[index]; Hu3DLightColorSet(light, r, g, b, a); } void Hu3DLLightColorSet(s16 dataIndex, s16 lightIndex, u8 r, u8 g, u8 b, u8 a) { ModelData* data; LightData* light; data = &Hu3DData[dataIndex]; light = &Hu3DLocalLight[data->unk_38[lightIndex]]; Hu3DLightColorSet(light, r, g, b, a); } inline void Hu3DLightPosSetV(LightData *light, Vec* pos, Vec* aim) { light->unk_1C = *pos; VECNormalize(aim, &light->unk_28); } void Hu3DGLightPosSetV(s16 index, Vec* pos, Vec* aim) { LightData* light = &Hu3DGlobalLight[index]; Hu3DLightPosSetV(light, pos, aim); } void Hu3DLLightPosSetV(s16 dataIndex, s16 lightIndex, Vec* pos, Vec* aim) { ModelData* data; LightData* light; data = &Hu3DData[dataIndex]; light = &Hu3DLocalLight[data->unk_38[lightIndex]]; Hu3DLightPosSetV(light, pos, aim); } inline void Hu3DLightPosSet(LightData *light, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { light->unk_1C.x = arg8; light->unk_1C.y = arg9; light->unk_1C.z = argA; light->unk_28.x = argB; light->unk_28.y = argC; light->unk_28.z = argD; VECNormalize(&light->unk_28, &light->unk_28); } void Hu3DGLightPosSet(s16 arg0, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { LightData* light; light = &Hu3DGlobalLight[arg0]; Hu3DLightPosSet(light, arg8, arg9, argA, argB, argC, argD); } void Hu3DLLightPosSet(s16 arg0, s16 arg1, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { ModelData* data; LightData* light; data = &Hu3DData[arg0]; light = &Hu3DLocalLight[data->unk_38[arg1]]; Hu3DLightPosSet(light, arg8, arg9, argA, argB, argC, argD); } inline void Hu3DLightPosAimSetV(LightData *light, Vec* pos, Vec* aim) { light->unk_1C = *pos; VECSubtract(aim, pos, &light->unk_28); VECNormalize(&light->unk_28, &light->unk_28); } void Hu3DGLightPosAimSetV(s16 index, Vec* pos, Vec* aim) { LightData* light = &Hu3DGlobalLight[index]; Hu3DLightPosAimSetV(light, pos, aim); } void Hu3DLLightPosAimSetV(s16 dataIndex, s16 lightIndex, Vec* pos, Vec* aim) { ModelData* data; LightData* light; data = &Hu3DData[dataIndex]; light = &Hu3DLocalLight[data->unk_38[lightIndex]]; Hu3DLightPosAimSetV(light, pos, aim); } void Hu3DGLightPosAimSet(s16 arg0, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { Vec pos; Vec aim; LightData *light; LightData *light2; pos.x = arg8; pos.y = arg9; pos.z = argA; aim.x = argB; aim.y = argC; aim.z = argD; light = &Hu3DGlobalLight[arg0]; light2 = light; Hu3DLightPosAimSetV(light2, &pos, &aim); } void Hu3DLLightPosAimSet(s16 arg0, s16 arg1, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { Vec pos; Vec aim; ModelData* data; LightData* light; LightData* light2; pos.x = arg8; pos.y = arg9; pos.z = argA; aim.x = argB; aim.y = argC; aim.z = argD; data = &Hu3DData[arg0]; light = &Hu3DLocalLight[data->unk_38[arg1]]; light2 = light; Hu3DLightPosAimSetV(light2, &pos, &aim); } inline void Hu3DLightStaticSet(LightData *light, s32 arg1) { if (arg1 != 0) { light->unk_00 |= 0x8000; } else { light->unk_00 &= ~0x8000; } } void Hu3DGLightStaticSet(s16 index, s32 arg1) { LightData* light = &Hu3DGlobalLight[index]; Hu3DLightStaticSet(light, arg1); } void Hu3DLLightStaticSet(s16 dataIndex, s16 lightIndex, s32 arg2) { ModelData* data; LightData* light; data = &Hu3DData[dataIndex]; light = &Hu3DLocalLight[data->unk_38[lightIndex]]; Hu3DLightStaticSet(light, arg2); } s32 Hu3DModelLightInfoSet(s16 arg0, s16 arg1) { Vec sp48; Vec sp3C; Vec sp30; LightData* sp1C; s16 sp12; u8 spE; u8 spD; u8 spC; HsfData* temp_r21; HsfObject* var_r18; HsfObject* var_r31; ModelData* temp_r28; s16 var_r17; s16 var_r25; temp_r28 = &Hu3DData[arg0]; temp_r21 = temp_r28->hsfData; if (temp_r28->unk_26 != 0) { return temp_r28->unk_26; } var_r31 = temp_r21->object; for (var_r17 = var_r25 = 0; var_r17 < temp_r21->objectCnt; var_r17++, var_r31++) { var_r18 = var_r31; if (var_r18->type != 8) { continue; } sp48.x = var_r18->light.target.x - var_r18->light.pos.x; sp48.y = var_r18->light.target.y - var_r18->light.pos.y; sp48.z = var_r18->light.target.z - var_r18->light.pos.z; spC = var_r18->light.b; spD = var_r18->light.g; spE = var_r18->light.r; sp12 = Hu3DGLightCreate(var_r18->light.pos.x, var_r18->light.pos.y, var_r18->light.pos.z, sp48.x, sp48.y, sp48.z, spE, spD, spC); temp_r28->unk_28[var_r25] = sp12; sp1C = &Hu3DGlobalLight[sp12]; Hu3DGLightStaticSet(sp12, arg1); switch (var_r18->light.type) { case 0: Hu3DGLightSpotSet(sp12, var_r18->light.cutoff, 2); break; case 1: Hu3DGLightPointSet(sp12, var_r18->data.base.scale.x - var_r18->data.base.rot.z, 1.0f, 2); Hu3DGLightPosSet(sp12, var_r18->light.pos.x, var_r18->light.pos.y, var_r18->light.pos.z, var_r18->light.target.x, var_r18->light.target.y, var_r18->light.target.z); break; case 2: Hu3DGLightInfinitytSet(sp12); break; } var_r25++; if (var_r25 >= 8) { break; } } temp_r28->unk_26 = var_r25; return var_r25; } s16 Hu3DLightSet(ModelData* arg0, Mtx *arg1, Mtx *arg2, f32 arg8) { s16 var_r30; LightData* var_r29; s16 var_r28; s16 i; var_r28 = 0; var_r30 = 1; var_r29 = Hu3DGlobalLight; for (i = 0; i < 8; i++, var_r29++) { if (var_r29->unk_00 != -1) { lightSet(var_r29, var_r30, arg2, arg1, arg8); var_r28 |= var_r30; var_r30 <<= 1; } } if ((arg0->attr & HU3D_ATTR_LLIGHT) != 0) { for (i = 0; i < 8; i++) { if (arg0->unk_38[i] != -1) { var_r29 = &Hu3DLocalLight[arg0->unk_38[i]]; lightSet(var_r29, var_r30, arg2, arg1, arg8); var_r28 |= var_r30; var_r30 <<= 1; } } } return var_r28; } void lightSet(LightData* arg0, s16 arg1, Mtx *arg2, Mtx *arg3, f32 arg8) { GXLightObj sp30; Point3d sp24; Point3d sp18; switch ((u8)arg0->unk_00) { case 0: GXInitLightAttn(&sp30, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); GXInitLightSpot(&sp30, arg0->unk_04, arg0->unk_02); break; case 1: GXInitLightAttn(&sp30, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f); GXInitLightSpot(&sp30, 20.0f, GX_SP_COS); GXInitLightAttnK(&sp30, 1.0f, 0.0f, 0.0f); VECScale(&arg0->unk_28, &arg0->unk_1C, -1000000.0f); break; case 2: GXInitLightAttn(&sp30, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); GXInitLightDistAttn(&sp30, arg0->unk_04, arg0->unk_08, arg0->unk_02); break; } if ((arg0->unk_00 & 0x8000) != 0) { 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); sp24 = arg0->unk_28; } if (0.0f == arg8) { GXInitLightDir(&sp30, sp24.x, sp24.y, sp24.z); } else { GXInitSpecularDir(&sp30, sp24.x, sp24.y, sp24.z); GXInitLightAttn(&sp30, 0.0f, 0.0f, 1.0f, arg8 / 2, 0.0f, 1.0f - (arg8 / 2)); } GXInitLightColor(&sp30, arg0->color); GXLoadLightObjImm(&sp30, arg1); } void Hu3DReflectMapSet(AnimData* arg0) { if (reflectAnim[0] != (AnimData*) refMapData0) { HuMemDirectFree(reflectAnim[0]); } reflectAnim[0] = HuSprAnimRead(arg0); reflectMapNo = 0; } void Hu3DReflectNoSet(s16 arg0) { reflectMapNo = arg0; } void Hu3DFogSet(f32 arg0, f32 arg1, u8 arg2, u8 arg3, u8 arg4) { FogData.fogType = 4; FogData.start = arg0; FogData.end = arg1; FogData.color.r = arg2; FogData.color.g = arg3; FogData.color.b = arg4; FogData.color.a = 0xFF; } void Hu3DFogClear(void) { FogData.fogType = 0; GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, BGColor); } void Hu3DShadowCreate(f32 arg8, f32 arg9, f32 argA) { Hu3DShadowData.unk_02 = 0xC0; if (Hu3DShadowData.unk_04 == 0) { Hu3DShadowData.unk_04 = HuMemDirectMalloc(HEAP_DATA, SHADOW_HEAP_SIZE); } Hu3DShadowData.unk_08.x = arg8; Hu3DShadowData.unk_08.y = arg9; Hu3DShadowData.unk_08.z = argA; Hu3DShadowData.unk_14.x = 300.0f; Hu3DShadowData.unk_14.y = 300.0f; Hu3DShadowData.unk_14.z = 0.0f; Hu3DShadowData.unk_20.x = Hu3DShadowData.unk_20.y = Hu3DShadowData.unk_20.z = 0.0f; Hu3DShadowData.unk_2C.x = -1.0f; Hu3DShadowData.unk_2C.y = 1.0f; Hu3DShadowData.unk_2C.z = 0.0f; C_MTXLightPerspective(Hu3DShadowData.unk_68, arg8, HU_DISP_ASPECT, 0.5f, -0.5f, 0.5f, 0.5f); VECNormalize(&Hu3DShadowData.unk_2C, &Hu3DShadowData.unk_2C); Hu3DShadowData.unk_00 = 0x80; Hu3DShadowF = 1; } void Hu3DShadowPosSet(Vec* camPos, Vec* camUp, Vec* camTarget) { Hu3DShadowData.unk_14 = *camPos; Hu3DShadowData.unk_20 = *camTarget; Hu3DShadowData.unk_2C = *camUp; } void Hu3DShadowTPLvlSet(f32 arg8) { Hu3DShadowData.unk_00 = 255.0f * arg8; } void Hu3DShadowSizeSet(u16 arg0) { Hu3DShadowData.unk_02 = arg0; if (Hu3DShadowData.unk_04 != 0) { HuMemDirectFree(Hu3DShadowData.unk_04); } Hu3DShadowData.unk_04 = HuMemDirectMalloc(HEAP_DATA, arg0 * arg0); } void Hu3DShadowExec(void) { ModelData* var_r31; s16 var_r30; Mtx spB8; Mtx sp88; Mtx sp58; Mtx44 sp18; GXColor sp14 = {0, 0, 0, 0}; s32 test; s32 test2; Hu3DDrawPreInit(); GXSetCopyClear(sp14, 0xFFFFFF); C_MTXPerspective(sp18, Hu3DShadowData.unk_08.x, HU_DISP_ASPECT, Hu3DShadowData.unk_08.y, Hu3DShadowData.unk_08.z); GXSetProjection(sp18, GX_PERSPECTIVE); if (Hu3DShadowData.unk_02 <= 0xF0) { GXSetScissor(2, 2, Hu3DShadowData.unk_02 * 2 - 4, Hu3DShadowData.unk_02 * 2 - 4); GXSetViewport(0.0f, 0.0f, Hu3DShadowData.unk_02 * 2, Hu3DShadowData.unk_02 * 2, 0.0f, 1.0f); test = (Hu3DShadowData.unk_02 / 2) * (Hu3DShadowData.unk_02 / 2); } else { GXSetScissor(1, 1, Hu3DShadowData.unk_02 - 2, Hu3DShadowData.unk_02 - 2); GXSetViewport(0.0f, 0.0f, Hu3DShadowData.unk_02, Hu3DShadowData.unk_02, 0.0f, 1.0f); test = Hu3DShadowData.unk_02 * Hu3DShadowData.unk_02; } C_MTXLookAt(Hu3DCameraMtx, &Hu3DShadowData.unk_14, &Hu3DShadowData.unk_2C, &Hu3DShadowData.unk_20); MTXCopy(Hu3DCameraMtx, Hu3DShadowData.unk_38); var_r31 = Hu3DData; shadowModelDrawF = 1; GXInvalidateTexAll(); GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, BGColor); for (var_r30 = 0; var_r30 < HU3D_MODEL_MAX; var_r30++, var_r31++) { if (var_r31->hsfData != 0 && (var_r31->attr & HU3D_ATTR_SHADOW) != 0 && (var_r31->attr & HU3D_ATTR_DISPOFF) == 0 && (var_r31->attr & HU3D_ATTR_HOOK) == 0) { if ((var_r31->attr & HU3D_ATTR_MOTION_OFF) != 0) { test2 = 0; if (var_r31->unk_08 != -1) { Hu3DMotionExec(var_r30, var_r31->unk_08, var_r31->unk_64, 0); } if (var_r31->unk_0C != -1) { Hu3DSubMotionExec(var_r30); } if (var_r31->unk_0A != -1) { Hu3DMotionExec(var_r30, var_r31->unk_0A, var_r31->unk_74, 1); } if ((var_r31->attr & HU3D_ATTR_CLUSTER_ON) != 0) { ClusterMotionExec(var_r31); test2 = 1; } if (var_r31->unk_0E != -1) { if (var_r31->unk_08 == -1) { Hu3DMotionExec(var_r30, var_r31->unk_0E, var_r31->unk_94, 0); } else { Hu3DMotionExec(var_r30, var_r31->unk_0E, var_r31->unk_94, 1); } } if ((var_r31->attr & (HU3D_ATTR_HOOKFUNC|HU3D_ATTR_ENVELOPE_OFF)) == 0 || (var_r31->motion_attr & HU3D_MOTATTR_PAUSE) == 0) { test2 = 1; InitVtxParm(var_r31->hsfData); if (var_r31->unk_0E != -1) { ShapeProc(var_r31->hsfData); } if ((var_r31->attr & HU3D_ATTR_CLUSTER_ON) != 0) { ClusterProc(var_r31); } if (var_r31->hsfData->cenvCnt != 0) { EnvelopeProc(var_r31->hsfData); } PPCSync(); } var_r31->attr |= HU3D_ATTR_MOT_EXEC; } mtxRot(sp58, var_r31->rot.x, var_r31->rot.y, var_r31->rot.z); 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); MTXConcat(Hu3DCameraMtx, spB8, sp88); MTXConcat(sp88, var_r31->unk_F0, sp88); Hu3DDraw(var_r31, sp88, &var_r31->scale); } } Hu3DDrawPost(); shadowModelDrawF = 0; if (Hu3DShadowData.unk_02 <= 0xF0) { GXSetTexCopySrc(0, 0, Hu3DShadowData.unk_02 * 2, Hu3DShadowData.unk_02 * 2); GXSetTexCopyDst(Hu3DShadowData.unk_02, Hu3DShadowData.unk_02, GX_CTF_R8, 1); } else { GXSetTexCopySrc(0, 0, Hu3DShadowData.unk_02, Hu3DShadowData.unk_02); GXSetTexCopyDst(Hu3DShadowData.unk_02, Hu3DShadowData.unk_02, GX_CTF_R8, 0); } GXCopyTex(Hu3DShadowData.unk_04, 1); GXSetViewport(0.0f, 0.0f, RenderMode->fbWidth, RenderMode->xfbHeight, 0.0f, 1.0f); GXSetScissor(0, 0, RenderMode->fbWidth, RenderMode->efbHeight); C_MTXOrtho(sp18, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); GXSetProjection(sp18, GX_ORTHOGRAPHIC); GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_U8, 0); GXSetTevColor(GX_TEVREG0, BGColor); GXSetNumTexGens(0); GXSetNumTevStages(1); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C0); GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1U, GX_TEVPREV); 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); MTXIdentity(sp88); GXLoadPosMtxImm(sp88, 0); GXSetZMode(0, GX_ALWAYS, 1); GXSetNumChans(1); GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_CLAMP, GX_AF_NONE); GXBegin(GX_QUADS, GX_VTXFMT0, 4); GXColor3u8(0, 0, 0); GXColor3u8(1, 0, 0); GXColor3u8(1, 1, 0); GXColor3u8(0, 1, 0); } s16 Hu3DProjectionCreate(void *arg0, f32 arg8, f32 arg9, f32 argA) { s16 var_r30; ThreeDProjectionStruct* var_r31; var_r31 = Hu3DProjection; for (var_r30 = 0; var_r30 < 4; var_r30++, var_r31++) { if (var_r31->unk_04 == 0U) { break; } } if ((s16) var_r30 == 4) { return -1; } var_r31->unk_04 = arg0; var_r31->unk_08.x = arg8; var_r31->unk_08.y = arg9; var_r31->unk_08.z = argA; var_r31->unk_14.x = 1000.0f; var_r31->unk_14.y = 1000.0f; var_r31->unk_14.z = 0.0f; var_r31->unk_20.x = var_r31->unk_20.y = var_r31->unk_20.z = 0.0f; var_r31->unk_2C.x = -1.0f; var_r31->unk_2C.y = 1.0f; var_r31->unk_2C.z = 0.0f; C_MTXLightPerspective(var_r31->unk_68, arg8, HU_DISP_ASPECT, 0.5f, -0.5f, 0.5f, 0.5f); VECNormalize(&var_r31->unk_2C, &var_r31->unk_2C); var_r31->unk_00 = 0x80; Hu3DProjectionNum++; return var_r30; } void Hu3DProjectionKill(s16 arg0) { HuSprAnimKill(Hu3DProjection[arg0].unk_04); Hu3DProjection[arg0].unk_04 = NULL; } void Hu3DProjectionPosSet(s16 arg0, Vec* arg1, Vec* arg2, Vec* arg3) { Hu3DProjection[arg0].unk_14 = *arg1; Hu3DProjection[arg0].unk_20 = *arg3; Hu3DProjection[arg0].unk_2C = *arg2; } void Hu3DProjectionTPLvlSet(s16 arg0, f32 arg8) { Hu3DProjection[arg0].unk_00 = 255.0f * arg8; } void Hu3DMipMapSet(char* arg0, s16 arg1, s32 arg2, f32 arg8) { HsfBitmap* temp_r31; AnimBmpData* var_r30; s16 i; HsfData* temp_r27; HsfAttribute* var_r26; ModelData* temp_r25; s32 var_r24; void *var_r23; void* temp_r22; AnimData* temp_r3; temp_r25 = &Hu3DData[arg1]; temp_r27 = temp_r25->hsfData; var_r26 = temp_r27->attribute; for (i = 0; i < temp_r27->attributeCnt; i++, var_r26++) { if (strcmp(arg2, var_r26->bitmap->name) == 0) { break; } } if (i == temp_r27->attributeCnt) { OSReport("Error: Not Found %s for MipMapSet\n", arg2); return; } temp_r31 = var_r26->bitmap; temp_r3 = HuSprAnimRead(arg0); var_r30 = temp_r3->bmp; 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); temp_r22 = var_r23; var_r30 = temp_r3->bmp; temp_r31->data = temp_r22; temp_r31->sizeX = var_r30->sizeX; temp_r31->sizeY = var_r30->sizeY; temp_r31->palSize = var_r30->palNum; temp_r31->palData = var_r30->palData; temp_r31->maxLod = temp_r3->bmpNum; switch (var_r30->dataFmt) { /* irregular */ case 0: temp_r31->dataFmt = 6; break; case 2: temp_r31->dataFmt = 5; break; case 3: temp_r31->dataFmt = 0xA; temp_r31->pixSize = 8; break; case 4: temp_r31->dataFmt = 0xA; temp_r31->pixSize = 4; break; } for (i = 0; i < temp_r3->bmpNum; i++, var_r30++) { memcpy(var_r23, var_r30->data, var_r30->dataSize); var_r23 = (void*) ((int) var_r23 + var_r30->dataSize); } DCFlushRange(temp_r22, var_r24); }