diff --git a/include/JSystem/J3DGraphBase/J3DShape.h b/include/JSystem/J3DGraphBase/J3DShape.h index 390c1d86e..2140e8c2b 100644 --- a/include/JSystem/J3DGraphBase/J3DShape.h +++ b/include/JSystem/J3DGraphBase/J3DShape.h @@ -118,8 +118,8 @@ public: u32 getPipeline() const { return (mFlags >> 2) & 0x07; } u32 getTexMtxLoadType() const { return mFlags & 0xF000; } u32 getMtxGroupNum() const { return mMtxGroupNum; } - J3DShapeDraw* getShapeDraw(u32 idx) const { return mShapeDraw[idx]; } - J3DShapeMtx* getShapeMtx(u32 idx) const { return mShapeMtx[idx]; } + J3DShapeDraw* getShapeDraw(u16 idx) const { return mShapeDraw[idx]; } + J3DShapeMtx* getShapeMtx(u16 idx) const { return mShapeMtx[idx]; } Vec* getMin() { return &mMin; } Vec* getMax() { return &mMax; } diff --git a/include/JSystem/J3DGraphBase/J3DShapeMtx.h b/include/JSystem/J3DGraphBase/J3DShapeMtx.h index d0cf7341d..b3a21b692 100644 --- a/include/JSystem/J3DGraphBase/J3DShapeMtx.h +++ b/include/JSystem/J3DGraphBase/J3DShapeMtx.h @@ -41,7 +41,7 @@ public: virtual ~J3DShapeMtx() {} virtual u32 getType() const { return 'SMTX'; } virtual u32 getUseMtxNum() const { return 1; } - virtual u32 getUseMtxIndex(u16) const { return mUseMtxIndex; } + virtual u16 getUseMtxIndex(u16) const { return mUseMtxIndex; } virtual void load() const; virtual void calcNBTScale(Vec const&, f32 (*)[3][3], f32 (*)[3][3]); @@ -84,7 +84,7 @@ public: virtual ~J3DShapeMtxMultiImm() {} virtual u32 getType() const { return 'SMMI'; } virtual u32 getUseMtxNum() const { return mUseMtxNum; } - virtual u32 getUseMtxIndex(u16 i) const { return mUseMtxIndexTable[i]; } + virtual u16 getUseMtxIndex(u16 i) const { return mUseMtxIndexTable[i]; } virtual void load() const; virtual void loadNrmMtx(int, u16) const; @@ -157,7 +157,7 @@ public: virtual ~J3DShapeMtxMulti() {} virtual u32 getType() const { return 'SMML'; } virtual u32 getUseMtxNum() const { return mUseMtxNum; } - virtual u32 getUseMtxIndex(u16 i) const { return mUseMtxIndexTable[i]; } + virtual u16 getUseMtxIndex(u16 i) const { return mUseMtxIndexTable[i]; } virtual void load() const; virtual void calcNBTScale(Vec const&, Mtx33*, Mtx33*); @@ -175,7 +175,7 @@ public: virtual ~J3DShapeMtxMultiConcatView() {} virtual u32 getType() const { return 'SMMI'; } virtual u32 getUseMtxNum() const { return mUseMtxNum; } - virtual u32 getUseMtxIndex(u16 i) const { return mUseMtxIndexTable[i]; } + virtual u16 getUseMtxIndex(u16 i) const { return mUseMtxIndexTable[i]; } virtual void load() const; virtual void loadNrmMtx(int, u16) const {} virtual void loadNrmMtx(int, u16, f32 (*)[4]) const; diff --git a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp index 968bab68f..bb8415c84 100644 --- a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp @@ -222,7 +222,7 @@ J3DSkinDeform::J3DSkinDeform() { /* 802F40F0-802F44E8 .text initMtxIndexArray__13J3DSkinDeformFP12J3DModelData */ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { - /* Nonmatching */ + /* Nonmatching - regalloc */ if (mPosData != NULL && mNrmData != NULL) return J3DErrType_Success; @@ -255,20 +255,20 @@ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { int posOffs = -1; int nrmOffs = -1; int pnmtxIdxOffs = -1; - int curOffs = 0; + int vtxSize = 0; for (GXVtxDescList* desc = modelData->getShapeNodePointer(i)->getVtxDesc(); desc->attr != GX_VA_NULL; desc++) { switch (desc->attr) { case GX_VA_PNMTXIDX: - pnmtxIdxOffs = curOffs; + pnmtxIdxOffs = vtxSize; break; case GX_VA_POS: - posOffs = curOffs; + posOffs = vtxSize; if (desc->type != GX_INDEX16) { OSReport(" Invlid Data : CPU Pipeline process GX_INDEX16 Data Only\n"); } break; case GX_VA_NRM: - nrmOffs = curOffs; + nrmOffs = vtxSize; if (desc->type != GX_INDEX16) { OSReport(" Invlid Data : CPU Pipeline process GX_INDEX16 Data Only\n"); } @@ -280,29 +280,28 @@ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { break; } - curOffs += size[desc->type]; + vtxSize += size[desc->type]; } - for (u32 j = 0; j < modelData->getShapeNodePointer(i)->getMtxGroupNum(); j++) { + for (u16 j = 0; j < modelData->getShapeNodePointer(i)->getMtxGroupNum(); j++) { J3DShapeMtx* shapeMtx = modelData->getShapeNodePointer(i)->getShapeMtx(j); - J3DShapeDraw* shapeDraw = modelData->getShapeNodePointer(i)->getShapeDraw(j); - u8* displayListStart = shapeDraw->getDisplayList(); - for (u8* dl = displayListStart; (dl - displayListStart) < shapeDraw->getDisplayListSize(); ) { + u8* displayListStart = modelData->getShapeNodePointer(i)->getShapeDraw(j)->getDisplayList(); + for (u8* dl = displayListStart; (dl - displayListStart) < modelData->getShapeNodePointer(i)->getShapeDraw(j)->getDisplayListSize(); ) { u8 cmd = dl[0]; if (cmd != GX_TRIANGLEFAN && cmd != GX_TRIANGLESTRIP) break; - u16 vtxCount = *(u16*)(&dl[1]); + u16 vtxCount = *(u16*)&dl[1]; - u32 useMtxIdxBuf[10]; - for (int k = 0; k < vtxCount; vtxCount++) { - int vtxOffs = k * curOffs + 3; - int pnmtxIdx = dl[vtxOffs + pnmtxIdx] / 3; - int posIdx = dl[vtxOffs + posIdx]; - int nrmIdx = dl[vtxOffs + nrmIdx]; + u16 useMtxIdxBuf[10]; + for (s32 k = 0; k < vtxCount; k++) { + u8* vtx = &dl[vtxSize * k + 3]; + u8 pnmtxIdx = (u32)vtx[pnmtxIdxOffs] / 3; + u16 posIdx = *(u16*)&vtx[posOffs]; + u16 nrmIdx = *(u16*)&vtx[nrmOffs]; - u32 useMtxIdx = shapeMtx->getUseMtxIndex(pnmtxIdx); + u16 useMtxIdx = shapeMtx->getUseMtxIndex(pnmtxIdx); if (useMtxIdx == 0xFFFF) { useMtxIdx = useMtxIdxBuf[pnmtxIdx]; } else if (pnmtxIdx != -1) { @@ -314,7 +313,7 @@ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { mNrmData[nrmIdx] = useMtxIdx; } - dl += vtxCount * curOffs + 3; + dl += vtxSize * vtxCount + 3; } if (nrmOffs == -1) {