From c6433029959d83a135d2e717f5914d4ca504aae7 Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Wed, 7 Feb 2024 06:56:12 -0600 Subject: [PATCH] Use HsfFace in hsfdraw.c --- include/game/hsfformat.h | 14 ++-- src/game/hsfdraw.c | 169 ++++++++++++++++++--------------------- src/game/hsfload.c | 10 ++- 3 files changed, 91 insertions(+), 102 deletions(-) diff --git a/include/game/hsfformat.h b/include/game/hsfformat.h index d3104319..1beae421 100644 --- a/include/game/hsfformat.h +++ b/include/game/hsfformat.h @@ -145,20 +145,16 @@ typedef struct hsf_vertex_buf { void *data; } HsfBuffer; -typedef struct hsf_tristrip { - u16 data[4]; -} HsfTristrip; - typedef struct hsf_face { - u16 type; - u16 mat; - u16 indices[12]; + s16 type; + s16 mat; union { struct { + s16 indices[3][4]; u32 count; - HsfTristrip *data; + s16 *data; } strip; - u16 ext_indices[4]; + s16 indices[4][4]; }; float nbt[3]; } HsfFace; diff --git a/src/game/hsfdraw.c b/src/game/hsfdraw.c index 5f8b4646..9be7868f 100755 --- a/src/game/hsfdraw.c +++ b/src/game/hsfdraw.c @@ -24,18 +24,9 @@ typedef struct { u32 unk0C; } DrawDataStruct; // Size 0x10 -typedef struct { - /* 0x00 */ s16 unk00; - /* 0x02 */ s16 unk02; - /* 0x04 */ s16 unk04[3][4]; // goes up to index [3][3] (union?) - /* 0x1C */ u32 unk1C; - /* 0x20 */ void *unk20; - /* 0x24 */ char unk24[0xC]; -} HsfdrawStruct02; // Size 0x30 - static void objCall(ModelData *arg0, HsfObject *arg1); static void objMesh(ModelData *arg0, HsfObject *arg1); -static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1); +static void FaceDraw(HsfdrawStruct00 *arg0, HsfFace *arg1); static void SetTevStageNoTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1); static void SetTevStageTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1); static GXTevKColorSel SetKColor(GXTevStageID arg0, u8 arg1); @@ -45,7 +36,7 @@ static void SetReflect(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2, u8 arg3); static void SetProjection(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2, s16 arg3, GXTexMapID arg4, u32 arg5); static void SetShadowTex(void); static void SetShadow(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2); -static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1); +static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfFace *arg1); static void LoadTexture(ModelData *arg0, HsfBitmap *arg1, HsfAttribute *arg2, s16 arg3); static void objNull(ModelData *arg0, HsfObject *arg1); static void objRoot(ModelData *arg0, HsfObject *arg1); @@ -55,10 +46,10 @@ static void objReplica(ModelData *arg0, HsfObject *arg1); static void ObjDraw(HsfdrawStruct00 *arg0); static void MDObjCall(HsfData *arg0, HsfObject *arg1); static void MDObjMesh(HsfData *arg0, HsfObject *arg1); -static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1); -static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3); -static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3); -static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1); +static void MDFaceDraw(HsfObject *arg0, HsfFace *arg1); +static s32 MakeCalcNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3); +static s32 MakeNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3); +static void MDFaceCnt(HsfObject *arg0, HsfFace *arg1); void GXResetWriteGatherPipe(void); @@ -429,7 +420,7 @@ s32 ObjCullCheck(HsfData *arg0, HsfObject *arg1, Mtx arg2) { } // TODO: not matching (https://decomp.me/scratch/54Pjw) -static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { +static void FaceDraw(HsfdrawStruct00 *arg0, HsfFace *arg1) { GXColor sp2C; void *sp28; Hu3DTexAnimDataStruct *sp24; @@ -452,7 +443,7 @@ static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { temp_r29 = arg0->unk00; temp_r20 = temp_r28->constData; kColorIdx = 0; - temp_r30 = &temp_r28->data.material[arg1->unk02 & 0xFFF]; + temp_r30 = &temp_r28->data.material[arg1->mat & 0xFFF]; temp_r19 = temp_r28->flags | temp_r30->flags; if (temp_r19 & 0x30) { if (temp_r19 & 0x10) { @@ -1650,7 +1641,7 @@ static void SetShadow(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2) { GXSetTevAlphaOp(arg1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_FALSE, GX_TEVPREV); } -static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { +static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfFace *arg1) { HsfObject *temp_r31; ModelData *temp_r28; HsfConstData *temp_r27; @@ -1662,7 +1653,7 @@ static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { temp_r31 = arg0->unk04; temp_r28 = arg0->unk00; temp_r27 = temp_r31->constData; - temp_r29 = &temp_r31->data.material[arg1->unk02 & 0xFFF]; + temp_r29 = &temp_r31->data.material[arg1->mat & 0xFFF]; if (temp_r29 != materialBak) { if (!(temp_r27->flags & 0x400)) { drawCnt++; @@ -2078,7 +2069,7 @@ void Hu3DDrawPost(void) { float temp_f26; float temp_f25; LightData *temp_r22; - HsfdrawStruct02 *var_r27; + HsfFace *var_r27; Mtx sp150; Mtx sp120; Mtx spF0; @@ -2217,12 +2208,12 @@ void Hu3DDrawPost(void) { if (shadowModelDrawF == 0) { for (i = 0; i < temp_r24->count;) { FaceDraw(temp_r28, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { totalPolyCnt += DrawData[drawCnt - 1].unk08; i++; var_r27++; } else { - totalPolyCnt += DrawData[drawCnt - 1].unk08 * ((var_r27->unk00 & 7) == 3 ? 2 : 1); + totalPolyCnt += DrawData[drawCnt - 1].unk08 * ((var_r27->type & 7) == 3 ? 2 : 1); i += DrawData[drawCnt - 1].unk08; var_r27 += DrawData[drawCnt - 1].unk08; } @@ -2236,7 +2227,7 @@ void Hu3DDrawPost(void) { GXSetNumChans(1); for (i = 0; i < temp_r24->count;) { FaceDrawShadow(temp_r28, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { i++; var_r27++; } else { @@ -2276,7 +2267,7 @@ static void ObjDraw(HsfdrawStruct00 *arg0) { float temp_f26; LightData *temp_r24; DrawDataStruct *temp_r25; - HsfdrawStruct02 *var_r27; + HsfFace *var_r27; Mtx sp140; Mtx sp110; Mtx spE0; @@ -2359,13 +2350,13 @@ static void ObjDraw(HsfdrawStruct00 *arg0) { if (shadowModelDrawF == 0) { for (i = 0; i < temp_r26->count;) { FaceDraw(arg0, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { totalPolyCnt += DrawData[drawCnt - 1].unk08; i++; var_r27++; } else { temp_r25 = &DrawData[drawCnt - 1]; - if ((var_r27->unk00 & 7) == 3) { + if ((var_r27->type & 7) == 3) { var_r20 = 2; } else { var_r20 = 1; @@ -2384,7 +2375,7 @@ static void ObjDraw(HsfdrawStruct00 *arg0) { GXSetNumChans(1); for (i = 0; i < temp_r26->count;) { FaceDrawShadow(arg0, var_r27); - if (var_r27->unk00 == 4) { + if (var_r27->type == 4) { i++; var_r27++; } else { @@ -2440,7 +2431,7 @@ static void MDObjCall(HsfData *arg0, HsfObject *arg1) { static void MDObjMesh(HsfData *arg0, HsfObject *arg1) { HsfBuffer *temp_r29; - HsfdrawStruct02 *var_r28; + HsfFace *var_r28; s16 i; temp_r29 = arg1->data.face; @@ -2502,7 +2493,7 @@ HsfConstData *ObjConstantMake(HsfObject *arg0, u32 arg1) { return temp_r3; } -static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { +static void MDFaceDraw(HsfObject *arg0, HsfFace *arg1) { HsfMaterial *temp_r30; s16 *var_r24; s16 var_r26; @@ -2513,9 +2504,9 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { s32 var_r25; var_r26 = -1; - temp_r30 = &arg0->data.material[arg1->unk02 & 0xFFF]; - if (temp_r30 != materialBak || polyTypeBak != (arg1->unk00 & 7) || (arg1->unk00 & 7) == 4) { - polyTypeBak = arg1->unk00 & 7; + temp_r30 = &arg0->data.material[arg1->mat & 0xFFF]; + if (temp_r30 != materialBak || polyTypeBak != (arg1->type & 7) || (arg1->type & 7) == 4) { + polyTypeBak = arg1->type & 7; materialBak = temp_r30; DrawData[drawCnt].unk00 = (u32) DLBufP - (u32) DLBufStartP; GXBeginDisplayList(DLBufP, 0x20000); @@ -2557,60 +2548,60 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { Hu3DObjInfoP->flags |= 0x10000; } faceCnt = 0; - switch (arg1->unk00 & 7) { + switch (arg1->type & 7) { case 0: case 1: break; case 2: GXBegin(GX_TRIANGLES, GX_VTXFMT0, faceNumBuf[drawCnt]); for (var_r27 = 0; var_r27 < faceNumBuf[drawCnt] / 3; var_r27++, arg1++) { - GXUnknownu16(arg1->unk04[0][0]); + GXUnknownu16(arg1->indices[0][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[0][1]); + GXUnknownu16(arg1->indices[0][1]); } else { MakeCalcNBT(arg0, arg1, 0, 1); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[0][2]; + temp_r28 = arg1->indices[0][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[0][3]); + GXUnknownu16(arg1->indices[0][3]); } - GXUnknownu16(arg1->unk04[2][0]); + GXUnknownu16(arg1->indices[2][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[2][1]); + GXUnknownu16(arg1->indices[2][1]); } else { MakeNBT(arg0, arg1, 2, 0); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[2][2]; + temp_r28 = arg1->indices[2][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[2][3]); + GXUnknownu16(arg1->indices[2][3]); } - GXUnknownu16(arg1->unk04[1][0]); + GXUnknownu16(arg1->indices[1][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[1][1]); + GXUnknownu16(arg1->indices[1][1]); } else { MakeNBT(arg0, arg1, 1, 2); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[1][2]; + temp_r28 = arg1->indices[1][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[1][3]); + GXUnknownu16(arg1->indices[1][3]); } } faceCnt = faceNumBuf[drawCnt] / 3; @@ -2618,125 +2609,125 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { case 3: GXBegin(GX_QUADS, GX_VTXFMT0, faceNumBuf[drawCnt]); for (var_r27 = 0; var_r27 < faceNumBuf[drawCnt] / 4; var_r27++, arg1++) { - GXUnknownu16(arg1->unk04[0][0]); + GXUnknownu16(arg1->indices[0][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[0][1]); + GXUnknownu16(arg1->indices[0][1]); } else { MakeCalcNBT(arg0, arg1, 0, 1); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[0][2]; + temp_r28 = arg1->indices[0][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[0][3]); + GXUnknownu16(arg1->indices[0][3]); } - GXUnknownu16(arg1->unk04[2][0]); + GXUnknownu16(arg1->indices[2][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[2][1]); + GXUnknownu16(arg1->indices[2][1]); } else { MakeNBT(arg0, arg1, 2, 0); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[2][2]; + temp_r28 = arg1->indices[2][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[2][3]); + GXUnknownu16(arg1->indices[2][3]); } - GXUnknownu16(arg1->unk04[3][0]); + GXUnknownu16(arg1->indices[3][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[3][1]); + GXUnknownu16(arg1->indices[3][1]); } else { MakeNBT(arg0, arg1, 3, 2); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[3][2]; + temp_r28 = arg1->indices[3][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[3][3]); + GXUnknownu16(arg1->indices[3][3]); } - GXUnknownu16(arg1->unk04[1][0]); + GXUnknownu16(arg1->indices[1][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[1][1]); + GXUnknownu16(arg1->indices[1][1]); } else { MakeNBT(arg0, arg1, 1, 3); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[1][2]; + temp_r28 = arg1->indices[1][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[1][3]); + GXUnknownu16(arg1->indices[1][3]); } } faceCnt = faceNumBuf[drawCnt] / 4; break; case 4: GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, faceNumBuf[drawCnt]); - GXUnknownu16(arg1->unk04[0][0]); + GXUnknownu16(arg1->indices[0][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[0][1]); + GXUnknownu16(arg1->indices[0][1]); } else { MakeCalcNBT(arg0, arg1, 0, 1); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[0][2]; + temp_r28 = arg1->indices[0][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[0][3]); + GXUnknownu16(arg1->indices[0][3]); } - GXUnknownu16(arg1->unk04[2][0]); + GXUnknownu16(arg1->indices[2][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[2][1]); + GXUnknownu16(arg1->indices[2][1]); } else { MakeNBT(arg0, arg1, 2, 0); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[2][2]; + temp_r28 = arg1->indices[2][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[2][3]); + GXUnknownu16(arg1->indices[2][3]); } - GXUnknownu16(arg1->unk04[1][0]); + GXUnknownu16(arg1->indices[1][0]); if (var_r26 == -1) { - GXUnknownu16(arg1->unk04[1][1]); + GXUnknownu16(arg1->indices[1][1]); } else { MakeNBT(arg0, arg1, 1, 2); } if (temp_r30->vtxMode == 5) { - temp_r28 = arg1->unk04[1][2]; + temp_r28 = arg1->indices[1][2]; GXUnknownu16(temp_r28); if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { Hu3DObjInfoP->flags |= 0x4001; } } if (var_r25 != 0) { - GXUnknownu16(arg1->unk04[1][3]); + GXUnknownu16(arg1->indices[1][3]); } - var_r24 = arg1->unk20; - for (var_r27 = 0; var_r27 < arg1->unk1C; var_r27++, var_r24 += 4) { + var_r24 = arg1->strip.data; + for (var_r27 = 0; var_r27 < arg1->strip.count; var_r27++, var_r24 += 4) { GXUnknownu16(var_r24[0]); if (var_r26 == -1) { GXUnknownu16(var_r24[1]); @@ -2754,7 +2745,7 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { GXUnknownu16(var_r24[3]); } } - faceCnt = arg1->unk1C + 1; + faceCnt = arg1->strip.count + 1; break; } temp_r3 = GXEndDisplayList(); @@ -2766,7 +2757,7 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { } } -static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { +static s32 MakeCalcNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3) { Vec sp10; Vec *temp_r29; Vec *temp_r31; @@ -2776,9 +2767,9 @@ static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg s16 temp_r27; temp_r31 = arg0->data.vertex->data; - temp_r27 = arg1->unk04[arg2][1]; - temp_r25 = arg1->unk04[arg2][0]; - temp_r24 = arg1->unk04[arg3][0]; + temp_r27 = arg1->indices[arg2][1]; + temp_r25 = arg1->indices[arg2][0]; + temp_r24 = arg1->indices[arg3][0]; if (arg0->data.hook != 0) { temp_r29 = arg0->data.normal->data; sp10.x = temp_r29[temp_r27].x; @@ -2801,7 +2792,7 @@ static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg GXPosition3s16(NBTT.x * 256.0f, NBTT.y * 256.0f, NBTT.z * 256.0f); } -static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { +static s32 MakeNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3) { Vec sp10; Vec *temp_r30; Vec *spC; @@ -2809,7 +2800,7 @@ static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { s16 temp_r28; spC = arg0->data.vertex->data; - temp_r28 = arg1->unk04[arg2][1]; + temp_r28 = arg1->indices[arg2][1]; if (arg0->data.hook != 0) { temp_r30 = arg0->data.normal->data; sp10.x = temp_r30[temp_r28].x; @@ -2827,15 +2818,15 @@ static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) { GXPosition3s16(NBTT.x * 256.0f, NBTT.y * 256.0f, NBTT.z * 256.0f); } -static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) { +static void MDFaceCnt(HsfObject *arg0, HsfFace *arg1) { HsfMaterial *temp_r30; s16 i; - temp_r30 = &arg0->data.material[arg1->unk02 & 0xFFF]; + temp_r30 = &arg0->data.material[arg1->mat & 0xFFF]; // Bug? Likely to be polyTypeBak != (arg1->unk00 & 7) - if (temp_r30 != materialBak || ((polyTypeBak != arg1->unk00) & 7) || (arg1->unk00 & 7) == 4) { + if (temp_r30 != materialBak || ((polyTypeBak != arg1->type) & 7) || (arg1->type & 7) == 4) { polySize = 4; - polyTypeBak = arg1->unk00 & 7; + polyTypeBak = arg1->type & 7; materialBak = temp_r30; matChgCnt++; if (DLFirstF != 0) { @@ -2857,7 +2848,7 @@ static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) { polySize += 2; } } - switch (arg1->unk00 & 7) { + switch (arg1->type & 7) { case 0: OSReport("Error\n"); break; @@ -2876,9 +2867,9 @@ static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) { break; case 4: triCnt++; - faceNumBuf[drawCnt] += arg1->unk1C + 3; + faceNumBuf[drawCnt] += arg1->strip.count + 3; DLTotalNum += polySize * 3; - DLTotalNum += polySize * arg1->unk1C; + DLTotalNum += polySize * arg1->strip.count; break; default: OSReport("Error\n"); diff --git a/src/game/hsfload.c b/src/game/hsfload.c index 88c10c51..f9f448cc 100644 --- a/src/game/hsfload.c +++ b/src/game/hsfload.c @@ -3,6 +3,8 @@ #include "ctype.h" #define AS_S16(field) (*((s16 *)&(field))) +#define AS_U16(field) (*((u16 *)&(field))) + GXColor rgba[100]; HsfHeader head; HsfData Model; @@ -401,7 +403,7 @@ static void FaceLoad(void) HsfFace *data; HsfFace *file_face_strip; HsfFace *new_face_strip; - HsfTristrip *strip; + u8 *strip; s32 i; s32 j; @@ -418,14 +420,14 @@ static void FaceLoad(void) new_face->name = SetName((u32 *)&file_face->name); new_face->count = file_face->count; new_face->data = (void *)((u32)data+(u32)temp_data); - strip = (HsfTristrip *)(&((HsfFace *)new_face->data)[new_face->count]); + strip = (u8 *)(&((HsfFace *)new_face->data)[new_face->count]); } new_face = temp_face; for(i=0; idata; for(j=0; jcount; j++, new_face_strip++, file_face_strip++) { - if(file_face_strip->type == 4) { - new_face_strip->strip.data = &strip[(u32)file_face_strip->strip.data]; + if(AS_U16(file_face_strip->type) == 4) { + new_face_strip->strip.data = (s16 *)(strip+(u32)file_face_strip->strip.data*(sizeof(s16)*4)); } } }