From 4a9f8e0709f9e99198b32b69dd7d49d7641fdc20 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Sun, 12 Mar 2023 15:19:44 -0500 Subject: [PATCH] get node utility methods by request courtessy Steve_Yorkshire, tim-mgt --- Engine/source/T3D/shapeBase.cpp | 69 +++++++++++++++++++++++++++++++++ Engine/source/T3D/shapeBase.h | 6 +++ 2 files changed, 75 insertions(+) diff --git a/Engine/source/T3D/shapeBase.cpp b/Engine/source/T3D/shapeBase.cpp index f23f38a91..4e02c74bc 100644 --- a/Engine/source/T3D/shapeBase.cpp +++ b/Engine/source/T3D/shapeBase.cpp @@ -2019,6 +2019,41 @@ Point3F ShapeBase::getAIRepairPoint() } //---------------------------------------------------------------------------- +void ShapeBase::getNodeTransform(const char* nodeName, MatrixF* outMat) +{ + S32 nodeIDx = mDataBlock->getShapeResource()->findNode(nodeName); + const MatrixF& xfm = isMounted() ? mMount.xfm : MatrixF::Identity; + + MatrixF nodeTransform(xfm); + const Point3F& scale = getScale(); + if (nodeIDx != -1) + { + nodeTransform = mShapeInstance->mNodeTransforms[nodeIDx]; + nodeTransform.mul(xfm); + } + // The position of the mount point needs to be scaled. + Point3F position = nodeTransform.getPosition(); + position.convolve(scale); + nodeTransform.setPosition(position); + // Also we would like the object to be scaled to the model. + outMat->mul(mObjToWorld, nodeTransform); + return; +} + +void ShapeBase::getNodeVector(const char* nodeName, VectorF* vec) +{ + MatrixF mat; + getNodeTransform(nodeName, &mat); + + mat.getColumn(1, vec); +} + +void ShapeBase::getNodePoint(const char* nodeName, Point3F* pos) +{ + MatrixF mat; + getNodeTransform(nodeName, &mat); + mat.getColumn(3, pos); +} void ShapeBase::getEyeTransform(MatrixF* mat) { @@ -5352,3 +5387,37 @@ void ShapeBase::setSelectionFlags(U8 flags) } } +DefineEngineMethod(ShapeBase, getNodeTransform, MatrixF, (const char* nodeName), , + "@brief Get the node/bone transform.\n\n" + + "@param node/bone name to query\n" + "@return the node position\n\n") +{ + MatrixF mat; + object->getNodeTransform(nodeName, &mat); + return mat; +} + +DefineEngineMethod(ShapeBase, getNodeVector, VectorF, (const char* nodeName), , + "@brief Get the node/bone vector.\n\n" + + "@param node/bone name to query\n" + "@return the node vector\n\n") +{ + VectorF vec(0, 1, 0); + object->getNodeVector(nodeName, &vec); + + return vec; +} + +DefineEngineMethod(ShapeBase, getNodePoint, Point3F, (const char* nodeName), , + "@brief Get the node/bone position.\n\n" + + "@param node/bone name to query\n" + "@return the node position\n\n") +{ + Point3F pos(0, 0, 0); + object->getNodePoint(nodeName, &pos); + + return pos; +} diff --git a/Engine/source/T3D/shapeBase.h b/Engine/source/T3D/shapeBase.h index 0d32739fe..576c23e7f 100644 --- a/Engine/source/T3D/shapeBase.h +++ b/Engine/source/T3D/shapeBase.h @@ -1627,6 +1627,12 @@ public: /// @name Object Transforms /// @{ + /// Returns a named node transform for a given shape + virtual void getNodeTransform(const char* nodeName, MatrixF* mat); + /// Returns a named node forwad vector for a given shape + virtual void getNodeVector(const char* nodeName, VectorF* vec); + /// Returns a named node position for a given shape + void getNodePoint(const char* nodeName, Point3F* pos); /// Returns the eye transform of this shape, IE the eyes of a player /// @param mat Eye transform (out) virtual void getEyeTransform(MatrixF* mat);