diff options
Diffstat (limited to 'servers/arvr_server.cpp')
| -rw-r--r-- | servers/arvr_server.cpp | 52 | 
1 files changed, 52 insertions, 0 deletions
diff --git a/servers/arvr_server.cpp b/servers/arvr_server.cpp index 8620b182df..f48bedbdac 100644 --- a/servers/arvr_server.cpp +++ b/servers/arvr_server.cpp @@ -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,15 @@ 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); +	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "primary_interface"), "set_primary_interface", "get_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 +140,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 +330,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;  |