Use HsfFace in hsfdraw.c

This commit is contained in:
gamemasterplc 2024-02-07 06:56:12 -06:00
parent 6baac0126f
commit c643302995
3 changed files with 91 additions and 102 deletions

View file

@ -145,20 +145,16 @@ typedef struct hsf_vertex_buf {
void *data; void *data;
} HsfBuffer; } HsfBuffer;
typedef struct hsf_tristrip {
u16 data[4];
} HsfTristrip;
typedef struct hsf_face { typedef struct hsf_face {
u16 type; s16 type;
u16 mat; s16 mat;
u16 indices[12];
union { union {
struct { struct {
s16 indices[3][4];
u32 count; u32 count;
HsfTristrip *data; s16 *data;
} strip; } strip;
u16 ext_indices[4]; s16 indices[4][4];
}; };
float nbt[3]; float nbt[3];
} HsfFace; } HsfFace;

View file

@ -24,18 +24,9 @@ typedef struct {
u32 unk0C; u32 unk0C;
} DrawDataStruct; // Size 0x10 } 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 objCall(ModelData *arg0, HsfObject *arg1);
static void objMesh(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 SetTevStageNoTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1);
static void SetTevStageTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1); static void SetTevStageTex(HsfdrawStruct00 *arg0, HsfMaterial *arg1);
static GXTevKColorSel SetKColor(GXTevStageID arg0, u8 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 SetProjection(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2, s16 arg3, GXTexMapID arg4, u32 arg5);
static void SetShadowTex(void); static void SetShadowTex(void);
static void SetShadow(HsfdrawStruct00 *arg0, s16 arg1, s16 arg2); 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 LoadTexture(ModelData *arg0, HsfBitmap *arg1, HsfAttribute *arg2, s16 arg3);
static void objNull(ModelData *arg0, HsfObject *arg1); static void objNull(ModelData *arg0, HsfObject *arg1);
static void objRoot(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 ObjDraw(HsfdrawStruct00 *arg0);
static void MDObjCall(HsfData *arg0, HsfObject *arg1); static void MDObjCall(HsfData *arg0, HsfObject *arg1);
static void MDObjMesh(HsfData *arg0, HsfObject *arg1); static void MDObjMesh(HsfData *arg0, HsfObject *arg1);
static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1); static void MDFaceDraw(HsfObject *arg0, HsfFace *arg1);
static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3); static s32 MakeCalcNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3);
static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3); static s32 MakeNBT(HsfObject *arg0, HsfFace *arg1, s16 arg2, s16 arg3);
static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1); static void MDFaceCnt(HsfObject *arg0, HsfFace *arg1);
void GXResetWriteGatherPipe(void); void GXResetWriteGatherPipe(void);
@ -429,7 +420,7 @@ s32 ObjCullCheck(HsfData *arg0, HsfObject *arg1, Mtx arg2) {
} }
// TODO: not matching (https://decomp.me/scratch/54Pjw) // TODO: not matching (https://decomp.me/scratch/54Pjw)
static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) { static void FaceDraw(HsfdrawStruct00 *arg0, HsfFace *arg1) {
GXColor sp2C; GXColor sp2C;
void *sp28; void *sp28;
Hu3DTexAnimDataStruct *sp24; Hu3DTexAnimDataStruct *sp24;
@ -452,7 +443,7 @@ static void FaceDraw(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) {
temp_r29 = arg0->unk00; temp_r29 = arg0->unk00;
temp_r20 = temp_r28->constData; temp_r20 = temp_r28->constData;
kColorIdx = 0; 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; temp_r19 = temp_r28->flags | temp_r30->flags;
if (temp_r19 & 0x30) { if (temp_r19 & 0x30) {
if (temp_r19 & 0x10) { 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); 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; HsfObject *temp_r31;
ModelData *temp_r28; ModelData *temp_r28;
HsfConstData *temp_r27; HsfConstData *temp_r27;
@ -1662,7 +1653,7 @@ static void FaceDrawShadow(HsfdrawStruct00 *arg0, HsfdrawStruct02 *arg1) {
temp_r31 = arg0->unk04; temp_r31 = arg0->unk04;
temp_r28 = arg0->unk00; temp_r28 = arg0->unk00;
temp_r27 = temp_r31->constData; 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_r29 != materialBak) {
if (!(temp_r27->flags & 0x400)) { if (!(temp_r27->flags & 0x400)) {
drawCnt++; drawCnt++;
@ -2078,7 +2069,7 @@ void Hu3DDrawPost(void) {
float temp_f26; float temp_f26;
float temp_f25; float temp_f25;
LightData *temp_r22; LightData *temp_r22;
HsfdrawStruct02 *var_r27; HsfFace *var_r27;
Mtx sp150; Mtx sp150;
Mtx sp120; Mtx sp120;
Mtx spF0; Mtx spF0;
@ -2217,12 +2208,12 @@ void Hu3DDrawPost(void) {
if (shadowModelDrawF == 0) { if (shadowModelDrawF == 0) {
for (i = 0; i < temp_r24->count;) { for (i = 0; i < temp_r24->count;) {
FaceDraw(temp_r28, var_r27); FaceDraw(temp_r28, var_r27);
if (var_r27->unk00 == 4) { if (var_r27->type == 4) {
totalPolyCnt += DrawData[drawCnt - 1].unk08; totalPolyCnt += DrawData[drawCnt - 1].unk08;
i++; i++;
var_r27++; var_r27++;
} else { } 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; i += DrawData[drawCnt - 1].unk08;
var_r27 += DrawData[drawCnt - 1].unk08; var_r27 += DrawData[drawCnt - 1].unk08;
} }
@ -2236,7 +2227,7 @@ void Hu3DDrawPost(void) {
GXSetNumChans(1); GXSetNumChans(1);
for (i = 0; i < temp_r24->count;) { for (i = 0; i < temp_r24->count;) {
FaceDrawShadow(temp_r28, var_r27); FaceDrawShadow(temp_r28, var_r27);
if (var_r27->unk00 == 4) { if (var_r27->type == 4) {
i++; i++;
var_r27++; var_r27++;
} else { } else {
@ -2276,7 +2267,7 @@ static void ObjDraw(HsfdrawStruct00 *arg0) {
float temp_f26; float temp_f26;
LightData *temp_r24; LightData *temp_r24;
DrawDataStruct *temp_r25; DrawDataStruct *temp_r25;
HsfdrawStruct02 *var_r27; HsfFace *var_r27;
Mtx sp140; Mtx sp140;
Mtx sp110; Mtx sp110;
Mtx spE0; Mtx spE0;
@ -2359,13 +2350,13 @@ static void ObjDraw(HsfdrawStruct00 *arg0) {
if (shadowModelDrawF == 0) { if (shadowModelDrawF == 0) {
for (i = 0; i < temp_r26->count;) { for (i = 0; i < temp_r26->count;) {
FaceDraw(arg0, var_r27); FaceDraw(arg0, var_r27);
if (var_r27->unk00 == 4) { if (var_r27->type == 4) {
totalPolyCnt += DrawData[drawCnt - 1].unk08; totalPolyCnt += DrawData[drawCnt - 1].unk08;
i++; i++;
var_r27++; var_r27++;
} else { } else {
temp_r25 = &DrawData[drawCnt - 1]; temp_r25 = &DrawData[drawCnt - 1];
if ((var_r27->unk00 & 7) == 3) { if ((var_r27->type & 7) == 3) {
var_r20 = 2; var_r20 = 2;
} else { } else {
var_r20 = 1; var_r20 = 1;
@ -2384,7 +2375,7 @@ static void ObjDraw(HsfdrawStruct00 *arg0) {
GXSetNumChans(1); GXSetNumChans(1);
for (i = 0; i < temp_r26->count;) { for (i = 0; i < temp_r26->count;) {
FaceDrawShadow(arg0, var_r27); FaceDrawShadow(arg0, var_r27);
if (var_r27->unk00 == 4) { if (var_r27->type == 4) {
i++; i++;
var_r27++; var_r27++;
} else { } else {
@ -2440,7 +2431,7 @@ static void MDObjCall(HsfData *arg0, HsfObject *arg1) {
static void MDObjMesh(HsfData *arg0, HsfObject *arg1) { static void MDObjMesh(HsfData *arg0, HsfObject *arg1) {
HsfBuffer *temp_r29; HsfBuffer *temp_r29;
HsfdrawStruct02 *var_r28; HsfFace *var_r28;
s16 i; s16 i;
temp_r29 = arg1->data.face; temp_r29 = arg1->data.face;
@ -2502,7 +2493,7 @@ HsfConstData *ObjConstantMake(HsfObject *arg0, u32 arg1) {
return temp_r3; return temp_r3;
} }
static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) { static void MDFaceDraw(HsfObject *arg0, HsfFace *arg1) {
HsfMaterial *temp_r30; HsfMaterial *temp_r30;
s16 *var_r24; s16 *var_r24;
s16 var_r26; s16 var_r26;
@ -2513,9 +2504,9 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) {
s32 var_r25; s32 var_r25;
var_r26 = -1; var_r26 = -1;
temp_r30 = &arg0->data.material[arg1->unk02 & 0xFFF]; temp_r30 = &arg0->data.material[arg1->mat & 0xFFF];
if (temp_r30 != materialBak || polyTypeBak != (arg1->unk00 & 7) || (arg1->unk00 & 7) == 4) { if (temp_r30 != materialBak || polyTypeBak != (arg1->type & 7) || (arg1->type & 7) == 4) {
polyTypeBak = arg1->unk00 & 7; polyTypeBak = arg1->type & 7;
materialBak = temp_r30; materialBak = temp_r30;
DrawData[drawCnt].unk00 = (u32) DLBufP - (u32) DLBufStartP; DrawData[drawCnt].unk00 = (u32) DLBufP - (u32) DLBufStartP;
GXBeginDisplayList(DLBufP, 0x20000); GXBeginDisplayList(DLBufP, 0x20000);
@ -2557,60 +2548,60 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) {
Hu3DObjInfoP->flags |= 0x10000; Hu3DObjInfoP->flags |= 0x10000;
} }
faceCnt = 0; faceCnt = 0;
switch (arg1->unk00 & 7) { switch (arg1->type & 7) {
case 0: case 0:
case 1: case 1:
break; break;
case 2: case 2:
GXBegin(GX_TRIANGLES, GX_VTXFMT0, faceNumBuf[drawCnt]); GXBegin(GX_TRIANGLES, GX_VTXFMT0, faceNumBuf[drawCnt]);
for (var_r27 = 0; var_r27 < faceNumBuf[drawCnt] / 3; var_r27++, arg1++) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[0][1]); GXUnknownu16(arg1->indices[0][1]);
} else { } else {
MakeCalcNBT(arg0, arg1, 0, 1); MakeCalcNBT(arg0, arg1, 0, 1);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[0][2]; temp_r28 = arg1->indices[0][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[2][1]); GXUnknownu16(arg1->indices[2][1]);
} else { } else {
MakeNBT(arg0, arg1, 2, 0); MakeNBT(arg0, arg1, 2, 0);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[2][2]; temp_r28 = arg1->indices[2][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[1][1]); GXUnknownu16(arg1->indices[1][1]);
} else { } else {
MakeNBT(arg0, arg1, 1, 2); MakeNBT(arg0, arg1, 1, 2);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[1][2]; temp_r28 = arg1->indices[1][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { if (var_r25 != 0) {
GXUnknownu16(arg1->unk04[1][3]); GXUnknownu16(arg1->indices[1][3]);
} }
} }
faceCnt = faceNumBuf[drawCnt] / 3; faceCnt = faceNumBuf[drawCnt] / 3;
@ -2618,125 +2609,125 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) {
case 3: case 3:
GXBegin(GX_QUADS, GX_VTXFMT0, faceNumBuf[drawCnt]); GXBegin(GX_QUADS, GX_VTXFMT0, faceNumBuf[drawCnt]);
for (var_r27 = 0; var_r27 < faceNumBuf[drawCnt] / 4; var_r27++, arg1++) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[0][1]); GXUnknownu16(arg1->indices[0][1]);
} else { } else {
MakeCalcNBT(arg0, arg1, 0, 1); MakeCalcNBT(arg0, arg1, 0, 1);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[0][2]; temp_r28 = arg1->indices[0][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[2][1]); GXUnknownu16(arg1->indices[2][1]);
} else { } else {
MakeNBT(arg0, arg1, 2, 0); MakeNBT(arg0, arg1, 2, 0);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[2][2]; temp_r28 = arg1->indices[2][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[3][1]); GXUnknownu16(arg1->indices[3][1]);
} else { } else {
MakeNBT(arg0, arg1, 3, 2); MakeNBT(arg0, arg1, 3, 2);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[3][2]; temp_r28 = arg1->indices[3][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[1][1]); GXUnknownu16(arg1->indices[1][1]);
} else { } else {
MakeNBT(arg0, arg1, 1, 3); MakeNBT(arg0, arg1, 1, 3);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[1][2]; temp_r28 = arg1->indices[1][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { if (var_r25 != 0) {
GXUnknownu16(arg1->unk04[1][3]); GXUnknownu16(arg1->indices[1][3]);
} }
} }
faceCnt = faceNumBuf[drawCnt] / 4; faceCnt = faceNumBuf[drawCnt] / 4;
break; break;
case 4: case 4:
GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, faceNumBuf[drawCnt]); GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT0, faceNumBuf[drawCnt]);
GXUnknownu16(arg1->unk04[0][0]); GXUnknownu16(arg1->indices[0][0]);
if (var_r26 == -1) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[0][1]); GXUnknownu16(arg1->indices[0][1]);
} else { } else {
MakeCalcNBT(arg0, arg1, 0, 1); MakeCalcNBT(arg0, arg1, 0, 1);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[0][2]; temp_r28 = arg1->indices[0][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[2][1]); GXUnknownu16(arg1->indices[2][1]);
} else { } else {
MakeNBT(arg0, arg1, 2, 0); MakeNBT(arg0, arg1, 2, 0);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[2][2]; temp_r28 = arg1->indices[2][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { 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) { if (var_r26 == -1) {
GXUnknownu16(arg1->unk04[1][1]); GXUnknownu16(arg1->indices[1][1]);
} else { } else {
MakeNBT(arg0, arg1, 1, 2); MakeNBT(arg0, arg1, 1, 2);
} }
if (temp_r30->vtxMode == 5) { if (temp_r30->vtxMode == 5) {
temp_r28 = arg1->unk04[1][2]; temp_r28 = arg1->indices[1][2];
GXUnknownu16(temp_r28); GXUnknownu16(temp_r28);
if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) { if (((GXColor*) arg0->data.color->data)[temp_r28].a != 0xFF) {
Hu3DObjInfoP->flags |= 0x4001; Hu3DObjInfoP->flags |= 0x4001;
} }
} }
if (var_r25 != 0) { if (var_r25 != 0) {
GXUnknownu16(arg1->unk04[1][3]); GXUnknownu16(arg1->indices[1][3]);
} }
var_r24 = arg1->unk20; var_r24 = arg1->strip.data;
for (var_r27 = 0; var_r27 < arg1->unk1C; var_r27++, var_r24 += 4) { for (var_r27 = 0; var_r27 < arg1->strip.count; var_r27++, var_r24 += 4) {
GXUnknownu16(var_r24[0]); GXUnknownu16(var_r24[0]);
if (var_r26 == -1) { if (var_r26 == -1) {
GXUnknownu16(var_r24[1]); GXUnknownu16(var_r24[1]);
@ -2754,7 +2745,7 @@ static void MDFaceDraw(HsfObject *arg0, HsfdrawStruct02 *arg1) {
GXUnknownu16(var_r24[3]); GXUnknownu16(var_r24[3]);
} }
} }
faceCnt = arg1->unk1C + 1; faceCnt = arg1->strip.count + 1;
break; break;
} }
temp_r3 = GXEndDisplayList(); 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 sp10;
Vec *temp_r29; Vec *temp_r29;
Vec *temp_r31; Vec *temp_r31;
@ -2776,9 +2767,9 @@ static s32 MakeCalcNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg
s16 temp_r27; s16 temp_r27;
temp_r31 = arg0->data.vertex->data; temp_r31 = arg0->data.vertex->data;
temp_r27 = arg1->unk04[arg2][1]; temp_r27 = arg1->indices[arg2][1];
temp_r25 = arg1->unk04[arg2][0]; temp_r25 = arg1->indices[arg2][0];
temp_r24 = arg1->unk04[arg3][0]; temp_r24 = arg1->indices[arg3][0];
if (arg0->data.hook != 0) { if (arg0->data.hook != 0) {
temp_r29 = arg0->data.normal->data; temp_r29 = arg0->data.normal->data;
sp10.x = temp_r29[temp_r27].x; 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); 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 sp10;
Vec *temp_r30; Vec *temp_r30;
Vec *spC; Vec *spC;
@ -2809,7 +2800,7 @@ static s32 MakeNBT(HsfObject *arg0, HsfdrawStruct02 *arg1, s16 arg2, s16 arg3) {
s16 temp_r28; s16 temp_r28;
spC = arg0->data.vertex->data; spC = arg0->data.vertex->data;
temp_r28 = arg1->unk04[arg2][1]; temp_r28 = arg1->indices[arg2][1];
if (arg0->data.hook != 0) { if (arg0->data.hook != 0) {
temp_r30 = arg0->data.normal->data; temp_r30 = arg0->data.normal->data;
sp10.x = temp_r30[temp_r28].x; 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); 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; HsfMaterial *temp_r30;
s16 i; 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) // 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; polySize = 4;
polyTypeBak = arg1->unk00 & 7; polyTypeBak = arg1->type & 7;
materialBak = temp_r30; materialBak = temp_r30;
matChgCnt++; matChgCnt++;
if (DLFirstF != 0) { if (DLFirstF != 0) {
@ -2857,7 +2848,7 @@ static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) {
polySize += 2; polySize += 2;
} }
} }
switch (arg1->unk00 & 7) { switch (arg1->type & 7) {
case 0: case 0:
OSReport("Error\n"); OSReport("Error\n");
break; break;
@ -2876,9 +2867,9 @@ static void MDFaceCnt(HsfObject *arg0, HsfdrawStruct02 *arg1) {
break; break;
case 4: case 4:
triCnt++; triCnt++;
faceNumBuf[drawCnt] += arg1->unk1C + 3; faceNumBuf[drawCnt] += arg1->strip.count + 3;
DLTotalNum += polySize * 3; DLTotalNum += polySize * 3;
DLTotalNum += polySize * arg1->unk1C; DLTotalNum += polySize * arg1->strip.count;
break; break;
default: default:
OSReport("Error\n"); OSReport("Error\n");

View file

@ -3,6 +3,8 @@
#include "ctype.h" #include "ctype.h"
#define AS_S16(field) (*((s16 *)&(field))) #define AS_S16(field) (*((s16 *)&(field)))
#define AS_U16(field) (*((u16 *)&(field)))
GXColor rgba[100]; GXColor rgba[100];
HsfHeader head; HsfHeader head;
HsfData Model; HsfData Model;
@ -401,7 +403,7 @@ static void FaceLoad(void)
HsfFace *data; HsfFace *data;
HsfFace *file_face_strip; HsfFace *file_face_strip;
HsfFace *new_face_strip; HsfFace *new_face_strip;
HsfTristrip *strip; u8 *strip;
s32 i; s32 i;
s32 j; s32 j;
@ -418,14 +420,14 @@ static void FaceLoad(void)
new_face->name = SetName((u32 *)&file_face->name); new_face->name = SetName((u32 *)&file_face->name);
new_face->count = file_face->count; new_face->count = file_face->count;
new_face->data = (void *)((u32)data+(u32)temp_data); 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; new_face = temp_face;
for(i=0; i<head.face.count; i++, new_face++) { for(i=0; i<head.face.count; i++, new_face++) {
file_face_strip = new_face_strip = new_face->data; file_face_strip = new_face_strip = new_face->data;
for(j=0; j<new_face->count; j++, new_face_strip++, file_face_strip++) { for(j=0; j<new_face->count; j++, new_face_strip++, file_face_strip++) {
if(file_face_strip->type == 4) { if(AS_U16(file_face_strip->type) == 4) {
new_face_strip->strip.data = &strip[(u32)file_face_strip->strip.data]; new_face_strip->strip.data = (s16 *)(strip+(u32)file_face_strip->strip.data*(sizeof(s16)*4));
} }
} }
} }