summaryrefslogtreecommitdiff
path: root/src/JSystem/J3DGraphBase/J3DShapeDraw.cpp
diff options
context:
space:
mode:
authorLagoLunatic <LagoLunatic@users.noreply.github.com>2025-12-02 18:38:12 -0500
committerGitHub <noreply@github.com>2025-12-02 15:38:12 -0800
commitcabc7039696f73e8216b629b79b3363f2e91865c (patch)
treeaefa0c25771a13e6bbc6ec631f6612db58b54515 /src/JSystem/J3DGraphBase/J3DShapeDraw.cpp
parent9a69fa38c720fb118bbaa4862dda3b313e360764 (diff)
J3DShapeDraw and J3DSkinDeform OK (#2908)
Diffstat (limited to 'src/JSystem/J3DGraphBase/J3DShapeDraw.cpp')
-rw-r--r--src/JSystem/J3DGraphBase/J3DShapeDraw.cpp42
1 files changed, 22 insertions, 20 deletions
diff --git a/src/JSystem/J3DGraphBase/J3DShapeDraw.cpp b/src/JSystem/J3DGraphBase/J3DShapeDraw.cpp
index fcfec6e2a4..dc00a46f9a 100644
--- a/src/JSystem/J3DGraphBase/J3DShapeDraw.cpp
+++ b/src/JSystem/J3DGraphBase/J3DShapeDraw.cpp
@@ -8,55 +8,57 @@
u32 J3DShapeDraw::countVertex(u32 stride) {
u32 count = 0;
- uintptr_t dlStart = (uintptr_t)getDisplayList();
+ u8* dlStart = (u8*)getDisplayList();
- for (u8* dl = (u8*)dlStart; ((uintptr_t)dl - dlStart) < getDisplayListSize();) {
- if (*dl != GX_TRIANGLEFAN && *dl != GX_TRIANGLESTRIP)
+ for (u8* dl = dlStart; (dl - dlStart) < getDisplayListSize();) {
+ u8 cmd = *(u8*)dl;
+ dl++;
+ if (cmd != GX_TRIANGLEFAN && cmd != GX_TRIANGLESTRIP)
break;
- u16 vtxNum = *((u16*)(dl + 1));
+ int vtxNum = *((u16*)(dl));
+ dl += 2;
count += vtxNum;
- dl += stride * vtxNum;
- dl += 3;
+ dl = (u8*)dl + stride * vtxNum;
}
return count;
}
-// NONMATCHING regalloc
void J3DShapeDraw::addTexMtxIndexInDL(u32 stride, u32 attrOffs, u32 valueBase) {
u32 byteNum = countVertex(stride);
- u32 newSize = ALIGN_NEXT(mDisplayListSize + byteNum, 0x20);
+ u32 oldSize = mDisplayListSize;
+ u32 newSize = ALIGN_NEXT(oldSize + byteNum, 0x20);
u8* newDLStart = new (0x20) u8[newSize];
- u8* oldDLStart = getDisplayList();
+ u8* oldDLStart = (u8*)mDisplayList;
u8* oldDL = oldDLStart;
u8* newDL = newDLStart;
for (; (oldDL - oldDLStart) < mDisplayListSize;) {
// Copy command
- u8 h = *oldDL;
- *newDL++ = h;
+ u8 cmd = *(u8*)oldDL;
+ oldDL++;
+ *newDL++ = cmd;
- if (h != GX_TRIANGLEFAN && h != GX_TRIANGLESTRIP)
+ if (cmd != GX_TRIANGLEFAN && cmd != GX_TRIANGLESTRIP)
break;
// Copy count
- // regalloc (I suspect there's a way to shove this in a u16 temp without an mr)
- s32 vtxNum = *((u16*)(oldDL + 1));
- *((u16*)newDL) = vtxNum;
+ int vtxNum = *(u16*)oldDL;
+ oldDL += 2;
+ *(u16*)newDL = vtxNum;
newDL += 2;
- for (s32 i = 0; i < vtxNum; i++) {
- u8* oldDLVtx = &oldDL[stride * i + 3];
+ for (int i = 0; i < vtxNum; i++) {
+ u8* oldDLVtx = &oldDL[stride * i];
u8 pnmtxidx = *oldDLVtx;
- memcpy(newDL, oldDLVtx, attrOffs);
+ memcpy(newDL, oldDLVtx, (int)attrOffs);
newDL += attrOffs;
*newDL++ = valueBase + pnmtxidx;
memcpy(newDL, oldDLVtx + attrOffs, stride - attrOffs);
newDL += (stride - attrOffs);
}
- oldDL += stride * vtxNum;
- oldDL += 3;
+ oldDL = (u8*)oldDL + stride * vtxNum;
}
u32 realSize = ALIGN_NEXT((uintptr_t)newDL - (uintptr_t)newDLStart, 0x20);