godot-ultraleap-plugin/src/hand.cpp

272 lines
8.6 KiB
C++

#include "hand.h"
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/classes/global_constants.hpp>
#include <godot_cpp/classes/ref.hpp>
#include <godot_cpp/classes/node3d.hpp>
#include <godot_cpp/variant/utility_functions.hpp>
using namespace godot;
void UltraleapHand::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_type", "type"), &UltraleapHand::set_type, DEFVAL(UltraleapTypes::Chirality::Left));
ClassDB::bind_method(D_METHOD("get_type"), &UltraleapHand::get_type);
ClassDB::bind_method(D_METHOD("set_confidence", "confidence"), &UltraleapHand::set_confidence);
ClassDB::bind_method(D_METHOD("get_confidence"), &UltraleapHand::get_confidence);
ClassDB::bind_method(D_METHOD("set_visible_time", "visible_time"), &UltraleapHand::set_visible_time);
ClassDB::bind_method(D_METHOD("get_visible_time"), &UltraleapHand::get_visible_time);
ClassDB::bind_method(D_METHOD("set_pinch_distance", "pinch_distance"), &UltraleapHand::set_pinch_distance);
ClassDB::bind_method(D_METHOD("get_pinch_distance"), &UltraleapHand::get_pinch_distance);
ClassDB::bind_method(D_METHOD("set_pinch_strength", "pinch_strength"), &UltraleapHand::set_pinch_strength);
ClassDB::bind_method(D_METHOD("get_pinch_strength"), &UltraleapHand::get_pinch_strength);
ClassDB::bind_method(D_METHOD("set_grab_strength", "grab_strength"), &UltraleapHand::set_grab_strength);
ClassDB::bind_method(D_METHOD("get_grab_strength"), &UltraleapHand::get_grab_strength);
ClassDB::bind_method(D_METHOD("set_grab_angle", "grab_angle"), &UltraleapHand::set_grab_angle);
ClassDB::bind_method(D_METHOD("get_grab_angle"), &UltraleapHand::get_grab_angle);
ClassDB::bind_method(D_METHOD("set_thumb", "thumb"), &UltraleapHand::set_thumb);
ClassDB::bind_method(D_METHOD("get_thumb"), &UltraleapHand::get_thumb);
ClassDB::bind_method(D_METHOD("set_index", "index"), &UltraleapHand::set_index);
ClassDB::bind_method(D_METHOD("get_index"), &UltraleapHand::get_index);
ClassDB::bind_method(D_METHOD("set_middle", "middle"), &UltraleapHand::set_middle);
ClassDB::bind_method(D_METHOD("get_middle"), &UltraleapHand::get_middle);
ClassDB::bind_method(D_METHOD("set_ring", "ring"), &UltraleapHand::set_ring);
ClassDB::bind_method(D_METHOD("get_ring"), &UltraleapHand::get_ring);
ClassDB::bind_method(D_METHOD("set_pinky", "pinky"), &UltraleapHand::set_pinky);
ClassDB::bind_method(D_METHOD("get_pinky"), &UltraleapHand::get_pinky);
ClassDB::bind_method(D_METHOD("set_arm", "arm"), &UltraleapHand::set_arm);
ClassDB::bind_method(D_METHOD("get_arm"), &UltraleapHand::get_arm);
ClassDB::bind_method(D_METHOD("set_palm", "palm"), &UltraleapHand::set_palm);
ClassDB::bind_method(D_METHOD("get_palm"), &UltraleapHand::get_palm);
ClassDB::bind_method(D_METHOD("get_digits"), &UltraleapHand::get_digits);
ClassDB::bind_method(D_METHOD("set_wrist", "wrist"), &UltraleapHand::set_wrist);
ClassDB::bind_method(D_METHOD("get_wrist"), &UltraleapHand::get_wrist);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::INT,
"type"
),
"set_type",
"get_type"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::FLOAT,
"confidence"
),
"set_confidence",
"get_confidence"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::FLOAT,
"visible_time"
),
"set_visible_time",
"get_visible_time"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::FLOAT,
"pinch_distance"
),
"set_pinch_distance",
"get_pinch_distance"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::FLOAT,
"pinch_strength"
),
"set_pinch_strength",
"get_pinch_strength"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::FLOAT,
"grab_strength"
),
"set_grab_strength",
"get_grab_strength"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::FLOAT,
"grab_angle"
),
"set_grab_angle",
"get_grab_angle"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"thumb",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapDigit"
),
"set_thumb",
"get_thumb"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"index",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapDigit"
),
"set_index",
"get_index"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"middle",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapDigit"
),
"set_middle",
"get_middle"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"ring",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapDigit"
),
"set_ring",
"get_ring"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"pinky",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapDigit",
PROPERTY_USAGE_DEFAULT,
"UltraleapDigit"
),
"set_pinky",
"get_pinky"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"arm",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapBone"
),
"set_arm",
"get_arm"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::OBJECT,
"palm",
PROPERTY_HINT_RESOURCE_TYPE,
"UltraleapPalm"
),
"set_palm",
"get_palm"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::ARRAY,
"digits",
PROPERTY_HINT_ARRAY_TYPE,
"UltraleapDigit",
PROPERTY_USAGE_READ_ONLY | PROPERTY_USAGE_EDITOR
),
"",
"get_digits"
);
ClassDB::add_property(
"UltraleapHand",
PropertyInfo(
Variant::TRANSFORM3D,
"wrist"
),
"set_wrist",
"get_wrist"
);
};
void UltraleapHand::fill_hand_data(Ref<UltraleapHand> ul_hand, LEAP_HAND* hand) {
// For now we just check if the arm ref is not set
if (ul_hand->arm_ref == NULL) {
ul_hand->arm_ref = Ref<UltraleapBone>(memnew(UltraleapBone));
ul_hand->palm_ref = Ref<UltraleapPalm>(memnew(UltraleapPalm));
ul_hand->set_thumb(Ref<UltraleapDigit>(memnew(UltraleapDigit)));
ul_hand->set_index(Ref<UltraleapDigit>(memnew(UltraleapDigit)));
ul_hand->set_middle(Ref<UltraleapDigit>(memnew(UltraleapDigit)));
ul_hand->set_ring(Ref<UltraleapDigit>(memnew(UltraleapDigit)));
ul_hand->set_pinky(Ref<UltraleapDigit>(memnew(UltraleapDigit)));
}
ul_hand->type = hand->type == eLeapHandType_Left ? UltraleapTypes::Chirality::Left : UltraleapTypes::Chirality::Right;
ul_hand->confidence = hand->confidence;
ul_hand->visible_time = hand->visible_time;
ul_hand->pinch_distance = hand->pinch_distance;
ul_hand->pinch_strength = hand->pinch_strength;
ul_hand->grab_angle = hand->grab_angle;
ul_hand->grab_strength = hand->grab_strength;
UltraleapPalm::fill_palm_data(ul_hand->palm_ref, &hand->palm);
UltraleapDigit::fill_digit_data(ul_hand->get_thumb(), &hand->thumb, UltraleapDigit::FingerType::Thumb, &hand->palm);
UltraleapDigit::fill_digit_data(ul_hand->get_index(), &hand->index, UltraleapDigit::FingerType::Index, &hand->palm);
UltraleapDigit::fill_digit_data(ul_hand->get_middle(), &hand->middle, UltraleapDigit::FingerType::Middle, &hand->palm);
UltraleapDigit::fill_digit_data(ul_hand->get_ring(), &hand->ring, UltraleapDigit::FingerType::Ring, &hand->palm);
UltraleapDigit::fill_digit_data(ul_hand->get_pinky(), &hand->pinky, UltraleapDigit::FingerType::Pinky, &hand->palm);
UltraleapBone::fill_bone_data(ul_hand->arm_ref, &hand->arm, UltraleapBone::BoneType::Arm, NULL, &hand->palm);
ul_hand->wrist = Transform3D(Basis(ul_hand->palm_ref->orientation), ul_hand->arm_ref->next_joint);
}