From 7628f37163cc4ded9662f47b3e2ba51dd876c8d6 Mon Sep 17 00:00:00 2001 From: dbalatoni13 <40299962+dbalatoni13@users.noreply.github.com> Date: Tue, 15 Apr 2025 05:15:22 +0200 Subject: [PATCH] hsfload fixes --- include/game/hsfdraw.h | 2 +- include/game/hsfformat.h | 3 +- include/port/byteswap.h | 32 +++++++++++++-- src/dolphin/mtx/mtx.c | 4 +- src/game/ClusterExec.c | 6 +-- src/game/EnvelopeExec.c | 8 ++-- src/game/armem.c | 2 +- src/game/data.c | 9 +++-- src/game/hsfdraw.c | 7 ++-- src/game/hsfload.c | 68 +++++++++++++++++++++++++------ src/game/hsfman.c | 12 ++---- src/port/byteswap.cpp | 86 ++++++++++++++++++++++++++++++++++++---- 12 files changed, 187 insertions(+), 52 deletions(-) diff --git a/include/game/hsfdraw.h b/include/game/hsfdraw.h index 068e5b3c..aca5f1d4 100755 --- a/include/game/hsfdraw.h +++ b/include/game/hsfdraw.h @@ -70,7 +70,7 @@ void Hu3DModelObjMtxGet(s16 arg0, char *arg1, Mtx arg2); void PGObjCall(ModelData *arg0, HsfObject *arg1); void PGObjCalc(ModelData *arg0, HsfObject *arg1); void PGObjReplica(ModelData *arg0, HsfObject *arg1); -HsfObject *Hu3DObjDuplicate(HsfData *arg0, u32 arg1); +HsfObject *Hu3DObjDuplicate(HsfData *arg0, uintptr_t arg1); void Hu3DModelObjDrawInit(void); void Hu3DModelObjDraw(s16 arg0, char *arg1, Mtx arg2); diff --git a/include/game/hsfformat.h b/include/game/hsfformat.h index b1ed6b36..68b317cd 100644 --- a/include/game/hsfformat.h +++ b/include/game/hsfformat.h @@ -277,7 +277,8 @@ typedef struct hsf_object_data { HsfCluster **cluster; u32 cenvCnt; HsfCenv *cenv; - void *file[2]; + HsfVector3f *vtxtop; + HsfVector3f *normtop; } HsfObjectData; typedef struct hsf_camera { diff --git a/include/port/byteswap.h b/include/port/byteswap.h index 40f9efee..bbdec9a1 100644 --- a/include/port/byteswap.h +++ b/include/port/byteswap.h @@ -156,6 +156,22 @@ typedef struct HsfShape32b { u32 vertex; } HsfShape32b; +typedef struct HsfCenvDual32b { + u32 target1; + u32 target2; + u32 weightCnt; + u32 weight; +} HsfCenvDual32b; + +typedef struct HsfCenvMulti32b { + u32 weightCnt; + u16 pos; + u16 posCnt; + u16 normal; + u16 normalCnt; + u32 weight; +} HsfCenvMulti32b; + typedef struct HsfCenv32b { u32 name; u32 singleData; @@ -200,7 +216,8 @@ typedef struct HsfObjectData32b { u32 cluster; u32 cenvCnt; u32 cenv; - u32 file[2]; + u32 vtxtop; + u32 normtop; } HsfObjectData32b; typedef struct HsfObject32b { @@ -265,6 +282,12 @@ typedef struct HsfFace32b { Vec nbt; } HsfFace32b; +typedef struct HsfMatrix32b { + u32 base_idx; + u32 count; + u32 data; +} HsfMatrix32b; + void byteswap_u16(u16 *src); void byteswap_s16(s16 *src); void byteswap_u32(u32 *src); @@ -285,7 +308,7 @@ void byteswap_hsfattribute(HsfAttribute32b *src, HsfAttribute *dest); void byteswap_hsfmaterial(HsfMaterial32b *src, HsfMaterial *dest); void byteswap_hsfscene(HsfScene *src); void byteswap_hsfbuffer(HsfBuffer32b *src, HsfBuffer *dest); -void byteswap_hsfmatrix(HsfMatrix *src); +void byteswap_hsfmatrix(HsfMatrix32b *src, HsfMatrix *dest); void byteswap_hsfpalette(HsfPalette32b *src, HsfPalette *dest); void byteswap_hsfpart(HsfPart32b *src, HsfPart *dest); void byteswap_hsfbitmap(HsfBitmap32b *src, HsfBitmap *dest); @@ -304,7 +327,6 @@ void byteswap_hsfattribute(HsfAttribute32b *src, HsfAttribute *dest); void byteswap_hsfmaterial(HsfMaterial32b *src, HsfMaterial *dest); void byteswap_hsfscene(HsfScene *src); void byteswap_hsfbuffer(HsfBuffer32b *src, HsfBuffer *dest); -void byteswap_hsfmatrix(HsfMatrix *src); void byteswap_hsfpalette(HsfPalette32b *src, HsfPalette *dest); void byteswap_hsfpart(HsfPart32b *src, HsfPart *dest); void byteswap_hsfbitmap(HsfBitmap32b *src, HsfBitmap *dest); @@ -312,6 +334,10 @@ void byteswap_hsfmapattr(HsfMapAttr32b *src, HsfMapAttr *dest); void byteswap_hsfskeleton(HsfSkeleton32b *src, HsfSkeleton *dest); void byteswap_hsfshape(HsfShape32b *src, HsfShape *dest); void byteswap_hsfcenv_single(HsfCenvSingle *src); +void byteswap_hsfcenv_dual_weight(HsfCenvDualWeight *src); +void byteswap_hsfcenv_dual(HsfCenvDual32b *src, HsfCenvDual *dest); +void byteswap_hsfcenv_multi_weight(HsfCenvMultiWeight *src); +void byteswap_hsfcenv_multi(HsfCenvMulti32b *src, HsfCenvMulti *dest); void byteswap_hsfcenv(HsfCenv32b *src, HsfCenv *dest); void byteswap_hsfobject(HsfObject32b *src, HsfObject *dest); void byteswap_hsfbitmapkey(HsfBitmapKey32b *src, HsfBitmapKey *dest); diff --git a/src/dolphin/mtx/mtx.c b/src/dolphin/mtx/mtx.c index ab196f4e..6b71edb5 100644 --- a/src/dolphin/mtx/mtx.c +++ b/src/dolphin/mtx/mtx.c @@ -1322,8 +1322,8 @@ void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 scaleS, f32 scaleT, void C_MTXReorder(const Mtx src, ROMtx dest) { u32 i, j; - for (i = 0; i < 3; j++) { - for (int j = 0; j < 4; j++) { + for (i = 0; i < 3; i++) { + for (j = 0; j < 4; j++) { dest[j][i] = src[i][j]; } } diff --git a/src/game/ClusterExec.c b/src/game/ClusterExec.c index af0b6981..7acb081c 100644 --- a/src/game/ClusterExec.c +++ b/src/game/ClusterExec.c @@ -127,9 +127,9 @@ void ClusterProc(ModelData *arg0) Vertextop = temp_r31->data.vertex->data; if (temp_r31->data.cenvCnt) { for (k = 0; k < temp_r31->data.vertex->count; k++) { - Vertextop[k].x = ((Vec *)temp_r31->data.file[0])[k].x; - Vertextop[k].y = ((Vec *)temp_r31->data.file[0])[k].y; - Vertextop[k].z = ((Vec *)temp_r31->data.file[0])[k].z; + Vertextop[k].x = ((Vec *)temp_r31->data.vtxtop)[k].x; + Vertextop[k].y = ((Vec *)temp_r31->data.vtxtop)[k].y; + Vertextop[k].z = ((Vec *)temp_r31->data.vtxtop)[k].z; } } SetClusterMain(var_r29); diff --git a/src/game/EnvelopeExec.c b/src/game/EnvelopeExec.c index 83da92b1..2a890986 100644 --- a/src/game/EnvelopeExec.c +++ b/src/game/EnvelopeExec.c @@ -36,7 +36,7 @@ void InitEnvelope(HsfData *arg0) { var_r31 = arg0->object; for (Meshcnt = i = 0; i < arg0->objectCnt; i++, var_r31++) { if (var_r31->type == 2) { - if (var_r31->data.file[0]) { + if (var_r31->data.vtxtop) { spC = var_r31->data.vertex; sp8 = var_r31->data.normal; Meshcnt++; @@ -173,17 +173,17 @@ static void SetEnvelopMain(HsfData *arg0) { if (var_r31->data.unk120[0] != 0) { Vertextop = temp_r30->data; } else { - Vertextop = var_r31->data.file[0]; + Vertextop = (Vec*)var_r31->data.vtxtop; } vtxenv = temp_r30->data; - normtop = var_r31->data.file[1]; + normtop = (Vec*)var_r31->data.normtop; normenv = temp_r28->data; var_r25 = var_r31->data.cenv; for (j = 0; j < var_r31->data.cenvCnt; j++, var_r25++) { SetEnvelop(var_r25); } sp10 = temp_r30->data; - spC = var_r31->data.file[0]; + spC = var_r31->data.vtxtop; sp8 = temp_r30->data; DCStoreRangeNoSync(normenv, temp_r28->count * sizeof(Vec)); DCStoreRangeNoSync(vtxenv, temp_r30->count * sizeof(Vec)); diff --git a/src/game/armem.c b/src/game/armem.c index 26b359f6..7417e0ba 100644 --- a/src/game/armem.c +++ b/src/game/armem.c @@ -344,7 +344,7 @@ void *HuAR_ARAMtoMRAMFileRead(u32 dir, u32 num, HeapID heap) { DCInvalidateRange(&preLoadBuf, sizeof(preLoadBuf)); amem_src = amemptr + (u32)((u32)(((u16)dir + 1) * 4) & 0xFFFFFFFE0); arqCnt++; - ARQPostRequest(&ARQueBuf[arqIdx].req, 0x1234, 1, 0, amem_src, (u32) &preLoadBuf, sizeof(preLoadBuf), ArqCallBackAMFileRead); + ARQPostRequest(&ARQueBuf[arqIdx].req, 0x1234, 1, 0, amem_src, (uintptr_t) &preLoadBuf, sizeof(preLoadBuf), ArqCallBackAMFileRead); arqIdx++; arqIdx &= 0xF; while (HuARDMACheck()); diff --git a/src/game/data.c b/src/game/data.c index 5fb4dca3..5376eab5 100644 --- a/src/game/data.c +++ b/src/game/data.c @@ -286,10 +286,11 @@ BOOL HuDataGetAsyncStat(s32 status) static void GetFileInfo(DataReadStat *read_stat, s32 file_num) { - u32 *temp_ptr; - temp_ptr = (u32 *)PTR_OFFSET(read_stat->dir, (file_num * 4))+1; + u32 *temp_ptr = (u32 *)PTR_OFFSET(read_stat->dir, (file_num * 4))+1; #ifdef TARGET_PC - byteswap_u32(temp_ptr); + u32 ofs = *temp_ptr; + byteswap_u32(&ofs); + temp_ptr = &ofs; #endif read_stat->file = PTR_OFFSET(read_stat->dir, *temp_ptr); temp_ptr = read_stat->file; @@ -336,7 +337,7 @@ void *HuDataReadNum(s32 data_num, s32 num) } read_stat = &ReadDataStat[status]; GetFileInfo(read_stat, data_num & 0xFFFF); - buf = HuMemDirectMallocNum(0, DATA_EFF_SIZE(read_stat->raw_len), num); + buf = HuMemDirectMallocNum(HEAP_SYSTEM, DATA_EFF_SIZE(read_stat->raw_len), num); if(buf) { HuDecodeData(read_stat->file, buf, read_stat->raw_len, read_stat->comp_type); } diff --git a/src/game/hsfdraw.c b/src/game/hsfdraw.c index 6aca1642..6439704d 100755 --- a/src/game/hsfdraw.c +++ b/src/game/hsfdraw.c @@ -3347,14 +3347,13 @@ void PGObjReplica(ModelData *arg0, HsfObject *arg1) } } -HsfObject *Hu3DObjDuplicate(HsfData *arg0, u32 arg1) +HsfObject *Hu3DObjDuplicate(HsfData *arg0, uintptr_t arg1) { HsfObject *temp_r27; HsfObject *var_r30; HsfObject *var_r31; s16 i; s16 j; - var_r31 = HuMemDirectMallocNum(HEAP_DATA, arg0->objectCnt * sizeof(HsfObject), arg1); temp_r27 = var_r31; var_r30 = arg0->object; @@ -3362,7 +3361,7 @@ HsfObject *Hu3DObjDuplicate(HsfData *arg0, u32 arg1) for (i = 0; i < arg0->objectCnt; i++, var_r31++, var_r30++) { if (var_r31->type != 8 && var_r31->type != 7) { if (var_r31->data.parent) { - var_r31->data.parent = (HsfObject *)((u8 *)temp_r27 + ((u32)var_r30->data.parent - (u32)arg0->object)); + var_r31->data.parent = (HsfObject *)((u8 *)temp_r27 + ((uintptr_t)var_r30->data.parent - (uintptr_t)arg0->object)); } var_r31->data.children = HuMemDirectMallocNum(HEAP_DATA, var_r30->data.childrenCount * 4, arg1); if (var_r30->constData) { @@ -3370,7 +3369,7 @@ HsfObject *Hu3DObjDuplicate(HsfData *arg0, u32 arg1) memcpy(var_r31->constData, var_r30->constData, sizeof(HsfConstData)); } for (j = 0; j < var_r30->data.childrenCount; j++) { - var_r31->data.children[j] = (HsfObject *)((u8 *)temp_r27 + ((u32)var_r30->data.children[j] - (u32)arg0->object)); + var_r31->data.children[j] = (HsfObject *)((u8 *)temp_r27 + ((uintptr_t)var_r30->data.children[j] - (uintptr_t)arg0->object)); } } } diff --git a/src/game/hsfload.c b/src/game/hsfload.c index 0a4882fd..4d830854 100644 --- a/src/game/hsfload.c +++ b/src/game/hsfload.c @@ -1,6 +1,8 @@ #include "game/hsfload.h" -#include "string.h" +#include "game/EnvelopeExec.h" #include "ctype.h" +#include "string.h" + #ifdef TARGET_PC #include "game/memory.h" @@ -89,7 +91,9 @@ HsfData *LoadHSF(void *data) NormalLoad(); STLoad(); FaceLoad(); +#if __MWERKS__ ObjectLoad(); +#endif CenvLoad(); SkeletonLoad(); PartLoad(); @@ -98,6 +102,10 @@ HsfData *LoadHSF(void *data) MapAttrLoad(); MotionLoad(); MatrixLoad(); +#if TARGET_PC + // to properly set pointers + ObjectLoad(); +#endif hsf = SetHsfModel(); InitEnvelope(hsf); objtop = NULL; @@ -448,7 +456,7 @@ static void NormalLoad(void) Model.normal = new_normal; Model.normalCnt = head.normal.count; #ifdef TARGET_PC - VertexDataTop = data = (void *)&file_normal_real[head.normal.count]; + NormalDataTop = data = (void *)&file_normal_real[head.normal.count]; #else file_normal = (HsfBuffer *)((u32)fileptr+head.normal.ofs); NormalDataTop = data = (void *)&file_normal[head.normal.count]; @@ -460,8 +468,8 @@ static void NormalLoad(void) new_normal->data = (void *)((uintptr_t)data+(uintptr_t)temp_data); #ifdef TARGET_PC if (cenv_count != 0) { - for (i = 0; i < new_normal->count; i++) { - HsfVector3f *normalData = &((HsfVector3f *)new_normal->data)[i]; + for (j = 0; j < new_normal->count; j++) { + HsfVector3f *normalData = &((HsfVector3f *)new_normal->data)[j]; byteswap_hsfvec3f(normalData); } } @@ -647,8 +655,16 @@ static void DispObject(HsfObject *parent, HsfObject *object) } else { new_object->data.attribute = NULL; } - new_object->data.file[0] = (void *)((uintptr_t)fileptr + (uintptr_t)data->file[0]); - new_object->data.file[1] = (void *)((uintptr_t)fileptr + (uintptr_t)data->file[1]); + new_object->data.vtxtop = (void *)((uintptr_t)fileptr + (uintptr_t)data->vtxtop); + new_object->data.normtop = (void *)((uintptr_t)fileptr + (uintptr_t)data->normtop); +#ifdef TARGET_PC + for (i = 0; i < new_object->data.vertex->count; i++) { + byteswap_hsfvec3f(&new_object->data.vtxtop[i]); + } + for (i = 0; i < new_object->data.normal->count; i++) { + byteswap_hsfvec3f(&new_object->data.normtop[i]); + } +#endif new_object->data.base.pos.x = data->base.pos.x; new_object->data.base.pos.y = data->base.pos.y; new_object->data.base.pos.z = data->base.pos.z; @@ -906,46 +922,70 @@ static void CenvLoad(void) Model.cenv = cenv_file; for(i=0; i