|
@@ -44,6 +44,7 @@ void ARVRServer::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("set_world_scale"), &ARVRServer::set_world_scale);
|
|
|
ClassDB::bind_method(D_METHOD("get_reference_frame"), &ARVRServer::get_reference_frame);
|
|
|
ClassDB::bind_method(D_METHOD("center_on_hmd", "rotation_mode", "keep_height"), &ARVRServer::center_on_hmd);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_hmd_transform"), &ARVRServer::get_hmd_transform);
|
|
|
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::REAL, "world_scale"), "set_world_scale", "get_world_scale");
|
|
|
|
|
@@ -54,8 +55,13 @@ void ARVRServer::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("get_tracker_count"), &ARVRServer::get_tracker_count);
|
|
|
ClassDB::bind_method(D_METHOD("get_tracker", "idx"), &ARVRServer::get_tracker);
|
|
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_primary_interface"), &ARVRServer::get_primary_interface);
|
|
|
ClassDB::bind_method(D_METHOD("set_primary_interface", "interface"), &ARVRServer::set_primary_interface);
|
|
|
|
|
|
+ ClassDB::bind_method(D_METHOD("get_last_process_usec"), &ARVRServer::get_last_process_usec);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_last_commit_usec"), &ARVRServer::get_last_commit_usec);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_last_frame_usec"), &ARVRServer::get_last_frame_usec);
|
|
|
+
|
|
|
BIND_ENUM_CONSTANT(TRACKER_CONTROLLER);
|
|
|
BIND_ENUM_CONSTANT(TRACKER_BASESTATION);
|
|
|
BIND_ENUM_CONSTANT(TRACKER_ANCHOR);
|
|
@@ -132,6 +138,14 @@ void ARVRServer::center_on_hmd(RotationMode p_rotation_mode, bool p_keep_height)
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+Transform ARVRServer::get_hmd_transform() {
|
|
|
+ Transform hmd_transform;
|
|
|
+ if (primary_interface != NULL) {
|
|
|
+ hmd_transform = primary_interface->get_transform_for_eye(ARVRInterface::EYE_MONO, hmd_transform);
|
|
|
+ };
|
|
|
+ return hmd_transform;
|
|
|
+};
|
|
|
+
|
|
|
void ARVRServer::add_interface(const Ref<ARVRInterface> &p_interface) {
|
|
|
ERR_FAIL_COND(p_interface.is_null());
|
|
|
|
|
@@ -314,6 +328,42 @@ void ARVRServer::clear_primary_interface_if(const Ref<ARVRInterface> &p_primary_
|
|
|
};
|
|
|
};
|
|
|
|
|
|
+uint64_t ARVRServer::get_last_process_usec() {
|
|
|
+ return last_process_usec;
|
|
|
+};
|
|
|
+
|
|
|
+uint64_t ARVRServer::get_last_commit_usec() {
|
|
|
+ return last_commit_usec;
|
|
|
+};
|
|
|
+
|
|
|
+uint64_t ARVRServer::get_last_frame_usec() {
|
|
|
+ return last_frame_usec;
|
|
|
+};
|
|
|
+
|
|
|
+void ARVRServer::_process() {
|
|
|
+ /* called from visual_server_viewport.draw_viewports right before we start drawing our viewports */
|
|
|
+
|
|
|
+ /* mark for our frame timing */
|
|
|
+ last_process_usec = OS::get_singleton()->get_ticks_usec();
|
|
|
+
|
|
|
+ /* process all active interfaces */
|
|
|
+ for (int i = 0; i < interfaces.size(); i++) {
|
|
|
+ if (!interfaces[i].is_valid()) {
|
|
|
+ // ignore, not a valid reference
|
|
|
+ } else if (interfaces[i]->is_initialized()) {
|
|
|
+ interfaces[i]->process();
|
|
|
+ };
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
+void ARVRServer::_mark_commit() {
|
|
|
+ /* time this */
|
|
|
+ last_commit_usec = OS::get_singleton()->get_ticks_usec();
|
|
|
+
|
|
|
+ /* now store our difference as we may overwrite last_process_usec before this is accessed */
|
|
|
+ last_frame_usec = last_commit_usec - last_process_usec;
|
|
|
+};
|
|
|
+
|
|
|
ARVRServer::ARVRServer() {
|
|
|
singleton = this;
|
|
|
world_scale = 1.0;
|