mirror of
https://github.com/perfect-dark-pc-port/perfect_dark.git
synced 2026-10-24 00:02:43 +02:00
port: halfassed solution for segmented addresses; fix some dyntex related stuff
This commit is contained in:
1 parent
f9b27d7d01
commit
62f3007d2a
8 files changed
+125
-81
No files matched your search
@@ -1568,12 +1568,21 @@ typedef struct {
|
|||||||
} GunkC0;
|
} GunkC0;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
#ifdef PLATFORM_BIG_ENDIAN
|
||||||
unsigned int cmd:8;
|
unsigned int cmd:8;
|
||||||
unsigned int unk08:4;
|
unsigned int unk08:4;
|
||||||
unsigned int unk0c:4;
|
unsigned int unk0c:4;
|
||||||
unsigned int unk10:16;
|
unsigned int unk10:16;
|
||||||
unsigned int seg:8;
|
unsigned int seg:8;
|
||||||
unsigned int offset:24;
|
unsigned int offset:24;
|
||||||
|
#else
|
||||||
|
unsigned int unk10:16;
|
||||||
|
unsigned int unk0c:4;
|
||||||
|
unsigned int unk08:4;
|
||||||
|
unsigned int cmd:8;
|
||||||
|
unsigned int offset:24;
|
||||||
|
unsigned int seg:8;
|
||||||
|
#endif
|
||||||
} Gvtx;
|
} Gvtx;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1920,6 +1929,15 @@ typedef union {
|
|||||||
#define gsSPSegment(segment, base) \
|
#define gsSPSegment(segment, base) \
|
||||||
gsMoveWd(G_MW_SEGMENT, (segment)*4, base)
|
gsMoveWd(G_MW_SEGMENT, (segment)*4, base)
|
||||||
|
|
||||||
|
#ifdef PLATFORM_N64
|
||||||
|
#define SEGADDR(x) x
|
||||||
|
#define UNSEGADDR(x) x
|
||||||
|
#else
|
||||||
|
// we mark all segmented addresses so that it'll be easier to recognize them later
|
||||||
|
#define SEGADDR(x) ((void *)((uintptr_t)(x) | 1))
|
||||||
|
#define UNSEGADDR(x) ((uintptr_t)(x) & ~1)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clipping Macros
|
* Clipping Macros
|
||||||
*/
|
*/
|
||||||
|
|||||||
+6
-14
@@ -2226,25 +2226,17 @@ static void gfx_dp_set_other_mode(uint32_t h, uint32_t l) {
|
|||||||
rdp.other_mode_l = l;
|
rdp.other_mode_l = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: figure out a proper way to deal with this shit, this won't work
|
|
||||||
static inline void *seg_addr(uintptr_t w1) {
|
static inline void *seg_addr(uintptr_t w1) {
|
||||||
// any address higher than 0x0fffffff is not segmented
|
// all segmented addresses have the least significant bit set
|
||||||
if ((w1 & 0xf0000000) == 0) {
|
if (w1 & 1) {
|
||||||
// seg 0 is reserved and doesn't count here
|
// seg 0 is reserved and doesn't count here
|
||||||
const uintptr_t seg = (w1 & 0x0f000000) >> 24;
|
const uintptr_t seg = (w1 & 0x0f000000) >> 24;
|
||||||
// only segments 2-6 and 13-15 are used in PD
|
if (seg && segmentPointers[seg]) {
|
||||||
if ((seg >= 2 && seg <= 6) || (seg >= 13)) {
|
const uintptr_t addr = (w1 & 0x00fffffe);
|
||||||
// maybe segmented, check if we have that segment loaded
|
return (void *)(segmentPointers[seg] + addr);
|
||||||
if (seg && segmentPointers[seg]) {
|
|
||||||
// we do but we can't really confirm whether or not it is actually segmented
|
|
||||||
const uintptr_t addr = (w1 & 0x00ffffff);
|
|
||||||
if (addr > 512 * 1024)
|
|
||||||
return (void *) w1; // PROBABLY isn't segmented because no seg should be that big
|
|
||||||
return (void *)(addr + segmentPointers[seg]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (void *) w1;
|
return (void *)w1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uintptr_t clearMtx;
|
uintptr_t clearMtx;
|
||||||
|
|||||||
+26
-12
@@ -157,18 +157,24 @@ static inline void preprocessGfx(Gfx *gdl, u8 *base, uintptr_t ofs)
|
|||||||
PD_SWAP_VAL(gdl->words.w1);
|
PD_SWAP_VAL(gdl->words.w1);
|
||||||
if (opcode == (s8)G_ENDDL) {
|
if (opcode == (s8)G_ENDDL) {
|
||||||
break;
|
break;
|
||||||
} else if (opcode == (s8)G_DL) {
|
|
||||||
/*
|
|
||||||
if ((gdl->words.w0 >> 16) & ((1U << 1) - 1) == 0) {
|
|
||||||
if (gdl->words.w1) {
|
|
||||||
preprocessGfx(PD_PTR_BASEOFS(gdl->words.w1, base, ofs), base, ofs);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gdl = PD_PTR_BASEOFS(gdl->words.w1, base, ofs);
|
|
||||||
--gdl;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mark all addresses in the DL as segmented
|
||||||
|
switch (opcode) {
|
||||||
|
case (s8)G_SETTIMG:
|
||||||
|
case (s8)G_SETCIMG:
|
||||||
|
case (s8)G_SETZIMG:
|
||||||
|
case G_MOVEMEM:
|
||||||
|
case G_MTX:
|
||||||
|
case G_VTX:
|
||||||
|
case G_COL:
|
||||||
|
case G_DL:
|
||||||
|
gdl->words.w1 |= 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
++gdl;
|
++gdl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -197,10 +203,12 @@ static void preprocessModelGunDL(struct modelrodata_gundl *gundl, u8 *base, u32
|
|||||||
if (gundl->opagdl) {
|
if (gundl->opagdl) {
|
||||||
PD_SWAP_PTR(gundl->opagdl);
|
PD_SWAP_PTR(gundl->opagdl);
|
||||||
preprocessGfx(PD_PTR_BASEOFS(gundl->opagdl, base, ofs), base, ofs);
|
preprocessGfx(PD_PTR_BASEOFS(gundl->opagdl, base, ofs), base, ofs);
|
||||||
|
gundl->opagdl = SEGADDR(gundl->opagdl);
|
||||||
}
|
}
|
||||||
if (gundl->xlugdl) {
|
if (gundl->xlugdl) {
|
||||||
PD_SWAP_PTR(gundl->xlugdl);
|
PD_SWAP_PTR(gundl->xlugdl);
|
||||||
preprocessGfx(PD_PTR_BASEOFS(gundl->xlugdl, base, ofs), base, ofs);
|
preprocessGfx(PD_PTR_BASEOFS(gundl->xlugdl, base, ofs), base, ofs);
|
||||||
|
gundl->xlugdl = SEGADDR(gundl->xlugdl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,10 +230,12 @@ static void preprocessModelDL(struct modelrodata_dl *dl, u8 *base, u32 ofs)
|
|||||||
if (dl->opagdl) {
|
if (dl->opagdl) {
|
||||||
PD_SWAP_PTR(dl->opagdl);
|
PD_SWAP_PTR(dl->opagdl);
|
||||||
preprocessGfx(PD_PTR_BASEOFS(dl->opagdl, base, ofs), base, ofs);
|
preprocessGfx(PD_PTR_BASEOFS(dl->opagdl, base, ofs), base, ofs);
|
||||||
|
dl->opagdl = SEGADDR(dl->opagdl);
|
||||||
}
|
}
|
||||||
if (dl->xlugdl) {
|
if (dl->xlugdl) {
|
||||||
PD_SWAP_PTR(dl->xlugdl);
|
PD_SWAP_PTR(dl->xlugdl);
|
||||||
preprocessGfx(PD_PTR_BASEOFS(dl->xlugdl, base, ofs), base, ofs);
|
preprocessGfx(PD_PTR_BASEOFS(dl->xlugdl, base, ofs), base, ofs);
|
||||||
|
dl->xlugdl = SEGADDR(dl->xlugdl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,9 +339,13 @@ static void preprocessModelNode(struct modelnode *node, u8 *base, u32 ofs)
|
|||||||
break;
|
break;
|
||||||
case MODELNODETYPE_STARGUNFIRE:
|
case MODELNODETYPE_STARGUNFIRE:
|
||||||
PD_SWAP_VAL(ro->stargunfire.unk00);
|
PD_SWAP_VAL(ro->stargunfire.unk00);
|
||||||
PD_SWAP_PTR(ro->stargunfire.gdl);
|
|
||||||
PD_SWAP_PTR(ro->stargunfire.vertices);
|
PD_SWAP_PTR(ro->stargunfire.vertices);
|
||||||
PD_SWAP_PTR(ro->stargunfire.baseaddr);
|
PD_SWAP_PTR(ro->stargunfire.baseaddr);
|
||||||
|
if (ro->stargunfire.gdl) {
|
||||||
|
PD_SWAP_PTR(ro->stargunfire.gdl);
|
||||||
|
preprocessGfx(PD_PTR_BASEOFS(ro->stargunfire.gdl, base, ofs), base, ofs);
|
||||||
|
ro->stargunfire.gdl = SEGADDR(ro->stargunfire.gdl);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MODELNODETYPE_HEADSPOT:
|
case MODELNODETYPE_HEADSPOT:
|
||||||
PD_SWAP_VAL(ro->headspot.rwdataindex);
|
PD_SWAP_VAL(ro->headspot.rwdataindex);
|
||||||
|
|||||||
+8
-8
@@ -710,7 +710,7 @@ Gfx *bgRenderGdlInXray(Gfx *gdl, s8 *readgdl, Vtx *vertices, s16 arg3[3])
|
|||||||
Gfx *cmd = (Gfx *) readgdl;
|
Gfx *cmd = (Gfx *) readgdl;
|
||||||
s32 dmemindex = cmd->bytes[GFX_W0_BYTE(1)] & 0xf;
|
s32 dmemindex = cmd->bytes[GFX_W0_BYTE(1)] & 0xf;
|
||||||
s32 numvertices = ((u32) cmd->bytes[GFX_W0_BYTE(1)] >> 4) + 1;
|
s32 numvertices = ((u32) cmd->bytes[GFX_W0_BYTE(1)] >> 4) + 1;
|
||||||
u32 offset = cmd->words.w1 & 0xffffff;
|
u32 offset = UNSEGADDR(cmd->words.w1) & 0xffffff;
|
||||||
|
|
||||||
for (i = 0; i < numvertices; i++) {
|
for (i = 0; i < numvertices; i++) {
|
||||||
Vtx *vtx = (Vtx *) (verticesu8 + offset);
|
Vtx *vtx = (Vtx *) (verticesu8 + offset);
|
||||||
@@ -3300,7 +3300,7 @@ s32 bgPopulateVtxBatchType(s32 roomnum, struct vtxbatch *batches, Gfx *gdl, s32
|
|||||||
}
|
}
|
||||||
|
|
||||||
numvertices = (((u32)gdl[i].bytes[GFX_W0_BYTE(1)] >> 4) & 0xf) + 1;
|
numvertices = (((u32)gdl[i].bytes[GFX_W0_BYTE(1)] >> 4) & 0xf) + 1;
|
||||||
batchvertices = (Vtx *)((uintptr_t)vertices + (gdl[i].words.w1 & 0xffffff));
|
batchvertices = (Vtx *)((uintptr_t)vertices + (UNSEGADDR(gdl[i].words.w1) & 0xffffff));
|
||||||
|
|
||||||
for (j = 0; j < numvertices; j++) {
|
for (j = 0; j < numvertices; j++) {
|
||||||
f32 x = batchvertices[j].x;
|
f32 x = batchvertices[j].x;
|
||||||
@@ -3609,7 +3609,7 @@ bool bgTestHitOnObj(struct coord *arg0, struct coord *arg1, struct coord *arg2,
|
|||||||
} else if (gdl->dma.cmd == G_VTX) {
|
} else if (gdl->dma.cmd == G_VTX) {
|
||||||
ptr = var800a6470;
|
ptr = var800a6470;
|
||||||
count = gdl->bytes[GFX_W0_BYTE(1)] & 0xf;
|
count = gdl->bytes[GFX_W0_BYTE(1)] & 0xf;
|
||||||
offset = (gdl->words.w1 & 0xffffff);
|
offset = (UNSEGADDR(gdl->words.w1) & 0xffffff);
|
||||||
numvertices = (((u32) gdl->bytes[GFX_W0_BYTE(1)] >> 4) & 0xf) + 1;
|
numvertices = (((u32) gdl->bytes[GFX_W0_BYTE(1)] >> 4) & 0xf) + 1;
|
||||||
vtx = (Vtx *)((uintptr_t)vertices + offset);
|
vtx = (Vtx *)((uintptr_t)vertices + offset);
|
||||||
vtx -= count;
|
vtx -= count;
|
||||||
@@ -3814,7 +3814,7 @@ bool bgTestHitOnObj(struct coord *arg0, struct coord *arg1, struct coord *arg2,
|
|||||||
|| (imggdl->words.w1 & 0x05000000) == 0x05000000) {
|
|| (imggdl->words.w1 & 0x05000000) == 0x05000000) {
|
||||||
texturenum = -1;
|
texturenum = -1;
|
||||||
} else {
|
} else {
|
||||||
s32 tmp = PHYS_TO_K0(imggdl->words.w1 - 8);
|
s32 tmp = PHYS_TO_K0(UNSEGADDR(imggdl->words.w1) - 8);
|
||||||
texturenum = *(s16 *) tmp;
|
texturenum = *(s16 *) tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3905,12 +3905,12 @@ bool bgTestHitOnChr(struct model *model, struct coord *arg1, struct coord *arg2,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} else if (gdl->dma.cmd == G_MTX) {
|
} else if (gdl->dma.cmd == G_MTX) {
|
||||||
word = gdl->words.w1 & 0xffffff;
|
word = UNSEGADDR(gdl->words.w1) & 0xffffff;
|
||||||
i = word / sizeof(Mtxf);
|
i = word / sizeof(Mtxf);
|
||||||
mtx = &model->matrices[i];
|
mtx = &model->matrices[i];
|
||||||
} else if (gdl->dma.cmd == G_VTX) {
|
} else if (gdl->dma.cmd == G_VTX) {
|
||||||
count = (gdl->bytes[GFX_W0_BYTE(1)] & 0xf);
|
count = (gdl->bytes[GFX_W0_BYTE(1)] & 0xf);
|
||||||
word = gdl->words.w1 & 0xffffff;
|
word = UNSEGADDR(gdl->words.w1) & 0xffffff;
|
||||||
numvertices = ((u32) gdl->bytes[GFX_W0_BYTE(1)] >> 4) + 1;
|
numvertices = ((u32) gdl->bytes[GFX_W0_BYTE(1)] >> 4) + 1;
|
||||||
vtx = (Vtx *)((uintptr_t)vertices + word);
|
vtx = (Vtx *)((uintptr_t)vertices + word);
|
||||||
|
|
||||||
@@ -4171,7 +4171,7 @@ bool bgTestHitInVtxBatch(struct coord *arg0, struct coord *arg1, struct coord *a
|
|||||||
|
|
||||||
vtx = bgFindVerticesForGdl(roomnum, gdl);
|
vtx = bgFindVerticesForGdl(roomnum, gdl);
|
||||||
iter = &gdl[batch->gbicmdindex];
|
iter = &gdl[batch->gbicmdindex];
|
||||||
vtx = (Vtx *)((iter->words.w1 & 0xffffff) + (s32)vtx);
|
vtx = (Vtx *)((UNSEGADDR(iter->words.w1) & 0xffffff) + (s32)vtx);
|
||||||
numvertices = (((u32) iter->bytes[GFX_W0_BYTE(1)] >> 4) & 0xf) + 1;
|
numvertices = (((u32) iter->bytes[GFX_W0_BYTE(1)] >> 4) & 0xf) + 1;
|
||||||
ptr = var800a6470;
|
ptr = var800a6470;
|
||||||
|
|
||||||
@@ -4311,7 +4311,7 @@ bool bgTestHitInVtxBatch(struct coord *arg0, struct coord *arg1, struct coord *a
|
|||||||
|| (tmpgdl->words.w1 & 0x05000000) == 0x05000000) {
|
|| (tmpgdl->words.w1 & 0x05000000) == 0x05000000) {
|
||||||
texturenum = -1;
|
texturenum = -1;
|
||||||
} else {
|
} else {
|
||||||
s32 tmp = tmpgdl->words.w1 - 8;
|
s32 tmp = UNSEGADDR(tmpgdl->words.w1) - 8;
|
||||||
texturenum = *(s16 *) PHYS_TO_K0(tmp);
|
texturenum = *(s16 *) PHYS_TO_K0(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
-28
@@ -3731,13 +3731,13 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
// use the space... after the model definition's colour table?
|
// use the space... after the model definition's colour table?
|
||||||
// Let's hope that's not being used by other instances...
|
// Let's hope that's not being used by other instances...
|
||||||
if (rwdata->gdl == rodata->opagdl) {
|
if (rwdata->gdl == rodata->opagdl) {
|
||||||
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((uintptr_t)rodata->opagdl & 0xffffff));
|
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((uintptr_t)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr = rwdata->gdl;
|
gdlptr = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->xlugdl) {
|
if (rodata->xlugdl) {
|
||||||
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((uintptr_t)rodata->xlugdl & 0xffffff));
|
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((uintptr_t)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr2 = NULL;
|
gdlptr2 = NULL;
|
||||||
}
|
}
|
||||||
@@ -3745,7 +3745,11 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
// Iterate the primary DL, and once the end is reached
|
// Iterate the primary DL, and once the end is reached
|
||||||
// iterate the secondary DL if we have one.
|
// iterate the secondary DL if we have one.
|
||||||
while (true) {
|
while (true) {
|
||||||
|
#ifdef PLATFORM_N64
|
||||||
op = *(s8 *)&gdlptr->words.w0;
|
op = *(s8 *)&gdlptr->words.w0;
|
||||||
|
#else
|
||||||
|
op = (s8)gdlptr->bytes[GFX_W0_BYTE(0)];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (op == G_ENDDL) {
|
if (op == G_ENDDL) {
|
||||||
if (gdlptr2) {
|
if (gdlptr2) {
|
||||||
@@ -3761,12 +3765,12 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
// Note: We should have found an MTX op before VTX.
|
// Note: We should have found an MTX op before VTX.
|
||||||
if (op == G_VTX) {
|
if (op == G_VTX) {
|
||||||
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
||||||
u32 word = gdlptr->words.w1 & 0xffffff;
|
u32 word = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
s32 numverts;
|
s32 numverts;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
||||||
numverts = (u32)ptr[1] / 16 + 1;
|
numverts = (u32)ptr[GFX_W0_BYTE(1)] / 16 + 1;
|
||||||
|
|
||||||
if (posnode) {
|
if (posnode) {
|
||||||
for (i = 0; i < numverts; i++) {
|
for (i = 0; i < numverts; i++) {
|
||||||
@@ -3785,7 +3789,7 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (op == G_MTX) {
|
} else if (op == G_MTX) {
|
||||||
u32 addr = gdlptr->words.w1 & 0xffffff;
|
u32 addr = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
||||||
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
||||||
|
|
||||||
@@ -3850,19 +3854,23 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rwdata->gdl == rodata->opagdl) {
|
if (rwdata->gdl == rodata->opagdl) {
|
||||||
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->opagdl & 0xffffff));
|
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr = rwdata->gdl;
|
gdlptr = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->xlugdl) {
|
if (rodata->xlugdl) {
|
||||||
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->xlugdl & 0xffffff));
|
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr2 = NULL;
|
gdlptr2 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
#ifdef PLATFORM_N64
|
||||||
s32 op = *(s8 *)&gdlptr->words.w0;
|
s32 op = *(s8 *)&gdlptr->words.w0;
|
||||||
|
#else
|
||||||
|
s32 op = (s8)gdlptr->bytes[GFX_W0_BYTE(0)];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (op == G_ENDDL) {
|
if (op == G_ENDDL) {
|
||||||
if (gdlptr2) {
|
if (gdlptr2) {
|
||||||
@@ -3878,9 +3886,9 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
// Note: We should have found an MTX op before VTX.
|
// Note: We should have found an MTX op before VTX.
|
||||||
if (op == G_VTX) {
|
if (op == G_VTX) {
|
||||||
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
||||||
u32 word = gdlptr->words.w1 & 0xffffff;
|
u32 word = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
Vtx *vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
Vtx *vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
||||||
s32 numverts = (u32)ptr[1] / 16 + 1;
|
s32 numverts = (u32)ptr[GFX_W0_BYTE(1)] / 16 + 1;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
if (posnode) {
|
if (posnode) {
|
||||||
@@ -3915,11 +3923,11 @@ void chr0f0260c4(struct model *model, s32 hitpart, struct modelnode *node, struc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (op == G_MTX) {
|
} else if (op == G_MTX) {
|
||||||
u32 addr = gdlptr->words.w1 & 0xffffff;
|
u32 addr = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
||||||
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
||||||
} else if (op == G_COL) {
|
} else if (op == G_COL) {
|
||||||
spac = gdlptr->words.w1 & 0xffffff;
|
spac = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
gdlptr++;
|
gdlptr++;
|
||||||
@@ -4006,13 +4014,13 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
// use the space... after the model definition's colour table?
|
// use the space... after the model definition's colour table?
|
||||||
// Let's hope that's not being used by other instances...
|
// Let's hope that's not being used by other instances...
|
||||||
if (rwdata->gdl == rodata->opagdl) {
|
if (rwdata->gdl == rodata->opagdl) {
|
||||||
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->opagdl & 0xffffff));
|
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr = rwdata->gdl;
|
gdlptr = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->xlugdl) {
|
if (rodata->xlugdl) {
|
||||||
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->xlugdl & 0xffffff));
|
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr2 = NULL;
|
gdlptr2 = NULL;
|
||||||
}
|
}
|
||||||
@@ -4020,7 +4028,11 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
// Iterate the primary DL, and once the end is reached
|
// Iterate the primary DL, and once the end is reached
|
||||||
// iterate the secondary DL if we have one.
|
// iterate the secondary DL if we have one.
|
||||||
while (true) {
|
while (true) {
|
||||||
|
#ifdef PLATFORM_N64
|
||||||
op = *(s8 *)&gdlptr->words.w0;
|
op = *(s8 *)&gdlptr->words.w0;
|
||||||
|
#else
|
||||||
|
op = (s8)gdlptr->bytes[GFX_W0_BYTE(0)];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (op == G_ENDDL) {
|
if (op == G_ENDDL) {
|
||||||
if (gdlptr2) {
|
if (gdlptr2) {
|
||||||
@@ -4036,12 +4048,12 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
// Note: We should have found an MTX op before VTX.
|
// Note: We should have found an MTX op before VTX.
|
||||||
if (op == G_VTX) {
|
if (op == G_VTX) {
|
||||||
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
||||||
u32 word = gdlptr->words.w1 & 0xffffff;
|
u32 word = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
s32 numverts;
|
s32 numverts;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
||||||
numverts = (u32)ptr[1] / 16 + 1;
|
numverts = (u32)ptr[GFX_W0_BYTE(1)] / 16 + 1;
|
||||||
|
|
||||||
if (posnode) {
|
if (posnode) {
|
||||||
for (i = 0; i < numverts; i++) {
|
for (i = 0; i < numverts; i++) {
|
||||||
@@ -4060,7 +4072,7 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (op == G_MTX) {
|
} else if (op == G_MTX) {
|
||||||
u32 addr = gdlptr->words.w1 & 0xffffff;
|
u32 addr = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
||||||
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
||||||
|
|
||||||
@@ -4144,19 +4156,23 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rwdata->gdl == rodata->opagdl) {
|
if (rwdata->gdl == rodata->opagdl) {
|
||||||
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->opagdl & 0xffffff));
|
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr = rwdata->gdl;
|
gdlptr = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->xlugdl) {
|
if (rodata->xlugdl) {
|
||||||
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->xlugdl & 0xffffff));
|
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr2 = NULL;
|
gdlptr2 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
s32 op = *(s8 *)&gdlptr->words.w0;
|
#ifdef PLATFORM_N64
|
||||||
|
s32 op = *(s8 *)&gdlptr->words.w0;
|
||||||
|
#else
|
||||||
|
s32 op = (s8)gdlptr->bytes[GFX_W0_BYTE(0)];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (op == G_ENDDL) {
|
if (op == G_ENDDL) {
|
||||||
if (gdlptr2) {
|
if (gdlptr2) {
|
||||||
@@ -4172,9 +4188,9 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
// Note: We should have found an MTX op before VTX.
|
// Note: We should have found an MTX op before VTX.
|
||||||
if (op == G_VTX) {
|
if (op == G_VTX) {
|
||||||
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
||||||
u32 word = gdlptr->words.w1 & 0xffffff;
|
u32 word = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
Vtx *vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
Vtx *vertices = (Vtx *)((uintptr_t)rodata->vertices + word);
|
||||||
s32 numverts = (u32)ptr[1] / 16 + 1;
|
s32 numverts = (u32)ptr[GFX_W0_BYTE(1)] / 16 + 1;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
if (posnode) {
|
if (posnode) {
|
||||||
@@ -4213,11 +4229,11 @@ void chrBruise(struct model *model, s32 hitpart, struct modelnode *node, struct
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (op == G_MTX) {
|
} else if (op == G_MTX) {
|
||||||
u32 addr = gdlptr->words.w1 & 0xffffff;
|
u32 addr = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
||||||
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
modelNodeGetModelRelativePosition(model, posnode, &spd4);
|
||||||
} else if (op == G_COL) {
|
} else if (op == G_COL) {
|
||||||
spac = gdlptr->words.w1 & 0xffffff;
|
spac = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
gdlptr++;
|
gdlptr++;
|
||||||
@@ -4335,19 +4351,23 @@ void chrDisfigure(struct chrdata *chr, struct coord *exppos, f32 damageradius)
|
|||||||
if (rwdata->vertices != rodata->vertices
|
if (rwdata->vertices != rodata->vertices
|
||||||
&& (uintptr_t)rwdata->colours != ALIGN8((uintptr_t)&rodata->vertices[rodata->numvertices])) {
|
&& (uintptr_t)rwdata->colours != ALIGN8((uintptr_t)&rodata->vertices[rodata->numvertices])) {
|
||||||
if (rwdata->gdl == rodata->opagdl) {
|
if (rwdata->gdl == rodata->opagdl) {
|
||||||
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((s32)rodata->opagdl & 0xffffff));
|
gdlptr = (Gfx *)((uintptr_t)rodata->colours + ((s32)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr = rwdata->gdl;
|
gdlptr = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->xlugdl) {
|
if (rodata->xlugdl) {
|
||||||
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((s32)rodata->xlugdl & 0xffffff));
|
gdlptr2 = (Gfx *)((uintptr_t)rodata->colours + ((s32)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
gdlptr2 = NULL;
|
gdlptr2 = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
#ifdef PLATFORM_N64
|
||||||
s32 op = *(s8 *)&gdlptr->words.w0;
|
s32 op = *(s8 *)&gdlptr->words.w0;
|
||||||
|
#else
|
||||||
|
s32 op = (s8)gdlptr->bytes[GFX_W0_BYTE(0)];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (op == G_ENDDL) {
|
if (op == G_ENDDL) {
|
||||||
if (gdlptr2 == NULL) {
|
if (gdlptr2 == NULL) {
|
||||||
@@ -4365,11 +4385,11 @@ void chrDisfigure(struct chrdata *chr, struct coord *exppos, f32 damageradius)
|
|||||||
if (op == G_VTX) {
|
if (op == G_VTX) {
|
||||||
// Iterate the vertex table and fudge them
|
// Iterate the vertex table and fudge them
|
||||||
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
u8 *ptr = (u8 *)&gdlptr->words.w0;
|
||||||
s32 word = gdlptr->words.w1 & 0xffffff;
|
s32 word = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
s32 numverts;
|
s32 numverts;
|
||||||
|
|
||||||
vertices = (Vtx *)((uintptr_t)rwdata->vertices + word);
|
vertices = (Vtx *)((uintptr_t)rwdata->vertices + word);
|
||||||
numverts = (u32)ptr[1] / 16 + 1;
|
numverts = (u32)ptr[GFX_W0_BYTE(1)] / 16 + 1;
|
||||||
|
|
||||||
if (posnode) {
|
if (posnode) {
|
||||||
for (i = 0; i < numverts; i++) {
|
for (i = 0; i < numverts; i++) {
|
||||||
@@ -4397,7 +4417,7 @@ void chrDisfigure(struct chrdata *chr, struct coord *exppos, f32 damageradius)
|
|||||||
}
|
}
|
||||||
} else if (op == G_MTX) {
|
} else if (op == G_MTX) {
|
||||||
// Get the position of the node relative to the model
|
// Get the position of the node relative to the model
|
||||||
u32 addr = gdlptr->words.w1 & 0xffffff;
|
u32 addr = UNSEGADDR(gdlptr->words.w1) & 0xffffff;
|
||||||
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
posnode = modelFindNodeByMtxIndex(model, addr / sizeof(Mtxf));
|
||||||
modelNodeGetModelRelativePosition(model, posnode, &pos);
|
modelNodeGetModelRelativePosition(model, posnode, &pos);
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-8
@@ -128,12 +128,12 @@ void modeldef0f1a7560(struct modeldef *modeldef, u16 filenum, u32 arg2, struct m
|
|||||||
s5 = gdl;
|
s5 = gdl;
|
||||||
|
|
||||||
if (gdl) {
|
if (gdl) {
|
||||||
s32 v1 = allocsize - (loadedsize - (s32)(((uintptr_t)modeldef + (gdl & 0xffffff)) - (uintptr_t)modeldef));
|
s32 v1 = allocsize - (loadedsize - (s32)(((uintptr_t)modeldef + (UNSEGADDR(gdl) & 0xffffff)) - (uintptr_t)modeldef));
|
||||||
sp84 = (s32)v1 + (s32)((uintptr_t)modeldef - ((uintptr_t)modeldef + (gdl & 0xffffff)));
|
sp84 = (s32)v1 + (s32)((uintptr_t)modeldef - ((uintptr_t)modeldef + (UNSEGADDR(gdl) & 0xffffff)));
|
||||||
|
|
||||||
texCopyGdls((Gfx *)((uintptr_t)modeldef + (gdl & 0xffffff)),
|
texCopyGdls((Gfx *)((uintptr_t)modeldef + (UNSEGADDR(gdl) & 0xffffff)),
|
||||||
(Gfx *)(v1 + (uintptr_t)modeldef),
|
(Gfx *)(v1 + (uintptr_t)modeldef),
|
||||||
loadedsize - (s32)(((uintptr_t)modeldef + (gdl & 0xffffff)) - (uintptr_t)modeldef));
|
loadedsize - (s32)(((uintptr_t)modeldef + (UNSEGADDR(gdl) & 0xffffff)) - (uintptr_t)modeldef));
|
||||||
texLoadFromConfigs(modeldef->texconfigs, modeldef->numtexconfigs, texpool, (uintptr_t)modeldef2 - arg2);
|
texLoadFromConfigs(modeldef->texconfigs, modeldef->numtexconfigs, texpool, (uintptr_t)modeldef2 - arg2);
|
||||||
|
|
||||||
while (node) {
|
while (node) {
|
||||||
@@ -143,9 +143,9 @@ void modeldef0f1a7560(struct modeldef *modeldef, u16 filenum, u32 arg2, struct m
|
|||||||
modelIterateDisplayLists(modeldef, &node, (Gfx **) &gdl);
|
modelIterateDisplayLists(modeldef, &node, (Gfx **) &gdl);
|
||||||
|
|
||||||
if (gdl) {
|
if (gdl) {
|
||||||
s4 = gdl - s0;
|
s4 = UNSEGADDR(gdl) - UNSEGADDR(s0);
|
||||||
} else {
|
} else {
|
||||||
s4 = loadedsize + (uintptr_t)modeldef - (uintptr_t)modeldef - (s0 & 0xffffff);
|
s4 = loadedsize + (uintptr_t)modeldef - (uintptr_t)modeldef - (UNSEGADDR(s0) & 0xffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
modelNodeReplaceGdl(modeldef, prevnode, (Gfx *) s0, (Gfx *) s5);
|
modelNodeReplaceGdl(modeldef, prevnode, (Gfx *) s0, (Gfx *) s5);
|
||||||
@@ -157,10 +157,10 @@ void modeldef0f1a7560(struct modeldef *modeldef, u16 filenum, u32 arg2, struct m
|
|||||||
vertices = NULL;
|
vertices = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
s5 += texLoadFromGdl((Gfx *)((uintptr_t)modeldef + (s0 & 0xffffff) + sp84), s4, (Gfx *)((uintptr_t)modeldef + (s5 & 0xffffff)), texpool, (u8 *) vertices);
|
s5 += texLoadFromGdl((Gfx *)((uintptr_t)modeldef + (UNSEGADDR(s0) & 0xffffff) + sp84), s4, (Gfx *)((uintptr_t)modeldef + (UNSEGADDR(s5) & 0xffffff)), texpool, (u8 *) vertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
fileSetSize(filenum, modeldef, (((uintptr_t)modeldef + (s5 & 0xffffff)) - (uintptr_t)modeldef + 0xf) & ~0xf, arg5);
|
fileSetSize(filenum, modeldef, (((uintptr_t)modeldef + (UNSEGADDR(s5) & 0xffffff)) - (uintptr_t)modeldef + 0xf) & ~0xf, arg5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -2914,13 +2914,13 @@ bool func0f06bea0(struct model *model, struct modelnode *endnode, struct modelno
|
|||||||
|
|
||||||
if (rwdata->gdl != NULL) {
|
if (rwdata->gdl != NULL) {
|
||||||
if (rwdata->gdl == rodata->dl.opagdl) {
|
if (rwdata->gdl == rodata->dl.opagdl) {
|
||||||
s4 = (Gfx *)((uintptr_t)rodata->dl.colours + ((uintptr_t)rodata->dl.opagdl & 0xffffff));
|
s4 = (Gfx *)((uintptr_t)rodata->dl.colours + ((uintptr_t)UNSEGADDR(rodata->dl.opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
s4 = rwdata->gdl;
|
s4 = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->dl.xlugdl != NULL) {
|
if (rodata->dl.xlugdl != NULL) {
|
||||||
s6 = (Gfx *)((uintptr_t)rodata->dl.colours + ((uintptr_t)rodata->dl.xlugdl & 0xffffff));
|
s6 = (Gfx *)((uintptr_t)rodata->dl.colours + ((uintptr_t)UNSEGADDR(rodata->dl.xlugdl) & 0xffffff));
|
||||||
}
|
}
|
||||||
|
|
||||||
vertices = rwdata->vertices;
|
vertices = rwdata->vertices;
|
||||||
@@ -2932,10 +2932,10 @@ bool func0f06bea0(struct model *model, struct modelnode *endnode, struct modelno
|
|||||||
if (node->rodata->gundl.opagdl != NULL) {
|
if (node->rodata->gundl.opagdl != NULL) {
|
||||||
s32 base = (intptr_t)node->rodata->gundl.baseaddr;
|
s32 base = (intptr_t)node->rodata->gundl.baseaddr;
|
||||||
|
|
||||||
s4 = (Gfx *)(base + ((uintptr_t)node->rodata->gundl.opagdl & 0xffffff));
|
s4 = (Gfx *)(base + ((uintptr_t)UNSEGADDR(node->rodata->gundl.opagdl) & 0xffffff));
|
||||||
|
|
||||||
if (node->rodata->gundl.xlugdl != NULL) {
|
if (node->rodata->gundl.xlugdl != NULL) {
|
||||||
s6 = (Gfx *)(base + ((uintptr_t)node->rodata->gundl.xlugdl & 0xffffff));
|
s6 = (Gfx *)(base + ((uintptr_t)UNSEGADDR(node->rodata->gundl.xlugdl) & 0xffffff));
|
||||||
}
|
}
|
||||||
|
|
||||||
vertices = (Vtx *)base;
|
vertices = (Vtx *)base;
|
||||||
@@ -13314,7 +13314,7 @@ Gfx *tvscreenRender(struct model *model, struct modelnode *node, struct tvscreen
|
|||||||
gSPMatrix(gdl++, osVirtualToPhysical(model->matrices), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
gSPMatrix(gdl++, osVirtualToPhysical(model->matrices), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||||
gSPSegment(gdl++, SPSEGMENT_MODEL_VTX, osVirtualToPhysical(vertices));
|
gSPSegment(gdl++, SPSEGMENT_MODEL_VTX, osVirtualToPhysical(vertices));
|
||||||
gSPColor(gdl++, osVirtualToPhysical(colours), 1);
|
gSPColor(gdl++, osVirtualToPhysical(colours), 1);
|
||||||
gSPVertex(gdl++, SPSEGMENT_MODEL_VTX << 24, 4, 0);
|
gSPVertex(gdl++, SEGADDR(SPSEGMENT_MODEL_VTX << 24), 4, 0);
|
||||||
gSPTri2(gdl++, 0, 1, 2, 0, 2, 3);
|
gSPTri2(gdl++, 0, 1, 2, 0, 2, 3);
|
||||||
gSPEndDisplayList(gdl++);
|
gSPEndDisplayList(gdl++);
|
||||||
|
|
||||||
@@ -14982,13 +14982,13 @@ bool func0f0849dc(struct model *model, struct modelnode *nodearg, struct coord *
|
|||||||
|
|
||||||
if (rwdata->gdl != NULL) {
|
if (rwdata->gdl != NULL) {
|
||||||
if (rwdata->gdl == rodata->opagdl) {
|
if (rwdata->gdl == rodata->opagdl) {
|
||||||
s3 = (Gfx *)((uintptr_t)rodata->colours + ((u32)rodata->opagdl & 0xffffff));
|
s3 = (Gfx *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
} else {
|
} else {
|
||||||
s3 = rwdata->gdl;
|
s3 = rwdata->gdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rodata->xlugdl != NULL) {
|
if (rodata->xlugdl != NULL) {
|
||||||
s5 = (void *)((uintptr_t)rodata->colours + ((u32)rodata->xlugdl & 0xffffff));
|
s5 = (void *)((uintptr_t)rodata->colours + ((u32)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
}
|
}
|
||||||
|
|
||||||
vertices = rwdata->vertices;
|
vertices = rwdata->vertices;
|
||||||
@@ -15000,10 +15000,10 @@ bool func0f0849dc(struct model *model, struct modelnode *nodearg, struct coord *
|
|||||||
struct modelrodata_gundl *rodata = &node->rodata->gundl;
|
struct modelrodata_gundl *rodata = &node->rodata->gundl;
|
||||||
|
|
||||||
if (rodata->opagdl != NULL) {
|
if (rodata->opagdl != NULL) {
|
||||||
s3 = (Gfx *)((uintptr_t)rodata->baseaddr + ((u32)rodata->opagdl & 0xffffff));
|
s3 = (Gfx *)((uintptr_t)rodata->baseaddr + ((u32)UNSEGADDR(rodata->opagdl) & 0xffffff));
|
||||||
|
|
||||||
if (rodata->xlugdl != NULL) {
|
if (rodata->xlugdl != NULL) {
|
||||||
s5 = (Gfx *)((uintptr_t)rodata->baseaddr + ((u32)rodata->xlugdl & 0xffffff));
|
s5 = (Gfx *)((uintptr_t)rodata->baseaddr + ((u32)UNSEGADDR(rodata->xlugdl) & 0xffffff));
|
||||||
}
|
}
|
||||||
|
|
||||||
vertices = (void *)(uintptr_t)rodata->baseaddr;
|
vertices = (void *)(uintptr_t)rodata->baseaddr;
|
||||||
|
|||||||
+2
-2
@@ -980,7 +980,7 @@ s32 texLoadFromGdl(Gfx *arg0, s32 gdlsizeinbytes, Gfx *arg2, struct texpool *poo
|
|||||||
if (spe0) {
|
if (spe0) {
|
||||||
start = s5->bytes[GFX_W0_BYTE(1)] & 0xf;
|
start = s5->bytes[GFX_W0_BYTE(1)] & 0xf;
|
||||||
count = s5->vtx.unk08 + 1;
|
count = s5->vtx.unk08 + 1;
|
||||||
vtx = (Vtx *)(s5->dma.addr & 0x00ffffff);
|
vtx = (Vtx *)(UNSEGADDR(s5->dma.addr) & 0x00ffffff);
|
||||||
|
|
||||||
for (i = start; i < start + count; i++) {
|
for (i = start; i < start + count; i++) {
|
||||||
if (animated && sp90[i]) {
|
if (animated && sp90[i]) {
|
||||||
@@ -998,7 +998,7 @@ s32 texLoadFromGdl(Gfx *arg0, s32 gdlsizeinbytes, Gfx *arg2, struct texpool *poo
|
|||||||
Vtx *vtx;
|
Vtx *vtx;
|
||||||
s32 i;
|
s32 i;
|
||||||
|
|
||||||
offset = s5->dma.addr & 0x00ffffff;
|
offset = UNSEGADDR(s5->dma.addr) & 0x00ffffff;
|
||||||
vtx = (Vtx *) (arg4 + offset);
|
vtx = (Vtx *) (arg4 + offset);
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
|
|||||||
Reference in new issue
Block a user