J3DCluster work

This commit is contained in:
Jasper St. Pierre
2024-04-20 11:32:13 -07:00
parent 5725698822
commit 7305b797f6
3 changed files with 73 additions and 29 deletions
+13 -16
View File
@@ -17,8 +17,8 @@ public:
mKeyNum = other.mKeyNum;
mPosNum = other.mPosNum;
mNrmNum = other.mNrmNum;
field_0x16 = other.field_0x16;
field_0x18 = other.field_0x18;
mClusterVertexNum = other.mClusterVertexNum;
mPosDstIdx = other.mPosDstIdx;
mClusterVertex = other.mClusterVertex;
mDeformer = other.mDeformer;
}
@@ -35,8 +35,8 @@ public:
/* 0x10 */ u16 mKeyNum;
/* 0x12 */ u16 mPosNum;
/* 0x14 */ u16 mNrmNum;
/* 0x16 */ u16 field_0x16;
/* 0x18 */ u16* field_0x18;
/* 0x16 */ u16 mClusterVertexNum;
/* 0x18 */ u16* mPosDstIdx;
/* 0x1C */ J3DClusterVertex* mClusterVertex;
/* 0x20 */ J3DDeformer* mDeformer;
}; // Size: 0x24
@@ -46,32 +46,29 @@ public:
void operator=(const J3DClusterKey& other) {
mPosNum = other.mPosNum;
mNrmNum = other.mNrmNum;
field_0x4 = other.field_0x4;
field_0x8 = other.field_0x8;
mPosFlag = other.mPosFlag;
mNrmFlag = other.mNrmFlag;
}
public:
/* 0x00 */ u16 mPosNum;
/* 0x02 */ u16 mNrmNum;
/* 0x04 */ u16* field_0x4;
/* 0x08 */ u16* field_0x8;
/* 0x04 */ u16* mPosFlag;
/* 0x08 */ u16* mNrmFlag;
}; // Size: 0x0C
class J3DClusterVertex {
public:
void operator=(const J3DClusterVertex& other) {
mNum = other.mNum;
field_0x4 = other.field_0x4;
field_0x8 = other.field_0x8;
mSrcIdx = other.mSrcIdx;
mDstIdx = other.mDstIdx;
}
private:
friend class J3DClusterLoader;
friend class J3DClusterLoader_v15;
public:
/* 0x00 */ u16 mNum;
/* 0x04 */ u16* field_0x4;
/* 0x08 */ u16* field_0x8;
/* 0x04 */ u16* mSrcIdx;
/* 0x08 */ u16* mDstIdx;
}; // Size: 0x0C
#endif /* J3DCLUSTER_H */
+55 -8
View File
@@ -86,7 +86,7 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
Vec* vtxPosDeform = (Vec*)mDeformData->getVtxPos();
for (s32 i = 0; i < posNum; i++) {
Vec* vtx = &vtxPosArr[cluster->field_0x18[i]];
Vec* vtx = &vtxPosArr[cluster->mPosDstIdx[i]];
vtx->x = 0.0f;
vtx->y = 0.0f;
vtx->z = 0.0f;
@@ -95,9 +95,9 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
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].field_0x4[i];
Vec* dst = &vtxPosDeform[flag & 0x1FFF];
Vec* src = &vtxPosArr[cluster->field_0x18[i]];
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];
@@ -115,7 +115,7 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
dst[2] = 0.0f;
for (u16 j = 0; j < cluster->mKeyNum; j++) {
u16 flag = key[j].field_0x8[i];
u16 flag = key[j].mNrmFlag[i];
f32* src = &vtxNrmDeform[(flag & 0x1FFF) * 3];
f32 srcX = src[0];
@@ -137,13 +137,60 @@ void J3DDeformer::deform(J3DVertexBuffer* vtx, u16 idx, f32* weightList) {
normalize(dst);
}
for (u16 i = 0; i < cluster->field_0x16; i++) {
for (u16 i = 0; i < cluster->mClusterVertexNum; i++) {
J3DClusterVertex* vertex = &cluster->mClusterVertex[i];
f32 pos[3];
pos[0] = 0.0f;
pos[1] = 0.0f;
pos[2] = 0.0f;
f32 weight = 1.0f / (float)vertex->mNum;
for (u16 j = 0; j < vertex->mNum; j++) {
f32* src = &field_0x0c[vertex->mSrcIdx[j] * 3];
pos[0] += src[0] * weight;
pos[1] += src[1] * weight;
pos[2] += src[2] * weight;
}
normalize(pos);
for (u16 j = 0; j < vertex->mNum; j++) {
u16 dstIdx = vertex->mDstIdx[j];
if (dstIdx == 0xFFFF)
continue;
f32* src = &field_0x0c[vertex->mSrcIdx[j] * 3];
f32 dot = pos[0]*src[0] + pos[1]*src[1] + pos[2]*src[2];
f32 angle;
if (dot >= 1.0f) {
angle = 0.0f;
} else if (dot > -1.0f) {
angle = acos(dot);
angle = (angle * 180.0f) / 3.1415f;
} else {
angle = 180.0f;
}
if (angle <= cluster->mMinAngle) {
vtxNrmArr[dstIdx * 3 + 0] = pos[0];
vtxNrmArr[dstIdx * 3 + 1] = pos[1];
vtxNrmArr[dstIdx * 3 + 2] = pos[2];
} else if (angle > cluster->mMaxAngle) {
vtxNrmArr[dstIdx * 3 + 0] = src[0];
vtxNrmArr[dstIdx * 3 + 1] = src[1];
vtxNrmArr[dstIdx * 3 + 2] = src[2];
} else {
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;
}
}
}
}
}
// TODO: the rest of the owl
}
/* 802F3FA8-802F4064 .text normalize__11J3DDeformerFPf */
@@ -92,7 +92,7 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) {
for (int i = 0; i < mpDeformData->getClusterNum(); i++) {
J3DCluster* cluster = &mpDeformData->mClusterPointer[i];
cluster->mClusterKey = JSUConvertOffsetToPtr<J3DClusterKey>(block, cluster->mClusterKey);
cluster->field_0x18 = JSUConvertOffsetToPtr<u16>(block, cluster->field_0x18);
cluster->mPosDstIdx = JSUConvertOffsetToPtr<u16>(block, cluster->mPosDstIdx);
J3DClusterVertex* clusterVertex = JSUConvertOffsetToPtr<J3DClusterVertex>(block, cluster->mClusterVertex);
u32 vertexIdx = (clusterVertex - blockClusterVertex) / sizeof(J3DClusterVertex);
cluster->mClusterVertex = &mpDeformData->mClusterVertex[vertexIdx];
@@ -109,13 +109,13 @@ void J3DClusterLoader_v15::readCluster(const J3DClusterBlock* block) {
for (int i = 0; i < mpDeformData->getClusterKeyNum(); i++) {
J3DClusterKey* clusterKey = &mpDeformData->mClusterKeyPointer[i];
clusterKey->field_0x4 = JSUConvertOffsetToPtr<u16>(block, clusterKey->field_0x4);
clusterKey->field_0x8 = JSUConvertOffsetToPtr<u16>(block, clusterKey->field_0x8);
clusterKey->mPosFlag = JSUConvertOffsetToPtr<u16>(block, clusterKey->mPosFlag);
clusterKey->mNrmFlag = JSUConvertOffsetToPtr<u16>(block, clusterKey->mNrmFlag);
}
for (int i = 0; i < mpDeformData->mClusterVertexNum; i++) {
J3DClusterVertex* clusterVertex = &mpDeformData->mClusterVertex[i];
clusterVertex->field_0x4 = JSUConvertOffsetToPtr<u16>(block, clusterVertex->field_0x4);
clusterVertex->field_0x8 = JSUConvertOffsetToPtr<u16>(block, clusterVertex->field_0x8);
clusterVertex->mSrcIdx = JSUConvertOffsetToPtr<u16>(block, clusterVertex->mSrcIdx);
clusterVertex->mDstIdx = JSUConvertOffsetToPtr<u16>(block, clusterVertex->mDstIdx);
}
}