Browse Source

Added ID to tracker signals and property for storing hand

Bastiaan Olij 8 years ago
parent
commit
de309c426d

+ 14 - 1
scene/3d/arvr_nodes.cpp

@@ -31,7 +31,6 @@
 #include "arvr_nodes.h"
 #include "arvr_nodes.h"
 #include "core/os/input.h"
 #include "core/os/input.h"
 #include "servers/arvr/arvr_interface.h"
 #include "servers/arvr/arvr_interface.h"
-#include "servers/arvr/arvr_positional_tracker.h"
 #include "servers/arvr_server.h"
 #include "servers/arvr_server.h"
 
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -142,6 +141,7 @@ void ARVRController::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_joystick_axis", "axis"), &ARVRController::get_joystick_axis);
 	ClassDB::bind_method(D_METHOD("get_joystick_axis", "axis"), &ARVRController::get_joystick_axis);
 
 
 	ClassDB::bind_method(D_METHOD("get_is_active"), &ARVRController::get_is_active);
 	ClassDB::bind_method(D_METHOD("get_is_active"), &ARVRController::get_is_active);
+	ClassDB::bind_method(D_METHOD("get_hand"), &ARVRController::get_hand);
 
 
 	ADD_SIGNAL(MethodInfo("button_pressed", PropertyInfo(Variant::INT, "button")));
 	ADD_SIGNAL(MethodInfo("button_pressed", PropertyInfo(Variant::INT, "button")));
 	ADD_SIGNAL(MethodInfo("button_release", PropertyInfo(Variant::INT, "button")));
 	ADD_SIGNAL(MethodInfo("button_release", PropertyInfo(Variant::INT, "button")));
@@ -204,6 +204,19 @@ bool ARVRController::get_is_active() const {
 	return is_active;
 	return is_active;
 };
 };
 
 
