2
0
Эх сурвалжийг харах

Merge pull request #989 from Azaezel/alpha41/nodeNosiness

get node utility methods by request
Brian Roberts 2 жил өмнө
parent
commit
4db9d241bf

+ 69 - 0
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;
+}

+ 6 - 0
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);