Try to improve stability in editor

The more I made changes, the more it crashed. Got it to a point where
it doesn't crash when starting the editor, but it will crash when
exciting.
This commit is contained in:
rodolpheh 2023-11-08 22:47:41 +00:00
parent 15ff0fff2e
commit 8b932e3a3c
9 changed files with 43 additions and 40 deletions

View file

@ -24,7 +24,8 @@ func _ready():
func _physics_process(_delta): func _physics_process(_delta):
if Time.get_unix_time_from_system() - latest_update > 0.5: if Time.get_unix_time_from_system() - latest_update > 0.5:
var frame : UltraleapFrame = tracking.get_last_frame() var frame : UltraleapFrame = tracking.get_last_frame()
$Footer/TrackingFramerate.text = "Tracking Frame Rate: " + str(ceil(frame.framerate)) if frame != null:
$Footer/TrackingFramerate.text = "Tracking Frame Rate: " + str(ceil(frame.framerate))
latest_update = Time.get_unix_time_from_system() latest_update = Time.get_unix_time_from_system()

View file

@ -150,6 +150,7 @@ void UltraleapDevice::open() {
void UltraleapDevice::close() { void UltraleapDevice::close() {
LeapCloseDevice(device); LeapCloseDevice(device);
LeapDestroyClockRebaser(rebaser);
} }
void UltraleapDevice::on_frame_received(const LEAP_TRACKING_EVENT* frame) { void UltraleapDevice::on_frame_received(const LEAP_TRACKING_EVENT* frame) {

View file

@ -192,8 +192,10 @@ void UltraleapDeviceNode::set_tracker(NodePath value) {
void UltraleapDeviceNode::_notification(int p_what) { void UltraleapDeviceNode::_notification(int p_what) {
if (p_what == Node::NOTIFICATION_READY) { if (p_what == Node::NOTIFICATION_READY) {
UltraleapHandTracking* tracking = Object::cast_to<UltraleapHandTracking>(get_node_or_null(tracker)); Node *tracking_node = get_node_or_null(tracker);
if (tracking != NULL) { if (tracking_node != NULL) {
UltraleapHandTracking* tracking = Object::cast_to<UltraleapHandTracking>(tracking_node);
// Connect to tracking signals // Connect to tracking signals
tracking->connect("device_added", Callable((Object*)this, "device_added")); tracking->connect("device_added", Callable((Object*)this, "device_added"));
tracking->connect("device_removed", Callable((Object*)this, "device_removed")); tracking->connect("device_removed", Callable((Object*)this, "device_removed"));

View file

@ -89,11 +89,11 @@ void UltraleapFrame::fill_frame_data(Ref<UltraleapFrame> ul_frame, const LEAP_TR
for (size_t i = 0; i < frame->nHands; i++) for (size_t i = 0; i < frame->nHands; i++)
{ {
if (frame->pHands[i].type == eLeapHandType_Left) { if (frame->pHands[i].type == eLeapHandType_Left) {
UltraleapHand::fill_hand_data(ul_frame->left_hand, &frame->pHands[i]); UltraleapHand::fill_hand_data(ul_frame->left_hand_ref, &frame->pHands[i]);
ul_frame->is_left_hand_visible = true; ul_frame->is_left_hand_visible = true;
} }
else { else {
UltraleapHand::fill_hand_data(ul_frame->right_hand, &frame->pHands[i]); UltraleapHand::fill_hand_data(ul_frame->right_hand_ref, &frame->pHands[i]);
ul_frame->is_right_hand_visible = true; ul_frame->is_right_hand_visible = true;
} }
} }

View file

@ -21,9 +21,6 @@ class UltraleapFrame : public Resource {
public: public:
uint32_t id; uint32_t id;
UltraleapHand* left_hand = memnew(UltraleapHand);
UltraleapHand* right_hand = memnew(UltraleapHand);
bool is_left_hand_visible = false; bool is_left_hand_visible = false;
bool is_right_hand_visible = false; bool is_right_hand_visible = false;
@ -49,8 +46,8 @@ protected:
static void _bind_methods(); static void _bind_methods();
private: private:
Ref<UltraleapHand> left_hand_ref = Ref<UltraleapHand>(left_hand); Ref<UltraleapHand> left_hand_ref = Ref<UltraleapHand>(memnew(UltraleapHand));
Ref<UltraleapHand> right_hand_ref = Ref<UltraleapHand>(right_hand); Ref<UltraleapHand> right_hand_ref = Ref<UltraleapHand>(memnew(UltraleapHand));
}; };
#endif #endif

View file

@ -223,7 +223,7 @@ void UltraleapHand::_bind_methods() {
); );
}; };
void UltraleapHand::fill_hand_data(UltraleapHand* ul_hand, LEAP_HAND* hand) { void UltraleapHand::fill_hand_data(Ref<UltraleapHand> ul_hand, LEAP_HAND* hand) {
ul_hand->type = hand->type == eLeapHandType_Left ? UltraleapTypes::Chirality::Left : UltraleapTypes::Chirality::Right; ul_hand->type = hand->type == eLeapHandType_Left ? UltraleapTypes::Chirality::Left : UltraleapTypes::Chirality::Right;
ul_hand->confidence = hand->confidence; ul_hand->confidence = hand->confidence;
ul_hand->visible_time = hand->visible_time; ul_hand->visible_time = hand->visible_time;

View file

@ -95,7 +95,7 @@ public:
} }
void set_digits(Array digits) { digits_array = digits; } void set_digits(Array digits) { digits_array = digits; }
static void fill_hand_data(UltraleapHand* ul_hand, LEAP_HAND* hand); static void fill_hand_data(Ref<UltraleapHand> ul_hand, LEAP_HAND* hand);
protected: protected:
static void _bind_methods(); static void _bind_methods();

View file

@ -25,10 +25,26 @@
using namespace godot; using namespace godot;
UltraleapHandTracking::UltraleapHandTracking() {
UtilityFunctions::print("Initializing UltraleapHandTracking");
#if ANDROID_ENABLED
// Get and store the binder
if (Engine::get_singleton()->has_singleton("UltraleapBinder")) {
binder = Engine::get_singleton()->get_singleton("UltraleapBinder");
}
#endif
// For now we will also start automatically if we're in the editor, so that we can have data for tool scripts
if (autostart || Engine::get_singleton()->is_editor_hint()) {
start();
}
}
UltraleapHandTracking::~UltraleapHandTracking() { UltraleapHandTracking::~UltraleapHandTracking() {
UtilityFunctions::print("Destroying UltraleapHandTracking"); UtilityFunctions::print("Destroying UltraleapHandTracking");
if (is_running) { if (is_running || messageLoop.joinable()) {
UtilityFunctions::print("Stopping the tracking thread"); UtilityFunctions::print("Stopping the tracking thread");
keep_running = false; keep_running = false;
messageLoop.join(); messageLoop.join();
@ -39,6 +55,8 @@ UltraleapHandTracking::~UltraleapHandTracking() {
#if ANDROID_ENABLED #if ANDROID_ENABLED
binder = NULL; binder = NULL;
#endif #endif
UtilityFunctions::print("UltraleapHandTracking destroyed");
} }
void UltraleapHandTracking::dispose_ultraleap() { void UltraleapHandTracking::dispose_ultraleap() {
@ -61,6 +79,8 @@ void UltraleapHandTracking::dispose_ultraleap() {
} }
} }
#endif #endif
UtilityFunctions::print("Ultraleap was disposed of");
} }
void UltraleapHandTracking::_bind_methods() { void UltraleapHandTracking::_bind_methods() {
@ -77,7 +97,7 @@ void UltraleapHandTracking::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_connected"), &UltraleapHandTracking::is_connected); ClassDB::bind_method(D_METHOD("is_connected"), &UltraleapHandTracking::is_connected);
ClassDB::bind_method(D_METHOD("is_started"), &UltraleapHandTracking::is_started); ClassDB::bind_method(D_METHOD("is_started"), &UltraleapHandTracking::is_started);
ClassDB::bind_method(D_METHOD("set_last_frame", "last_frame"), &UltraleapHandTracking::set_last_frame); //ClassDB::bind_method(D_METHOD("set_last_frame", "last_frame"), &UltraleapHandTracking::set_last_frame);
ClassDB::bind_method(D_METHOD("get_last_frame"), &UltraleapHandTracking::get_last_frame); ClassDB::bind_method(D_METHOD("get_last_frame"), &UltraleapHandTracking::get_last_frame);
ClassDB::bind_method(D_METHOD("set_tracking_mode", "tracking_mode"), &UltraleapHandTracking::set_tracking_mode, DEFVAL(0)); ClassDB::bind_method(D_METHOD("set_tracking_mode", "tracking_mode"), &UltraleapHandTracking::set_tracking_mode, DEFVAL(0));
@ -118,7 +138,7 @@ void UltraleapHandTracking::_bind_methods() {
"UltraleapFrame", "UltraleapFrame",
PROPERTY_USAGE_READ_ONLY | PROPERTY_USAGE_EDITOR PROPERTY_USAGE_READ_ONLY | PROPERTY_USAGE_EDITOR
), ),
"set_last_frame", "",
"get_last_frame" "get_last_frame"
); );
@ -387,7 +407,6 @@ void UltraleapHandTracking::serviceMessageLoop() {
LEAP_CONNECTION_MESSAGE msg; LEAP_CONNECTION_MESSAGE msg;
eLeapRS result; eLeapRS result;
keep_running = true;
is_running = true; is_running = true;
while (keep_running) { while (keep_running) {
@ -774,19 +793,6 @@ void UltraleapHandTracking::_notification(int p_what) {
events.pop(); events.pop();
} }
} }
else if (p_what == Node::NOTIFICATION_READY) {
#if ANDROID_ENABLED
// Get and store the binder
if (Engine::get_singleton()->has_singleton("UltraleapBinder")) {
binder = Engine::get_singleton()->get_singleton("UltraleapBinder");
}
#endif
// For now we will also start automatically if we're in the editor, so that we can have data for tool scripts
if (autostart || Engine::get_singleton()->is_editor_hint()) {
start();
}
}
} }
String UltraleapHandTracking::generate_connection_payload() { String UltraleapHandTracking::generate_connection_payload() {
@ -805,7 +811,6 @@ void UltraleapHandTracking::set_primary_device(Ref<UltraleapDevice> device) {
} }
// Pretty hack-ish, we open the device and re-store the handle in the UltraleapDevice object // Pretty hack-ish, we open the device and re-store the handle in the UltraleapDevice object
LeapOpenDevice(device->device_ref, &(device->device)); LeapOpenDevice(device->device_ref, &(device->device));
LeapCreateClockRebaser(&(device->rebaser));
primary_device = device; primary_device = device;

View file

@ -27,6 +27,7 @@ class UltraleapHandTracking : public Node3D {
GDCLASS(UltraleapHandTracking, Node3D); GDCLASS(UltraleapHandTracking, Node3D);
public: public:
UltraleapHandTracking();
~UltraleapHandTracking(); ~UltraleapHandTracking();
void start(); void start();
@ -39,11 +40,11 @@ public:
bool get_interpolate(); bool get_interpolate();
void set_interpolate(bool value); void set_interpolate(bool value);
UltraleapDeviceList* devices = memnew(UltraleapDeviceList); Ref<UltraleapDeviceList> devices = Ref<UltraleapDeviceList>(memnew(UltraleapDeviceList));
Ref<UltraleapFrame> last_frame_ref = Ref<UltraleapFrame>(memnew(UltraleapFrame)); Ref<UltraleapFrame> last_frame_ref;
Ref<UltraleapImage> left_image_ref = Ref<UltraleapImage>(memnew(UltraleapImage)); Ref<UltraleapImage> left_image_ref;
Ref<UltraleapImage> right_image_ref = Ref<UltraleapImage>(memnew(UltraleapImage)); Ref<UltraleapImage> right_image_ref;
String service_ip = String("127.0.0.1"); String service_ip = String("127.0.0.1");
uint32_t service_port = 12345; uint32_t service_port = 12345;
@ -100,13 +101,10 @@ protected:
static void _bind_methods(); static void _bind_methods();
private: private:
bool _isRunning = false; std::atomic_bool is_running = ATOMIC_VAR_INIT(false);
std::atomic_bool keep_running = ATOMIC_VAR_INIT(true);
std::atomic<bool> is_running = false;
std::atomic<bool> keep_running = false;
LEAP_CONNECTION connectionHandle = NULL; LEAP_CONNECTION connectionHandle = NULL;
LEAP_CLOCK_REBASER clockSynchronizer;
std::thread messageLoop; std::thread messageLoop;
@ -115,7 +113,6 @@ private:
bool connected = false; /* We have confirmed connection */ bool connected = false; /* We have confirmed connection */
Ref<UltraleapDevice> primary_device = NULL; Ref<UltraleapDevice> primary_device = NULL;
typedef struct { typedef struct {
StringName signal; StringName signal;
Variant arg; Variant arg;