papermario/src/a5dd0_len_114e0.c
Ethan Roseman 969e28c76c
40% (#459)
* cleanup
* some of effect_9
* remove 1 warning
* restore Bowser Slug to his former glory (behavior)
2021-10-03 18:42:38 +01:00

2968 lines
100 KiB
C

#include "common.h"
#include "model.h"
#include "ld_addrs.h"
typedef struct GameMode {
/* 0x00 */ u16 flags;
/* 0x04 */ void (*init)(void);
/* 0x08 */ void (*step)(void);
/* 0x0C */ UNK_FUN_PTR(unk_0C);
/* 0x10 */ void (*render)(void);
/* 0x14 */ void (*renderAux)(void); ///< @see state_render_frontUI
} GameMode; // size = 0x18
typedef struct Fog {
/* 0x00 */ s32 enabled;
/* 0x04 */ s32 r;
/* 0x08 */ s32 g;
/* 0x0C */ s32 b;
/* 0x10 */ s32 a;
/* 0x14 */ s32 startDistance;
/* 0x18 */ s32 endDistance;
} Fog; // size = 0x1C
extern Gfx D_8014B7F8[];
extern Gfx D_8014B820[];
extern Gfx D_8014B848[];
extern Gfx D_8014B870[];
extern Gfx D_8014B898[];
extern Gfx D_8014B8C0[];
extern Gfx D_8014B8E8[];
extern Gfx D_8014B910[];
extern Gfx D_8014B938[];
extern Gfx D_8014B960[];
extern Gfx D_8014B988[];
extern Gfx D_8014B9B0[];
extern Gfx D_8014B9D8[];
extern Gfx D_8014BA00[];
extern Gfx D_8014BA20[];
extern Gfx D_8014BA48[];
extern Gfx D_8014BA70[];
extern Gfx D_8014BA98[];
extern Gfx D_8014BAC0[];
extern Gfx D_8014BAE8[];
extern Gfx D_8014BB10[];
extern Gfx D_8014BB38[];
extern Gfx D_8014BB60[];
extern Gfx D_8014BB88[];
extern Gfx D_8014BBB0[];
extern Gfx D_8014BBD8[];
extern Gfx D_8014BC00[];
extern Gfx D_8014BC28[];
extern Gfx D_8014BC50[];
extern Gfx D_8014BC78[];
extern Gfx D_8014BCA0[];
extern Gfx D_8014BCC8[];
extern Gfx D_8014BCF8[];
extern Gfx D_8014BD18[];
extern Gfx D_8014BD40[];
extern Gfx D_8014BD68[];
extern Gfx D_8014BD88[];
extern Gfx D_8014BDB0[];
extern Gfx D_8014BDD8[];
extern Gfx D_8014BE00[];
extern Gfx D_8014BE28[];
extern Gfx D_8014BE50[];
extern Gfx D_8014BE78[];
extern Gfx D_8014BEA0[];
extern Gfx D_8014BEC8[];
extern Gfx D_8014BEF0[];
extern Gfx D_8014BF18[];
extern Gfx D_8014BF40[];
extern Gfx D_8014BF68[];
extern Gfx D_8014BF90[];
extern Gfx D_8014BFB8[];
extern Gfx D_8014BFE0[];
extern Gfx D_8014C008[];
extern Gfx D_8014C028[];
extern Gfx D_8014C050[];
extern Gfx D_8014C078[];
extern Gfx D_8014C098[];
extern Gfx D_8014C0C0[];
extern Gfx D_8014C0E8[];
extern Gfx D_8014C110[];
extern Gfx D_8014C138[];
extern Gfx D_8014C160[];
s32 D_8014AFB0 = 0xFF;
s32 D_8014AFB4[] = {0, 0, 0};
Gfx* D_8014AFC0[] = { D_8014B7F8, D_8014B910, D_8014B820, D_8014B938, D_8014B848, D_8014B960, D_8014B870, D_8014B988, D_8014B898, D_8014BA20, D_8014B9B0, D_8014BAC0, D_8014B8C0, D_8014B9D8, D_8014B8E8, D_8014BA00 };
Gfx* D_8014B000[] = { D_8014BB60, D_8014BC78, D_8014BB88, D_8014BCA0, D_8014BBB0, D_8014BCC8, D_8014BBD8, D_8014BCF8, D_8014BC00, D_8014BD88, D_8014BD18, D_8014BC28, D_8014BD40, D_8014BC50, D_8014BD68, D_8014BE78, D_8014BF90, D_8014BEA0, D_8014BFB8, D_8014BEC8, D_8014BFE0, D_8014BEF0, D_8014C008, D_8014BF18, D_8014C098, D_8014C028, D_8014BF40, D_8014C050, D_8014BF68, D_8014C078, D_8014BA48, D_8014BA70, D_8014BA98, D_8014BDB0, D_8014BDD8, D_8014BE00, D_8014C0C0, D_8014C0E8, D_8014C110, D_8014BB10, D_8014BB38, D_8014BE28, D_8014BE50, D_8014C138, D_8014C160, NULL };
s32 D_8014B0B8 = 0xFCFFFFFF;
s32 D_8014B0BC[] = { 0xFFFE793C, 0xFCFFFFFF, 0xFFFE7838, 0xFCFFFFFF, 0xFFFE7838, 0xFC457FFF, 0xFFFDF838, 0xFC41FFFF, 0xFFFEF838, 0xFC121824, 0xFF33FFFF, 0xFC127FFF, 0xFFFFF238, 0xFC1219FF, 0xFFFFFE38, 0xFC127E0A, 0xF3FFF238, 0xFC121803, 0xFFFFFF78, 0xFC147E28, 0x44FE793C, 0xFC147FFF, 0x4FFE7838, 0xFC147FFF, 0x4FFE7838, 0xFC147E0A, 0x4FFE72F8, 0xFC147E03, 0x4FFE7978, 0xFCFFFFFF, 0xFFFCF279, 0xFCFFFFFF, 0xFFFCF238, 0xFCFFFFFF, 0xFFFCF238, 0xFC157FFF, 0xFFFDF238, 0xFCFFFE03, 0xFFFCF378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF9883, 0xFFFFAF78, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FE03, 0x2FFD7378, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61FEC3, 0x11FCF279, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FE03, 0x1FFCF378, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, };
s32 D_8014B400 = 0xFCFFFFFF;
s32 D_8014B404[] = { 0xFFFE793C, 0xFCFFFFFF, 0xFFFE7838, 0xFCFFFFFF, 0xFFFE7838, 0xFC457FFF, 0xFFFDF838, 0xFC41FFFF, 0xFFFEF838, 0xFC127E24, 0xFFFFF3F9, 0xFC127FFF, 0xFFFFF238, 0xFC127FFF, 0xFFFFF238, 0xFC127E0A, 0xF3FFF238, 0xFC127E03, 0xFFFFF378, 0xFC147E28, 0x44FE793C, 0xFC147FFF, 0x4FFE7838, 0xFC147FFF, 0x4FFE7838, 0xFC147E0A, 0x4FFE72F8, 0xFC147E03, 0x4FFE7978, 0xFCFFFFFF, 0xFFFCF279, 0xFCFFFFFF, 0xFFFCF238, 0xFCFFFFFF, 0xFFFCF238, 0xFC157FFF, 0xFFFDF238, 0xFCFFFE03, 0xFFFCF378, 0xFC26A004, 0x1FFC93FC, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1FFC93FC, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF9883, 0xFFFFAF78, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FE03, 0x2FFD7378, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61FEC3, 0x11FCF279, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FE03, 0x1FFCF378, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, };
u32 mdl_textureBaseAddress = 0x8028E000;
s8 mdl_bgMultiplyColorA = 0;
s8 mdl_bgMultiplyColorR = 0;
s8 mdl_bgMultiplyColorG = 0;
s8 mdl_bgMultiplyColorB = 0;
s8 mdl_renderModelFogPrimColorR = 0;
s8 mdl_renderModelFogPrimColorG = 0;
s8 mdl_renderModelFogPrimColorB = 0;
s8 mdl_renderModelFogPrimColorA = 0;
s8 mdl_renderModelFogColorR = 0;
s8 mdl_renderModelFogColorG = 0;
s8 mdl_renderModelFogColorB = 0;
s8 mdl_renderModelFogColorA = 0; // unused?
s32 mdl_renderModelFogStart = 950;
s32 mdl_renderModelFogEnd = 1000;
s8 gRenderModelPrimR = 255;
s8 gRenderModelPrimG = 255;
s8 gRenderModelPrimB = 255;
s8 gRenderModelEnvR = 0;
s8 gRenderModelEnvG = 0;
s8 gRenderModelEnvB = 0;
s8 D_8014B766 = 0;
s8 D_8014B767 = 0;
Matrix4s mdl_RDPIdentity = {
.whole = {
{1, 0, 0, 0},
{0, 1, 0, 0},
{0, 0, 1, 0},
{0, 0, 0, 1}
},
.frac = {
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
}
};
s32 D_8014B7A8[] = { 0x00000006, 0x00000000, 0x00000005, 0x00020000, 0x00000004, 0x00030000, 0x00000003, 0x00038000, 0x00000002, 0x0003C000, 0x00000001, 0x0003E000, 0x00000000, 0x0003F000, 0x00000000, 0x0003F800, 0x00000000, 0x00000000, };
s32 D_8014B7F0[] = { 0x00000000, 0x00000000, };
Gfx D_8014B7F8[] = {
gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD |
G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B820[] = {
gsDPSetRenderMode(G_RM_AA_ZB_OPA_DECAL, G_RM_AA_ZB_OPA_DECAL2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD |
G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B848[] = {
gsDPSetRenderMode(G_RM_AA_ZB_OPA_INTER, G_RM_AA_ZB_OPA_INTER2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD |
G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B870[] = {
gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B898[] = {
gsDPSetRenderMode(G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B8C0[] = {
gsDPSetRenderMode(G_RM_AA_ZB_XLU_DECAL, G_RM_AA_ZB_XLU_DECAL2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B8E8[] = {
gsDPSetRenderMode(G_RM_AA_ZB_XLU_INTER, G_RM_AA_ZB_XLU_INTER2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B910[] = {
gsDPSetRenderMode(G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B938[] = {
gsDPSetRenderMode(G_RM_ZB_OPA_DECAL, G_RM_ZB_OPA_DECAL2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B960[] = {
gsDPSetRenderMode(G_RM_AA_ZB_OPA_INTER, G_RM_AA_ZB_OPA_INTER2),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
gsSPEndDisplayList(),
};
Gfx D_8014B988[] = {
gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B9B0[] = {
gsDPSetRenderMode(G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014B9D8[] = {
gsDPSetRenderMode(G_RM_ZB_OVL_SURF, G_RM_ZB_OVL_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BA00[] = {
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BA20[] = {
gsDPSetRenderMode(AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD |
CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BA48[] = {
gsDPSetRenderMode(G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BA70[] = {
gsDPSetRenderMode(G_RM_AA_TEX_EDGE, G_RM_AA_TEX_EDGE2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BA98[] = {
gsDPSetRenderMode(G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BAC0[] = {
gsDPSetRenderMode(AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD |
CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BAE8[] = {
gsDPSetRenderMode(IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL |
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), IM_RD | CVG_DST_SAVE | ZMODE_XLU |
FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BB10[] = {
gsDPSetRenderMode(G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BB38[] = {
gsDPSetRenderMode(G_RM_CLD_SURF, G_RM_CLD_SURF2),
gsDPSetCycleType(G_CYC_1CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BB60[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BB88[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BBB0[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_INTER2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BBD8[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_TEX_EDGE2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BC00[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BC28[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BC50[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_INTER2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BC78[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_OPA_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BCA0[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_OPA_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BCC8[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_INTER2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
gsSPEndDisplayList(),
};
Gfx D_8014BCF8[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_TEX_EDGE2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BD18[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BD40[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_XLU_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BD68[] = {
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BD88[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BDB0[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_OPA_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BDD8[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_TEX_EDGE2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BE00[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_AA_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BE28[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_CLD_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BE50[] = {
gsDPSetRenderMode(G_RM_PASS, G_RM_CLD_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BE78[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BEA0[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BEC8[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_INTER2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BEF0[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BF18[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BF40[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BF68[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_INTER2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BF90[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_OPA_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BFB8[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_OPA_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014BFE0[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_INTER2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C008[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C028[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C050[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_XLU_DECAL2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C078[] = {
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C098[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C0C0[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_OPA_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C0E8[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_TEX_EDGE2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C110[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_XLU_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C138[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
Gfx D_8014C160[] = {
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_CLD_SURF2),
gsDPSetCycleType(G_CYC_2CYCLE),
gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH),
gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH),
gsSPEndDisplayList(),
};
s32 D_8014C188[] = { 0xFFFE7960, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x007A1200, 0x007A1200, 0x007A1200, 0x00000000, 0x007A1200, 0x007270E0, 0x007270E0, 0x007270E0, 0x00000000, 0x006ACFC0, 0x006ACFC0, 0x006ACFC0, 0x006ACFC0, 0x00632EA0, 0x00632EA0, 0x00632EA0, 0x00000000, 0x005B8D80, 0x005B8D80, 0x005B8D80, 0x00000000, 0x0053EC60, 0x0053EC60, 0x0053EC60, 0x007A1200, 0x003D0900, 0x0040D990, 0x0044AA20, 0x0044AA20, 0x007A1200, 0x000AAE60, }; // render mode -> distance map?
s8 D_8014C248[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
// TODO BSS to sort out
extern ModelNode** gCurrentModelTreeRoot;
extern ModelTransformGroupList wTransformGroups;
extern ModelTransformGroupList bTransformGroups;
// BSS
static s32 B_801512B0[2];
static ModelCustomGfxBuilderList* gCurrentCustomModelGfxBuildersPtr;
static s32 D_801512BC;
static s32 D_801512C0;
static s32 gEntityHeapBase;
static s32 D_801512C8;
BSS ModelList* gCurrentModels;
static s32 D_801512D0[4];
static ModelTransformGroupList* gCurrentTransformGroups;
static s8 gMsgGlobalWaveCounter[0x4];
static ModelCustomGfxList* gCurrentCustomModelGfxPtr;
static s32 gLastCreatedEntityIndex;
static s8 B_801512F0[0x410];
static GameMode gMainGameState[2]; // TODO rename
extern s32 D_80151324;
extern s32 D_8015132C;
extern s32 D_80151330;
extern s32 wStaticEntityDataSize;
extern s32 bStaticEntityDataSize;
extern StaticEntityData* wStaticEntityData[30];
extern StaticEntityData* bStaticEntityData[4];
extern TileDescriptor gCurrentTileDescriptor;
extern ModelList wModelList;
extern ModelList bModelList;
extern ModelCustomGfxList wModelSpecialDls;
extern ModelCustomGfxList bModelSpecialDls;
extern ModelCustomGfxBuilderList wCustomModelGfxBuilders;
extern ModelCustomGfxBuilderList bCustomModelGfxBuilders;
extern ModelLocalVertexCopy** D_80152190;
extern ModelLocalVertexCopy** D_801521D0;
extern ModelLocalVertexCopy** gCurrentModelLocalVtxBuffers;
extern ModelNode* D_80152214;
extern ModelNode* D_80152218;
extern ModelTreeInfoList D_80152220;
extern ModelTreeInfoList D_80152A20;
extern s8 wBgRenderType;
extern s8 bBgRenderType;
extern s32 mdl_treeIterPos;
extern Fog wFogSettings;
extern Fog bFogSettings;
extern Fog* gCurrentFogSettings;
extern s32 texPannerMainU[MAX_TEX_PANNERS];
extern s32 texPannerMainV[MAX_TEX_PANNERS];
extern s32 texPannerAuxU[MAX_TEX_PANNERS];
extern s32 texPannerAuxV[MAX_TEX_PANNERS];
extern u32 mdl_nextTextureAddress;
extern u16 mdl_currentTransformGroupChildIndex;
extern ModelNode* D_80153370;
extern u16 D_80153374;
extern u16 D_80153376;
extern s16 D_8015336E;
extern RenderTask* mdl_renderTaskLists[3];
extern s32 mdl_renderTaskMode;
extern s32 mdl_renderTaskCount; // num render task entries?
extern s8 D_8015A578;
extern TextureHandle mdl_textureHandles[128];
extern RenderTask mdl_clearRenderTasks[3][0x100];
void update_shadows(void);
s32 step_entity_commandlist(Entity* entity);
void render_shadows(void);
void update_entity_transform_matrix(Entity* entity);
void update_shadow_transform_matrix(Shadow* shadow);
void update_entity_inverse_rotation_matrix(Entity* entity);
void delete_entity(s32 entityIndex);
void delete_entity_and_unload_data(s32 entityIndex);
void _delete_shadow(s32 shadowIndex);
s32 entity_get_collision_flags(Entity* entity);
void entity_free_static_data(StaticEntityData* data);
void update_entity_shadow_position(Entity* entity);
s32 entity_raycast_down(f32* x, f32* y, f32* z, f32* hitYaw, f32* hitPitch, f32* hitLength);
void load_model_transforms(ModelNode* model, ModelNode* parent, Matrix4f mdlTxMtx, s32 treeDepth);
void enable_transform_group(u16 modelID);
void update_entities(void) {
s32 i;
D_801512BC = 0;
D_801512C0 = 0;
D_80151330++;
for (i = 0; i < MAX_ENTITIES; i++) {
Entity* entity = get_entity_by_index(i);
if (entity != NULL) {
D_801512C0++;
if (!(entity->flags & 0x40000000)) {
if (entity->flags & 0x1000000) {
entity->flags &= ~0x1000000;
if (!(entity->flags & 0x8000)) {
entity->flags |= 0x2000000;
}
entity->boundScript = start_script(entity->boundScriptBytecode, 0xA, 0x20);
}
if (entity->flags & 0x2000000) {
if (does_script_exist(entity->boundScript->id)) {
if (entity->flags & 8) {
update_model_animator(entity->virtualModelIndex);
} else {
exec_entity_model_commandlist(entity->virtualModelIndex);
}
if (entity->flags & 0x2000) {
entity->rotation.y = -gCameras[gCurrentCameraID].currentYaw;
}
if (!(entity->flags & 0x10)) {
update_entity_transform_matrix(entity);
}
continue;
} else {
entity->flags &= ~0x2000000;
}
}
if (entity->unk_07 == 0) {
entity->collisionFlags = entity_get_collision_flags(entity);
if (entity->collisionFlags) {
EntityCallback entityCallback = entity->staticData->unk_data_ptr2;
if (entityCallback != NULL && entityCallback(entity) != 0) {
entity->unk_07 = 0xA;
entity->flags |= 0x10000;
}
}
} else {
entity->unk_07--;
if (entity->flags & 0x40) {
if (entity->unk_07 == 0) {
entity->flags &= ~0x60;
} else {
entity->flags |= 0x20;
}
} else if (entity->unk_07 == 0) {
entity->flags &= ~0x10000;
entity->flags &= ~0x20000;
entity->collisionFlags = 0;
}
}
if (entity->flags & 0x2000) {
entity->rotation.y = -gCameras[gCurrentCameraID].currentYaw;
}
if (!gGameStatusPtr->disableScripts) {
if (entity->updateScriptCallback != NULL) {
entity->updateScriptCallback(entity);
}
if (entity->scriptReadPos != NULL) {
if (entity->hasEntityScript) {
entity->hasEntityScript--;
if (!(entity->hasEntityScript)) {
while (step_entity_commandlist(entity));
}
}
}
}
if (!(entity->flags & 0x10)) {
update_entity_transform_matrix(entity);
}
if (!(entity->flags & 0x20)) {
update_entity_inverse_rotation_matrix(entity);
}
if (entity->flags & 8) {
update_model_animator(entity->virtualModelIndex);
} else {
exec_entity_model_commandlist(entity->virtualModelIndex);
}
if (entity->shadowIndex >= 0) {
update_entity_shadow_position(entity);
}
if (entity->flags & 0x20000000) {
delete_entity(entity->listIndex);
}
if (entity->flags & 0x4000000) {
delete_entity_and_unload_data(entity->listIndex);
}
}
}
}
update_shadows();
D_8015A578 = 0;
}
void update_shadows(void) {
s32 i;
D_80151324 = 0;
for (i = 0; i < MAX_SHADOWS; i++) {
Shadow* shadow = get_shadow_by_index(i);
if (shadow != NULL) {
D_80151324++;
if (!(shadow->flags & 0x40000000)) {
if (shadow->flags & 0x2000) {
shadow->rotation.y = -gCameras[gCurrentCameraID].currentYaw;
}
update_shadow_transform_matrix(shadow);
if (shadow->flags & 8) {
update_model_animator(shadow->entityModelID);
} else {
exec_entity_model_commandlist(shadow->entityModelID);
}
if (shadow->flags & 0x20000000) {
_delete_shadow(shadow->listIndex);
}
}
}
}
}
void set_entity_commandlist(Entity* entity, s32* entityScript) {
entity->scriptReadPos = entityScript;
entity->hasEntityScript = TRUE;
entity->savedReadPos = entity->scriptReadPos;
}
// Ordering issues with the savedReadPos cases (4 and 5)
#ifdef NON_MATCHING
s32 step_entity_commandlist(Entity* entity) {
s32* args = entity->scriptReadPos;
s32 ret;
s32 a1;
s32 (*tempfunc)(Entity*);
switch (*args++) {
case 0:
entity->hasEntityScript = -1;
entity->updateScriptCallback = NULL;
entity->scriptReadPos = NULL;
ret = FALSE;
break;
case 1:
entity->scriptReadPos = *args;
entity->hasEntityScript = 1;
entity->savedReadPos = entity->scriptReadPos;
ret = TRUE;
break;
case 2:
tempfunc = *args++;
entity->scriptReadPos = args;
(tempfunc)(entity);
ret = TRUE;
break;
case 3:
entity->hasEntityScript = *args++;
entity->updateScriptCallback = (s32 (*)(Entity*)) *args++;
entity->scriptReadPos = args++;
ret = FALSE;
break;
case 4:
entity->scriptReadPos = entity->savedReadPos[*args++];
ret = TRUE;
break;
case 5:
a1 = *args++;
entity->savedReadPos[a1] = args;
entity->scriptReadPos = args;
ret = TRUE;
break;
case 6:
if (entity->boundScriptBytecode != NULL) {
entity->flags |= 0x1000000;
}
entity->scriptReadPos = args++;
ret = TRUE;
break;
case 7:
entity->flags |= *args++;
entity->scriptReadPos = args++;
ret = TRUE;
break;
case 8:
entity->flags &= ~*args++;
entity->scriptReadPos = args++;
ret = TRUE;
break;
case 9:
sfx_play_sound(*args++);
entity->scriptReadPos = args++;
ret = TRUE;
break;
default:
args++;
entity->scriptReadPos = args++;
ret = TRUE;
break;
}
return ret;
}
#else
INCLUDE_ASM(s32, "a5dd0_len_114e0", step_entity_commandlist, Entity* entity);
#endif
void exec_entity_commandlist(Entity* entity) {
while (step_entity_commandlist(entity));
}
void func_8010FD98(s32 arg0, s32 alpha) {
if (alpha >= 255) {
gDPSetRenderMode(gMasterGfxPos++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2);
gDPSetCombineMode(gMasterGfxPos++, G_CC_MODULATEIA, G_CC_MODULATEIA);
} else {
gDPSetCombineLERP(gMasterGfxPos++, 0, 0, 0, TEXEL0, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, TEXEL0, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gMasterGfxPos++, 0, 0, 0x00, 0x00, 0x00, alpha);
}
}
void func_8010FE44(s32 arg0) {
func_8010FD98(arg0, D_8014AFB0);
}
void entity_model_set_shadow_color(s32 alpha) {
gDPSetCombineLERP(gMasterGfxPos++, 0, 0, 0, 0, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, 0, TEXEL0, 0, PRIMITIVE, 0);
gDPSetPrimColor(gMasterGfxPos++, 0, 0, 0x00, 0x00, 0x00, alpha);
}
void render_entities(void) {
s32 i;
for (i = 0; i < MAX_ENTITIES; i++) {
Entity* entity = get_entity_by_index(i);
if (entity != NULL) {
if (!gGameStatusPtr->isBattle) {
if (D_80151310 != 0 &&
!(entity->flags & 0x80000) &&
dist2D(gPlayerStatusPtr->position.x,
gPlayerStatusPtr->position.z,
entity->position.x,
entity->position.z) > 200.0f
) {
continue;
}
if (D_80151310 == 1) {
if (!(entity->flags & 2)) {
continue;
}
} else if (D_80151310 == 2) {
if (!(entity->flags & 0x40000)) {
continue;
}
}
}
if (!(entity->flags & 1)) {
if (entity->flags & 8) {
if (D_8014AFB0 == 0xFF) {
if (entity->renderSetupFunc != NULL) {
set_animator_render_callback(entity->virtualModelIndex, entity->listIndex, entity->renderSetupFunc);
}
} else {
set_animator_render_callback(entity->virtualModelIndex, entity->listIndex, func_8010FE44);
}
if (entity->vertexData == NULL) {
render_animated_model(entity->virtualModelIndex, &entity->transformMatrix);
} else {
render_animated_model_with_vertices(entity->virtualModelIndex,
&entity->transformMatrix,
entity->vertexSegment,
entity->vertexData);
}
} else {
if (D_8014AFB0 == 0xFF) {
if (entity->renderSetupFunc != NULL) {
bind_entity_model_setupGfx(entity->virtualModelIndex,
entity->listIndex,
entity->renderSetupFunc);
} else {
get_entity_model(entity->virtualModelIndex)->fpSetupGfxCallback = NULL;
}
} else {
bind_entity_model_setupGfx(entity->virtualModelIndex, entity->listIndex, func_8010FE44);
}
if (entity->vertexData == NULL) {
draw_entity_model_A(entity->virtualModelIndex, &entity->transformMatrix);
} else {
draw_entity_model_B(entity->virtualModelIndex,
&entity->transformMatrix,
entity->vertexSegment,
entity->vertexData);
}
}
}
}
}
render_shadows();
}
void render_shadows(void) {
s32 i;
for (i = 0; i < MAX_SHADOWS; i++) {
Shadow* shadow = get_shadow_by_index(i);
if (shadow != NULL) {
if (shadow->flags & 1) {
if (shadow->flags & 0x10000000) {
shadow->unk_05 -= 20;
if (shadow->unk_05 <= 20) {
shadow->flags |= 0x20000000;
}
}
} else if (shadow->flags & 8) {
if (shadow->vertexArray == NULL) {
render_animated_model(shadow->entityModelID, &shadow->transformMatrix);
} else {
render_animated_model_with_vertices(shadow->entityModelID,
&shadow->transformMatrix,
shadow->vertexSegment,
shadow->vertexArray);
}
} else {
if (shadow->flags & 0x10000000) {
shadow->unk_05 -= 20;
if (shadow->unk_05 <= 20) {
shadow->flags |= 0x20000000;
}
}
bind_entity_model_setupGfx(shadow->entityModelID, shadow->unk_05, entity_model_set_shadow_color);
if (shadow->vertexArray == NULL) {
draw_entity_model_A(shadow->entityModelID, &shadow->transformMatrix);
} else {
draw_entity_model_B(shadow->entityModelID,
&shadow->transformMatrix,
shadow->vertexSegment,
shadow->vertexArray);
}
}
}
}
}
INCLUDE_ASM(void, "a5dd0_len_114e0", update_entity_transform_matrix, Entity* entity);
INCLUDE_ASM(void, "a5dd0_len_114e0", update_shadow_transform_matrix, Shadow* shadow);
INCLUDE_ASM(void, "a5dd0_len_114e0", update_entity_inverse_rotation_matrix, Entity* entity);
Entity* get_entity_by_index(s32 index) {
return (*gCurrentEntityListPtr)[index & 0xFFF];
}
Shadow* get_shadow_by_index(s32 index) {
return (*gCurrentShadowListPtr)[index & 0xFFF];
}
EntityList* get_entity_list(void) {
EntityList* ret;
if (!gGameStatusPtr->isBattle) {
ret = &gWorldEntityList;
} else {
ret = &gBattleEntityList;
}
return ret;
}
ShadowList* get_shadow_list(void) {
ShadowList* ret;
if (!gGameStatusPtr->isBattle) {
ret = &gWorldShadowList;
} else {
ret = &gBattleShadowList;
}
return ret;
}
s32 entity_start_script(Entity* entity) {
if (entity->boundScriptBytecode != NULL) {
entity->flags |= 0x1000000;
return 1;
}
return 0;
}
u32 get_entity_type(s32 index) {
Entity* entity = get_entity_by_index(index);
if (entity == NULL) {
return -1;
} else {
return entity->staticData->entityType;
}
}
void delete_entity(s32 entityIndex) {
Entity* entity = get_entity_by_index(entityIndex);
if (entity->dataBuf != NULL) {
heap_free(entity->dataBuf);
}
if (!(entity->flags & 8)) {
free_entity_model_by_index(entity->virtualModelIndex);
} else {
delete_model_animator(get_animator_by_index(entity->virtualModelIndex));
}
if (entity->shadowIndex >= 0) {
Shadow* shadow = get_shadow_by_index(entity->shadowIndex);
shadow->flags |= 0x10000000;
}
heap_free((*gCurrentEntityListPtr)[entityIndex]);
(*gCurrentEntityListPtr)[entityIndex] = NULL;
}
void delete_entity_and_unload_data(s32 entityIndex) {
Entity* entity = get_entity_by_index(entityIndex);
if (entity->dataBuf != NULL) {
heap_free(entity->dataBuf);
}
if (!(entity->flags & 8)) {
free_entity_model_by_index(entity->virtualModelIndex);
} else {
delete_model_animator(get_animator_by_index(entity->virtualModelIndex));
}
entity_free_static_data(entity->staticData);
if (entity->shadowIndex >= 0) {
Shadow* shadow = get_shadow_by_index(entity->shadowIndex);
shadow->flags |= 0x10000000;
}
heap_free((*gCurrentEntityListPtr)[entityIndex]);
(*gCurrentEntityListPtr)[entityIndex] = NULL;
}
void _delete_shadow(s32 shadowIndex) {
Shadow* shadow = get_shadow_by_index(shadowIndex);
free_entity_model_by_index(shadow->entityModelID);
heap_free((*gCurrentShadowListPtr)[shadowIndex]);
(*gCurrentShadowListPtr)[shadowIndex] = NULL;
}
s32 entity_get_collision_flags(Entity* entity) {
u32 listIndex = entity->listIndex;
s32 ret = 0;
u32 flag;
if (entity->flags & 0x20000) {
ret = 0x80;
entity->flags &= ~0x20000;
}
flag = gCollisionStatus.currentFloor;
if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) {
ret |= 1;
}
flag = gCollisionStatus.lastTouchedFloor;
if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) {
ret |= 0x100;
}
flag = gCollisionStatus.currentCeiling;
if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) {
ret |= 0x4;
}
flag = gCollisionStatus.pushingAgainstWall;
if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) {
ret |= 0x10;
}
flag = gCollisionStatus.lastWallHammered;
if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) {
ret |= 0x40;
}
flag = gCollisionStatus.currentWall;
if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag && gPlayerStatusPtr->pressedButtons & 0x8000) {
ret |= 8;
}
return ret;
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", entity_interacts_with_current_partner);
// float bs
#ifdef NON_MATCHING
s32 test_player_entity_aabb(Entity* entity) {
f32 temp_f4;
f32 colliderDiameter;
temp_f4 = entity->position.y - (gPlayerStatus.position.y + gPlayerStatus.colliderHeight);
if (temp_f4 > 0.0f || gPlayerStatus.colliderHeight + entity->aabb.y < fabsf(temp_f4)) {
return 0;
}
if ((gPlayerStatus.colliderDiameter + entity->aabb.x) * 0.5 < fabsf(gPlayerStatus.position.x - entity->position.x)) {
return 0;
}
if ((gPlayerStatus.colliderDiameter + entity->aabb.z) * 0.5 < fabsf(gPlayerStatus.position.z - entity->position.z)) {
return 0;
}
return 1;
}
#else
INCLUDE_ASM(s32, "a5dd0_len_114e0", test_player_entity_aabb);
#endif
s32 is_player_action_state(s8 actionState) {
return actionState == gPlayerActionState;
}
void entity_set_render_script(Entity* entity, u32* commandList) {
if (!(entity->flags & 8)) {
set_entity_model_render_command_list(entity->virtualModelIndex, commandList);
}
}
void func_80110BF8(Entity* entity) {
entity->unk_07 = 0;
entity->flags &= ~0x00010000;
}
#ifdef NON_MATCHING
#define AREA_SPECIFIC_ENTITY_VRAM &entity_default_VRAM
#else
#define AREA_SPECIFIC_ENTITY_VRAM 0x802BAE00
#endif
void load_area_specific_entity_data(void) {
if (D_8015132C == 0) {
if (gGameStatusPtr->areaID == AREA_JAN || gGameStatusPtr->areaID == AREA_IWA) {
dma_copy(entity_jan_iwa_ROM_START, entity_jan_iwa_ROM_END, AREA_SPECIFIC_ENTITY_VRAM);
} else if (gGameStatusPtr->areaID == AREA_SBK || gGameStatusPtr->areaID == AREA_OMO) {
dma_copy(entity_sbk_omo_ROM_START, entity_sbk_omo_ROM_END, AREA_SPECIFIC_ENTITY_VRAM);
} else {
dma_copy(entity_default_ROM_START, entity_default_ROM_END, AREA_SPECIFIC_ENTITY_VRAM);
}
D_8015132C = 1;
}
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", clear_entity_data);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80110E58);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80110F10);
INCLUDE_ASM(s32, "a5dd0_len_114e0", entity_anim_make_vertex_pointers);
s32 is_entity_data_loaded(Entity* entity, StaticEntityData* entityData, s32* loadedStart, s32* loadedEnd);
INCLUDE_ASM(s32, "a5dd0_len_114e0", is_entity_data_loaded);
void load_simple_entity_data(Entity* entity, StaticEntityData* entityData) {
s32 loadedStart;
s32 loadedEnd;
s32 entitySize;
u32 temp;
s32 sizeTemp;
entity->vertexSegment = 10;
if (!gGameStatusPtr->isBattle) {
sizeTemp = wStaticEntityDataSize;
} else {
sizeTemp = bStaticEntityDataSize;
}
if (is_entity_data_loaded(entity, entityData, &loadedStart, &loadedEnd)) {
if (sizeTemp + ((entityData->dmaEnd - entityData->dmaStart) >> 2) >= 0x5FFDU) {
get_entity_type(entity->listIndex);
get_entity_type(entity->listIndex);
PANIC();
}
entitySize = (entityData->dmaEnd - entityData->dmaStart) >> 2;
entity->vertexData = (gEntityHeapBase - (sizeTemp * 4)) - (entitySize * 4);
temp = dma_copy(entityData->dmaStart, entityData->dmaEnd, entity->vertexData);
sizeTemp += temp / 4;
get_entity_type(entity->listIndex);
} else {
entitySize = (entityData->dmaEnd - entityData->dmaStart) >> 2;
entity->vertexData = (gEntityHeapBase - (loadedStart * 4)) - (entitySize * 4);
get_entity_type(entity->listIndex);
}
if (!gGameStatusPtr->isBattle) {
wStaticEntityDataSize = sizeTemp;
} else {
bStaticEntityDataSize = sizeTemp;
}
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", load_split_entity_data);
s32 func_80111790(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentEntityListPtr); i++) {
Entity* entity = (*gCurrentEntityListPtr)[i];
if (entity != NULL && entity->staticData->dmaStart != NULL) {
if (entity->staticData->dmaStart == entity->staticData) {
return TRUE;
}
}
}
return FALSE;
}
INCLUDE_ASM(void, "a5dd0_len_114e0", entity_free_static_data, StaticEntityData* data);
INCLUDE_ASM(s32, "a5dd0_len_114e0", create_entity, StaticEntityData* data, s32 x, s32 y, s32 z, s32 arg4,
...);
s32 create_shadow_from_data(StaticShadowData* data, f32 x, f32 y, f32 z) {
Shadow* shadow;
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentShadowListPtr); i++) {
if ((*gCurrentShadowListPtr)[i] == NULL) {
break;
}
}
ASSERT(i < ARRAY_COUNT(*gCurrentShadowListPtr));
shadow = heap_malloc(sizeof(*shadow));
(*gCurrentShadowListPtr)[i] = shadow;
mem_clear(shadow, sizeof(*shadow));
shadow->listIndex = i;
shadow->flags = data->flags | 0x80000000;
shadow->unk_05 = 0x80;
shadow->unk_06 = 0x80;
shadow->position.x = x;
shadow->position.y = y;
shadow->position.z = z;
shadow->scale.x = 1.0f;
shadow->scale.y = 1.0f;
shadow->scale.z = 1.0f;
if (data->animModelNode != NULL) {
shadow->flags |= 8;
shadow->entityModelID = create_model_animator(data->unk_04);
load_model_animator_tree(shadow->entityModelID, data->animModelNode);
} else {
shadow->entityModelID = load_entity_model(data->unk_04);
}
if (data->onCreateCallback != NULL) {
data->onCreateCallback(shadow);
}
update_shadow_transform_matrix(shadow);
return shadow->listIndex;
}
s32 MakeEntity(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
StaticEntityData* entityData;
s32 x, y, z;
s32 flags;
s32 temp_v0;
s32 entityIndex;
s32 t80000000;
s32* temp;
if (isInitialCall != TRUE) {
return ApiStatus_DONE2;
}
entityData = (StaticEntityData*)evt_get_variable(script, *args++);
temp = &D_8015C7D0[2];
t80000000 = 0x80000000;
x = evt_get_variable(script, *args++);
y = evt_get_variable(script, *args++);
z = evt_get_variable(script, *args++);
flags = evt_get_variable(script, *args++);
*temp-- = 0;
*temp-- = 0;
*temp = 0;
do {
temp_v0 = evt_get_variable(script, *args++);
if (temp_v0 != t80000000) {
*temp++ = temp_v0;
}
} while (temp_v0 != t80000000);
entityIndex = create_entity(entityData, x, y, z, flags, D_8015C7D0[0], D_8015C7D0[1], D_8015C7D0[2], t80000000);
gLastCreatedEntityIndex = entityIndex;
script->varTable[0] = entityIndex;
return ApiStatus_DONE2;
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", SetEntityCullMode);
ApiStatus UseDynamicShadow(Evt* script, s32 isInitialCall) {
Entity* entity = get_entity_by_index(gLastCreatedEntityIndex);
if (evt_get_variable(script, *script->ptrReadPos)) {
Shadow* shadow;
entity->flags |= 4;
shadow = get_shadow_by_index(entity->shadowIndex);
shadow->flags |= 0x400000;
} else {
entity->flags &= ~4;
}
return ApiStatus_DONE2;
}
ApiStatus AssignScript(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall == TRUE) {
Bytecode* toBind = (Bytecode*)evt_get_variable(script, *args++);
get_entity_by_index(gLastCreatedEntityIndex)->boundScriptBytecode = toBind;
return ApiStatus_DONE2;
}
return ApiStatus_DONE1;
}
ApiStatus AssignAreaFlag(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall == TRUE) {
s32 temp_s0 = evt_get_variable(script, *args++);
Entity* entity = get_entity_by_index(gLastCreatedEntityIndex);
// TODO find proper struct for the dataBuf
((s16*)(entity->dataBuf))[16] = temp_s0;
if (get_area_flag(temp_s0) != 0) {
entity->flags |= 0x20000000;
}
return ApiStatus_DONE2;
}
return ApiStatus_DONE1;
}
ApiStatus AssignBlockFlag(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall == TRUE) {
s32 temp_s0 = evt_get_variable_index(script, *args++);
Entity* entity = get_entity_by_index(gLastCreatedEntityIndex);
// TODO find proper struct for the dataBuf
((s16*)(entity->dataBuf))[5] = temp_s0;
return ApiStatus_DONE2;
}
return ApiStatus_DONE1;
}
ApiStatus AssignFlag(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall == TRUE) {
Trigger* trigger = (Trigger*)get_entity_by_index(gLastCreatedEntityIndex)->dataBuf;
trigger->flags.bytes.genericFlagIndex = evt_get_variable_index(script, *args);
return ApiStatus_DONE2;
}
return ApiStatus_DONE1;
}
ApiStatus AssignPanelFlag(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall == TRUE) {
// TODO find proper struct for the dataBuf
s16* dataBuf = (s16*)get_entity_by_index(gLastCreatedEntityIndex)->dataBuf;
dataBuf[3] = evt_get_variable_index(script, *args++);
return ApiStatus_DONE2;
}
return ApiStatus_DONE1;
}
ApiStatus AssignCrateFlag(Evt* script, s32 isInitialCall) {
Bytecode* args = script->ptrReadPos;
if (isInitialCall == TRUE) {
// TODO find proper struct for the dataBuf
s16* dataBuf = (s16*)get_entity_by_index(gLastCreatedEntityIndex)->dataBuf;
dataBuf[2] = evt_get_variable_index(script, *args++);
return ApiStatus_DONE2;
}
return ApiStatus_DONE1;
}
s32 create_entity_shadow(Entity* entity, f32 x, f32 y, f32 z) {
u16 staticFlags = entity->staticData->flags;
s32 type;
s16 shadowIndex;
if (staticFlags & 0x200) {
if (staticFlags & 0x800) {
type = 2;
} else {
type = 3;
}
} else {
type = ((staticFlags >> 11) ^ 1) & 1;
}
shadowIndex = create_shadow_type(type, x, y, z);
entity->shadowIndex = shadowIndex;
get_shadow_by_index(shadowIndex)->flags |= 0xC00000;
return entity->shadowIndex;
}
s32 create_shadow_type(s32 type, f32 x, f32 y, f32 z) {
s32 setFlag200 = FALSE;
StaticShadowData* data = &D_802E98BC;
s32 shadowIndex;
switch (type) {
case 2:
setFlag200 = TRUE;
case 0:
data = &D_802E98BC;
break;
case 3:
setFlag200 = TRUE;
case 1:
data = &D_802E9904;
break;
case 5:
setFlag200 = TRUE;
case 4:
data = &D_802E98E0;
break;
}
shadowIndex = create_shadow_from_data(data, x, y, z);
if (setFlag200) {
get_shadow_by_index(shadowIndex)->flags |= 0x200;
}
return shadowIndex;
}
void delete_shadow(s32 shadowIndex) {
_delete_shadow(shadowIndex);
}
void update_entity_shadow_position(Entity* entity) {
Shadow* shadow = get_shadow_by_index(entity->shadowIndex);
if (shadow != NULL) {
f32 rayX;
f32 rayY;
f32 rayZ;
f32 hitYaw;
f32 hitPitch;
f32 hitLength;
f32 origHitLength;
if (entity->alpha < 255) {
shadow->unk_05 = entity->alpha / 2;
} else {
u8 alphaTemp;
if (shadow->flags & 0x800000) {
alphaTemp = 160;
} else {
alphaTemp = 128;
}
shadow->unk_05 = alphaTemp;
}
if (!(entity->flags & 4)) {
if (shadow->flags & 0x400000) {
shadow->flags &= ~0x400000;
} else {
return;
}
}
rayX = entity->position.x;
rayY = entity->position.y;
rayZ = entity->position.z;
if (!entity_raycast_down(&rayX, &rayY, &rayZ, &hitYaw, &hitPitch, &hitLength) && hitLength == 32767.0f) {
hitLength = 0.0f;
}
origHitLength = hitLength;
if (shadow->flags & 0x200) {
hitLength = 212.5f;
shadow->scale.x = entity->aabb.x / hitLength;
shadow->scale.z = entity->aabb.z / hitLength;
} else {
hitLength = ((hitLength / 150.0f) + 0.95) * 250.0;
shadow->scale.x = (entity->aabb.x / hitLength) * entity->scale.x;
shadow->scale.z = (entity->aabb.z / hitLength) * entity->scale.z;
}
shadow->position.x = entity->position.x;
shadow->position.z = entity->position.z;
shadow->position.y = rayY;
entity->shadowPosY = rayY;
shadow->rotation.x = hitYaw;
shadow->rotation.z = hitPitch;
shadow->rotation.y = entity->rotation.y;
if (entity->position.y < rayY) {
shadow->flags |= 0x40000000;
entity->position.y = rayY + 10.0f;
} else {
shadow->flags &= ~0x40000000;
}
shadow->flags = (shadow->flags & ~1) | ((u16)entity->flags & 1);
if (!(entity->flags & 0x400) && origHitLength == 0.0f) {
shadow->flags |= 1;
}
} else {
entity->shadowPosY = 0.0f;
}
}
s32 entity_raycast_down(f32* x, f32* y, f32* z, f32* hitYaw, f32* hitPitch, f32* hitLength) {
f32 hitX, hitY, hitZ;
f32 hitDepth;
f32 hitNx, hitNy, hitNz;
s32 entityID;
s32 colliderID;
s32 hitID;
s32 ret;
hitDepth = 32767.0f;
*hitLength = 32767.0f;
entityID = test_ray_entities(*x, *y, *z, 0.0f, -1.0f, 0.0f, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz);
hitID = -1;
ret = FALSE;
if ((entityID >= 0) && ((get_entity_type(entityID) != 0xC) || (hitNx == 0.0f && hitNz == 0.0f && hitNy == 1.0))) {
hitID = entityID | 0x4000;
}
colliderID = test_ray_colliders(0x10000, *x, *y, *z, 0.0f, -1.0f, 0.0f, &hitX, &hitY, &hitZ, &hitDepth, &hitNx,
&hitNy, &hitNz);
if (colliderID >= 0) {
hitID = colliderID;
}
if (hitID >= 0) {
*hitLength = hitDepth;
*y = hitY;
*hitYaw = -atan2(0.0f, 0.0f, hitNz * 100.0f, hitNy * 100.0f);
*hitPitch = -atan2(0.0f, 0.0f, hitNx * 100.0f, hitNy * 100.0f);
ret = TRUE;
} else {
*hitYaw = 0.0f;
*hitPitch = 0.0f;
}
return ret;
}
void set_standard_shadow_scale(Shadow* shadow, f32 height) {
if (!gGameStatusPtr->isBattle) {
shadow->scale.x = 0.13 - (height / 2600.0f);
} else {
shadow->scale.x = 0.12 - (height / 3600.0f);
}
if (shadow->scale.x < 0.01) {
shadow->scale.x = 0.01f;
}
shadow->scale.z = shadow->scale.x;
}
void set_npc_shadow_scale(Shadow* shadow, f32 height, f32 npcRadius) {
if (!gGameStatusPtr->isBattle) {
shadow->scale.x = 0.13 - (height / 2600.0f);
} else {
shadow->scale.x = 0.12 - (height / 3600.0f);
}
if (shadow->scale.x < 0.01) {
shadow->scale.x = 0.01f;
}
if (npcRadius > 60.0f) {
shadow->scale.z = shadow->scale.x * 2.0f;
} else {
shadow->scale.z = shadow->scale.x;
}
}
void set_peach_shadow_scale(Shadow* shadow, f32 scale) {
PlayerStatus* playerStatus = &gPlayerStatus;
f32 phi_f2 = 0.12f;
if (!gGameStatusPtr->isBattle) {
switch (playerStatus->anim) {
case 0xC0018:
case 0xC0019:
case 0xC001A:
case 0xD0008:
shadow->scale.x = 0.26f - (scale / 2600.0f);
if (shadow->scale.x < 0.01) {
shadow->scale.x = 0.01f;
}
shadow->scale.z = 0.13f - (scale / 2600.0f);
if (shadow->scale.z < 0.01) {
shadow->scale.z = 0.01f;
}
return;
}
phi_f2 = 0.16f;
}
shadow->scale.x = phi_f2 - (scale / 3600.0f);
if (shadow->scale.x < 0.01) {
shadow->scale.x = 0.01f;
}
shadow->scale.z = shadow->scale.x;
}
s32 is_block_on_ground(Entity* block) {
f32 x = block->position.x;
f32 y = block->position.y;
f32 z = block->position.z;
f32 hitYaw;
f32 hitPitch;
f32 hitLength;
s32 ret;
entity_raycast_down(&x, &y, &z, &hitYaw, &hitPitch, &hitLength);
ret = hitLength;
if (ret == 32767) {
ret = 0;
}
return ret;
}
void state_delegate_NOP(void) {
}
// Dumb temp and weird i decrement and temp increment stuff needed to match
void clear_game_modes(void) {
GameMode* state = &gMainGameState[0];
s32 i;
for (i = ARRAY_COUNT(gMainGameState) - 1; i >= 0; i--, state++) {
state->flags = 0;
}
}
// weird ordering at the beginning
#ifndef NON_MATCHING
INCLUDE_ASM(s32, "a5dd0_len_114e0", set_next_game_mode);
#else
GameMode* set_next_game_mode(GameMode* arg0) {
GameMode* gameMode;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameState); i++) {
gameMode = &gMainGameState[i];
if (gameMode->flags == 0) {
break;
}
}
ASSERT(i < ARRAY_COUNT(gMainGameState));
gameMode->flags = 1 | 2;
gameMode->init = arg0->init;
gameMode->step = arg0->step;
gameMode->render = arg0->render;
gameMode->unk_0C = NULL;
if (gameMode->init == NULL) {
gameMode->init = state_delegate_NOP;
}
if (gameMode->step == NULL) {
gameMode->step = state_delegate_NOP;
}
if (gameMode->unk_0C == NULL) {
gameMode->unk_0C = state_delegate_NOP;
}
if (gameMode->render == NULL) {
gameMode->render = state_delegate_NOP;
}
gameMode->renderAux = state_delegate_NOP;
gameMode->init();
return gameMode;
}
#endif
GameMode* set_game_mode_slot(s32 i, GameMode* arg0) {
GameMode* gameMode = &gMainGameState[i];
ASSERT(i < ARRAY_COUNT(gMainGameState));
gameMode->flags = 1 | 2;
gameMode->init = arg0->init;
gameMode->step = arg0->step;
gameMode->render = arg0->render;
gameMode->unk_0C = NULL;
if (gameMode->init == NULL) gameMode->init = state_delegate_NOP;
if (gameMode->step == NULL) gameMode->step = state_delegate_NOP;
if (gameMode->unk_0C == NULL) gameMode->unk_0C = state_delegate_NOP;
if (gameMode->render == NULL) gameMode->render = state_delegate_NOP;
gameMode->renderAux = state_delegate_NOP;
gameMode->init();
return gameMode;
}
void game_mode_set_fpDrawAuxUI(s32 i, void (*fn)(void)) {
GameMode* gameMode = &gMainGameState[i];
ASSERT(i < ARRAY_COUNT(gMainGameState));
gameMode->renderAux = fn;
gameMode->flags |= 0x20;
if (fn == NULL) {
gameMode->renderAux = state_delegate_NOP;
}
}
void func_80112DD4(s32 i) {
gMainGameState[i].flags |= 4;
}
void func_80112DFC(s32 i) {
gMainGameState[i].flags |= 8;
}
void func_80112E24(s32 i) {
gMainGameState[i].flags &= ~0x1C;
}
void func_80112E4C(s32 i) {
gMainGameState[i].flags &= ~0x0C;
gMainGameState[i].flags |= 0x10;
}
void step_current_game_mode(void) {
GameMode* gameMode = gMainGameState;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) {
if (gameMode->flags != 0) {
if (!(gameMode->flags & 4)) {
if (!(gameMode->flags & 8)) {
gameMode->flags &= ~2;
gameMode->step();
}
}
}
}
}
void state_do_unk(void) {
GameMode* gameMode = gMainGameState;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) {
if (gameMode->flags != 0) {
if (!(gameMode->flags & 4)) {
if (!(gameMode->flags & 0x10)) {
gameMode->unk_0C();
}
}
}
}
}
void state_render_backUI(void) {
GameMode* gameMode = gMainGameState;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) {
if (gameMode->flags != 0) {
if (!(gameMode->flags & 4)) {
if (!(gameMode->flags & 0x10)) {
gameMode->render();
}
}
}
}
}
void state_render_frontUI(void) {
GameMode* gameMode = gMainGameState;
s32 i;
for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) {
if (gameMode->flags != 0) {
if (!(gameMode->flags & 4)) {
if (!(gameMode->flags & 2)) {
if (gameMode->flags & 0x20) {
gameMode->renderAux();
}
}
}
}
}
// re-initialization needed - evidence of inlining? or just copy/pasting?
gameMode = &gMainGameState;
for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) {
if (gameMode->flags != 0) {
if (!(gameMode->flags & 4)) {
if (!(gameMode->flags & 2)) {
if (gameMode->flags & 0x10) {
gameMode->render();
}
}
}
}
}
}
void appendGfx_model(Model* model);
INCLUDE_ASM(void, "a5dd0_len_114e0", appendGfx_model, Model*);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80114B58);
void load_tile_header(char* textureName, s32 romOffset, s32 size);
INCLUDE_ASM(s32, "a5dd0_len_114e0", load_tile_header);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80115498);
// Goofy temps needed to match
ModelNodeProperty* get_model_property(ModelNode* node, ModelPropertyKeys key) {
s32 numProperties = node->numProperties;
ModelNodeProperty* propertyList = node->propertyList;
s32 i;
for (i = 0; i < numProperties; i++, propertyList++) {
if (propertyList->key == key) {
return propertyList;
}
}
return NULL;
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", _load_model_textures);
void load_model_textures(ModelNode* model, s32 romOffset, s32 size) {
s32 battleOffset = ((gGameStatusPtr->isBattle != 0) << 17);
mdl_nextTextureAddress = mdl_textureBaseAddress + battleOffset;
if (model != NULL && romOffset != 0 && size != 0) {
s32 i;
for (i = 0; i < ARRAY_COUNT(mdl_textureHandles); i++) {
mdl_textureHandles[i].gfx = NULL;
}
mdl_treeIterPos = 0;
if (model != NULL) {
_load_model_textures();
}
}
}
s32 mdl_get_child_count(ModelNode* model) {
s32 ret = 0;
if (model->type != 2 && model->groupData != NULL) {
s32 numChildren = model->groupData->numChildren;
if (numChildren != 0) {
s32 i;
ret += numChildren;
for (i = 0; i < numChildren; i++) {
ret += mdl_get_child_count(model->groupData->childList[i]);
}
}
}
return ret;
}
void clear_model_data(void) {
s32 i;
if (!gGameStatusPtr->isBattle) {
gCurrentModels = &wModelList;
gCurrentTransformGroups = &wTransformGroups;
gCurrentCustomModelGfxPtr = &wModelSpecialDls;
gCurrentCustomModelGfxBuildersPtr = &wCustomModelGfxBuilders;
gCurrentModelTreeRoot = &D_80152214;
gCurrentModelLocalVtxBuffers = &D_80152190;
mdl_currentModelTreeNodeInfo = &D_80152220;
D_801512F0 = &wBgRenderType;
mdl_bgMultiplyColorA = 0;
mdl_bgMultiplyColorR = 0;
mdl_bgMultiplyColorG = 0;
mdl_bgMultiplyColorB = 0;
gCurrentFogSettings = &wFogSettings;
} else {
gCurrentModels = &bModelList;
gCurrentTransformGroups = &bTransformGroups;
gCurrentCustomModelGfxPtr = &bModelSpecialDls;
gCurrentCustomModelGfxBuildersPtr = &bCustomModelGfxBuilders;
gCurrentModelTreeRoot = &D_80152218;
gCurrentModelLocalVtxBuffers = &D_801521D0;
mdl_currentModelTreeNodeInfo = &D_80152A20;
D_801512F0 = &bBgRenderType;
gCurrentFogSettings = &bFogSettings;
}
for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) {
(*gCurrentModels)[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(*gCurrentTransformGroups); i++) {
(*gCurrentTransformGroups)[i] = 0;
}
for (i = 0; i < ARRAY_COUNT(*gCurrentCustomModelGfxPtr); i++) {
(*gCurrentCustomModelGfxPtr)[i] = 0;
(*gCurrentCustomModelGfxBuildersPtr)[i] = 0;
}
*gCurrentModelTreeRoot = NULL;
for (i = 0; i < ARRAY_COUNT(*mdl_currentModelTreeNodeInfo); i++) {
(*mdl_currentModelTreeNodeInfo)[i].modelIndex = -1;
(*mdl_currentModelTreeNodeInfo)[i].treeDepth = 0;
(*mdl_currentModelTreeNodeInfo)[i].textureID = 0;
}
*D_801512F0 = 0;
gCurrentFogSettings->r = 10;
gCurrentFogSettings->g = 10;
gCurrentFogSettings->b = 10;
gCurrentFogSettings->startDistance = 950;
gCurrentFogSettings->enabled = FALSE;
gCurrentFogSettings->a = 0;
gCurrentFogSettings->endDistance = 1000;
for (i = 0; i < ARRAY_COUNT(texPannerAuxV); i++) {
texPannerAuxV[i] = 0;
texPannerAuxU[i] = 0;
texPannerMainV[i] = 0;
texPannerMainU[i] = 0;
}
}
void init_model_data(void) {
if (!gGameStatusPtr->isBattle) {
gCurrentModels = &wModelList;
gCurrentTransformGroups = &wTransformGroups;
gCurrentCustomModelGfxPtr = &wModelSpecialDls;
gCurrentCustomModelGfxBuildersPtr = &wCustomModelGfxBuilders;
gCurrentModelTreeRoot = &D_80152214;
gCurrentModelLocalVtxBuffers = &D_80152190;
mdl_currentModelTreeNodeInfo = &D_80152220;
D_801512F0 = &wBgRenderType;
gCurrentFogSettings = &wFogSettings;
} else {
gCurrentModels = &bModelList;
gCurrentTransformGroups = &bTransformGroups;
gCurrentCustomModelGfxPtr = &bModelSpecialDls;
gCurrentCustomModelGfxBuildersPtr = &bCustomModelGfxBuilders;
gCurrentModelTreeRoot = &D_80152218;
gCurrentModelLocalVtxBuffers = &D_801521D0;
mdl_currentModelTreeNodeInfo = &D_80152A20;
D_801512F0 = &bBgRenderType;
gCurrentFogSettings = &bFogSettings;
}
}
void calculate_model_sizes(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) {
Model* model = (*gCurrentModels)[i];
if (model != NULL) {
ModelBoundingBox* bb = (ModelBoundingBox*)get_model_property(model->modelNode, MODEL_PROP_KEY_BOUNDING_BOX);
bb->halfSizeX = (bb->maxX - bb->minX) * 0.5;
bb->halfSizeY = (bb->maxY - bb->minY) * 0.5;
bb->halfSizeZ = (bb->maxZ - bb->minZ) * 0.5;
model->flags |= 0x1000;
}
}
}
void mdl_create_model(ModelBlueprint* bp, s32 arg1);
INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_create_model);
// The global here is getting optimized out because nothing is happening to it. Very weird
#ifdef NON_MATCHING
void func_80116674(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) {
Model* m = (*gCurrentModels)[i];
}
}
#else
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80116674);
#endif
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80116698);
INCLUDE_ASM(s32, "a5dd0_len_114e0", render_models);
void appendGfx_model_group(Model* model);
INCLUDE_ASM(void, "a5dd0_len_114e0", appendGfx_model_group, Model*);
void func_80117D00(Model* model) {
Model* mdl = model; // temps needed to match
ModelNode* modelNode = mdl->modelNode;
if (model->modelNode->type != SHAPE_TYPE_MODEL) {
if (modelNode->groupData != NULL) {
s32 numChildren = modelNode->groupData->numChildren;
if (numChildren != 0) {
s32 i;
for (i = 0; i < numChildren; i++, mdl_treeIterPos++) {
Model newModel = *mdl;
ModelNodeProperty* prop;
newModel.flags = mdl->flags;
newModel.currentSpecialMatrix = mdl->currentSpecialMatrix;
newModel.modelNode = modelNode->groupData->childList[i];
newModel.texPannerID = mdl->texPannerID;
newModel.specialDisplayListID = mdl->specialDisplayListID;
if (newModel.modelNode->type == SHAPE_TYPE_MODEL) {
prop = get_model_property(newModel.modelNode, MODEL_PROP_KEY_RENDER_MODE);
} else {
prop = NULL;
}
if (prop != NULL) {
newModel.renderMode = prop->data.s;
} else {
newModel.renderMode = 0;
}
newModel.textureID = (*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].textureID;
newModel.unk_A9 = 0;
func_80117D00(&newModel);
}
}
}
} else {
appendGfx_model(mdl);
}
}
// this looks like a switch, but I can't figure it out
void render_transform_group_node(ModelNode* node) {
Gfx** gfx = &gMasterGfxPos;
Model* model;
if (node != NULL) {
if (node->type == SHAPE_TYPE_GROUP) {
ModelNodeProperty* groupTypeProp = get_model_property(node, MODEL_PROP_KEY_GROUP_TYPE);
if (groupTypeProp != NULL && groupTypeProp->data.s != 0) {
model = get_model_from_list_index(mdl_currentTransformGroupChildIndex);
if (!(model->flags & 2)) {
appendGfx_model_group(model);
}
mdl_currentTransformGroupChildIndex++;
return;
}
}
if (node->type != SHAPE_TYPE_MODEL) {
if (node->groupData != NULL) {
s32 numChildren;
s32 i;
if (node->groupData->transformMatrix != NULL) {
gSPMatrix((*gfx)++, node->groupData->transformMatrix,
G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW);
}
numChildren = node->groupData->numChildren;
if (numChildren != 0) {
for (i = 0; i < numChildren; i++) {
render_transform_group_node(node->groupData->childList[i]);
}
}
if (node->groupData->transformMatrix != NULL) {
gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW);
}
}
return;
}
model = get_model_from_list_index(mdl_currentTransformGroupChildIndex);
if (!(model->flags & 2)) {
appendGfx_model(model);
}
mdl_currentTransformGroupChildIndex++;
}
}
// arg0 and gfx temps needed
void render_transform_group(ModelTransformGroup* group) {
ModelTransformGroup* mtg = group;
Gfx** gfx = &gMasterGfxPos;
if (!(mtg->flags & 4)) {
mdl_currentTransformGroupChildIndex = mtg->minChildModelIndex;
if (!(mtg->flags & 0x2000)) {
gSPMatrix((*gfx)++, mtg->transformMtx, (G_MTX_PUSH | G_MTX_LOAD) | G_MTX_MODELVIEW);
}
render_transform_group_node(mtg->modelNode);
if (!(mtg->flags & 0x2000)) {
gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW);
}
gDPPipeSync((*gfx)++);
}
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_801180E8);
Model* get_model_from_list_index(s32 listIndex) {
return (*gCurrentModels)[listIndex];
}
void load_data_for_models(ModelNode* model, s32 romOffset, s32 size) {
Matrix4f mtx;
guMtxIdentF(mtx);
if (romOffset != 0) {
load_model_textures(model, romOffset, size);
}
*gCurrentModelTreeRoot = model;
mdl_treeIterPos = 0;
if (model != NULL) {
load_model_transforms(model, NULL, mtx, 0);
}
}
// tiny reg swap in the first loop
#ifdef NON_MATCHING
void load_model_transforms(ModelNode* model, ModelNode* parent, Matrix4f mdlTxMtx, s32 treeDepth) {
Matrix4f sp10;
Matrix4f sp50;
ModelBlueprint modelBP;
ModelBlueprint* modelBPptr = &modelBP;
ModelNodeProperty* groupTypeProperty;
s32 i;
if (model->groupData != NULL && model->groupData->numChildren != 0) {
s32 groupType;
if (model->groupData->transformMatrix != NULL) {
Matrix4f spA0;
guMtxL2F(spA0, model->groupData->transformMatrix);
guMtxCatF(spA0, mdlTxMtx, sp10);
}
groupTypeProperty = get_model_property(model, MODEL_PROP_KEY_GROUP_TYPE);
if (groupTypeProperty == NULL) {
groupType = 0;
} else {
groupType = groupTypeProperty->data.s;
}
if (model->type != 5 || groupType == 0) {
for (i = 0; i < model->groupData->numChildren; i++) {
ModelNode** modelTemp;
Matrix4f* txMtx;
modelTemp = &model->groupData->childList[i];
if (model->groupData->transformMatrix != NULL) {
txMtx = sp10;
} else {
txMtx = mdlTxMtx;
}
load_model_transforms(*modelTemp, model, txMtx, treeDepth + 1);
}
(*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].modelIndex = -1;
(*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].treeDepth = treeDepth;
mdl_treeIterPos += 1;
return;
}
}
guMtxF2L(mdlTxMtx, sp50);
modelBPptr->flags = 0;
modelBPptr->mdlNode = model;
modelBPptr->groupData = parent->groupData;
modelBPptr->mtx = sp50;
if (model->type == 5) {
s32 childCount = mdl_get_child_count(model);
for (i = mdl_treeIterPos; i < mdl_treeIterPos + childCount; i++) {
(*mdl_currentModelTreeNodeInfo)[i].modelIndex = -1;
(*mdl_currentModelTreeNodeInfo)[i].treeDepth = treeDepth + 1;
}
mdl_treeIterPos += childCount;
}
mdl_create_model(modelBPptr, 4);
(*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].treeDepth = treeDepth;
mdl_treeIterPos += 1;
}
#else
INCLUDE_ASM(s32, "a5dd0_len_114e0", load_model_transforms);
#endif
s32 get_model_list_index_from_tree_index(s32 treeIndex) {
s32 i;
if (treeIndex < 0x100) {
u8 modelIndex = (*mdl_currentModelTreeNodeInfo)[treeIndex].modelIndex;
if (modelIndex != (u8)-1) {
return modelIndex;
}
}
for (i = 0; i < 0x100; i++) {
Model* model = get_model_from_list_index(i);
if (model != NULL && model->modelID == treeIndex) {
return i;
}
}
return 0;
}
s32 get_transform_group_index(s32 modelID) {
ModelTransformGroup* group;
s32 i;
for (i = 0; i < MAX_MODEL_TRANSFORM_GROUPS; i++) {
group = get_transform_group(i);
if (group != NULL && group->groupModelID == modelID) {
return i;
}
}
return -1;
}
// TODO this seems to be returning center for the model and center for the BB (not the size)
void get_model_center_and_size(u16 modelID, f32* centerX, f32* centerY, f32* centerZ, f32* sizeX, f32* sizeY, f32* sizeZ) {
Model* model = get_model_from_list_index(get_model_list_index_from_tree_index(modelID));
ModelNode* node = model->modelNode;
ModelBoundingBox* bb;
*centerX = model->center.x;
*centerY = model->center.y;
*centerZ = model->center.z;
bb = (ModelBoundingBox*)get_model_property(node, MODEL_PROP_KEY_BOUNDING_BOX);
if (bb != NULL) {
*sizeX = bb->halfSizeX;
*sizeY = bb->halfSizeY;
*sizeZ = bb->halfSizeZ;
} else {
*sizeX = *sizeY = *sizeZ = 0.0f;
}
}
ModelTransformGroup* get_transform_group(s32 index) {
return (*gCurrentTransformGroups)[index];
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011B1D8);
void make_transform_group(u16 modelID) {
mdl_treeIterPos = 0;
D_80153370 = NULL;
D_8015336E = modelID;
D_80153376 = 0;
D_80153374 = 0;
func_8011B1D8(*gCurrentModelTreeRoot);
if (D_80153370 != 0) {
ModelTransformGroup* newMtg;
ModelNode* node;
ModelNodeProperty* prop;
ModelBoundingBox* bb;
f32 x, y, z;
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentTransformGroups); i++) {
if ((*gCurrentTransformGroups)[i] == NULL) {
break;
}
}
(*gCurrentTransformGroups)[i] = newMtg = heap_malloc(sizeof(ModelTransformGroup));
newMtg->flags = 1;
newMtg->groupModelID = modelID;
newMtg->minChildModelIndex = get_model_list_index_from_tree_index(D_80153374);
newMtg->maxChildModelIndex = get_model_list_index_from_tree_index(D_80153376);
newMtg->matrixMode = 0;
newMtg->matrixRDP_N = NULL;
newMtg->modelNode = D_80153370;
guMtxIdent(&newMtg->matrixA);
newMtg->flags |= 0x2000;
guMtxIdentF(newMtg->matrixB);
node = newMtg->modelNode;
if (node->type != SHAPE_TYPE_GROUP) {
prop = get_model_property(node, MODEL_PROP_KEY_RENDER_MODE);
} else {
prop = get_model_property(node, MODEL_PROP_KEY_GROUP_TYPE);
if (prop != NULL) {
prop = &prop[1];
}
}
if (prop != NULL) {
newMtg->renderMode = prop->data.s;
} else {
newMtg->renderMode = 1;
}
bb = (ModelBoundingBox*)get_model_property(node, MODEL_PROP_KEY_BOUNDING_BOX);
if (bb != NULL) {
x = (bb->minX + bb->maxX) * 0.5f;
y = (bb->minY + bb->maxY) * 0.5f;
z = (bb->minZ + bb->maxZ) * 0.5f;
} else {
x = y = z = 0.0f;
}
if (newMtg->matrixRDP_N != NULL) {
guMtxXFML(newMtg->matrixRDP_N, x, y, z, &x, &y, &z);
}
newMtg->center.x = x;
newMtg->center.y = y;
newMtg->center.z = z;
enable_transform_group(modelID);
}
}
void enable_transform_group(u16 modelID) {
ModelTransformGroup* group = get_transform_group(get_transform_group_index(modelID));
s32 i;
group->flags &= ~0x4;
for (i = group->minChildModelIndex; i <= group->maxChildModelIndex; i++) {
Model* model = get_model_from_list_index(i);
model->flags |= 0x8;
if (model->currentMatrix != NULL) {
model->flags |= 0x1000;
}
}
}
void disable_transform_group(u16 modelID) {
ModelTransformGroup* group = get_transform_group(get_transform_group_index(modelID));
s32 i;
group->flags |= 0x4;
for (i = group->minChildModelIndex; i <= group->maxChildModelIndex; i++) {
Model* model = get_model_from_list_index(i);
model->flags &= ~0x8;
if (model->currentMatrix != NULL) {
model->flags |= 0x1000;
}
}
}
void clone_model(u16 srcModelID, u16 newModelID) {
Model* srcModel = get_model_from_list_index(get_model_list_index_from_tree_index(srcModelID));
Model* newModel;
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) {
if ((*gCurrentModels)[i] == NULL) {
break;
}
}
(*gCurrentModels)[i] = newModel = heap_malloc(sizeof(Model));
*newModel = *srcModel;
newModel->modelID = newModelID;
}
INCLUDE_ASM(void, "a5dd0_len_114e0", func_8011B7C0, u16 arg0, s32 arg1, s32 arg2);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011B950);
void func_8011BAE8(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) {
Model* model = (*gCurrentModels)[i];
if (model != NULL) {
model->flags &= ~0x0400;
}
}
for (i = 0; i < ARRAY_COUNT(*gCurrentTransformGroups); i++) {
ModelTransformGroup* transformGroup = (*gCurrentTransformGroups)[i];
if (transformGroup != NULL) {
transformGroup->flags &= ~0x0400;
}
}
}
void enable_world_fog(void) {
gCurrentFogSettings->enabled = TRUE;
}
void disable_world_fog(void) {
gCurrentFogSettings->enabled = FALSE;
}
void set_world_fog_dist(s32 start, s32 end) {
gCurrentFogSettings->startDistance = start;
gCurrentFogSettings->endDistance = end;
}
void set_world_fog_color(s32 r, s32 g, s32 b, s32 a) {
gCurrentFogSettings->r = r;
gCurrentFogSettings->g = g;
gCurrentFogSettings->b = b;
gCurrentFogSettings->a = a;
}
s32 is_world_fog_enabled(void) {
return gCurrentFogSettings->enabled;
}
void get_world_fog_distance(s32* start, s32* end) {
*start = gCurrentFogSettings->startDistance;
*end = gCurrentFogSettings->endDistance;
}
void get_world_fog_color(s32* r, s32* g, s32* b, s32* a) {
*r = gCurrentFogSettings->r;
*g = gCurrentFogSettings->g;
*b = gCurrentFogSettings->b;
*a = gCurrentFogSettings->a;
}
void set_tex_panner(Model* model, s8 texPannerID) {
model->texPannerID = texPannerID;
}
void set_main_pan_u(s32 texPannerID, s32 value) {
texPannerMainU[texPannerID] = value;
}
void set_main_pan_v(s32 texPannerID, s32 value) {
texPannerMainV[texPannerID] = value;
}
void set_aux_pan_u(s32 texPannerID, s32 value) {
texPannerAuxU[texPannerID] = value;
}
void set_aux_pan_v(s32 texPannerID, s32 value) {
texPannerAuxV[texPannerID] = value;
}
void set_mdl_custom_gfx_set(Model* model, s32 customGfxIndex, u32 fogType) {
if (customGfxIndex == -1) {
customGfxIndex = model->specialDisplayListID & 15;
}
if (fogType == -1) {
fogType = model->specialDisplayListID / 16;
}
model->specialDisplayListID = (customGfxIndex & 15) + ((fogType & 15) * 16);
}
void set_custom_gfx(s32 customGfxIndex, Gfx* pre, Gfx* post) {
(*gCurrentCustomModelGfxPtr)[customGfxIndex * 2] = pre;
(*gCurrentCustomModelGfxPtr)[customGfxIndex * 2 + 1] = post;
}
void set_custom_gfx_builders(s32 customGfxIndex, ModelCustomGfxBuilderFunc pre, ModelCustomGfxBuilderFunc post) {
(*gCurrentCustomModelGfxBuildersPtr)[customGfxIndex * 2] = pre;
(*gCurrentCustomModelGfxBuildersPtr)[customGfxIndex * 2 + 1] = post;
}
void build_custom_gfx(void) {
Gfx* gfx = gMasterGfxPos;
ModelCustomGfxBuilderFunc preFunc;
ModelCustomGfxBuilderFunc postFunc;
s32 i;
gSPBranchList(gMasterGfxPos++, 0x00000000);
for (i = 0; i < ARRAY_COUNT(*gCurrentCustomModelGfxPtr) / 2; i++) {
preFunc = (*gCurrentCustomModelGfxBuildersPtr)[i * 2];
if (preFunc != NULL) {
(*gCurrentCustomModelGfxPtr)[i * 2] = gMasterGfxPos;
preFunc(i);
gSPEndDisplayList(gMasterGfxPos++);
}
postFunc = (*gCurrentCustomModelGfxBuildersPtr)[i * 2 + 1];
if (postFunc != NULL) {
(*gCurrentCustomModelGfxPtr)[i * 2 + 1] = gMasterGfxPos;
postFunc(i);
gSPEndDisplayList(gMasterGfxPos++);
}
}
gSPBranchList(gfx, gMasterGfxPos);
}
// weird temps necessary to match
/// @returns TRUE if mtx is NULL or identity.
s32 is_identity_fixed_mtx(Matrix4s* mtx) {
s32* mtxIt = (s32*)mtx;
s32* identityIt;
s32 i;
if (mtx == NULL) {
return TRUE;
}
identityIt = (s32*)&mdl_RDPIdentity;
for (i = 0; i < 16; i++, mtxIt++, identityIt++) {
if (*mtxIt != *identityIt) {
return FALSE;
}
}
return TRUE;
}
void set_background_color_blend(u8 r, u8 g, u8 b, u8 a) {
mdl_bgMultiplyColorR = r;
mdl_bgMultiplyColorG = g;
mdl_bgMultiplyColorB = b;
mdl_bgMultiplyColorA = a;
}
void get_background_color_blend(u8* r, u8* g, u8* b, u8* a) {
*r = mdl_bgMultiplyColorR;
*g = mdl_bgMultiplyColorG;
*b = mdl_bgMultiplyColorB;
*a = mdl_bgMultiplyColorA;
}
void set_model_fog_color_parameters(s8 primR, s8 primG, s8 primB, s8 primA, s32 fogR, s32 fogG, s32 fogB, s32 fogStart,
s32 fogEnd) {
mdl_renderModelFogPrimColorR = primR;
mdl_renderModelFogPrimColorG = primG;
mdl_renderModelFogPrimColorB = primB;
mdl_renderModelFogPrimColorA = primA;
mdl_renderModelFogColorR = fogR;
mdl_renderModelFogColorG = fogG;
mdl_renderModelFogColorB = fogB;
mdl_renderModelFogStart = fogStart;
mdl_renderModelFogEnd = fogEnd;
}
void get_model_fog_color_parameters(u8* primR, u8* primG, u8* primB, u8* primA, u8* fogR, u8* fogG, u8* fogB,
s32* fogStart, s32* fogEnd) {
*primR = mdl_renderModelFogPrimColorR;
*primG = mdl_renderModelFogPrimColorG;
*primB = mdl_renderModelFogPrimColorB;
*primA = mdl_renderModelFogPrimColorA;
*fogR = mdl_renderModelFogColorR;
*fogG = mdl_renderModelFogColorG;
*fogB = mdl_renderModelFogColorB;
*fogStart = mdl_renderModelFogStart;
*fogEnd = mdl_renderModelFogEnd;
}
void set_model_env_color_parameters(u8 primR, u8 primG, u8 primB, u8 envR, s32 envG, s32 envB) {
gRenderModelPrimR = primR;
gRenderModelPrimG = primG;
gRenderModelPrimB = primB;
gRenderModelEnvR = envR;
gRenderModelEnvG = envG;
gRenderModelEnvB = envB;
}
void get_model_env_color_parameters(u8* primR, u8* primG, u8* primB, u8* envR, u8* envG, u8* envB) {
*primR = gRenderModelPrimR;
*primG = gRenderModelPrimG;
*primB = gRenderModelPrimB;
*envR = gRenderModelEnvR;
*envG = gRenderModelEnvG;
*envB = gRenderModelEnvB;
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_get_vertex_count);
INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_local_gfx_update_vtx_pointers);
INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_local_gfx_copy_vertices);
INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_make_local_vertex_copy);
void mdl_get_copied_vertices(s32 copyIndex, Vtx** firstVertex, Vtx** copiedVertices, s32* numCopied) {
ModelLocalVertexCopy* mlvc = gCurrentModelLocalVtxBuffers[copyIndex];
s32 selector = mlvc->selector;
*firstVertex = mlvc->minVertexAddr;
*copiedVertices = mlvc->vtxCopy[selector];
*numCopied = mlvc->numVertices;
}
Gfx* mdl_get_copied_gfx(s32 copyIndex) {
ModelLocalVertexCopy* mlvc = gCurrentModelLocalVtxBuffers[copyIndex];
s32 selector = mlvc->selector;
Gfx* gfxCopy = mlvc->gfxCopy[selector];
mlvc->selector++;
if (mlvc->selector >= 2) {
mlvc->selector = 0;
}
return gfxCopy;
}
void mdl_project_tex_coords(s32 modelID, Gfx* destGfx, Matrix4f* destMtx, Vtx* destVertices);
INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_project_tex_coords);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011C80C);
INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011CFBC);
void mdl_draw_hidden_panel_surface(Gfx** arg0, u16 treeIndex) {
Model* model = get_model_from_list_index(get_model_list_index_from_tree_index(treeIndex));
Model copied = *model;
Gfx* oldGfxPos;
s32 flag;
if (*arg0 == gMasterGfxPos) {
flag = 1;
}
oldGfxPos = gMasterGfxPos;
gMasterGfxPos = *arg0;
copied.flags = 0x80 | 0x1;
appendGfx_model(&copied);
*arg0 = gMasterGfxPos;
if (flag == 0) {
gMasterGfxPos = oldGfxPos;
}
}
s32 mdl_get_next_texture_address(s32 size) {
u32 offset = mdl_nextTextureAddress - mdl_textureBaseAddress + 0x3F;
offset = (offset >> 6) << 6;
if (size + offset > 0x28000) {
return 0;
} else {
return mdl_textureBaseAddress + offset;
}
}
void mdl_set_all_fog_mode(s32 fogMode) {
ModelList* modelList = gCurrentModels;
Model* model;
s32 fogType = fogMode; // weirdness here and the next line needed to match
s32 i = fogMode;
for (i = 0; i < ARRAY_COUNT(*modelList); i++) {
model = (*modelList)[i];
if (model != NULL) {
set_mdl_custom_gfx_set(model, -1, fogType);
}
}
}
void clear_render_tasks(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(mdl_clearRenderTasks); i++) {
mdl_renderTaskLists[i] = mdl_clearRenderTasks[i];
}
mdl_renderTaskMode = 0;
mdl_renderTaskCount = 0;
}
void clear_render_tasks_alt(void) {
s32 i;
for (i = 0; i < ARRAY_COUNT(mdl_clearRenderTasks); i++) {
mdl_renderTaskLists[i] = mdl_clearRenderTasks[i];
}
mdl_renderTaskMode = 0;
mdl_renderTaskCount = 0;
}
RenderTask* queue_render_task(RenderTask* task) {
RenderTask* ret = mdl_renderTaskLists[mdl_renderTaskMode];
ASSERT(mdl_renderTaskCount < 0x100);
ret = &ret[mdl_renderTaskCount++];
ret->renderMode = 1;
if (task->renderMode == 0x2D) {
ret->renderMode = 0x21;
}
ret->appendGfxArg = task->appendGfxArg;
ret->appendGfx = task->appendGfx;
ret->distance = D_8014C188[task->renderMode] - task->distance;
return ret;
}
INCLUDE_ASM(s32, "a5dd0_len_114e0", execute_render_tasks);