diff --git a/components/script/dom/webidls/XRRay.webidl b/components/script/dom/webidls/XRRay.webidl index 317f6609c08..b67d8a511a5 100644 --- a/components/script/dom/webidls/XRRay.webidl +++ b/components/script/dom/webidls/XRRay.webidl @@ -7,7 +7,7 @@ [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRRay { constructor(optional DOMPointInit origin = {}, optional DOMPointInit direction = {}); - // constructor(XRRigidTransform transform); + constructor(XRRigidTransform transform); [SameObject] readonly attribute DOMPointReadOnly origin; [SameObject] readonly attribute DOMPointReadOnly direction; // [SameObject] readonly attribute Float32Array matrix; diff --git a/components/script/dom/xrray.rs b/components/script/dom/xrray.rs index 2cf7b2b3a30..df53ab4ecc9 100644 --- a/components/script/dom/xrray.rs +++ b/components/script/dom/xrray.rs @@ -9,6 +9,7 @@ use crate::dom::bindings::root::DomRoot; use crate::dom::dompointreadonly::DOMPointReadOnly; use crate::dom::globalscope::GlobalScope; use crate::dom::window::Window; +use crate::dom::xrrigidtransform::XRRigidTransform; use dom_struct::dom_struct; use euclid::Vector3D; use webxr_api::{ApiSpace, Ray}; @@ -45,6 +46,18 @@ impl XRRay { Self::new(&window.global(), Ray { origin, direction }) } + + #[allow(non_snake_case)] + /// https://immersive-web.github.io/hit-test/#dom-xrray-xrray-transform + pub fn Constructor_(window: &Window, transform: &XRRigidTransform) -> DomRoot { + let transform = transform.transform(); + let origin = transform.translation; + let direction = transform + .rotation + .transform_vector3d(Vector3D::new(0., 0., -1.)); + + Self::new(&window.global(), Ray { origin, direction }) + } } impl XRRayMethods for XRRay { diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index dc2b5b3c497..093c15e8dd6 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -47,8 +47,8 @@ use std::f64::consts::{FRAC_PI_2, PI}; use std::mem; use std::rc::Rc; use webxr_api::{ - self, util, Display, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, SelectKind, - Session, SessionId, View, Viewer, Visibility, + self, util, ApiSpace, Display, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, + SelectKind, Session, SessionId, View, Viewer, Visibility, }; #[dom_struct] @@ -711,8 +711,6 @@ impl XRSessionMethods for XRSession { } } -#[derive(Clone, Copy, Debug)] -pub struct ApiSpace; // The pose of an object in native-space. Should never be exposed. pub type ApiPose = RigidTransform3D; // The pose of the viewer in some api-space.