diff options
| author | LagoLunatic <LagoLunatic@users.noreply.github.com> | 2025-12-02 18:38:12 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-02 15:38:12 -0800 |
| commit | cabc7039696f73e8216b629b79b3363f2e91865c (patch) | |
| tree | aefa0c25771a13e6bbc6ec631f6612db58b54515 /src/JSystem/J3DGraphBase/J3DShapeDraw.cpp | |
| parent | 9a69fa38c720fb118bbaa4862dda3b313e360764 (diff) | |
J3DShapeDraw and J3DSkinDeform OK (#2908)
Diffstat (limited to 'src/JSystem/J3DGraphBase/J3DShapeDraw.cpp')
| -rw-r--r-- | src/JSystem/J3DGraphBase/J3DShapeDraw.cpp | 42 |
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); |
