mirror of
https://gitlab.com/ryandwyer/perfect-dark
synced 2026-06-17 14:56:36 -04:00
206 lines
4.4 KiB
C
206 lines
4.4 KiB
C
#include <ultra64.h>
|
|
#include "constants.h"
|
|
#include "game/chraction.h"
|
|
#include "game/ceil.h"
|
|
#include "game/bondgun.h"
|
|
#include "game/game_0b0fd0.h"
|
|
#include "game/tex.h"
|
|
#include "game/menugfx.h"
|
|
#include "game/menu.h"
|
|
#include "game/mainmenu.h"
|
|
#include "game/inv.h"
|
|
#include "game/game_1531a0.h"
|
|
#include "game/file.h"
|
|
#include "game/texdecompress.h"
|
|
#include "game/tex.h"
|
|
#include "game/modeldef.h"
|
|
#include "game/lang.h"
|
|
#include "game/mplayer/mplayer.h"
|
|
#include "game/options.h"
|
|
#include "bss.h"
|
|
#include "lib/vi.h"
|
|
#include "lib/main.h"
|
|
#include "data.h"
|
|
#include "types.h"
|
|
|
|
struct skeleton *g_Skeletons[] = {
|
|
&g_SkelChr,
|
|
&g_SkelClassicGun,
|
|
&g_Skel06,
|
|
&g_SkelUzi,
|
|
&g_SkelBasic,
|
|
&g_SkelCctv,
|
|
&g_SkelWindowedDoor,
|
|
&g_Skel11,
|
|
&g_Skel12,
|
|
&g_Skel13,
|
|
&g_SkelTerminal,
|
|
&g_SkelCiHub,
|
|
&g_SkelAutogun,
|
|
&g_Skel17,
|
|
&g_Skel18,
|
|
&g_Skel19,
|
|
&g_Skel0A,
|
|
&g_Skel0B,
|
|
&g_SkelCasing,
|
|
&g_SkelChrGun,
|
|
&g_Skel0C,
|
|
&g_SkelJoypad,
|
|
&g_SkelLift,
|
|
&g_SkelSkedar,
|
|
&g_SkelLogo,
|
|
&g_SkelPdLogo,
|
|
&g_SkelHoverbike,
|
|
&g_SkelJumpship,
|
|
&g_Skel20,
|
|
&g_Skel21,
|
|
&g_Skel22,
|
|
&g_SkelLaptopGun,
|
|
&g_SkelK7Avenger,
|
|
&g_SkelChopper,
|
|
&g_SkelFalcon2,
|
|
&g_SkelKnife,
|
|
&g_SkelDrCaroll,
|
|
&g_SkelRope,
|
|
&g_SkelCmp150,
|
|
&g_SkelBanner,
|
|
&g_SkelDragon,
|
|
&g_SkelSuperDragon,
|
|
&g_SkelRocket,
|
|
&g_Skel4A,
|
|
&g_SkelShotgun,
|
|
&g_SkelFarsight,
|
|
&g_Skel4D,
|
|
&g_SkelReaper,
|
|
&g_SkelDropship,
|
|
&g_SkelMauler,
|
|
&g_SkelDevastator,
|
|
&g_SkelRobot,
|
|
&g_SkelPistol,
|
|
&g_SkelAr34,
|
|
&g_SkelMagnum,
|
|
&g_SkelSlayerRocket,
|
|
&g_SkelCyclone,
|
|
&g_SkelSniperRifle,
|
|
&g_SkelTranquilizer,
|
|
&g_SkelCrossbow,
|
|
&g_SkelHudPiece,
|
|
&g_SkelTimedProxyMine,
|
|
&g_SkelPhoenix,
|
|
&g_SkelCallisto,
|
|
&g_SkelHand,
|
|
&g_SkelRcp120,
|
|
&g_SkelSkShuttle,
|
|
&g_SkelLaser,
|
|
&g_SkelMaianUfo,
|
|
&g_SkelGrenade,
|
|
&g_SkelCableCar,
|
|
&g_SkelSubmarine,
|
|
&g_SkelTarget,
|
|
&g_SkelEcmMine,
|
|
&g_SkelUplink,
|
|
&g_SkelRareLogo,
|
|
&g_SkelWireFence,
|
|
&g_SkelRemoteMine,
|
|
&g_SkelBB,
|
|
};
|
|
|
|
void modeldef0f1a7560(struct modelfiledata *modeldef, u16 filenum, u32 arg2, u32 arg3, struct texpool *arg4, bool arg5)
|
|
{
|
|
s32 allocsize;
|
|
s32 loadedsize;
|
|
s32 sp84;
|
|
u32 s0;
|
|
u32 s4;
|
|
u32 s5;
|
|
struct modelnode *node;
|
|
struct modelnode *prevnode;
|
|
u32 gdl;
|
|
struct gfxvtx *vertices;
|
|
|
|
allocsize = fileGetAllocationSize(filenum);
|
|
loadedsize = fileGetLoadedSize(filenum);
|
|
node = NULL;
|
|
|
|
modelIterateDisplayLists(modeldef, &node, (Gfx **)&gdl);
|
|
|
|
s5 = gdl;
|
|
|
|
if (gdl) {
|
|
s32 v1 = allocsize - (loadedsize - (s32)(((u32)modeldef + (gdl & 0xffffff)) - (u32)modeldef));
|
|
sp84 = (s32)v1 + (s32)((s32)modeldef - ((u32)modeldef + (gdl & 0xffffff)));
|
|
|
|
texCopyGdls((Gfx *)((u32)modeldef + (gdl & 0xffffff)), (Gfx *)(v1 + (u32)modeldef), loadedsize - (s32)(((u32)modeldef + (gdl & 0xffffff)) - (u32)modeldef));
|
|
texLoadFromConfigs(modeldef->texconfigs, modeldef->numtexconfigs, arg4, arg3 - arg2);
|
|
|
|
while (node) {
|
|
prevnode = node;
|
|
s0 = gdl;
|
|
|
|
modelIterateDisplayLists(modeldef, &node, &gdl);
|
|
|
|
if (gdl) {
|
|
s4 = gdl - s0;
|
|
} else {
|
|
s4 = loadedsize + (u32)modeldef - (u32)modeldef - (s0 & 0xffffff);
|
|
}
|
|
|
|
modelNodeReplaceGdl(modeldef, prevnode, s0, s5);
|
|
|
|
if (prevnode->type == MODELNODETYPE_DL) {
|
|
struct modelrodata_dl *rodata = &prevnode->rodata->dl;
|
|
vertices = rodata->vertices;
|
|
} else {
|
|
vertices = NULL;
|
|
}
|
|
|
|
s5 += texLoadFromGdl((Gfx *)((u32)modeldef + (s0 & 0xffffff) + sp84), s4, (Gfx *)((u32)modeldef + (s5 & 0xffffff)), arg4, (u8 *) vertices);
|
|
}
|
|
|
|
fileSetSize(filenum, modeldef, (((u32)modeldef + (s5 & 0xffffff)) - (u32)modeldef + 0xf) & ~0xf, arg5);
|
|
}
|
|
}
|
|
|
|
void modelPromoteTypeToPointer(struct modelfiledata *filedata)
|
|
{
|
|
s32 i;
|
|
|
|
if ((u32)filedata->skel < 0x10000) {
|
|
for (i = 0; g_Skeletons[i] != NULL; i++) {
|
|
if ((s16)filedata->skel == g_Skeletons[i]->skel) {
|
|
filedata->skel = g_Skeletons[i];
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct modelfiledata *modeldefLoad(u16 fileid, u8 *dst, s32 size, struct texpool *arg3)
|
|
{
|
|
struct modelfiledata *filedata;
|
|
|
|
g_LoadType = LOADTYPE_MODEL;
|
|
|
|
if (dst) {
|
|
filedata = fileLoadToAddr(fileid, FILELOADMETHOD_EXTRAMEM, dst, size);
|
|
} else {
|
|
filedata = fileLoadToNew(fileid, FILELOADMETHOD_EXTRAMEM);
|
|
}
|
|
|
|
modelPromoteTypeToPointer(filedata);
|
|
modelPromoteOffsetsToPointers(filedata, 0x5000000, (u32) filedata);
|
|
modeldef0f1a7560(filedata, fileid, 0x5000000, (u32)filedata, arg3, dst == NULL);
|
|
|
|
return filedata;
|
|
}
|
|
|
|
struct modelfiledata *modeldefLoadToNew(u16 fileid)
|
|
{
|
|
return modeldefLoad(fileid, NULL, 0, NULL);
|
|
}
|
|
|
|
struct modelfiledata *modeldefLoadToAddr(u16 fileid, u8 *dst, s32 size)
|
|
{
|
|
return modeldefLoad(fileid, dst, size, NULL);
|
|
}
|