+ARVRPositionalTracker::TrackerHand ARVRController::get_hand() const {
+	// get our ARVRServer
+	ARVRServer *arvr_server = ARVRServer::get_singleton();
+	ERR_FAIL_NULL_V(arvr_server, ARVRPositionalTracker::TRACKER_HAND_UNKNOWN);
+
+	ARVRPositionalTracker *tracker = arvr_server->find_by_type_and_id(ARVRServer::TRACKER_CONTROLLER, controller_id);
+	if (tracker == NULL) {
+		return ARVRPositionalTracker::TRACKER_HAND_UNKNOWN;
+	};
+
+	return tracker->get_hand();
+};
+
 String ARVRController::get_configuration_warning() const {
 String ARVRController::get_configuration_warning() const {
 	if (!is_visible() || !is_inside_tree())
 	if (!is_visible() || !is_inside_tree())
 		return String();
 		return String();

+ 2 - 0
scene/3d/arvr_nodes.h

@@ -33,6 +33,7 @@
 
 
 #include "scene/3d/camera.h"
 #include "scene/3d/camera.h"
 #include "scene/3d/spatial.h"
 #include "scene/3d/spatial.h"
+#include "servers/arvr/arvr_positional_tracker.h"
 
 
 /**
 /**
 	@author Bastiaan Olij <[email protected]>
 	@author Bastiaan Olij <[email protected]>
@@ -84,6 +85,7 @@ public:
 	float get_joystick_axis(int p_axis) const;
 	float get_joystick_axis(int p_axis) const;
 
 
 	bool get_is_active() const;
 	bool get_is_active() const;
+	ARVRPositionalTracker::TrackerHand get_hand() const;
 
 
 	String get_configuration_warning() const;
 	String get_configuration_warning() const;
 
 

+ 14 - 0
servers/arvr/arvr_positional_tracker.cpp

@@ -31,6 +31,10 @@
 #include "core/os/input.h"
 #include "core/os/input.h"
 
 
 void ARVRPositionalTracker::_bind_methods() {
 void ARVRPositionalTracker::_bind_methods() {
+	BIND_ENUM_CONSTANT(TRACKER_HAND_UNKNOWN);
+	BIND_ENUM_CONSTANT(TRACKER_LEFT_HAND);
+	BIND_ENUM_CONSTANT(TRACKER_RIGHT_HAND);
+
 	// this class is read only from GDScript, so we only have access to getters..
 	// this class is read only from GDScript, so we only have access to getters..
 	ClassDB::bind_method(D_METHOD("get_type"), &ARVRPositionalTracker::get_type);
 	ClassDB::bind_method(D_METHOD("get_type"), &ARVRPositionalTracker::get_type);
 	ClassDB::bind_method(D_METHOD("get_name"), &ARVRPositionalTracker::get_name);
 	ClassDB::bind_method(D_METHOD("get_name"), &ARVRPositionalTracker::get_name);
@@ -39,6 +43,7 @@ void ARVRPositionalTracker::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_orientation"), &ARVRPositionalTracker::get_orientation);
 	ClassDB::bind_method(D_METHOD("get_orientation"), &ARVRPositionalTracker::get_orientation);
 	ClassDB::bind_method(D_METHOD("get_tracks_position"), &ARVRPositionalTracker::get_tracks_position);
 	ClassDB::bind_method(D_METHOD("get_tracks_position"), &ARVRPositionalTracker::get_tracks_position);
 	ClassDB::bind_method(D_METHOD("get_position"), &ARVRPositionalTracker::get_position);
 	ClassDB::bind_method(D_METHOD("get_position"), &ARVRPositionalTracker::get_position);
+	ClassDB::bind_method(D_METHOD("get_hand"), &ARVRPositionalTracker::get_hand);
 	ClassDB::bind_method(D_METHOD("get_transform", "adjust_by_reference_frame"), &ARVRPositionalTracker::get_transform);
 	ClassDB::bind_method(D_METHOD("get_transform", "adjust_by_reference_frame"), &ARVRPositionalTracker::get_transform);
 
 
 	// these functions we don't want to expose to normal users but do need to be callable from GDNative
 	// these functions we don't want to expose to normal users but do need to be callable from GDNative
@@ -141,6 +146,14 @@ Vector3 ARVRPositionalTracker::get_rw_position() const {
 	return rw_position;
 	return rw_position;
 };
 };
 
 
+ARVRPositionalTracker::TrackerHand ARVRPositionalTracker::get_hand() const {
+	return hand;
+};
+
+void ARVRPositionalTracker::set_hand(const ARVRPositionalTracker::TrackerHand p_hand) {
+	hand = p_hand;
+};
+
 Transform ARVRPositionalTracker::get_transform(bool p_adjust_by_reference_frame) const {
 Transform ARVRPositionalTracker::get_transform(bool p_adjust_by_reference_frame) const {
 	Transform new_transform;
 	Transform new_transform;
 
 
@@ -164,6 +177,7 @@ ARVRPositionalTracker::ARVRPositionalTracker() {
 	tracker_id = 0;
 	tracker_id = 0;
 	tracks_orientation = false;
 	tracks_orientation = false;
 	tracks_position = false;
 	tracks_position = false;
+	hand = TRACKER_HAND_UNKNOWN;
 };
 };
 
 
 ARVRPositionalTracker::~ARVRPositionalTracker(){
 ARVRPositionalTracker::~ARVRPositionalTracker(){

+ 12 - 0
servers/arvr/arvr_positional_tracker.h

@@ -48,6 +48,13 @@ class ARVRPositionalTracker : public Object {
 	GDCLASS(ARVRPositionalTracker, Object);
 	GDCLASS(ARVRPositionalTracker, Object);
 	_THREAD_SAFE_CLASS_
 	_THREAD_SAFE_CLASS_
 
 
+public:
+	enum TrackerHand {
+		TRACKER_HAND_UNKNOWN, /* unknown or not applicable */
+		TRACKER_LEFT_HAND, /* controller is the left hand controller */
+		TRACKER_RIGHT_HAND /* controller is the right hand controller */
+	};
+
 private:
 private:
 	ARVRServer::TrackerType type; // type of tracker
 	ARVRServer::TrackerType type; // type of tracker
 	StringName name; // (unique) name of the tracker
 	StringName name; // (unique) name of the tracker
@@ -57,6 +64,7 @@ private:
 	Basis orientation; // our orientation
 	Basis orientation; // our orientation
 	bool tracks_position; // do we track position?
 	bool tracks_position; // do we track position?
 	Vector3 rw_position; // our position "in the real world, so without world_scale applied"
 	Vector3 rw_position; // our position "in the real world, so without world_scale applied"
+	TrackerHand hand; // if known, the hand this tracker is held in
 
 
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
@@ -77,6 +85,8 @@ public:
 	Vector3 get_position() const; // get position with world_scale applied
 	Vector3 get_position() const; // get position with world_scale applied
 	void set_rw_position(const Vector3 &p_rw_position);
 	void set_rw_position(const Vector3 &p_rw_position);
 	Vector3 get_rw_position() const;
 	Vector3 get_rw_position() const;
+	ARVRPositionalTracker::TrackerHand get_hand() const;
+	void set_hand(const ARVRPositionalTracker::TrackerHand p_hand);
 
 
 	Transform get_transform(bool p_adjust_by_reference_frame) const;
 	Transform get_transform(bool p_adjust_by_reference_frame) const;
 
 
@@ -84,4 +94,6 @@ public:
 	~ARVRPositionalTracker();
 	~ARVRPositionalTracker();
 };
 };
 
 
