From 5a2cd47fba01c81e971fd0212c1371014a2995de Mon Sep 17 00:00:00 2001 From: CreateSource Date: Tue, 26 Dec 2023 22:00:05 -0500 Subject: [PATCH 1/2] add Hu3DModelLightInfoSet --- configure.py | 2 +- include/game/hsfformat.h | 13 ++ include/game/hsfman.h | 7 +- src/game/hsfman.c | 355 +++++++++++++++++++++++---------------- 4 files changed, 224 insertions(+), 153 deletions(-) diff --git a/configure.py b/configure.py index 694a9610..f8c8ea01 100644 --- a/configure.py +++ b/configure.py @@ -247,7 +247,7 @@ config.libs = [ Object(Matching, "game/sprput.c"), Object(Matching, "game/hsfload.c"), Object(NonMatching, "game/hsfdraw.c"), - Object(NonMatching, "game/hsfman.c"), + Object(Matching, "game/hsfman.c"), Object(NonMatching, "game/hsfmotion.c"), Object(NonMatching, "game/hsfanim.c"), Object(NonMatching, "game/hsfex.c"), diff --git a/include/game/hsfformat.h b/include/game/hsfformat.h index e81d5c84..b0b40ed2 100644 --- a/include/game/hsfformat.h +++ b/include/game/hsfformat.h @@ -285,6 +285,18 @@ typedef struct hsf_camera { float far; } HsfCamera; +typedef struct hsf_light { + HsfVector3f pos; + HsfVector3f target; + u8 type; + u8 r; + u8 g; + u8 b; + float unk2C; + float ref_distance; + float ref_brightness; + float cutoff; +} HsfLight; typedef struct hsf_object { char *name; u32 type; @@ -293,6 +305,7 @@ typedef struct hsf_object { union { HsfObjectData data; HsfCamera camera; + HsfLight light; }; } HsfObject; diff --git a/include/game/hsfman.h b/include/game/hsfman.h index c3306522..b331ac33 100644 --- a/include/game/hsfman.h +++ b/include/game/hsfman.h @@ -30,8 +30,8 @@ typedef struct model_data { s16 unk_20; u16 camera; s16 unk_24; - s16 unk_26; - char unk_28[0x10]; + u16 unk_26; + u16 unk_28[8]; s16 unk_38[8]; HsfData *unk_48; HsfData *unk_4C; @@ -205,7 +205,6 @@ void Hu3DCameraKill(s32); void Hu3DCameraAllKill(void); void Hu3DCameraSet(s32, Mtx); BOOL Hu3DModelCameraInfoSet(s16, u16); -BOOL Hu3DModelLightInfoSet(s16, u16); s16 Hu3DModelCameraCreate(s16, u16); void Hu3DCameraMotionOn(s16, s8); void Hu3DCameraMotionStart(s16, u16); @@ -236,7 +235,7 @@ void Hu3DGLightPosAimSet(s16, f32, f32, f32, f32, f32, f32); void Hu3DLLightPosAimSet(s16, s16, f32, f32, f32, f32, f32, f32); void Hu3DGLightStaticSet(s16, s32); void Hu3DLLightStaticSet(s16, s16, s32); -//... +s32 Hu3DModelLightInfoSet(s16, s16); s16 Hu3DLightSet(ModelData*, s32, s32, f32); void lightSet(LightData*, s16, s32, s32, f32); //... diff --git a/src/game/hsfman.c b/src/game/hsfman.c index 9f3a1798..9ffb78d4 100644 --- a/src/game/hsfman.c +++ b/src/game/hsfman.c @@ -1445,66 +1445,68 @@ s16 Hu3DLLightCreateV(s16 arg0, Vec* arg1, Vec* arg2, GXColor* arg3) { return var_r30; } -void Hu3DGLightSpotSet(s16 arg0, u16 arg1, f32 arg8) { - LightData* temp_r31; +inline void Hu3DLightSpotSet(LightData *light, u16 arg1, f32 arg8) { + light->unk_00 &= 0xFF00; + light->unk_04 = arg8; + light->unk_02 = arg1; +} - temp_r31 = &Hu3DGlobalLight[arg0]; - temp_r31->unk_00 &= 0xFF00; - temp_r31->unk_04 = arg8; - temp_r31->unk_02 = arg1; +void Hu3DGLightSpotSet(s16 arg0, u16 arg1, f32 arg8) { + LightData *light = &Hu3DGlobalLight[arg0]; + + Hu3DLightSpotSet(light, arg1, arg8); } void Hu3DLLightSpotSet(s16 arg0, s16 arg1, u16 arg2, f32 arg8) { ModelData* data; - LightData* temp_r31; + LightData* light; data = &Hu3DData[arg0]; - temp_r31 = &Hu3DLocalLight[data->unk_38[arg1]]; - temp_r31->unk_00 &= 0xFF00; - temp_r31->unk_04 = arg8; - temp_r31->unk_02 = arg2; + 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* temp_r31; - - temp_r31 = &Hu3DGlobalLight[lightIndex]; - temp_r31->unk_00 &= 0xFF00; - temp_r31->unk_00 |= 1; + LightData* light = &Hu3DGlobalLight[lightIndex]; + + Hu3DLightInfinitytSet(light); } void Hu3DLLightInfinitytSet(s16 dataIndex, s16 lightIndex) { ModelData* data; - LightData* temp_r31; + LightData* light; data = &Hu3DData[dataIndex]; - temp_r31 = &Hu3DLocalLight[data->unk_38[lightIndex]]; - temp_r31->unk_00 &= 0xFF00; - temp_r31->unk_00 |= 1; + light = &Hu3DLocalLight[data->unk_38[lightIndex]]; + Hu3DLightInfinitytSet(light); +} + +inline void Hu3DLightPointSet(LightData *light, u16 arg1, f32 arg8, f32 arg9) { + light->unk_00 &= 0xFF00; + light->unk_00 |= 2; + light->unk_04 = arg8; + light->unk_08 = arg9; + light->unk_02 = arg1; } void Hu3DGLightPointSet(s16 arg0, u16 arg1, f32 arg8, f32 arg9) { - LightData* temp_r31; - - temp_r31 = &Hu3DGlobalLight[arg0]; - temp_r31->unk_00 &= 0xFF00; - temp_r31->unk_00 |= 2; - temp_r31->unk_04 = arg8; - temp_r31->unk_08 = arg9; - temp_r31->unk_02 = arg1; + LightData* light = &Hu3DGlobalLight[arg0]; + + Hu3DLightPointSet(light, arg1, arg8, arg9); } void Hu3DLLightPointSet(s16 arg0, s16 arg1, u16 arg2, f32 arg8, f32 arg9) { ModelData* data; - LightData* temp_r31; + LightData* light; data = &Hu3DData[arg0]; - temp_r31 = &Hu3DLocalLight[data->unk_38[arg1]]; - temp_r31->unk_00 &= 0xFF00; - temp_r31->unk_00 |= 2; - temp_r31->unk_04 = arg8; - temp_r31->unk_08 = arg9; - temp_r31->unk_02 = arg2; + light = &Hu3DLocalLight[data->unk_38[arg1]]; + Hu3DLightPointSet(light, arg2, arg8, arg9); } void Hu3DGLightKill(s16 index) { @@ -1543,161 +1545,218 @@ void Hu3DLightAllKill(void) { } } -void Hu3DGLightColorSet(s16 arg0, u8 arg1, u8 arg2, u8 arg3, u8 arg4) { +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; - light = &Hu3DGlobalLight[arg0]; - light->color.r = arg1; - light->color.g = arg2; - light->color.b = arg3; - light->color.a = arg4; + data = &Hu3DData[dataIndex]; + light = &Hu3DLocalLight[data->unk_38[lightIndex]]; + Hu3DLightColorSet(light, r, g, b, a); } -void Hu3DLLightColorSet(s16 arg0, s16 arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5) { +inline void Hu3DLightPosSetV(LightData *light, Vec* pos, Vec* aim) { + light->unk_1C = *pos; + PSVECSubtract(aim, pos, &light->unk_28); + PSVECNormalize(&light->unk_28, &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; - ModelData* data; - data = &Hu3DData[arg0]; - light = &Hu3DLocalLight[data->unk_38[arg1]]; - light->color.r = arg2; - light->color.g = arg3; - light->color.b = arg4; - light->color.a = arg5; + data = &Hu3DData[dataIndex]; + light = &Hu3DLocalLight[data->unk_38[lightIndex]]; + Hu3DLightPosSetV(light, pos, aim); } -void Hu3DGLightPosSetV(s16 arg0, Vec* arg1, Point3d* arg2) { - Point3d* spC; - s16 sp8; - LightData* temp_r31; - - temp_r31 = &Hu3DGlobalLight[arg0]; - temp_r31->unk_1C = *arg1; - - PSVECNormalize(arg2, &temp_r31->unk_28); -} - -void Hu3DLLightPosSetV(s16 arg0, s16 arg1, Vec* arg2, Point3d* arg3) { - ModelData* data; - LightData* temp_r31; - - data = &Hu3DData[arg0]; - temp_r31 = &Hu3DLocalLight[data->unk_38[arg1]]; - temp_r31->unk_1C = *arg2; - - PSVECNormalize(arg3, &temp_r31->unk_28); +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; + PSVECNormalize(&light->unk_28, &light->unk_28); } void Hu3DGLightPosSet(s16 arg0, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { - LightData* temp_r31; + LightData* light; - temp_r31 = &Hu3DGlobalLight[arg0]; - temp_r31->unk_1C.x = arg8; - temp_r31->unk_1C.y = arg9; - temp_r31->unk_1C.z = argA; - temp_r31->unk_28.x = argB; - temp_r31->unk_28.y = argC; - temp_r31->unk_28.z = argD; - PSVECNormalize(&temp_r31->unk_28, &temp_r31->unk_28); + 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* temp_r31; + LightData* light; data = &Hu3DData[arg0]; - temp_r31 = &Hu3DLocalLight[data->unk_38[arg1]]; - temp_r31->unk_1C.x = arg8; - temp_r31->unk_1C.y = arg9; - temp_r31->unk_1C.z = argA; - temp_r31->unk_28.x = argB; - temp_r31->unk_28.y = argC; - temp_r31->unk_28.z = argD; - PSVECNormalize(&temp_r31->unk_28, &temp_r31->unk_28); + light = &Hu3DLocalLight[data->unk_38[arg1]]; + Hu3DLightPosSet(light, arg8, arg9, argA, argB, argC, argD); } -void Hu3DGLightPosAimSetV(s16 arg0, Point3d* arg1, Point3d* arg2) { - LightData* temp_r31; +inline void Hu3DLightPosAimSetV(LightData *light, Vec* pos, Vec* aim) { + light->unk_1C = *pos; + PSVECSubtract(aim, pos, &light->unk_28); + PSVECNormalize(&light->unk_28, &light->unk_28); +} - temp_r31 = &Hu3DGlobalLight[arg0]; - temp_r31->unk_1C = *arg1; +void Hu3DGLightPosAimSetV(s16 index, Vec* pos, Vec* aim) { + LightData* light = &Hu3DGlobalLight[index]; - PSVECSubtract(arg2, arg1, &temp_r31->unk_28); - PSVECNormalize(&temp_r31->unk_28, &temp_r31->unk_28); + Hu3DLightPosAimSetV(light, pos, aim); } -void Hu3DLLightPosAimSetV(s16 arg0, s16 arg1, Point3d* arg2, Point3d* arg3) { +void Hu3DLLightPosAimSetV(s16 dataIndex, s16 lightIndex, Vec* pos, Vec* aim) { ModelData* data; - LightData* temp_r31; + LightData* light; - data = &Hu3DData[arg0]; - temp_r31 = &Hu3DLocalLight[data->unk_38[arg1]]; - temp_r31->unk_1C = *arg2; - - PSVECSubtract(arg3, arg2, &temp_r31->unk_28); - PSVECNormalize(&temp_r31->unk_28, &temp_r31->unk_28); + 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 vec2; - Vec vec1; - LightData* temp_r30; - LightData* temp_r31; + Vec pos; + Vec aim; + LightData *light; + LightData *light2; - vec2.x = arg8; - vec2.y = arg9; - vec2.z = argA; - vec1.x = argB; - vec1.y = argC; - vec1.z = argD; - - temp_r30 = &Hu3DGlobalLight[arg0]; - temp_r31 = temp_r30; - temp_r31->unk_1C = vec2; - PSVECSubtract(&vec1, &vec2, &temp_r31->unk_28); - PSVECNormalize(&temp_r31->unk_28, &temp_r31->unk_28); + 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 vec2; - Vec vec1; + Vec pos; + Vec aim; ModelData* data; - LightData* temp_r30; - LightData* temp_r31; + LightData* light; + LightData* light2; - vec2.x = arg8; - vec2.y = arg9; - vec2.z = argA; - vec1.x = argB; - vec1.y = argC; - vec1.z = argD; + 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]; - data = &Hu3DData[arg0]; - temp_r30 = &Hu3DLocalLight[data->unk_38[arg1]]; - temp_r31 = temp_r30; - temp_r31->unk_1C = vec2; - PSVECSubtract(&vec1, &vec2, &temp_r31->unk_28); - PSVECNormalize(&temp_r31->unk_28, &temp_r31->unk_28); + Hu3DLightStaticSet(light, arg1); } -void Hu3DGLightStaticSet(s16 arg0, s32 arg1) { - LightData* temp_r31; - - temp_r31 = &Hu3DGlobalLight[arg0]; - if (arg1 != 0) temp_r31->unk_00 |= 0x8000; - else temp_r31->unk_00 &= ~0x8000; -} - -void Hu3DLLightStaticSet(s16 arg0, s16 arg1, s32 arg2) { +void Hu3DLLightStaticSet(s16 dataIndex, s16 lightIndex, s32 arg2) { ModelData* data; - LightData* temp_r31; + LightData* light; - data = &Hu3DData[arg0]; - temp_r31 = &Hu3DLocalLight[data->unk_38[arg1]]; - if (arg2 != 0) temp_r31->unk_00 |= 0x8000; - else temp_r31->unk_00 &= ~0x8000; + 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, 2, var_r18->light.cutoff); + break; + case 1: + Hu3DGLightPointSet(sp12, 2, var_r18->data.base.scale.x - var_r18->data.base.rot.z, 1.0f); + 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, s32 arg1, s32 arg2, f32 arg8) { s16 var_r30; From 485bec5ec9ead95fecaff2e29c28b5c9439f5dea Mon Sep 17 00:00:00 2001 From: CreateSource Date: Wed, 27 Dec 2023 00:40:17 -0500 Subject: [PATCH 2/2] technically matching... --- configure.py | 2 +- include/game/hsfman.h | 23 +++-- src/game/hsfman.c | 229 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 223 insertions(+), 31 deletions(-) diff --git a/configure.py b/configure.py index f8c8ea01..694a9610 100644 --- a/configure.py +++ b/configure.py @@ -247,7 +247,7 @@ config.libs = [ Object(Matching, "game/sprput.c"), Object(Matching, "game/hsfload.c"), Object(NonMatching, "game/hsfdraw.c"), - Object(Matching, "game/hsfman.c"), + Object(NonMatching, "game/hsfman.c"), Object(NonMatching, "game/hsfmotion.c"), Object(NonMatching, "game/hsfanim.c"), Object(NonMatching, "game/hsfex.c"), diff --git a/include/game/hsfman.h b/include/game/hsfman.h index b331ac33..7cbb468d 100644 --- a/include/game/hsfman.h +++ b/include/game/hsfman.h @@ -10,6 +10,7 @@ #include "game/init.h" #include "game/data.h" #include "game/memory.h" +#include "dolphin/gx/GXVert.h" #define Hu3DModelCreateFile(data_id) (Hu3DModelCreate(HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) @@ -84,10 +85,16 @@ typedef struct ThreeDProjectionStruct { Mtx unk_68; } ThreeDProjectionStruct; // sizeof 0x98 typedef struct shadow_data { - char unk_00[0x2]; + u8 unk_00; + u8 unk_01; u16 unk_02; - void*unk_04; - char unk_08[0x90]; + void* unk_04; + Vec unk_08; + Vec unk_14; + Vec unk_20; + Vec unk_2C; + Mtx unk_38; + Mtx unk_68; } ShadowData; // sizeof 0x98 typedef struct motion_data { s16 unk_00; @@ -151,6 +158,7 @@ void Hu3DParManAllKill(void); f32 Hu3DMotionMotionMaxTimeGet(s16); void Hu3DMotionStartEndSet(s16, f32, f32); void Hu3DMotionTimeSet(s16, f32); +void GXInitSpecularDir(GXLightObj*, f32, f32, f32); void Hu3DInit(void); void Hu3DPreProc(void); @@ -236,9 +244,10 @@ void Hu3DLLightPosAimSet(s16, s16, f32, f32, f32, f32, f32, f32); void Hu3DGLightStaticSet(s16, s32); void Hu3DLLightStaticSet(s16, s16, s32); s32 Hu3DModelLightInfoSet(s16, s16); -s16 Hu3DLightSet(ModelData*, s32, s32, f32); -void lightSet(LightData*, s16, s32, s32, f32); -//... +s16 Hu3DLightSet(ModelData*, Mtx*, Mtx*, f32); +void lightSet(LightData* arg0, s16 arg1, Mtx *arg2, Mtx *arg3, f32 arg8); +void Hu3DReflectMapSet(AnimData* arg0); +void Hu3DReflectNoSet(s16 arg0); void Hu3DFogSet(f32, f32, u8, u8, u8); void Hu3DFogClear(void); //... @@ -249,8 +258,6 @@ void Hu3DProjectionTPLvlSet(s16, f32); void Hu3DMipMapSet(char*, s16, s32, f32); extern MotionData Hu3DMotion[0x100]; -extern f32 lbl_801D4AFC; -extern GXColor lbl_801D6BE0; extern u32 totalMatCnt; extern u32 totalMatCnted; extern u32 totalPolyCnt; diff --git a/src/game/hsfman.c b/src/game/hsfman.c index 9ffb78d4..5b69fa3b 100644 --- a/src/game/hsfman.c +++ b/src/game/hsfman.c @@ -1345,6 +1345,7 @@ void Hu3DLighInit(void) { } } + s16 Hu3DGLightCreate(f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD, u8 arg0, u8 arg1, u8 arg2) { Vec vec1; Vec vec2; @@ -1363,6 +1364,17 @@ s16 Hu3DGLightCreate(f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD, 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; + PSVECNormalize(&light->unk_28, &light->unk_28); + light->color = *arg2; +} + s16 Hu3DGLightCreateV(Vec* arg0, Vec* arg1, GXColor* arg2) { s16 var_r30; LightData* var_r31; @@ -1377,15 +1389,9 @@ s16 Hu3DGLightCreateV(Vec* arg0, Vec* arg1, GXColor* arg2) { if (var_r30 == 8) { return -1; } - var_r31->unk_00 = 0; - var_r31->unk_1C = *arg0; - var_r31->unk_28 = *arg1; - var_r31->unk_34.x = var_r31->unk_34.y = var_r31->unk_34.z = 0.0f; - var_r31->unk_04 = 0.0f; - var_r31->unk_02 = 2; - - PSVECNormalize(&var_r31->unk_28, &var_r31->unk_28); - var_r31->color = *arg2; + + Hu3DLightCreateV(var_r31, arg0, arg1, arg2); + return var_r30; } @@ -1423,14 +1429,8 @@ s16 Hu3DLLightCreateV(s16 arg0, Vec* arg1, Vec* arg2, GXColor* arg3) { if (var_r28 == 0x20) { return -1; } - var_r31->unk_00 = 0; - var_r31->unk_1C = *arg1; - var_r31->unk_28 = *arg2; - var_r31->unk_34.x = var_r31->unk_34.y = var_r31->unk_34.z = 0.0f; - var_r31->unk_04 = 30.0f; - var_r31->unk_02 = 2; - PSVECNormalize(&var_r31->unk_28, &var_r31->unk_28); - var_r31->color = *arg3; + + Hu3DLightCreateV(var_r31, arg1, arg2, arg3); for (var_r30 = 0; var_r30 < 8; var_r30++) { if (temp_r29->unk_38[var_r30] == -1) { @@ -1758,7 +1758,7 @@ s32 Hu3DModelLightInfoSet(s16 arg0, s16 arg1) { return var_r25; } -s16 Hu3DLightSet(ModelData* arg0, s32 arg1, s32 arg2, f32 arg8) { +s16 Hu3DLightSet(ModelData* arg0, Mtx *arg1, Mtx *arg2, f32 arg8) { s16 var_r30; LightData* var_r29; s16 var_r28; @@ -1772,7 +1772,7 @@ s16 Hu3DLightSet(ModelData* arg0, s32 arg1, s32 arg2, f32 arg8) { if (var_r29->unk_00 != -1) { lightSet(var_r29, var_r30, arg2, arg1, arg8); var_r28 |= var_r30; - var_r30 = (s16) var_r30 * 2; + var_r30 *= 2; } } if ((arg0->attr & 0x1000) != 0) { @@ -1781,14 +1781,51 @@ s16 Hu3DLightSet(ModelData* arg0, s32 arg1, s32 arg2, f32 arg8) { var_r29 = &Hu3DLocalLight[arg0->unk_38[i]]; lightSet(var_r29, var_r30, arg2, arg1, arg8); var_r28 |= var_r30; - var_r30 = (s16) var_r30 * 2; + var_r30 *= 2; } } } 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); + PSVECScale(&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) { + PSMTXMultVec(*arg2, &arg0->unk_28, &sp24); + PSMTXMultVec(*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) { @@ -1818,7 +1855,36 @@ void Hu3DFogClear(void) { 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, 0x9000); + } + 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, 1.2f, 0.5f, -0.5f, 0.5f, 0.5f); + PSVECNormalize(&Hu3DShadowData.unk_2C, &Hu3DShadowData.unk_2C); + Hu3DShadowData.unk_00 = 0x80; + Hu3DShadowF = 1; +} + +void Hu3DShadowPosSet(Vec* arg0, Vec* arg1, Vec* arg2) { + Hu3DShadowData.unk_14 = *arg0; + Hu3DShadowData.unk_20 = *arg2; + Hu3DShadowData.unk_2C = *arg1; +} + +void Hu3DShadowTPLvlSet(f32 arg8) { + Hu3DShadowData.unk_00 = 255.0f * arg8; +} void Hu3DShadowSizeSet(u16 arg0) { Hu3DShadowData.unk_02 = arg0; @@ -1828,6 +1894,125 @@ void Hu3DShadowSizeSet(u16 arg0) { 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, 1.2f, 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); + PSMTXCopy(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 < 0x200; var_r30++, var_r31++) { + if (var_r31->hsfData != 0 && (var_r31->attr & 4) != 0 && (var_r31->attr & 1) == 0 && (var_r31->attr & 0x8000) == 0) { + if ((var_r31->attr & 8) != 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 & 0x400) != 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 & 0x90) == 0 || (var_r31->motion_attr & 0x40000002) == 0) { + test2 = 1; + InitVtxParm(var_r31->hsfData); + if (var_r31->unk_0E != -1) { + ShapeProc(var_r31->hsfData); + } + if ((var_r31->attr & 0x400) != 0) { + ClusterProc(var_r31); + } + if (var_r31->hsfData->cenvCnt != 0) { + EnvelopeProc(var_r31->hsfData); + } + PPCSync(); + } + var_r31->attr |= 0x800; + } + 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); + 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); + Hu3DDraw(var_r31, sp88[0], &var_r31->scale.x); + } + } + 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); + PSMTXIdentity(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;