diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2024-10-10 07:29:58 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-10 08:29:58 -0600 |
| commit | 12eb254d769d84743b5cc6cd5424057c57eaf0ad (patch) | |
| tree | 4509be332b2ccfc6fe939f47740d68f7746eca3e /src/JSystem/J3DGraphAnimator/J3DJointTree.cpp | |
| parent | 2fd702c0ac170a789af879b8b92a82d4dcc9080c (diff) | |
switch to dtk setup (#2203)
* switch to dtk setup
* some cleanup / fixes
* cleanup d_a_alink literals
* Restore doxygen, update CI & README.md (#1)
* Fix build image ref (#2)
---------
Co-authored-by: Luke Street <luke@street.dev>
Diffstat (limited to 'src/JSystem/J3DGraphAnimator/J3DJointTree.cpp')
| -rw-r--r-- | src/JSystem/J3DGraphAnimator/J3DJointTree.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/JSystem/J3DGraphAnimator/J3DJointTree.cpp b/src/JSystem/J3DGraphAnimator/J3DJointTree.cpp new file mode 100644 index 0000000000..7a1368a74f --- /dev/null +++ b/src/JSystem/J3DGraphAnimator/J3DJointTree.cpp @@ -0,0 +1,137 @@ +#include "JSystem/J3DGraphAnimator/J3DJointTree.h" +#include "JSystem/J3DGraphAnimator/J3DMaterialAttach.h" +#include "JSystem/J3DGraphAnimator/J3DShapeTable.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" + +/* 80325A18-80325A9C 320358 0084+00 0/0 1/1 0/0 .text __ct__12J3DJointTreeFv */ +J3DJointTree::J3DJointTree() + : mHierarchy(NULL), mFlags(0), mModelDataType(0), mRootNode(NULL), mBasicMtxCalc(NULL), + mJointNodePointer(NULL), mJointNum(0), mWEvlpMtxNum(0), mWEvlpMixMtxNum(0), mWEvlpMixIndex(0), + mWEvlpMixWeight(0), mInvJointMtx(NULL), mWEvlpImportantMtxIdx(0), field_0x40(0), + mJointName(NULL) {} + +/* 80325A9C-80325C00 3203DC 0164+00 1/0 2/2 0/0 .text + * makeHierarchy__12J3DJointTreeFP8J3DJointPPC17J3DModelHierarchyP16J3DMaterialTableP13J3DShapeTable + */ +void J3DJointTree::makeHierarchy(J3DJoint* pJoint, J3DModelHierarchy const** pHierarchy, + J3DMaterialTable* pMaterialTable, J3DShapeTable* pShapeTable) { + enum { + kTypeEnd = 0x00, + kTypeBeginChild = 0x01, + kTypeEndChild = 0x02, + kTypeJoint = 0x10, + kTypeMaterial = 0x11, + kTypeShape = 0x12, + }; + + J3DJoint * curJoint = pJoint; + + while (true) { + J3DJoint * newJoint = NULL; + J3DMaterial * newMaterial = NULL; + J3DShape * newShape = NULL; + const J3DModelHierarchy * inf = *pHierarchy; + u16 val; + + switch (inf->mType) { + case kTypeBeginChild: + *pHierarchy = inf + 1; + makeHierarchy(curJoint, pHierarchy, pMaterialTable, pShapeTable); + break; + case kTypeEndChild: + *pHierarchy = inf + 1; + return; + case kTypeEnd: + return; + case kTypeJoint: + { + J3DJoint ** jointNodePointer = mJointNodePointer; + *pHierarchy = inf + 1; + newJoint = jointNodePointer[inf->mValue]; + } + break; + case kTypeMaterial: + *pHierarchy = inf + 1; + val = inf->mValue; + newMaterial = pMaterialTable->getMaterialNodePointer(val); + break; + case kTypeShape: + *pHierarchy = inf + 1; + val = inf->mValue; + newShape = pShapeTable->getShapeNodePointer(val); + break; + } + + if (newJoint != NULL) { + curJoint = newJoint; + if (pJoint == NULL) + mRootNode = newJoint; + else + pJoint->appendChild(newJoint); + } else if (newMaterial != NULL) { + if (pJoint->getMesh() != NULL) + newMaterial->mNext = pJoint->getMesh(); + pJoint->mMesh = newMaterial; + newMaterial->mJoint = pJoint; + } else if (newShape != NULL) { + newMaterial = pJoint->getMesh(); + newMaterial->mShape = newShape; + newShape->mMaterial = newMaterial; + } + } +} + +/* 80325C00-80325CAC 320540 00AC+00 0/0 2/2 0/0 .text findImportantMtxIndex__12J3DJointTreeFv */ +void J3DJointTree::findImportantMtxIndex() { + const s32 wEvlpMtxNum = getWEvlpMtxNum(); + u32 tableIdx = 0; + const u16 drawFullWgtMtxNum = getDrawFullWgtMtxNum(); + const u16 * wEvlpMixIndex = getWEvlpMixIndex(); + const f32 * wEvlpMixWeight = getWEvlpMixWeight(); + u16 * wEvlpImportantMtxIdx = getWEvlpImportantMtxIndex(); + + // Rigid matrices are easy. + for (u16 i = 0; i < drawFullWgtMtxNum; i++) + wEvlpImportantMtxIdx[i] = mDrawMtxData.mDrawMtxIndex[i]; + + // For envelope matrices, we need to find the matrix with the most contribution. + for (s32 i = 0; i < wEvlpMtxNum; i++) { + s32 mixNum = getWEvlpMixMtxNum(i); + u16 bestIdx = 0; + f32 bestWeight = -0.1f; + + for (s32 j = 0; j < mixNum; j++) { + if (bestWeight < wEvlpMixWeight[tableIdx]) { + bestWeight = wEvlpMixWeight[tableIdx]; + bestIdx = wEvlpMixIndex[tableIdx]; + } + + tableIdx++; + } + + wEvlpImportantMtxIdx[i + mDrawMtxData.mDrawFullWgtMtxNum] = bestIdx; + } +} + +/* 80325CAC-80325D1C 3205EC 0070+00 1/0 0/0 0/0 .text + * calc__12J3DJointTreeFP12J3DMtxBufferRC3VecRA3_A4_Cf */ +void J3DJointTree::calc(J3DMtxBuffer* pMtxBuffer, Vec const& scale, f32 const (&mtx)[3][4]) { + getBasicMtxCalc()->init(scale, mtx); + J3DMtxCalc::setMtxBuffer(pMtxBuffer); + J3DJoint* root = getRootNode(); + + if (root == NULL) + return; + + root->setCurrentMtxCalc(getBasicMtxCalc()); + root->recursiveCalc(); +} + +/* 80325D1C-80325D24 32065C 0008+00 1/1 0/0 0/0 .text setMtxBuffer__10J3DMtxCalcFP12J3DMtxBuffer + */ +void J3DMtxCalc::setMtxBuffer(J3DMtxBuffer* mtxBuffer) { + J3DMtxCalc::mMtxBuffer = mtxBuffer; +} + +/* 80325D24-80325D88 320664 0064+00 1/0 0/0 0/0 .text __dt__12J3DJointTreeFv */ +J3DJointTree::~J3DJointTree() {}
\ No newline at end of file |
