145 lines
5.2 KiB
C++
145 lines
5.2 KiB
C++
/**************************************************************************/
|
|
/* kinect_skeleton.cpp */
|
|
/**************************************************************************/
|
|
/* This file is part of: */
|
|
/* AETHEX ENGINE */
|
|
/* https://aethex.foundation */
|
|
/**************************************************************************/
|
|
/* Copyright (c) 2026-present AeThex Labs. */
|
|
/**************************************************************************/
|
|
|
|
#include "kinect_skeleton.h"
|
|
|
|
void KinectSkeleton::_bind_methods() {
|
|
// Joint access
|
|
ClassDB::bind_method(D_METHOD("set_joint", "joint_id", "position", "tracking_state"), &KinectSkeleton::set_joint);
|
|
ClassDB::bind_method(D_METHOD("get_joint_position", "joint_id"), &KinectSkeleton::get_joint_position);
|
|
ClassDB::bind_method(D_METHOD("get_joint_tracking_state", "joint_id"), &KinectSkeleton::get_joint_tracking_state);
|
|
ClassDB::bind_method(D_METHOD("is_joint_tracked", "joint_id"), &KinectSkeleton::is_joint_tracked);
|
|
|
|
// Bulk access
|
|
ClassDB::bind_method(D_METHOD("get_all_joints"), &KinectSkeleton::get_all_joints);
|
|
|
|
// Static helpers
|
|
ClassDB::bind_static_method("KinectSkeleton", D_METHOD("get_joint_name", "joint_id"), &KinectSkeleton::get_joint_name);
|
|
ClassDB::bind_static_method("KinectSkeleton", D_METHOD("get_bone_connections"), &KinectSkeleton::get_bone_connections);
|
|
|
|
// Joint ID constants
|
|
BIND_ENUM_CONSTANT(JOINT_HIP_CENTER);
|
|
BIND_ENUM_CONSTANT(JOINT_SPINE);
|
|
BIND_ENUM_CONSTANT(JOINT_SHOULDER_CENTER);
|
|
BIND_ENUM_CONSTANT(JOINT_HEAD);
|
|
BIND_ENUM_CONSTANT(JOINT_SHOULDER_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_ELBOW_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_WRIST_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_HAND_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_SHOULDER_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_ELBOW_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_WRIST_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_HAND_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_HIP_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_KNEE_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_ANKLE_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_FOOT_LEFT);
|
|
BIND_ENUM_CONSTANT(JOINT_HIP_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_KNEE_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_ANKLE_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_FOOT_RIGHT);
|
|
BIND_ENUM_CONSTANT(JOINT_COUNT);
|
|
|
|
// Tracking state constants
|
|
BIND_ENUM_CONSTANT(TRACKING_NOT_TRACKED);
|
|
BIND_ENUM_CONSTANT(TRACKING_INFERRED);
|
|
BIND_ENUM_CONSTANT(TRACKING_TRACKED);
|
|
}
|
|
|
|
void KinectSkeleton::set_joint(int p_joint_id, const Vector3 &p_position, int p_tracking_state) {
|
|
if (p_joint_id < 0 || p_joint_id >= JOINT_COUNT) {
|
|
return;
|
|
}
|
|
joints[p_joint_id].position = p_position;
|
|
joints[p_joint_id].tracking_state = p_tracking_state;
|
|
}
|
|
|
|
Vector3 KinectSkeleton::get_joint_position(int p_joint_id) const {
|
|
if (p_joint_id < 0 || p_joint_id >= JOINT_COUNT) {
|
|
return Vector3();
|
|
}
|
|
return joints[p_joint_id].position;
|
|
}
|
|
|
|
int KinectSkeleton::get_joint_tracking_state(int p_joint_id) const {
|
|
if (p_joint_id < 0 || p_joint_id >= JOINT_COUNT) {
|
|
return TRACKING_NOT_TRACKED;
|
|
}
|
|
return joints[p_joint_id].tracking_state;
|
|
}
|
|
|
|
bool KinectSkeleton::is_joint_tracked(int p_joint_id) const {
|
|
return get_joint_tracking_state(p_joint_id) >= TRACKING_INFERRED;
|
|
}
|
|
|
|
Dictionary KinectSkeleton::get_all_joints() const {
|
|
Dictionary result;
|
|
for (int i = 0; i < JOINT_COUNT; i++) {
|
|
Dictionary joint_data;
|
|
joint_data["position"] = joints[i].position;
|
|
joint_data["tracking_state"] = joints[i].tracking_state;
|
|
result[i] = joint_data;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
String KinectSkeleton::get_joint_name(int p_joint_id) {
|
|
static const char *names[JOINT_COUNT] = {
|
|
"HipCenter", "Spine", "ShoulderCenter", "Head",
|
|
"ShoulderLeft", "ElbowLeft", "WristLeft", "HandLeft",
|
|
"ShoulderRight", "ElbowRight", "WristRight", "HandRight",
|
|
"HipLeft", "KneeLeft", "AnkleLeft", "FootLeft",
|
|
"HipRight", "KneeRight", "AnkleRight", "FootRight"
|
|
};
|
|
|
|
if (p_joint_id < 0 || p_joint_id >= JOINT_COUNT) {
|
|
return "Unknown";
|
|
}
|
|
return names[p_joint_id];
|
|
}
|
|
|
|
PackedInt32Array KinectSkeleton::get_bone_connections() {
|
|
// Pairs of joint IDs that form bones
|
|
static const int connections[] = {
|
|
JOINT_HIP_CENTER, JOINT_SPINE,
|
|
JOINT_SPINE, JOINT_SHOULDER_CENTER,
|
|
JOINT_SHOULDER_CENTER, JOINT_HEAD,
|
|
JOINT_SHOULDER_CENTER, JOINT_SHOULDER_LEFT,
|
|
JOINT_SHOULDER_LEFT, JOINT_ELBOW_LEFT,
|
|
JOINT_ELBOW_LEFT, JOINT_WRIST_LEFT,
|
|
JOINT_WRIST_LEFT, JOINT_HAND_LEFT,
|
|
JOINT_SHOULDER_CENTER, JOINT_SHOULDER_RIGHT,
|
|
JOINT_SHOULDER_RIGHT, JOINT_ELBOW_RIGHT,
|
|
JOINT_ELBOW_RIGHT, JOINT_WRIST_RIGHT,
|
|
JOINT_WRIST_RIGHT, JOINT_HAND_RIGHT,
|
|
JOINT_HIP_CENTER, JOINT_HIP_LEFT,
|
|
JOINT_HIP_LEFT, JOINT_KNEE_LEFT,
|
|
JOINT_KNEE_LEFT, JOINT_ANKLE_LEFT,
|
|
JOINT_ANKLE_LEFT, JOINT_FOOT_LEFT,
|
|
JOINT_HIP_CENTER, JOINT_HIP_RIGHT,
|
|
JOINT_HIP_RIGHT, JOINT_KNEE_RIGHT,
|
|
JOINT_KNEE_RIGHT, JOINT_ANKLE_RIGHT,
|
|
JOINT_ANKLE_RIGHT, JOINT_FOOT_RIGHT,
|
|
};
|
|
|
|
PackedInt32Array result;
|
|
for (size_t i = 0; i < sizeof(connections) / sizeof(int); i++) {
|
|
result.push_back(connections[i]);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
KinectSkeleton::KinectSkeleton() {
|
|
// Initialize all joints to not tracked
|
|
for (int i = 0; i < JOINT_COUNT; i++) {
|
|
joints[i].position = Vector3();
|
|
joints[i].tracking_state = TRACKING_NOT_TRACKED;
|
|
}
|
|
}
|