#include "xr_nodes.h"
#include "core/config/project_settings.h"
#include "scene/main/viewport.h"
#include "servers/xr/xr_interface.h"
void XRCamera3D::_bind_tracker() { … }
void XRCamera3D::_unbind_tracker() { … }
void XRCamera3D::_changed_tracker(const StringName &p_tracker_name, int p_tracker_type) { … }
void XRCamera3D::_removed_tracker(const StringName &p_tracker_name, int p_tracker_type) { … }
void XRCamera3D::_pose_changed(const Ref<XRPose> &p_pose) { … }
PackedStringArray XRCamera3D::get_configuration_warnings() const {
PackedStringArray warnings = Node::get_configuration_warnings();
if (is_visible() && is_inside_tree()) {
Node *parent = get_parent();
XROrigin3D *origin = Object::cast_to<XROrigin3D>(parent);
if (parent && origin == nullptr) {
warnings.push_back(RTR("XRCamera3D may not function as expected without an XROrigin3D node as its parent."));
};
}
return warnings;
};
Vector3 XRCamera3D::project_local_ray_normal(const Point2 &p_pos) const {
XRServer *xr_server = XRServer::get_singleton();
ERR_FAIL_NULL_V(xr_server, Vector3());
Ref<XRInterface> xr_interface = xr_server->get_primary_interface();
if (xr_interface.is_null()) {
return Camera3D::project_local_ray_normal(p_pos);
}
ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector3(), "Camera is not inside scene.");
Size2 viewport_size = get_viewport()->get_camera_rect_size();
Vector2 cpos = get_viewport()->get_camera_coords(p_pos);
Vector3 ray;
Projection cm = xr_interface->get_projection_for_view(0, viewport_size.aspect(), get_near(), get_far());
Vector2 screen_he = cm.get_viewport_half_extents();
ray = Vector3(((cpos.x / viewport_size.width) * 2.0 - 1.0) * screen_he.x, ((1.0 - (cpos.y / viewport_size.height)) * 2.0 - 1.0) * screen_he.y, -get_near()).normalized();
return ray;
};
Point2 XRCamera3D::unproject_position(const Vector3 &p_pos) const {
XRServer *xr_server = XRServer::get_singleton();
ERR_FAIL_NULL_V(xr_server, Vector2());
Ref<XRInterface> xr_interface = xr_server->get_primary_interface();
if (xr_interface.is_null()) {
return Camera3D::unproject_position(p_pos);
}
ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector2(), "Camera is not inside scene.");
Size2 viewport_size = get_viewport()->get_visible_rect().size;
Projection cm = xr_interface->get_projection_for_view(0, viewport_size.aspect(), get_near(), get_far());
Plane p(get_camera_transform().xform_inv(p_pos), 1.0);
p = cm.xform4(p);
p.normal /= p.d;
Point2 res;
res.x = (p.normal.x * 0.5 + 0.5) * viewport_size.x;
res.y = (-p.normal.y * 0.5 + 0.5) * viewport_size.y;
return res;
};
Vector3 XRCamera3D::project_position(const Point2 &p_point, real_t p_z_depth) const {
XRServer *xr_server = XRServer::get_singleton();
ERR_FAIL_NULL_V(xr_server, Vector3());
Ref<XRInterface> xr_interface = xr_server->get_primary_interface();
if (xr_interface.is_null()) {
return Camera3D::project_position(p_point, p_z_depth);
}
ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector3(), "Camera is not inside scene.");
Size2 viewport_size = get_viewport()->get_visible_rect().size;
Projection cm = xr_interface->get_projection_for_view(0, viewport_size.aspect(), get_near(), get_far());
Vector2 vp_he = cm.get_viewport_half_extents();
Vector2 point;
point.x = (p_point.x / viewport_size.x) * 2.0 - 1.0;
point.y = (1.0 - (p_point.y / viewport_size.y)) * 2.0 - 1.0;
point *= vp_he;
Vector3 p(point.x, point.y, -p_z_depth);
return get_camera_transform().xform(p);
};
Vector<Plane> XRCamera3D::get_frustum() const {
XRServer *xr_server = XRServer::get_singleton();
ERR_FAIL_NULL_V(xr_server, Vector<Plane>());
Ref<XRInterface> xr_interface = xr_server->get_primary_interface();
if (xr_interface.is_null()) {
return Camera3D::get_frustum();
}
ERR_FAIL_COND_V(!is_inside_world(), Vector<Plane>());
Size2 viewport_size = get_viewport()->get_visible_rect().size;
Projection cm = xr_interface->get_projection_for_view(0, viewport_size.aspect(), get_near(), get_far());
return cm.get_projection_planes(get_camera_transform());
};
XRCamera3D::XRCamera3D() { … }
XRCamera3D::~XRCamera3D() { … }
void XRNode3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_tracker", "tracker_name"), &XRNode3D::set_tracker);
ClassDB::bind_method(D_METHOD("get_tracker"), &XRNode3D::get_tracker);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "tracker", PROPERTY_HINT_ENUM_SUGGESTION), "set_tracker", "get_tracker");
ClassDB::bind_method(D_METHOD("set_pose_name", "pose"), &XRNode3D::set_pose_name);
ClassDB::bind_method(D_METHOD("get_pose_name"), &XRNode3D::get_pose_name);
ADD_PROPERTY(PropertyInfo(Variant::STRING, "pose", PROPERTY_HINT_ENUM_SUGGESTION), "set_pose_name", "get_pose_name");
ClassDB::bind_method(D_METHOD("set_show_when_tracked", "show"), &XRNode3D::set_show_when_tracked);
ClassDB::bind_method(D_METHOD("get_show_when_tracked"), &XRNode3D::get_show_when_tracked);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_when_tracked"), "set_show_when_tracked", "get_show_when_tracked");
ClassDB::bind_method(D_METHOD("get_is_active"), &XRNode3D::get_is_active);
ClassDB::bind_method(D_METHOD("get_has_tracking_data"), &XRNode3D::get_has_tracking_data);
ClassDB::bind_method(D_METHOD("get_pose"), &XRNode3D::get_pose);
ClassDB::bind_method(D_METHOD("trigger_haptic_pulse", "action_name", "frequency", "amplitude", "duration_sec", "delay_sec"), &XRNode3D::trigger_haptic_pulse);
ADD_SIGNAL(MethodInfo("tracking_changed", PropertyInfo(Variant::BOOL, "tracking")));
};
void XRNode3D::_validate_property(PropertyInfo &p_property) const { … }
void XRNode3D::set_tracker(const StringName &p_tracker_name) { … }
StringName XRNode3D::get_tracker() const { … }
void XRNode3D::set_pose_name(const StringName &p_pose_name) { … }
StringName XRNode3D::get_pose_name() const { … }
void XRNode3D::set_show_when_tracked(bool p_show) { … }
bool XRNode3D::get_show_when_tracked() const { … }
bool XRNode3D::get_is_active() const { … }
bool XRNode3D::get_has_tracking_data() const { … }
void XRNode3D::trigger_haptic_pulse(const String &p_action_name, double p_frequency, double p_amplitude, double p_duration_sec, double p_delay_sec) { … }
Ref<XRPose> XRNode3D::get_pose() { … }
void XRNode3D::_bind_tracker() { … }
void XRNode3D::_unbind_tracker() { … }
void XRNode3D::_changed_tracker(const StringName &p_tracker_name, int p_tracker_type) { … }
void XRNode3D::_removed_tracker(const StringName &p_tracker_name, int p_tracker_type) { … }
void XRNode3D::_pose_changed(const Ref<XRPose> &p_pose) { … }
void XRNode3D::_pose_lost_tracking(const Ref<XRPose> &p_pose) { … }
void XRNode3D::_set_has_tracking_data(bool p_has_tracking_data) { … }
void XRNode3D::_update_visibility() { … }
XRNode3D::XRNode3D() { … }
XRNode3D::~XRNode3D() { … }
PackedStringArray XRNode3D::get_configuration_warnings() const { … }
void XRController3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_button_pressed", "name"), &XRController3D::is_button_pressed);
ClassDB::bind_method(D_METHOD("get_input", "name"), &XRController3D::get_input);
ClassDB::bind_method(D_METHOD("get_float", "name"), &XRController3D::get_float);
ClassDB::bind_method(D_METHOD("get_vector2", "name"), &XRController3D::get_vector2);
ClassDB::bind_method(D_METHOD("get_tracker_hand"), &XRController3D::get_tracker_hand);
ADD_SIGNAL(MethodInfo("button_pressed", PropertyInfo(Variant::STRING, "name")));
ADD_SIGNAL(MethodInfo("button_released", PropertyInfo(Variant::STRING, "name")));
ADD_SIGNAL(MethodInfo("input_float_changed", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::FLOAT, "value")));
ADD_SIGNAL(MethodInfo("input_vector2_changed", PropertyInfo(Variant::STRING, "name"), PropertyInfo(Variant::VECTOR2, "value")));
ADD_SIGNAL(MethodInfo("profile_changed", PropertyInfo(Variant::STRING, "role")));
};
void XRController3D::_bind_tracker() { … }
void XRController3D::_unbind_tracker() { … }
void XRController3D::_button_pressed(const String &p_name) { … }
void XRController3D::_button_released(const String &p_name) { … }
void XRController3D::_input_float_changed(const String &p_name, float p_value) { … }
void XRController3D::_input_vector2_changed(const String &p_name, Vector2 p_value) { … }
void XRController3D::_profile_changed(const String &p_role) { … }
bool XRController3D::is_button_pressed(const StringName &p_name) const { … }
Variant XRController3D::get_input(const StringName &p_name) const { … }
float XRController3D::get_float(const StringName &p_name) const { … }
Vector2 XRController3D::get_vector2(const StringName &p_name) const { … }
XRPositionalTracker::TrackerHand XRController3D::get_tracker_hand() const { … }
void XRAnchor3D::_bind_methods() { … }
Vector3 XRAnchor3D::get_size() const { … }
Plane XRAnchor3D::get_plane() const { … }
Vector<XROrigin3D *> XROrigin3D::origin_nodes;
PackedStringArray XROrigin3D::get_configuration_warnings() const { … }
void XROrigin3D::_bind_methods() { … }
real_t XROrigin3D::get_world_scale() const { … }
void XROrigin3D::set_world_scale(real_t p_world_scale) { … }
void XROrigin3D::_set_current(bool p_enabled, bool p_update_others) { … }
void XROrigin3D::set_current(bool p_enabled) { … }
bool XROrigin3D::is_current() const { … }
void XROrigin3D::_notification(int p_what) { … }