+VARIANT_ENUM_CAST(ARVRPositionalTracker::TrackerHand);
+
 #endif
 #endif

+ 4 - 4
servers/arvr_server.cpp

@@ -68,8 +68,8 @@ void ARVRServer::_bind_methods() {
 	ADD_SIGNAL(MethodInfo("interface_added", PropertyInfo(Variant::STRING, "name")));
 	ADD_SIGNAL(MethodInfo("interface_added", PropertyInfo(Variant::STRING, "name")));
 	ADD_SIGNAL(MethodInfo("interface_removed", PropertyInfo(Variant::STRING, "name")));
 	ADD_SIGNAL(MethodInfo("interface_removed", PropertyInfo(Variant::STRING, "name")));
 
 
-	ADD_SIGNAL(MethodInfo("tracker_added", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::INT, "type")));
-	ADD_SIGNAL(MethodInfo("tracker_removed", PropertyInfo(Variant::STRING, "name")));
+	ADD_SIGNAL(MethodInfo("tracker_added", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::INT, "type"), PropertyInfo(Variant::INT, "id")));
+	ADD_SIGNAL(MethodInfo("tracker_removed", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::INT, "type"), PropertyInfo(Variant::INT, "id")));
 };
 };
 
 
 real_t ARVRServer::get_world_scale() const {
 real_t ARVRServer::get_world_scale() const {
@@ -232,7 +232,7 @@ void ARVRServer::add_tracker(ARVRPositionalTracker *p_tracker) {
 	ERR_FAIL_NULL(p_tracker);
 	ERR_FAIL_NULL(p_tracker);
 
 
 	trackers.push_back(p_tracker);
 	trackers.push_back(p_tracker);
-	emit_signal("tracker_added", p_tracker->get_name(), p_tracker->get_type());
+	emit_signal("tracker_added", p_tracker->get_name(), p_tracker->get_type(), p_tracker->get_tracker_id());
 };
 };
 
 
 void ARVRServer::remove_tracker(ARVRPositionalTracker *p_tracker) {
 void ARVRServer::remove_tracker(ARVRPositionalTracker *p_tracker) {
@@ -250,7 +250,7 @@ void ARVRServer::remove_tracker(ARVRPositionalTracker *p_tracker) {
 
 
 	ERR_FAIL_COND(idx == -1);
 	ERR_FAIL_COND(idx == -1);
 
 
-	emit_signal("tracker_removed", p_tracker->get_name());
+	emit_signal("tracker_removed", p_tracker->get_name(), p_tracker->get_type(), p_tracker->get_tracker_id());
 	trackers.remove(idx);
 	trackers.remove(idx);
 };
 };