diff options
-rw-r--r-- | components/script/dom/webidls/XRReferenceSpace.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/xrreferencespace.rs | 32 | ||||
-rw-r--r-- | components/script/dom/xrrigidtransform.rs | 12 | ||||
-rw-r--r-- | components/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<XRRigidTransform>, } 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<XRReferenceSpace> { + pub fn new( + global: &Window, + position: &DOMPointReadOnly, + orientation: &DOMPointReadOnly, + ) -> DomRoot<XRReferenceSpace> { + 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<XRRigidTransform> { + 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<XRRigidTransform> { + 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<XRStationaryReferenceSpace> { + pub fn new(window: &Window) -> DomRoot<XRStationaryReferenceSpace> { + let transform = XRRigidTransform::identity(window); reflect_dom_object( - Box::new(XRStationaryReferenceSpace::new_inherited()), - global, + Box::new(XRStationaryReferenceSpace::new_inherited(&transform)), + window, XRStationaryReferenceSpaceBinding::Wrap, ) } |