Added Bone Info Functions

* Added functions to get info on bones
* Fixed ColorKey() flipping images if color is not -1
This commit is contained in:
n00b87
2026-01-27 23:56:30 -06:00
parent a2c4eba1e2
commit 61e55f72f6
9 changed files with 514 additions and 291 deletions

View File

@@ -2,6 +2,7 @@
#define RC_BASE_ACTOR_H_INCLUDED
#include "ProjectiveTextures.h"
#include "rc_matrix.h"
void setSolidProperties(int actor)
{
@@ -1504,6 +1505,196 @@ Uint32 rc_getLightSpecularColor(int actor)
}
int GetActorBoneCount( int actor )
{
if(actor < 0 || actor >= rc_actor.size())
return 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
return node->getJointCount();
}
break;
}
return 0;
}
irr::u32 GetActorBoneIndex( int actor, std::string bone_name )
{
if(actor < 0 || actor >= rc_actor.size())
return 0;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_name.c_str());
if(bone)
{
return bone->getBoneIndex();
}
}
break;
}
return -1;
}
std::string GetActorBoneName( int actor, irr::u32 bone_index )
{
if(actor < 0 || actor >= rc_actor.size())
return "";
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_index);
if(bone)
{
return (std::string)bone->getBoneName() + "\0";
}
}
break;
}
return "";
}
bool GetActorBonePosition( int actor, int bone_index, double* x, double* y, double* z )
{
if(actor < 0 || actor >= rc_actor.size())
return false;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_index);
if(bone)
{
*x = (double)bone->getPosition().X;
*y = (double)bone->getPosition().Y;
*z = (double)bone->getPosition().Z;
return true;
}
}
break;
}
return false;
}
bool GetActorBoneRotation( int actor, int bone_index, double* x, double* y, double* z )
{
if(actor < 0 || actor >= rc_actor.size())
return false;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_index);
if(bone)
{
*x = (double)bone->getRotation().X;
*y = (double)bone->getRotation().Y;
*z = (double)bone->getRotation().Z;
return true;
}
}
break;
}
return false;
}
bool GetActorBoneScale( int actor, int bone_index, double* x, double* y, double* z )
{
if(actor < 0 || actor >= rc_actor.size())
return false;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_index);
if(bone)
{
*x = (double)bone->getScale().X;
*y = (double)bone->getScale().Y;
*z = (double)bone->getScale().Z;
return true;
}
}
break;
}
return false;
}
bool GetActorBoneRelativeTranform( int actor, int bone_index, int t_matrix )
{
if(actor < 0 || actor >= rc_actor.size())
return false;
if(!rc_matrixExists(t_matrix))
return false;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_index);
if(bone)
{
rc_convertFromIrrMatrix(bone->getRelativeTransformation(), t_matrix);
return true;
}
}
break;
}
return false;
}
bool GetActorBoneAbsoluteTranform( int actor, int bone_index, int t_matrix )
{
if(actor < 0 || actor >= rc_actor.size())
return false;
if(!rc_matrixExists(t_matrix))
return false;
switch(rc_actor[actor].node_type)
{
case RC_NODE_TYPE_MESH:
{
irr::scene::IAnimatedMeshSceneNode* node = (irr::scene::IAnimatedMeshSceneNode*)rc_actor[actor].mesh_node;
irr::scene::IBoneSceneNode* bone = node->getJointNode(bone_index);
if(bone)
{
rc_convertFromIrrMatrix(bone->getAbsoluteTransformation(), t_matrix);
return true;
}
}
break;
}
return false;
}
//set actor animation speed