From f2ea11c65bfe23b00d59382f9bade0de8fc80cbc Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 20 Apr 2024 18:59:23 -0700 Subject: [PATCH] J3DCluster work --- include/JSystem/J3DGraphAnimator/J3DModel.h | 8 +- .../JSystem/J3DGraphAnimator/J3DSkinDeform.h | 4 +- src/JSystem/J3DGraphAnimator/J3DCluster.cpp | 144 +++++++++++++----- 3 files changed, 112 insertions(+), 44 deletions(-) diff --git a/include/JSystem/J3DGraphAnimator/J3DModel.h b/include/JSystem/J3DGraphAnimator/J3DModel.h index b5973e3d2..f298312f6 100644 --- a/include/JSystem/J3DGraphAnimator/J3DModel.h +++ b/include/JSystem/J3DGraphAnimator/J3DModel.h @@ -117,6 +117,10 @@ public: void setScaleFlag(int idx, u8 param_1) { mpScaleFlagArr[idx] = param_1; } u8 getEnvScaleFlag(int idx) const { return mpEvlpScaleFlagArr[idx]; } J3DVertexBuffer* getVertexBuffer() { return (J3DVertexBuffer*)&mVertexBuffer; } + void* getCurrentVtxPos() { return mVertexBuffer.getCurrentVtxPos(); } + void setCurrentVtxPos(void* v) { mVertexBuffer.setCurrentVtxPos(v); } + void* getCurrentVtxNrm() { return mVertexBuffer.getCurrentVtxNrm(); } + void setCurrentVtxNrm(void* v) { mVertexBuffer.setCurrentVtxNrm(v); } J3DMatPacket* getMatPacket(u16 idx) { return &mpMatPacket[idx]; } J3DMatPacket* getMatPacketArray() { return mpMatPacket; } J3DShapePacket* getShapePacket(u16 idx) { return &mpShapePacket[idx]; } @@ -132,10 +136,6 @@ public: void setVisibilityManager(J3DVisibilityManager* manager) { mpVisibilityManager = manager; } // TODO - void getCurrentVtxNrm() {} - void setCurrentVtxNrm(void*) {} - void getCurrentVtxPos() {} - void setCurrentVtxPos(void*) {} void setModelData(J3DModelData*) {} void setNrmMtx(int, Mtx) {} diff --git a/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h b/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h index 8dddbede3..6e6d8083e 100644 --- a/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h +++ b/include/JSystem/J3DGraphAnimator/J3DSkinDeform.h @@ -70,8 +70,8 @@ public: static u16 sWorkArea_MtxReg[1024 + 4 /* padding */]; private: - /* 0x04 */ u16* mPosData; - /* 0x08 */ u16* mNrmData; + /* 0x04 */ u16* mPosUseMtx; + /* 0x08 */ u16* mNrmUseMtx; /* 0x0C */ Mtx33* mNrmMtx; /* 0x10 */ u32 mFlags; /* 0x14 */ u8 field_0x14; diff --git a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp index 8e08aa279..2b29a61c8 100644 --- a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp @@ -78,30 +78,30 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) { u16 keyStart = 0; for (u16 i = 0; i < idx; i++) - keyStart += mDeformData->getClusterPointer(idx)->mKeyNum + 1; + keyStart += mDeformData->getClusterPointer(i)->mKeyNum + 1; J3DClusterKey* key = mDeformData->getClusterKeyPointer(keyStart); normalizeWeight(keyNum, weightList); - Vec* vtxPosArr = (Vec*)vtx->getVtxPosArrayPointer(0); - Vec* vtxPosDeform = (Vec*)mDeformData->getVtxPos(); + f32* vtxPosArr = (f32*)vtx->getVtxPosArrayPointer(0); + f32* vtxPosDeform = (f32*)mDeformData->getVtxPos(); for (s32 i = 0; i < posNum; i++) { - Vec* vtx = &vtxPosArr[cluster->mPosDstIdx[i]]; - vtx->x = 0.0f; - vtx->y = 0.0f; - vtx->z = 0.0f; + f32* vtx = &vtxPosArr[cluster->mPosDstIdx[i] * 3]; + vtx[0] = 0.0f; + vtx[1] = 0.0f; + vtx[2] = 0.0f; } f32 sign[2] = { 1.0f, -1.0f }; for (u16 i = 0; i < posNum; i++) { for (u16 j = 0; j < keyNum; j++) { u16 flag = key[j].mPosFlag[i]; - Vec* src = &vtxPosDeform[flag & 0x1FFF]; - Vec* dst = &vtxPosArr[cluster->mPosDstIdx[i]]; - dst->x += src->x * sign[flag >> 15] * weightList[j]; - dst->y += src->y * sign[flag >> 14] * weightList[j]; - dst->z += src->z * sign[flag >> 13] * weightList[j]; + f32* src = &vtxPosDeform[(flag & 0x1FFF) * 3]; + f32* dst = &vtxPosArr[cluster->mPosDstIdx[i] * 3]; + dst[0] += src[0] * sign[flag >> 15] * weightList[j]; + dst[1] += src[1] * sign[flag >> 14] * weightList[j]; + dst[2] += src[2] * sign[flag >> 13] * weightList[j]; } } @@ -184,9 +184,9 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) { f32 weight = (angle - cluster->mMinAngle) / (cluster->mMaxAngle - cluster->mMinAngle); f32 inv = 1.0f - weight; - vtxNrmArr[dstIdx * 3 + 0] = pos[0] * inv + src[0] * weight; - vtxNrmArr[dstIdx * 3 + 1] = pos[1] * inv + src[1] * weight; - vtxNrmArr[dstIdx * 3 + 2] = pos[2] * inv + src[2] * weight; + vtxNrmArr[dstIdx * 3 + 0] = inv * pos[0] + weight * src[0]; + vtxNrmArr[dstIdx * 3 + 1] = inv * pos[1] + weight * src[1]; + vtxNrmArr[dstIdx * 3 + 2] = inv * pos[2] + weight * src[2]; } } } @@ -214,8 +214,8 @@ void J3DDeformer::normalizeWeight(int count, f32* weight) { /* 802F40C0-802F40F0 .text __ct__13J3DSkinDeformFv */ J3DSkinDeform::J3DSkinDeform() { - mPosData = NULL; - mNrmData = NULL; + mPosUseMtx = NULL; + mNrmUseMtx = NULL; mNrmMtx = NULL; mFlags = 3; field_0x14 = 1; @@ -225,25 +225,25 @@ J3DSkinDeform::J3DSkinDeform() { int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { /* Nonmatching - regalloc */ - if (mPosData != NULL && mNrmData != NULL) + if (mPosUseMtx != NULL && mNrmUseMtx != NULL) return J3DErrType_Success; - mPosData = new u16[modelData->getVtxNum()]; - if (mPosData == NULL) + mPosUseMtx = new u16[modelData->getVtxNum()]; + if (mPosUseMtx == NULL) return J3DErrType_OutOfMemory; for (u32 i = 0; i < modelData->getVtxNum(); i++) - mPosData[i] = 0xFFFF; + mPosUseMtx[i] = 0xFFFF; if (modelData->getNrmNum() != 0) { - mNrmData = new u16[modelData->getNrmNum()]; - if (mNrmData == NULL) + mNrmUseMtx = new u16[modelData->getNrmNum()]; + if (mNrmUseMtx == NULL) return J3DErrType_OutOfMemory; for (u32 i = 0; i < modelData->getNrmNum(); i++) - mNrmData[i] = 0; + mNrmUseMtx[i] = 0; } else { - mNrmData = NULL; + mNrmUseMtx = NULL; } mNrmMtx = new(0x20) Mtx33[modelData->getDrawMtxNum()]; @@ -253,9 +253,9 @@ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { for (u16 i = 0; i < modelData->getShapeNum(); i++) { int size[4] = { 0, 1, 1, 2 }; + int pnmtxIdxOffs = -1; int posOffs = -1; int nrmOffs = -1; - int pnmtxIdxOffs = -1; int vtxSize = 0; for (GXVtxDescList* desc = modelData->getShapeNodePointer(i)->getVtxDesc(); desc->attr != GX_VA_NULL; desc++) { switch (desc->attr) { @@ -297,24 +297,25 @@ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { u16 useMtxIdxBuf[10]; for (s32 k = 0; k < vtxCount; k++) { - u8* vtx = &dl[vtxSize * k + 3]; - u8 pnmtxIdx = (u32)vtx[pnmtxIdxOffs] / 3; + u8* vtx = &dl[3 + vtxSize * k]; + u8 pnmtxIdx = (u32)*(u8*)&vtx[pnmtxIdxOffs] / 3; u16 posIdx = *(u16*)&vtx[posOffs]; u16 nrmIdx = *(u16*)&vtx[nrmOffs]; u16 useMtxIdx = shapeMtx->getUseMtxIndex(pnmtxIdx); if (useMtxIdx == 0xFFFF) { useMtxIdx = useMtxIdxBuf[pnmtxIdx]; - } else if (pnmtxIdx != -1) { + } else if (pnmtxIdxOffs != -1) { useMtxIdxBuf[pnmtxIdx] = useMtxIdx; } - mPosData[posIdx] = useMtxIdx; + mPosUseMtx[posIdx] = useMtxIdx; if (nrmOffs != -1) - mNrmData[nrmIdx] = useMtxIdx; + mNrmUseMtx[nrmIdx] = useMtxIdx; } - dl += vtxSize * vtxCount + 3; + dl += vtxSize * vtxCount; + dl += 3; } if (nrmOffs == -1) { @@ -325,9 +326,9 @@ int J3DSkinDeform::initMtxIndexArray(J3DModelData* modelData) { } for (u32 i = 0; i < modelData->getVtxNum(); i++) { - if (mPosData[i] == 0xFFFF) { + if (mPosUseMtx[i] == 0xFFFF) { field_0x14 = 0; - mPosData[i] = 0; + mPosUseMtx[i] = 0; } } @@ -427,23 +428,90 @@ void J3DSkinDeform::calcNrmMtx(J3DModel* model) { } /* 802F4850-802F4974 .text deformVtxPos_F32__13J3DSkinDeformCFP8J3DModel */ -void J3DSkinDeform::deformVtxPos_F32(J3DModel*) const { +void J3DSkinDeform::deformVtxPos_F32(J3DModel* model) const { /* Nonmatching */ + Mtx* mtxArr[2] = { + model->mpNodeMtx, + model->mpWeightEnvMtx, + }; + model->getVertexBuffer()->swapTransformedVtxPos(); + + s32 vtxNum = model->getModelData()->getVtxNum(); + Vec* curVtxPos = (Vec*)model->getCurrentVtxPos(); + Vec* transformedVtxPos = (Vec*)model->getVertexBuffer()->getTransformedVtxPos(0); + + for (s32 i = 0; i < vtxNum; i++) { + u16 useMtx = mPosUseMtx[i]; + MtxP mtx = mtxArr[model->getModelData()->getDrawMtxFlag(useMtx)][model->getModelData()->getDrawMtxIndex(useMtx)]; + J3DPSMulMtxVec(mtx, &curVtxPos[i], &transformedVtxPos[i]); + } + + DCStoreRange(model->getVertexBuffer()->getTransformedVtxPos(0), model->getModelData()->getVtxNum() * sizeof(Vec)); + model->setCurrentVtxPos(transformedVtxPos); } /* 802F4974-802F4AB4 .text deformVtxPos_S16__13J3DSkinDeformCFP8J3DModel */ -void J3DSkinDeform::deformVtxPos_S16(J3DModel*) const { +void J3DSkinDeform::deformVtxPos_S16(J3DModel* model) const { /* Nonmatching */ + Mtx* mtxArr[2] = { + model->mpNodeMtx, + model->mpWeightEnvMtx, + }; + + J3DGQRSetup7(model->getModelData()->getVertexData().getVtxPosFrac(), 7, model->getModelData()->getVertexData().getVtxPosFrac(), 7); + model->getVertexBuffer()->swapTransformedVtxPos(); + + s32 vtxNum = model->getModelData()->getVtxNum(); + SVec* curVtxPos = (SVec*)model->getCurrentVtxPos(); + SVec* transformedVtxPos = (SVec*)model->getVertexBuffer()->getTransformedVtxPos(0); + + for (s32 i = 0; i < vtxNum; i++) { + u16 useMtx = mPosUseMtx[i]; + MtxP mtx = mtxArr[model->getModelData()->getDrawMtxFlag(useMtx)][model->getModelData()->getDrawMtxIndex(useMtx)]; + J3DPSMulMtxVec(mtx, &curVtxPos[i], &transformedVtxPos[i]); + } + + DCStoreRange(model->getVertexBuffer()->getTransformedVtxPos(0), model->getModelData()->getVtxNum() * sizeof(SVec)); + model->setCurrentVtxPos(transformedVtxPos); } /* 802F4AB4-802F4BB8 .text deformVtxNrm_F32__13J3DSkinDeformCFP8J3DModel */ -void J3DSkinDeform::deformVtxNrm_F32(J3DModel*) const { +void J3DSkinDeform::deformVtxNrm_F32(J3DModel* model) const { /* Nonmatching */ + model->getVertexBuffer()->swapTransformedVtxNrm(); + + s32 vtxNum = model->getModelData()->getNrmNum(); + Vec* curVtxNrm = (Vec*)model->getCurrentVtxNrm(); + Vec* transformedVtxNrm = (Vec*)model->getVertexBuffer()->getTransformedVtxNrm(0); + + for (s32 i = 0; i < vtxNum; i++) { + u16 useMtx = mNrmUseMtx[i]; + Mtx3P mtx = mNrmMtx[useMtx]; + J3DPSMulMtxVec(mtx, &curVtxNrm[i], &transformedVtxNrm[i]); + } + + DCStoreRange(model->getVertexBuffer()->getTransformedVtxNrm(0), model->getModelData()->getNrmNum() * sizeof(Vec)); + model->setCurrentVtxNrm(transformedVtxNrm); } /* 802F4BB8-802F4CD8 .text deformVtxNrm_S16__13J3DSkinDeformCFP8J3DModel */ -void J3DSkinDeform::deformVtxNrm_S16(J3DModel*) const { +void J3DSkinDeform::deformVtxNrm_S16(J3DModel* model) const { /* Nonmatching */ + model->getVertexBuffer()->swapTransformedVtxNrm(); + + J3DGQRSetup7(model->getModelData()->getVertexData().getVtxNrmFrac(), 7, model->getModelData()->getVertexData().getVtxNrmFrac(), 7); + s32 vtxNum = model->getModelData()->getNrmNum(); + SVec* curVtxNrm = (SVec*)model->getCurrentVtxNrm(); + SVec* transformedVtxNrm = (SVec*)model->getVertexBuffer()->getTransformedVtxNrm(0); + + for (s32 i = 0; i < vtxNum; i++) { + u16 useMtx = mNrmUseMtx[i]; + Mtx3P mtx = mNrmMtx[useMtx]; + J3DPSMulMtxVec(mtx, &curVtxNrm[i], &transformedVtxNrm[i]); + } + + DCStoreRange(model->getVertexBuffer()->getTransformedVtxNrm(0), model->getModelData()->getNrmNum() * sizeof(SVec)); + model->setCurrentVtxNrm(transformedVtxNrm); } /* 802F4CD8-802F4D78 .text deform__13J3DSkinDeformFP8J3DModel */