From 7305b797f672df24577b80036d80c0b4ce89784b Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 20 Apr 2024 11:32:13 -0700 Subject: [PATCH] J3DCluster work --- include/JSystem/J3DGraphAnimator/J3DCluster.h | 29 ++++----- src/JSystem/J3DGraphAnimator/J3DCluster.cpp | 63 ++++++++++++++++--- .../J3DGraphLoader/J3DClusterLoader.cpp | 10 +-- 3 files changed, 73 insertions(+), 29 deletions(-) diff --git a/include/JSystem/J3DGraphAnimator/J3DCluster.h b/include/JSystem/J3DGraphAnimator/J3DCluster.h index e32a785a3..bc86b6641 100644 --- a/include/JSystem/J3DGraphAnimator/J3DCluster.h +++ b/include/JSystem/J3DGraphAnimator/J3DCluster.h @@ -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 */ diff --git a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp index 0f4de6496..968bab68f 100644 --- a/src/JSystem/J3DGraphAnimator/J3DCluster.cpp +++ b/src/JSystem/J3DGraphAnimator/J3DCluster.cpp @@ -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 */ diff --git a/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp b/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp index b12e06cf7..2ee19010c 100644 --- a/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp +++ b/src/JSystem/J3DGraphLoader/J3DClusterLoader.cpp @@ -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(block, cluster->mClusterKey); - cluster->field_0x18 = JSUConvertOffsetToPtr(block, cluster->field_0x18); + cluster->mPosDstIdx = JSUConvertOffsetToPtr(block, cluster->mPosDstIdx); J3DClusterVertex* clusterVertex = JSUConvertOffsetToPtr(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(block, clusterKey->field_0x4); - clusterKey->field_0x8 = JSUConvertOffsetToPtr(block, clusterKey->field_0x8); + clusterKey->mPosFlag = JSUConvertOffsetToPtr(block, clusterKey->mPosFlag); + clusterKey->mNrmFlag = JSUConvertOffsetToPtr(block, clusterKey->mNrmFlag); } for (int i = 0; i < mpDeformData->mClusterVertexNum; i++) { J3DClusterVertex* clusterVertex = &mpDeformData->mClusterVertex[i]; - clusterVertex->field_0x4 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x4); - clusterVertex->field_0x8 = JSUConvertOffsetToPtr(block, clusterVertex->field_0x8); + clusterVertex->mSrcIdx = JSUConvertOffsetToPtr(block, clusterVertex->mSrcIdx); + clusterVertex->mDstIdx = JSUConvertOffsetToPtr(block, clusterVertex->mDstIdx); } }