Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/servers/xr/xr_hand_tracker.cpp
10277 views
1
/**************************************************************************/
2
/* xr_hand_tracker.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "xr_hand_tracker.h"
32
33
void XRHandTracker::_bind_methods() {
34
ClassDB::bind_method(D_METHOD("set_has_tracking_data", "has_data"), &XRHandTracker::set_has_tracking_data);
35
ClassDB::bind_method(D_METHOD("get_has_tracking_data"), &XRHandTracker::get_has_tracking_data);
36
37
ClassDB::bind_method(D_METHOD("set_hand_tracking_source", "source"), &XRHandTracker::set_hand_tracking_source);
38
ClassDB::bind_method(D_METHOD("get_hand_tracking_source"), &XRHandTracker::get_hand_tracking_source);
39
40
ClassDB::bind_method(D_METHOD("set_hand_joint_flags", "joint", "flags"), &XRHandTracker::set_hand_joint_flags);
41
ClassDB::bind_method(D_METHOD("get_hand_joint_flags", "joint"), &XRHandTracker::get_hand_joint_flags);
42
43
ClassDB::bind_method(D_METHOD("set_hand_joint_transform", "joint", "transform"), &XRHandTracker::set_hand_joint_transform);
44
ClassDB::bind_method(D_METHOD("get_hand_joint_transform", "joint"), &XRHandTracker::get_hand_joint_transform);
45
46
ClassDB::bind_method(D_METHOD("set_hand_joint_radius", "joint", "radius"), &XRHandTracker::set_hand_joint_radius);
47
ClassDB::bind_method(D_METHOD("get_hand_joint_radius", "joint"), &XRHandTracker::get_hand_joint_radius);
48
49
ClassDB::bind_method(D_METHOD("set_hand_joint_linear_velocity", "joint", "linear_velocity"), &XRHandTracker::set_hand_joint_linear_velocity);
50
ClassDB::bind_method(D_METHOD("get_hand_joint_linear_velocity", "joint"), &XRHandTracker::get_hand_joint_linear_velocity);
51
52
ClassDB::bind_method(D_METHOD("set_hand_joint_angular_velocity", "joint", "angular_velocity"), &XRHandTracker::set_hand_joint_angular_velocity);
53
ClassDB::bind_method(D_METHOD("get_hand_joint_angular_velocity", "joint"), &XRHandTracker::get_hand_joint_angular_velocity);
54
55
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "has_tracking_data", PROPERTY_HINT_NONE), "set_has_tracking_data", "get_has_tracking_data");
56
ADD_PROPERTY(PropertyInfo(Variant::INT, "hand_tracking_source", PROPERTY_HINT_ENUM, "Unknown,Unobstructed,Controller"), "set_hand_tracking_source", "get_hand_tracking_source");
57
58
BIND_ENUM_CONSTANT(HAND_TRACKING_SOURCE_UNKNOWN);
59
BIND_ENUM_CONSTANT(HAND_TRACKING_SOURCE_UNOBSTRUCTED);
60
BIND_ENUM_CONSTANT(HAND_TRACKING_SOURCE_CONTROLLER);
61
BIND_ENUM_CONSTANT(HAND_TRACKING_SOURCE_NOT_TRACKED);
62
BIND_ENUM_CONSTANT(HAND_TRACKING_SOURCE_MAX);
63
64
BIND_ENUM_CONSTANT(HAND_JOINT_PALM);
65
BIND_ENUM_CONSTANT(HAND_JOINT_WRIST);
66
BIND_ENUM_CONSTANT(HAND_JOINT_THUMB_METACARPAL);
67
BIND_ENUM_CONSTANT(HAND_JOINT_THUMB_PHALANX_PROXIMAL);
68
BIND_ENUM_CONSTANT(HAND_JOINT_THUMB_PHALANX_DISTAL);
69
BIND_ENUM_CONSTANT(HAND_JOINT_THUMB_TIP);
70
BIND_ENUM_CONSTANT(HAND_JOINT_INDEX_FINGER_METACARPAL);
71
BIND_ENUM_CONSTANT(HAND_JOINT_INDEX_FINGER_PHALANX_PROXIMAL);
72
BIND_ENUM_CONSTANT(HAND_JOINT_INDEX_FINGER_PHALANX_INTERMEDIATE);
73
BIND_ENUM_CONSTANT(HAND_JOINT_INDEX_FINGER_PHALANX_DISTAL);
74
BIND_ENUM_CONSTANT(HAND_JOINT_INDEX_FINGER_TIP);
75
BIND_ENUM_CONSTANT(HAND_JOINT_MIDDLE_FINGER_METACARPAL);
76
BIND_ENUM_CONSTANT(HAND_JOINT_MIDDLE_FINGER_PHALANX_PROXIMAL);
77
BIND_ENUM_CONSTANT(HAND_JOINT_MIDDLE_FINGER_PHALANX_INTERMEDIATE);
78
BIND_ENUM_CONSTANT(HAND_JOINT_MIDDLE_FINGER_PHALANX_DISTAL);
79
BIND_ENUM_CONSTANT(HAND_JOINT_MIDDLE_FINGER_TIP);
80
BIND_ENUM_CONSTANT(HAND_JOINT_RING_FINGER_METACARPAL);
81
BIND_ENUM_CONSTANT(HAND_JOINT_RING_FINGER_PHALANX_PROXIMAL);
82
BIND_ENUM_CONSTANT(HAND_JOINT_RING_FINGER_PHALANX_INTERMEDIATE);
83
BIND_ENUM_CONSTANT(HAND_JOINT_RING_FINGER_PHALANX_DISTAL);
84
BIND_ENUM_CONSTANT(HAND_JOINT_RING_FINGER_TIP);
85
BIND_ENUM_CONSTANT(HAND_JOINT_PINKY_FINGER_METACARPAL);
86
BIND_ENUM_CONSTANT(HAND_JOINT_PINKY_FINGER_PHALANX_PROXIMAL);
87
BIND_ENUM_CONSTANT(HAND_JOINT_PINKY_FINGER_PHALANX_INTERMEDIATE);
88
BIND_ENUM_CONSTANT(HAND_JOINT_PINKY_FINGER_PHALANX_DISTAL);
89
BIND_ENUM_CONSTANT(HAND_JOINT_PINKY_FINGER_TIP);
90
BIND_ENUM_CONSTANT(HAND_JOINT_MAX);
91
92
BIND_BITFIELD_FLAG(HAND_JOINT_FLAG_ORIENTATION_VALID);
93
BIND_BITFIELD_FLAG(HAND_JOINT_FLAG_ORIENTATION_TRACKED);
94
BIND_BITFIELD_FLAG(HAND_JOINT_FLAG_POSITION_VALID);
95
BIND_BITFIELD_FLAG(HAND_JOINT_FLAG_POSITION_TRACKED);
96
BIND_BITFIELD_FLAG(HAND_JOINT_FLAG_LINEAR_VELOCITY_VALID);
97
BIND_BITFIELD_FLAG(HAND_JOINT_FLAG_ANGULAR_VELOCITY_VALID);
98
}
99
100
void XRHandTracker::set_tracker_type(XRServer::TrackerType p_type) {
101
ERR_FAIL_COND_MSG(p_type != XRServer::TRACKER_HAND, "XRHandTracker must be of type TRACKER_HAND.");
102
}
103
104
void XRHandTracker::set_tracker_hand(const XRPositionalTracker::TrackerHand p_hand) {
105
ERR_FAIL_COND_MSG(p_hand != TRACKER_HAND_LEFT && p_hand != TRACKER_HAND_RIGHT, "XRHandTracker must specify hand.");
106
tracker_hand = p_hand;
107
}
108
109
void XRHandTracker::set_has_tracking_data(bool p_has_tracking_data) {
110
has_tracking_data = p_has_tracking_data;
111
}
112
113
bool XRHandTracker::get_has_tracking_data() const {
114
return has_tracking_data;
115
}
116
117
void XRHandTracker::set_hand_tracking_source(XRHandTracker::HandTrackingSource p_source) {
118
hand_tracking_source = p_source;
119
}
120
121
XRHandTracker::HandTrackingSource XRHandTracker::get_hand_tracking_source() const {
122
return hand_tracking_source;
123
}
124
125
void XRHandTracker::set_hand_joint_flags(XRHandTracker::HandJoint p_joint, BitField<XRHandTracker::HandJointFlags> p_flags) {
126
ERR_FAIL_INDEX(p_joint, HAND_JOINT_MAX);
127
hand_joint_flags[p_joint] = p_flags;
128
}
129
130
BitField<XRHandTracker::HandJointFlags> XRHandTracker::get_hand_joint_flags(XRHandTracker::HandJoint p_joint) const {
131
ERR_FAIL_INDEX_V(p_joint, HAND_JOINT_MAX, BitField<HandJointFlags>());
132
return hand_joint_flags[p_joint];
133
}
134
135
void XRHandTracker::set_hand_joint_transform(XRHandTracker::HandJoint p_joint, const Transform3D &p_transform) {
136
ERR_FAIL_INDEX(p_joint, HAND_JOINT_MAX);
137
hand_joint_transforms[p_joint] = p_transform;
138
}
139
140
Transform3D XRHandTracker::get_hand_joint_transform(XRHandTracker::HandJoint p_joint) const {
141
ERR_FAIL_INDEX_V(p_joint, HAND_JOINT_MAX, Transform3D());
142
return hand_joint_transforms[p_joint];
143
}
144
145
void XRHandTracker::set_hand_joint_radius(XRHandTracker::HandJoint p_joint, float p_radius) {
146
ERR_FAIL_INDEX(p_joint, HAND_JOINT_MAX);
147
hand_joint_radii[p_joint] = p_radius;
148
}
149
150
float XRHandTracker::get_hand_joint_radius(XRHandTracker::HandJoint p_joint) const {
151
ERR_FAIL_INDEX_V(p_joint, HAND_JOINT_MAX, 0.0);
152
return hand_joint_radii[p_joint];
153
}
154
155
void XRHandTracker::set_hand_joint_linear_velocity(XRHandTracker::HandJoint p_joint, const Vector3 &p_velocity) {
156
ERR_FAIL_INDEX(p_joint, HAND_JOINT_MAX);
157
hand_joint_linear_velocities[p_joint] = p_velocity;
158
}
159
160
Vector3 XRHandTracker::get_hand_joint_linear_velocity(XRHandTracker::HandJoint p_joint) const {
161
ERR_FAIL_INDEX_V(p_joint, HAND_JOINT_MAX, Vector3());
162
return hand_joint_linear_velocities[p_joint];
163
}
164
165
void XRHandTracker::set_hand_joint_angular_velocity(XRHandTracker::HandJoint p_joint, const Vector3 &p_velocity) {
166
ERR_FAIL_INDEX(p_joint, HAND_JOINT_MAX);
167
hand_joint_angular_velocities[p_joint] = p_velocity;
168
}
169
170
Vector3 XRHandTracker::get_hand_joint_angular_velocity(XRHandTracker::HandJoint p_joint) const {
171
ERR_FAIL_INDEX_V(p_joint, HAND_JOINT_MAX, Vector3());
172
return hand_joint_angular_velocities[p_joint];
173
}
174
175
XRHandTracker::XRHandTracker() {
176
type = XRServer::TRACKER_HAND;
177
tracker_hand = TRACKER_HAND_LEFT;
178
}
179
180