diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/XRBoundedReferenceSpace.webidl | 10 | ||||
-rw-r--r-- | components/script/dom/webidls/XRReferenceSpace.webidl | 3 | ||||
-rw-r--r-- | components/script/dom/xrboundedreferencespace.rs | 98 | ||||
-rw-r--r-- | components/script/dom/xrreferencespace.rs | 13 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 20 |
6 files changed, 138 insertions, 7 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 2f74d04f8b3..ae275631e95 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -623,6 +623,7 @@ pub mod xmlhttprequest; pub mod xmlhttprequesteventtarget; pub mod xmlhttprequestupload; pub mod xmlserializer; +pub mod xrboundedreferencespace; pub mod xrcompositionlayer; pub mod xrcubelayer; pub mod xrcylinderlayer; diff --git a/components/script/dom/webidls/XRBoundedReferenceSpace.webidl b/components/script/dom/webidls/XRBoundedReferenceSpace.webidl new file mode 100644 index 00000000000..ee7f59085ba --- /dev/null +++ b/components/script/dom/webidls/XRBoundedReferenceSpace.webidl @@ -0,0 +1,10 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +// https://immersive-web.github.io/webxr/#xrboundedreferencespace-interface + +[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +interface XRBoundedReferenceSpace : XRReferenceSpace { + readonly attribute /*FrozenArray<DOMPointReadOnly>*/ any boundsGeometry; +}; diff --git a/components/script/dom/webidls/XRReferenceSpace.webidl b/components/script/dom/webidls/XRReferenceSpace.webidl index 0479bd12beb..f8a1638ef8d 100644 --- a/components/script/dom/webidls/XRReferenceSpace.webidl +++ b/components/script/dom/webidls/XRReferenceSpace.webidl @@ -14,6 +14,7 @@ enum XRReferenceSpaceType { [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRReferenceSpace : XRSpace { - XRReferenceSpace getOffsetReferenceSpace(XRRigidTransform originOffset); + [NewObject] XRReferenceSpace getOffsetReferenceSpace(XRRigidTransform originOffset); + // attribute EventHandler onreset; }; diff --git a/components/script/dom/xrboundedreferencespace.rs b/components/script/dom/xrboundedreferencespace.rs new file mode 100644 index 00000000000..41bb2052694 --- /dev/null +++ b/components/script/dom/xrboundedreferencespace.rs @@ -0,0 +1,98 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use dom_struct::dom_struct; +use js::jsval::JSVal; + +use crate::dom::bindings::codegen::Bindings::XRBoundedReferenceSpaceBinding::XRBoundedReferenceSpaceMethods; +use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::utils::to_frozen_array; +use crate::dom::dompointreadonly::DOMPointReadOnly; +use crate::dom::globalscope::GlobalScope; +use crate::dom::xrreferencespace::XRReferenceSpace; +use crate::dom::xrrigidtransform::XRRigidTransform; +use crate::dom::xrsession::XRSession; +use crate::script_runtime::JSContext; + +#[dom_struct] +pub struct XRBoundedReferenceSpace { + xrspace: XRReferenceSpace, + offset: Dom<XRRigidTransform>, +} + +impl XRBoundedReferenceSpace { + pub fn new_inherited( + session: &XRSession, + offset: &XRRigidTransform, + ) -> XRBoundedReferenceSpace { + XRBoundedReferenceSpace { + xrspace: XRReferenceSpace::new_inherited( + session, + offset, + XRReferenceSpaceType::Bounded_floor, + ), + offset: Dom::from_ref(offset), + } + } + + #[allow(unused)] + pub fn new(global: &GlobalScope, session: &XRSession) -> DomRoot<XRBoundedReferenceSpace> { + let offset = XRRigidTransform::identity(global); + Self::new_offset(global, session, &offset) + } + + #[allow(unused)] + pub fn new_offset( + global: &GlobalScope, + session: &XRSession, + offset: &XRRigidTransform, + ) -> DomRoot<XRBoundedReferenceSpace> { + reflect_dom_object( + Box::new(XRBoundedReferenceSpace::new_inherited(session, offset)), + global, + ) + } +} + +impl XRBoundedReferenceSpaceMethods for XRBoundedReferenceSpace { + /// <https://www.w3.org/TR/webxr/#dom-xrboundedreferencespace-boundsgeometry> + fn BoundsGeometry(&self, cx: JSContext) -> JSVal { + if let Some(bounds) = self.xrspace.get_bounds() { + let point1 = DOMPointReadOnly::new( + &self.global(), + bounds.min.x.into(), + 0.0, + bounds.min.y.into(), + 1.0, + ); + let point2 = DOMPointReadOnly::new( + &self.global(), + bounds.min.x.into(), + 0.0, + bounds.max.y.into(), + 1.0, + ); + let point3 = DOMPointReadOnly::new( + &self.global(), + bounds.max.x.into(), + 0.0, + bounds.max.y.into(), + 1.0, + ); + let point4 = DOMPointReadOnly::new( + &self.global(), + bounds.max.x.into(), + 0.0, + bounds.min.y.into(), + 1.0, + ); + + to_frozen_array(&[point1, point2, point3, point4], cx) + } else { + to_frozen_array::<DomRoot<DOMPointReadOnly>>(&[], cx) + } + } +} diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index e7bf33cddd9..402d9d584e8 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -3,8 +3,8 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use dom_struct::dom_struct; -use euclid::RigidTransform3D; -use webxr_api::{self, Frame, Space}; +use euclid::{Box2D, RigidTransform3D}; +use webxr_api::{self, Floor, Frame, Space}; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::{ XRReferenceSpaceMethods, XRReferenceSpaceType, @@ -65,6 +65,7 @@ impl XRReferenceSpace { XRReferenceSpaceType::Local => webxr_api::BaseSpace::Local, XRReferenceSpaceType::Viewer => webxr_api::BaseSpace::Viewer, XRReferenceSpaceType::Local_floor => webxr_api::BaseSpace::Floor, + XRReferenceSpaceType::Bounded_floor => webxr_api::BaseSpace::BoundedFloor, _ => panic!("unsupported reference space found"), }; let offset = self.offset.transform(); @@ -121,7 +122,7 @@ impl XRReferenceSpace { // for most devices is (0, 0, 0) Some(RigidTransform3D::identity()) }, - XRReferenceSpaceType::Local_floor => { + XRReferenceSpaceType::Local_floor | XRReferenceSpaceType::Bounded_floor => { let native_to_floor = self .upcast::<XRSpace>() .session() @@ -134,4 +135,10 @@ impl XRReferenceSpace { _ => unimplemented!(), } } + + pub fn get_bounds(&self) -> Option<Box2D<f32, Floor>> { + self.upcast::<XRSpace>() + .session() + .with_session(|s| s.reference_space_bounds()) + } } diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 6cfd8fda59e..f79ebed7fce 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -54,6 +54,7 @@ use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::dom::performance::reduce_timing_resolution; use crate::dom::promise::Promise; +use crate::dom::xrboundedreferencespace::XRBoundedReferenceSpace; use crate::dom::xrframe::XRFrame; use crate::dom::xrhittestsource::XRHitTestSource; use crate::dom::xrinputsourcearray::XRInputSourceArray; @@ -793,9 +794,16 @@ impl XRSessionMethods for XRSession { // XXXManishearth reject based on session type // https://github.com/immersive-web/webxr/blob/master/spatial-tracking-explainer.md#practical-usage-guidelines + if !self.is_immersive() && + (ty == XRReferenceSpaceType::Bounded_floor || ty == XRReferenceSpaceType::Unbounded) + { + p.reject_error(Error::NotSupported); + return p; + } + match ty { - XRReferenceSpaceType::Bounded_floor | XRReferenceSpaceType::Unbounded => { - // XXXManishearth eventually support these + XRReferenceSpaceType::Unbounded => { + // XXXmsub2 figure out how to support this p.reject_error(Error::NotSupported) }, ty => { @@ -814,7 +822,13 @@ impl XRSessionMethods for XRSession { return p; } } - p.resolve_native(&XRReferenceSpace::new(&self.global(), self, ty)); + if ty == XRReferenceSpaceType::Bounded_floor { + let space = XRBoundedReferenceSpace::new(&self.global(), self); + p.resolve_native(&space); + } else { + let space = XRReferenceSpace::new(&self.global(), self, ty); + p.resolve_native(&space); + } }, } p |