Merge pull request #989 from Azaezel/alpha41/nodeNosiness

get node utility methods by request
This commit is contained in:
Brian Roberts 2023-03-13 11:28:05 -05:00 committed by GitHub
commit 4db9d241bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 0 deletions

View file

@ -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;
}

View file

@ -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);