J3DCluster work

This commit is contained in:
Jasper St. Pierre
2024-04-20 18:59:23 -07:00
parent 0e4b0837f3
commit f2ea11c65b
3 changed files with 112 additions and 44 deletions
+4 -4
View File
@@ -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) {}
@@ -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;
+106 -38
View File
@@ -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 */