Update originOffset semantics

This commit is contained in:
Manish Goregaokar 2019-06-10 15:52:01 -07:00
parent 26e0aaca6c
commit 52b0d37bb7
2 changed files with 31 additions and 18 deletions

View file

@ -14,6 +14,6 @@ enum XRReferenceSpaceType {
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
interface XRReferenceSpace : XRSpace { interface XRReferenceSpace : XRSpace {
attribute XRRigidTransform originOffset; XRReferenceSpace getOffsetReferenceSpace(XRRigidTransform originOffset);
// attribute EventHandler onreset; // attribute EventHandler onreset;
}; };

View file

@ -5,8 +5,9 @@
use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding;
use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceMethods; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceMethods;
use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType;
use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::{DomRoot, MutDom}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::xrrigidtransform::XRRigidTransform; use crate::dom::xrrigidtransform::XRRigidTransform;
use crate::dom::xrsession::XRSession; use crate::dom::xrsession::XRSession;
@ -18,19 +19,19 @@ use webvr_traits::WebVRFrameData;
#[dom_struct] #[dom_struct]
pub struct XRReferenceSpace { pub struct XRReferenceSpace {
xrspace: XRSpace, xrspace: XRSpace,
transform: MutDom<XRRigidTransform>, offset: Dom<XRRigidTransform>,
ty: XRReferenceSpaceType, ty: XRReferenceSpaceType,
} }
impl XRReferenceSpace { impl XRReferenceSpace {
pub fn new_inherited( pub fn new_inherited(
session: &XRSession, session: &XRSession,
transform: &XRRigidTransform, offset: &XRRigidTransform,
ty: XRReferenceSpaceType, ty: XRReferenceSpaceType,
) -> XRReferenceSpace { ) -> XRReferenceSpace {
XRReferenceSpace { XRReferenceSpace {
xrspace: XRSpace::new_inherited(session), xrspace: XRSpace::new_inherited(session),
transform: MutDom::new(transform), offset: Dom::from_ref(offset),
ty, ty,
} }
} }
@ -41,9 +42,19 @@ impl XRReferenceSpace {
session: &XRSession, session: &XRSession,
ty: XRReferenceSpaceType, ty: XRReferenceSpaceType,
) -> DomRoot<XRReferenceSpace> { ) -> DomRoot<XRReferenceSpace> {
let transform = XRRigidTransform::identity(global); let offset = XRRigidTransform::identity(global);
Self::new_offset(global, session, ty, &offset)
}
#[allow(unused)]
pub fn new_offset(
global: &GlobalScope,
session: &XRSession,
ty: XRReferenceSpaceType,
offset: &XRRigidTransform,
) -> DomRoot<XRReferenceSpace> {
reflect_dom_object( reflect_dom_object(
Box::new(XRReferenceSpace::new_inherited(session, &transform, ty)), Box::new(XRReferenceSpace::new_inherited(session, &offset, ty)),
global, global,
XRReferenceSpaceBinding::Wrap, XRReferenceSpaceBinding::Wrap,
) )
@ -51,14 +62,16 @@ impl XRReferenceSpace {
} }
impl XRReferenceSpaceMethods for XRReferenceSpace { impl XRReferenceSpaceMethods for XRReferenceSpace {
/// https://immersive-web.github.io/webxr/#dom-xrreferencespace-originoffset /// https://immersive-web.github.io/webxr/#dom-xrreferencespace-getoffsetreferencespace
fn SetOriginOffset(&self, transform: &XRRigidTransform) { fn GetOffsetReferenceSpace(&self, new: &XRRigidTransform) -> DomRoot<Self> {
self.transform.set(transform); let offset = new.transform().pre_mul(&self.offset.transform());
} let offset = XRRigidTransform::new(&self.global(), offset);
Self::new_offset(
/// https://immersive-web.github.io/webxr/#dom-xrreferencespace-originoffset &self.global(),
fn OriginOffset(&self) -> DomRoot<XRRigidTransform> { self.upcast::<XRSpace>().session(),
self.transform.get() self.ty,
&offset,
)
} }
} }
@ -77,7 +90,7 @@ impl XRReferenceSpace {
// = (get_unoffset_pose(space) * offset).inverse() * get_pose(viewer_space) // = (get_unoffset_pose(space) * offset).inverse() * get_pose(viewer_space)
// = offset.inverse() * get_unoffset_pose(space).inverse() * get_pose(viewer_space) // = offset.inverse() * get_unoffset_pose(space).inverse() * get_pose(viewer_space)
// = offset.inverse() * get_unoffset_viewer_pose(space) // = offset.inverse() * get_unoffset_viewer_pose(space)
let offset = self.transform.get().transform(); let offset = self.offset.transform();
let inverse = offset.inverse(); let inverse = offset.inverse();
inverse.pre_mul(&pose) inverse.pre_mul(&pose)
} }
@ -128,7 +141,7 @@ impl XRReferenceSpace {
let pose = self.get_unoffset_pose(base_pose); let pose = self.get_unoffset_pose(base_pose);
// This may change, see https://github.com/immersive-web/webxr/issues/567 // This may change, see https://github.com/immersive-web/webxr/issues/567
let offset = self.transform.get().transform(); let offset = self.offset.transform();
offset.post_mul(&pose) offset.post_mul(&pose)
} }