From c775820a79a793781696f2c472d3071bcb5380f6 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 14 Mar 2019 13:01:50 -0700 Subject: [PATCH 1/8] Add XRRigidTransform constructor --- components/script/dom/dompointreadonly.rs | 5 +++ .../dom/webidls/XRRigidTransform.webidl | 4 +- components/script/dom/xrrigidtransform.rs | 37 ++++++++++++++++--- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/components/script/dom/dompointreadonly.rs b/components/script/dom/dompointreadonly.rs index 2387cb8f6d5..e8ae7aa4990 100644 --- a/components/script/dom/dompointreadonly.rs +++ b/components/script/dom/dompointreadonly.rs @@ -2,6 +2,7 @@ * 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 crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit; use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::{ DOMPointReadOnlyMethods, Wrap, }; @@ -50,6 +51,10 @@ impl DOMPointReadOnly { ) -> Fallible> { Ok(DOMPointReadOnly::new(global, x, y, z, w)) } + + pub fn new_from_init(global: &GlobalScope, p: &DOMPointInit) -> DomRoot { + DOMPointReadOnly::new(global, p.x, p.y, p.z, p.w) + } } impl DOMPointReadOnlyMethods for DOMPointReadOnly { diff --git a/components/script/dom/webidls/XRRigidTransform.webidl b/components/script/dom/webidls/XRRigidTransform.webidl index f7ccd0fb188..aa2bc93fa31 100644 --- a/components/script/dom/webidls/XRRigidTransform.webidl +++ b/components/script/dom/webidls/XRRigidTransform.webidl @@ -4,8 +4,8 @@ // https://immersive-web.github.io/webxr/#xrrigidtransform-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] -// [Constructor(optional DOMPointInit position, optional DOMPointInit orientation)] +[SecureContext, Exposed=Window, Pref="dom.webxr.enabled", + Constructor(optional DOMPointInit position, optional DOMPointInit orientation)] interface XRRigidTransform { // readonly attribute DOMPointReadOnly position; // readonly attribute DOMPointReadOnly orientation; diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index b147e274810..d30a074fbf9 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -2,30 +2,57 @@ * 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 crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit; use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding; +use crate::dom::bindings::error::Fallible; +use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; -use crate::dom::bindings::root::DomRoot; -use crate::dom::globalscope::GlobalScope; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::dompointreadonly::DOMPointReadOnly; +use crate::dom::window::Window; use dom_struct::dom_struct; #[dom_struct] pub struct XRRigidTransform { reflector_: Reflector, + position: Dom, + orientation: Dom, } impl XRRigidTransform { - fn new_inherited() -> XRRigidTransform { + fn new_inherited( + position: &DOMPointReadOnly, + orientation: &DOMPointReadOnly, + ) -> XRRigidTransform { XRRigidTransform { reflector_: Reflector::new(), + position: Dom::from_ref(position), + orientation: Dom::from_ref(orientation), } } #[allow(unused)] - pub fn new(global: &GlobalScope) -> DomRoot { + pub fn new( + global: &Window, + position: &DOMPointReadOnly, + orientation: &DOMPointReadOnly, + ) -> DomRoot { reflect_dom_object( - Box::new(XRRigidTransform::new_inherited()), + Box::new(XRRigidTransform::new_inherited(position, orientation)), global, XRRigidTransformBinding::Wrap, ) } + + // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-xrrigidtransform + pub fn Constructor( + window: &Window, + position: &DOMPointInit, + orientation: &DOMPointInit, + ) -> Fallible> { + let global = window.global(); + let position = DOMPointReadOnly::new_from_init(&global, &position); + let orientation = DOMPointReadOnly::new_from_init(&global, &orientation); + Ok(XRRigidTransform::new(window, &position, &orientation)) + } } From 503ea3d943e37cc0ca1b86882550a6515651f927 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 14 Mar 2019 13:11:21 -0700 Subject: [PATCH 2/8] Add XRRigidTransform attributes --- .../script/dom/webidls/XRRigidTransform.webidl | 4 ++-- components/script/dom/xrrigidtransform.rs | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/components/script/dom/webidls/XRRigidTransform.webidl b/components/script/dom/webidls/XRRigidTransform.webidl index aa2bc93fa31..91b4f92dc3c 100644 --- a/components/script/dom/webidls/XRRigidTransform.webidl +++ b/components/script/dom/webidls/XRRigidTransform.webidl @@ -7,7 +7,7 @@ [SecureContext, Exposed=Window, Pref="dom.webxr.enabled", Constructor(optional DOMPointInit position, optional DOMPointInit orientation)] interface XRRigidTransform { - // readonly attribute DOMPointReadOnly position; - // readonly attribute DOMPointReadOnly orientation; + readonly attribute DOMPointReadOnly position; + readonly attribute DOMPointReadOnly orientation; // readonly attribute Float32Array matrix; }; diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index d30a074fbf9..ab8bd6e6e85 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -4,6 +4,7 @@ use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit; use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding; +use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding::XRRigidTransformMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; @@ -56,3 +57,14 @@ impl XRRigidTransform { Ok(XRRigidTransform::new(window, &position, &orientation)) } } + +impl XRRigidTransformMethods for XRRigidTransform { + // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-position + fn Position(&self) -> DomRoot { + DomRoot::from_ref(&self.position) + } + // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-orientation + fn Orientation(&self) -> DomRoot { + DomRoot::from_ref(&self.orientation) + } +} From ffacb1179eb7b62b805584b72d11d1b429523b22 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 14 Mar 2019 13:40:39 -0700 Subject: [PATCH 3/8] Add originOffset to XRReferenceSpace --- .../dom/webidls/XRReferenceSpace.webidl | 2 +- components/script/dom/xrreferencespace.rs | 32 ++++++++++++++++--- components/script/dom/xrrigidtransform.rs | 12 +++++++ .../script/dom/xrstationaryreferencespace.rs | 14 ++++---- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/components/script/dom/webidls/XRReferenceSpace.webidl b/components/script/dom/webidls/XRReferenceSpace.webidl index fdedfe0bb4f..378a4e520ee 100644 --- a/components/script/dom/webidls/XRReferenceSpace.webidl +++ b/components/script/dom/webidls/XRReferenceSpace.webidl @@ -16,6 +16,6 @@ dictionary XRReferenceSpaceOptions { [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRReferenceSpace : XRSpace { - // attribute XRRigidTransform originOffset; + attribute XRRigidTransform originOffset; // attribute EventHandler onreset; }; diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index 308b710d928..7d573a165c3 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -3,30 +3,52 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding; +use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceMethods; use crate::dom::bindings::reflector::reflect_dom_object; -use crate::dom::bindings::root::DomRoot; -use crate::dom::globalscope::GlobalScope; +use crate::dom::bindings::root::{DomRoot, MutDom}; +use crate::dom::dompointreadonly::DOMPointReadOnly; +use crate::dom::window::Window; +use crate::dom::xrrigidtransform::XRRigidTransform; use crate::dom::xrspace::XRSpace; use dom_struct::dom_struct; #[dom_struct] pub struct XRReferenceSpace { xrspace: XRSpace, + transform: MutDom, } impl XRReferenceSpace { - pub fn new_inherited() -> XRReferenceSpace { + pub fn new_inherited(transform: &XRRigidTransform) -> XRReferenceSpace { XRReferenceSpace { xrspace: XRSpace::new_inherited(), + transform: MutDom::new(transform), } } #[allow(unused)] - pub fn new(global: &GlobalScope) -> DomRoot { + pub fn new( + global: &Window, + position: &DOMPointReadOnly, + orientation: &DOMPointReadOnly, + ) -> DomRoot { + let transform = XRRigidTransform::identity(global); reflect_dom_object( - Box::new(XRReferenceSpace::new_inherited()), + Box::new(XRReferenceSpace::new_inherited(&transform)), global, XRReferenceSpaceBinding::Wrap, ) } } + +impl XRReferenceSpaceMethods for XRReferenceSpace { + /// https://immersive-web.github.io/webxr/#dom-xrreferencespace-originoffset + fn SetOriginOffset(&self, transform: &XRRigidTransform) { + self.transform.set(transform); + } + + /// https://immersive-web.github.io/webxr/#dom-xrreferencespace-originoffset + fn OriginOffset(&self) -> DomRoot { + self.transform.get() + } +} diff --git a/components/script/dom/xrrigidtransform.rs b/components/script/dom/xrrigidtransform.rs index ab8bd6e6e85..3f726475517 100644 --- a/components/script/dom/xrrigidtransform.rs +++ b/components/script/dom/xrrigidtransform.rs @@ -45,6 +45,18 @@ impl XRRigidTransform { ) } + #[allow(unused)] + pub fn identity(window: &Window) -> DomRoot { + let global = window.global(); + let position = DOMPointReadOnly::new(&global, 0., 0., 0., 1.); + let orientation = DOMPointReadOnly::new(&global, 0., 0., 0., 1.); + reflect_dom_object( + Box::new(XRRigidTransform::new_inherited(&position, &orientation)), + window, + XRRigidTransformBinding::Wrap, + ) + } + // https://immersive-web.github.io/webxr/#dom-xrrigidtransform-xrrigidtransform pub fn Constructor( window: &Window, diff --git a/components/script/dom/xrstationaryreferencespace.rs b/components/script/dom/xrstationaryreferencespace.rs index 92c0dce0196..bfb8b41aeb5 100644 --- a/components/script/dom/xrstationaryreferencespace.rs +++ b/components/script/dom/xrstationaryreferencespace.rs @@ -5,8 +5,9 @@ use crate::dom::bindings::codegen::Bindings::XRStationaryReferenceSpaceBinding; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::root::DomRoot; -use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; use crate::dom::xrreferencespace::XRReferenceSpace; +use crate::dom::xrrigidtransform::XRRigidTransform; use dom_struct::dom_struct; #[dom_struct] @@ -16,16 +17,17 @@ pub struct XRStationaryReferenceSpace { #[allow(unused)] impl XRStationaryReferenceSpace { - pub fn new_inherited() -> XRStationaryReferenceSpace { + pub fn new_inherited(transform: &XRRigidTransform) -> XRStationaryReferenceSpace { XRStationaryReferenceSpace { - xrreferencespace: XRReferenceSpace::new_inherited(), + xrreferencespace: XRReferenceSpace::new_inherited(transform), } } - pub fn new(global: &GlobalScope) -> DomRoot { + pub fn new(window: &Window) -> DomRoot { + let transform = XRRigidTransform::identity(window); reflect_dom_object( - Box::new(XRStationaryReferenceSpace::new_inherited()), - global, + Box::new(XRStationaryReferenceSpace::new_inherited(&transform)), + window, XRStationaryReferenceSpaceBinding::Wrap, ) } From 8f140079798b3820320599f3d33e1295e3e68564 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 14 Mar 2019 15:18:47 -0700 Subject: [PATCH 4/8] Add session parameter to XRSpace --- components/script/dom/xrreferencespace.rs | 8 +++++--- components/script/dom/xrspace.rs | 11 +++++++---- .../script/dom/xrstationaryreferencespace.rs | 14 ++++++++++---- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index 7d573a165c3..469086ec834 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -9,6 +9,7 @@ use crate::dom::bindings::root::{DomRoot, MutDom}; use crate::dom::dompointreadonly::DOMPointReadOnly; use crate::dom::window::Window; use crate::dom::xrrigidtransform::XRRigidTransform; +use crate::dom::xrsession::XRSession; use crate::dom::xrspace::XRSpace; use dom_struct::dom_struct; @@ -19,9 +20,9 @@ pub struct XRReferenceSpace { } impl XRReferenceSpace { - pub fn new_inherited(transform: &XRRigidTransform) -> XRReferenceSpace { + pub fn new_inherited(session: &XRSession, transform: &XRRigidTransform) -> XRReferenceSpace { XRReferenceSpace { - xrspace: XRSpace::new_inherited(), + xrspace: XRSpace::new_inherited(session), transform: MutDom::new(transform), } } @@ -29,12 +30,13 @@ impl XRReferenceSpace { #[allow(unused)] pub fn new( global: &Window, + session: &XRSession, position: &DOMPointReadOnly, orientation: &DOMPointReadOnly, ) -> DomRoot { let transform = XRRigidTransform::identity(global); reflect_dom_object( - Box::new(XRReferenceSpace::new_inherited(&transform)), + Box::new(XRReferenceSpace::new_inherited(session, &transform)), global, XRReferenceSpaceBinding::Wrap, ) diff --git a/components/script/dom/xrspace.rs b/components/script/dom/xrspace.rs index 00e20df2c22..e0d4ce75cf3 100644 --- a/components/script/dom/xrspace.rs +++ b/components/script/dom/xrspace.rs @@ -4,27 +4,30 @@ use crate::dom::bindings::codegen::Bindings::XRSpaceBinding; use crate::dom::bindings::reflector::reflect_dom_object; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; +use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; #[dom_struct] pub struct XRSpace { eventtarget: EventTarget, + session: Dom, } impl XRSpace { - pub fn new_inherited() -> XRSpace { + pub fn new_inherited(session: &XRSession) -> XRSpace { XRSpace { eventtarget: EventTarget::new_inherited(), + session: Dom::from_ref(session), } } #[allow(unused)] - pub fn new(global: &GlobalScope) -> DomRoot { + pub fn new(global: &GlobalScope, session: &XRSession) -> DomRoot { reflect_dom_object( - Box::new(XRSpace::new_inherited()), + Box::new(XRSpace::new_inherited(session)), global, XRSpaceBinding::Wrap, ) diff --git a/components/script/dom/xrstationaryreferencespace.rs b/components/script/dom/xrstationaryreferencespace.rs index bfb8b41aeb5..8ac897b5ad7 100644 --- a/components/script/dom/xrstationaryreferencespace.rs +++ b/components/script/dom/xrstationaryreferencespace.rs @@ -8,6 +8,7 @@ use crate::dom::bindings::root::DomRoot; use crate::dom::window::Window; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrrigidtransform::XRRigidTransform; +use crate::dom::xrsession::XRSession; use dom_struct::dom_struct; #[dom_struct] @@ -17,16 +18,21 @@ pub struct XRStationaryReferenceSpace { #[allow(unused)] impl XRStationaryReferenceSpace { - pub fn new_inherited(transform: &XRRigidTransform) -> XRStationaryReferenceSpace { + pub fn new_inherited( + session: &XRSession, + transform: &XRRigidTransform, + ) -> XRStationaryReferenceSpace { XRStationaryReferenceSpace { - xrreferencespace: XRReferenceSpace::new_inherited(transform), + xrreferencespace: XRReferenceSpace::new_inherited(session, transform), } } - pub fn new(window: &Window) -> DomRoot { + pub fn new(window: &Window, session: &XRSession) -> DomRoot { let transform = XRRigidTransform::identity(window); reflect_dom_object( - Box::new(XRStationaryReferenceSpace::new_inherited(&transform)), + Box::new(XRStationaryReferenceSpace::new_inherited( + session, &transform, + )), window, XRStationaryReferenceSpaceBinding::Wrap, ) From f2a6164a52bfa789c123e0fe6b94285688804c29 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Thu, 14 Mar 2019 16:23:18 -0700 Subject: [PATCH 5/8] Add XRReferenceSpace::identity --- components/script/dom/xrreferencespace.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index 469086ec834..a24ab48d0c1 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -34,6 +34,16 @@ impl XRReferenceSpace { position: &DOMPointReadOnly, orientation: &DOMPointReadOnly, ) -> DomRoot { + let transform = XRRigidTransform::new(global, position, orientation); + reflect_dom_object( + Box::new(XRReferenceSpace::new_inherited(session, &transform)), + global, + XRReferenceSpaceBinding::Wrap, + ) + } + + #[allow(unused)] + pub fn identity(global: &Window, session: &XRSession) -> DomRoot { let transform = XRRigidTransform::identity(global); reflect_dom_object( Box::new(XRReferenceSpace::new_inherited(session, &transform)), From 191fcf66cc59ef91eaf016b38188819d41b67259 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 15 Mar 2019 10:11:05 -0700 Subject: [PATCH 6/8] Add requestReferenceSpace --- .../dom/webidls/XRReferenceSpace.webidl | 10 ----- .../script/dom/webidls/XRSession.webidl | 15 ++++++- .../webidls/XRStationaryReferenceSpace.webidl | 4 -- components/script/dom/xrsession.rs | 41 +++++++++++++++++++ .../script/dom/xrstationaryreferencespace.rs | 12 +++++- 5 files changed, 64 insertions(+), 18 deletions(-) diff --git a/components/script/dom/webidls/XRReferenceSpace.webidl b/components/script/dom/webidls/XRReferenceSpace.webidl index 378a4e520ee..43236ea338c 100644 --- a/components/script/dom/webidls/XRReferenceSpace.webidl +++ b/components/script/dom/webidls/XRReferenceSpace.webidl @@ -4,16 +4,6 @@ // https://immersive-web.github.io/webxr/#xrreferencespace-interface -enum XRReferenceSpaceType { - "stationary", - "bounded", - "unbounded" -}; - -dictionary XRReferenceSpaceOptions { - required XRReferenceSpaceType type; -}; - [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRReferenceSpace : XRSpace { attribute XRRigidTransform originOffset; diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index a07fa355e6e..fa8d13b7cb3 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -24,8 +24,7 @@ interface XRSession : EventTarget { attribute XRLayer? baseLayer; // // Methods - // Promise requestReferenceSpace(XRReferenceSpaceType type, - // optional XRReferenceSpaceOptions options); + Promise requestReferenceSpace(XRReferenceSpaceOptions options); // FrozenArray getInputSources(); @@ -43,3 +42,15 @@ interface XRSession : EventTarget { // attribute EventHandler onselectstart; // attribute EventHandler onselectend; }; + +enum XRReferenceSpaceType { + "identity", + "stationary", + "bounded", + "unbounded" +}; + +dictionary XRReferenceSpaceOptions { + required XRReferenceSpaceType type; + XRStationaryReferenceSpaceSubtype subtype; +}; diff --git a/components/script/dom/webidls/XRStationaryReferenceSpace.webidl b/components/script/dom/webidls/XRStationaryReferenceSpace.webidl index 3580ac94602..b04100dac6d 100644 --- a/components/script/dom/webidls/XRStationaryReferenceSpace.webidl +++ b/components/script/dom/webidls/XRStationaryReferenceSpace.webidl @@ -10,10 +10,6 @@ enum XRStationaryReferenceSpaceSubtype { "position-disabled" }; -dictionary XRStationaryReferenceSpaceOptions : XRReferenceSpaceOptions { - required XRStationaryReferenceSpaceSubtype subtype; -}; - [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRStationaryReferenceSpace: XRReferenceSpace { // readonly attribute XRStationaryReferenceSpaceSubtype subtype; diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 997d88b34bf..4c8ac610a78 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -7,17 +7,23 @@ use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode; use crate::dom::bindings::codegen::Bindings::XRSessionBinding; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlendMode; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback; +use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRReferenceSpaceOptions; +use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRReferenceSpaceType; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods; +use crate::dom::bindings::error::Error; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom}; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; use crate::dom::vrdisplay::VRDisplay; use crate::dom::xrlayer::XRLayer; +use crate::dom::xrreferencespace::XRReferenceSpace; +use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use crate::dom::xrwebgllayer::XRWebGLLayer; use dom_struct::dom_struct; use std::rc::Rc; @@ -111,4 +117,39 @@ impl XRSessionMethods for XRSession { fn EnvironmentBlendMode(&self) -> XREnvironmentBlendMode { self.blend_mode } + + /// https://immersive-web.github.io/webxr/#dom-xrsession-requestreferencespace + fn RequestReferenceSpace(&self, options: &XRReferenceSpaceOptions) -> Rc { + let p = Promise::new(&self.global()); + + // https://immersive-web.github.io/webxr/#create-a-reference-space + + match options.type_ { + XRReferenceSpaceType::Identity => { + p.resolve_native(&XRReferenceSpace::identity( + &self.global().as_window(), + self, + )); + }, + XRReferenceSpaceType::Stationary => { + if let Some(subtype) = options.subtype { + p.resolve_native(&XRStationaryReferenceSpace::new( + &self.global().as_window(), + self, + subtype, + )); + } else { + p.reject_error(Error::Type(format!( + "stationary XRReferenceSpaces must specify a subtype" + ))) + } + }, + XRReferenceSpaceType::Bounded | XRReferenceSpaceType::Unbounded => { + // XXXManishearth eventually support these + p.reject_error(Error::NotSupported) + }, + } + + p + } } diff --git a/components/script/dom/xrstationaryreferencespace.rs b/components/script/dom/xrstationaryreferencespace.rs index 8ac897b5ad7..33d96f1488f 100644 --- a/components/script/dom/xrstationaryreferencespace.rs +++ b/components/script/dom/xrstationaryreferencespace.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::XRStationaryReferenceSpaceBinding; +use crate::dom::bindings::codegen::Bindings::XRStationaryReferenceSpaceBinding::XRStationaryReferenceSpaceSubtype; use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::root::DomRoot; use crate::dom::window::Window; @@ -14,24 +15,31 @@ use dom_struct::dom_struct; #[dom_struct] pub struct XRStationaryReferenceSpace { xrreferencespace: XRReferenceSpace, + ty: XRStationaryReferenceSpaceSubtype, } #[allow(unused)] impl XRStationaryReferenceSpace { pub fn new_inherited( session: &XRSession, + ty: XRStationaryReferenceSpaceSubtype, transform: &XRRigidTransform, ) -> XRStationaryReferenceSpace { XRStationaryReferenceSpace { xrreferencespace: XRReferenceSpace::new_inherited(session, transform), + ty, } } - pub fn new(window: &Window, session: &XRSession) -> DomRoot { + pub fn new( + window: &Window, + session: &XRSession, + ty: XRStationaryReferenceSpaceSubtype, + ) -> DomRoot { let transform = XRRigidTransform::identity(window); reflect_dom_object( Box::new(XRStationaryReferenceSpace::new_inherited( - session, &transform, + session, ty, &transform, )), window, XRStationaryReferenceSpaceBinding::Wrap, From a2c4270f558273f7d84d8901c4934b5c3b2960bd Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 15 Mar 2019 11:53:28 -0700 Subject: [PATCH 7/8] Cleanup XRFrame --- components/script/dom/xrframe.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index 8343bb76420..fc2aaa26091 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -58,10 +58,11 @@ impl XRFrameMethods for XRFrame { if reference.is_some() { // it's not possible to obtain a reference // space at all yet - return None; + None + } else { + let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data); + let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data); + Some(XRViewerPose::new(&self.global(), &left, &right)) } - let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data); - let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data); - Some(XRViewerPose::new(&self.global(), &left, &right)) } } From 22e5ce5ff3bee330cb8e934f99311b4f474ac241 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 18 Mar 2019 16:24:30 -0700 Subject: [PATCH 8/8] Improve getViewerPose() --- components/script/dom/webidls/XRFrame.webidl | 2 +- components/script/dom/xrframe.rs | 18 ++++++++++-------- components/script/dom/xrsession.rs | 3 +++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/components/script/dom/webidls/XRFrame.webidl b/components/script/dom/webidls/XRFrame.webidl index 6c40306755d..24f714fcb76 100644 --- a/components/script/dom/webidls/XRFrame.webidl +++ b/components/script/dom/webidls/XRFrame.webidl @@ -8,6 +8,6 @@ interface XRFrame { readonly attribute XRSession session; - XRViewerPose? getViewerPose(optional XRReferenceSpace referenceSpace); + XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); // XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace); }; diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index fc2aaa26091..b569f7d9e46 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -5,11 +5,13 @@ use crate::dom::bindings::codegen::Bindings::XRFrameBinding; use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods; use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrsession::XRSession; +use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use crate::dom::xrview::XRView; use crate::dom::xrviewerpose::XRViewerPose; use dom_struct::dom_struct; @@ -52,17 +54,17 @@ impl XRFrameMethods for XRFrame { } /// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose - fn GetViewerPose(&self, reference: Option<&XRReferenceSpace>) -> Option> { - // We assume the reference space is eye level for now - // since it's the only one 3DOF devices support - if reference.is_some() { - // it's not possible to obtain a reference - // space at all yet - None - } else { + fn GetViewerPose(&self, reference: &XRReferenceSpace) -> Option> { + if let Some(_) = reference.downcast::() { + // For 3DOF devices all three kinds of reference spaces are identical + // FIXME(#23070, Manishearth) support originOffset let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data); let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data); Some(XRViewerPose::new(&self.global(), &left, &right)) + } else { + // FIXME(#23070, Manishearth) support identity reference spaces + // depends on https://github.com/immersive-web/webxr/issues/565 + None } } } diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 4c8ac610a78..f756b0e5fa5 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -124,6 +124,9 @@ impl XRSessionMethods for XRSession { // https://immersive-web.github.io/webxr/#create-a-reference-space + // XXXManishearth reject based on session type + // https://github.com/immersive-web/webxr/blob/master/spatial-tracking-explainer.md#practical-usage-guidelines + match options.type_ { XRReferenceSpaceType::Identity => { p.resolve_native(&XRReferenceSpace::identity(