Implement SetNodeTransform
This commit is contained in:
@@ -172,6 +172,27 @@ void AnimatedModel::GetNodeTransformation(const StringView& nodeName, Matrix& no
|
|||||||
GetNodeTransformation(SkinnedModel ? SkinnedModel->FindNode(nodeName) : -1, nodeTransformation, worldSpace);
|
GetNodeTransformation(SkinnedModel ? SkinnedModel->FindNode(nodeName) : -1, nodeTransformation, worldSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AnimatedModel::SetNodeTransformation(int32 nodeIndex, const Matrix& nodeTransformation, bool worldSpace)
|
||||||
|
{
|
||||||
|
if (GraphInstance.NodesPose.IsEmpty())
|
||||||
|
const_cast<AnimatedModel*>(this)->PreInitSkinningData(); // Ensure to have valid nodes pose to return
|
||||||
|
CHECK(nodeIndex >= 0 && nodeIndex < GraphInstance.NodesPose.Count());
|
||||||
|
GraphInstance.NodesPose[nodeIndex] = nodeTransformation;
|
||||||
|
if (worldSpace)
|
||||||
|
{
|
||||||
|
Matrix world;
|
||||||
|
_transform.GetWorld(world);
|
||||||
|
Matrix invWorld;
|
||||||
|
Matrix::Invert(world, invWorld);
|
||||||
|
GraphInstance.NodesPose[nodeIndex] = GraphInstance.NodesPose[nodeIndex] * invWorld;
|
||||||
|
}
|
||||||
|
OnAnimationUpdated();
|
||||||
|
}
|
||||||
|
void AnimatedModel::SetNodeTransformation(const StringView& nodeName, const Matrix& nodeTransformation, bool worldSpace)
|
||||||
|
{
|
||||||
|
SetNodeTransformation(SkinnedModel ? SkinnedModel->FindNode(nodeName) : -1, nodeTransformation, worldSpace);
|
||||||
|
}
|
||||||
|
|
||||||
int32 AnimatedModel::FindClosestNode(const Vector3& location, bool worldSpace) const
|
int32 AnimatedModel::FindClosestNode(const Vector3& location, bool worldSpace) const
|
||||||
{
|
{
|
||||||
if (GraphInstance.NodesPose.IsEmpty())
|
if (GraphInstance.NodesPose.IsEmpty())
|
||||||
|
|||||||
@@ -229,6 +229,22 @@ public:
|
|||||||
/// <param name="worldSpace">True if convert matrices into world-space, otherwise returned values will be in local-space of the actor.</param>
|
/// <param name="worldSpace">True if convert matrices into world-space, otherwise returned values will be in local-space of the actor.</param>
|
||||||
API_FUNCTION() void GetNodeTransformation(const StringView& nodeName, API_PARAM(Out) Matrix& nodeTransformation, bool worldSpace = false) const;
|
API_FUNCTION() void GetNodeTransformation(const StringView& nodeName, API_PARAM(Out) Matrix& nodeTransformation, bool worldSpace = false) const;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the node final transformation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="nodeIndex">The index of the skinned model skeleton node.</param>
|
||||||
|
/// <param name="nodeTransformation">The final node transformation matrix.</param>
|
||||||
|
/// <param name="worldSpace">True if convert matrices from world-space, otherwise values will be in local-space of the actor.</param>
|
||||||
|
API_FUNCTION() void SetNodeTransformation(int32 nodeIndex, const Matrix& nodeTransformation, bool worldSpace = false);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the node final transformation.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="nodeName">The name of the skinned model skeleton node.</param>
|
||||||
|
/// <param name="nodeTransformation">The final node transformation matrix.</param>
|
||||||
|
/// <param name="worldSpace">True if convert matrices from world-space, otherwise values will be in local-space of the actor.</param>
|
||||||
|
API_FUNCTION() void SetNodeTransformation(const StringView& nodeName, const Matrix& nodeTransformation, bool worldSpace = false);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds the closest node to a given location.
|
/// Finds the closest node to a given location.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user