diff --git a/Cargo.lock b/Cargo.lock index ac22c158761..a0a60f4a541 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#a098d39811ad73a070b578d62606aef169aef8e9" +source = "git+https://github.com/servo/webxr#48ce33668b2e6cd95507ee909ac02c160ae7bedc" dependencies = [ "bindgen", "euclid", @@ -6412,7 +6412,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#a098d39811ad73a070b578d62606aef169aef8e9" +source = "git+https://github.com/servo/webxr#48ce33668b2e6cd95507ee909ac02c160ae7bedc" dependencies = [ "euclid", "ipc-channel", diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index c62bd9b4283..1116407cf46 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -10,10 +10,10 @@ use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::xrrigidtransform::XRRigidTransform; -use crate::dom::xrsession::{cast_transform, ApiPose, ApiRigidTransform, ApiViewerPose, XRSession}; +use crate::dom::xrsession::{cast_transform, ApiPose, ApiViewerPose, XRSession}; use crate::dom::xrspace::XRSpace; use dom_struct::dom_struct; -use euclid::{RigidTransform3D, Vector3D}; +use euclid::RigidTransform3D; use webxr_api::Frame; #[dom_struct] @@ -96,7 +96,6 @@ impl XRReferenceSpace { /// /// Does not apply originOffset, use get_viewer_pose instead if you need it pub fn get_unoffset_viewer_pose(&self, base_pose: &Frame) -> Option { - let viewer_pose: ApiViewerPose = cast_transform(base_pose.transform?); // all math is in column-vector notation // we use the following equation to verify correctness here: // get_viewer_pose(space) = get_pose(space).inverse() * get_pose(viewer_space) @@ -105,20 +104,22 @@ impl XRReferenceSpace { // get_viewer_pose(eye_level) = get_pose(eye_level).inverse() * get_pose(viewer_space) // = I * viewer_pose // = viewer_pose + let viewer_pose: ApiViewerPose = cast_transform(base_pose.transform?); // we get viewer poses in eye-level space by default Some(viewer_pose) }, XRReferenceSpaceType::Local_floor => { - // XXXManishearth support getting floor info from stage parameters - // get_viewer_pose(floor_level) = get_pose(floor_level).inverse() * get_pose(viewer_space) - // = Translate(-2).inverse() * viewer_pose - // = Translate(2) * viewer_pose + // = floor_to_native.inverse() * viewer_pose + // = native_to_floor * viewer_pose + let viewer_pose = base_pose.transform?; + let native_to_floor = self + .upcast::() + .session() + .with_session(|s| s.floor_transform())?; - // assume approximate user height of 2 meters - let floor_to_eye: ApiRigidTransform = Vector3D::new(0., 2., 0.).into(); - Some(floor_to_eye.pre_transform(&viewer_pose)) + Some(cast_transform(native_to_floor.pre_transform(&viewer_pose))) }, XRReferenceSpaceType::Viewer => { // This reference space follows the viewer around, so the viewer is @@ -155,11 +156,11 @@ impl XRReferenceSpace { Some(RigidTransform3D::identity()) }, XRReferenceSpaceType::Local_floor => { - // XXXManishearth support getting floor info from stage parameters - - // Assume approximate height of 2m - // the floor-level space is 2m below the eye-level space, which is (0, 0, 0) - Some(Vector3D::new(0., -2., 0.).into()) + let native_to_floor = self + .upcast::() + .session() + .with_session(|s| s.floor_transform())?; + Some(cast_transform(native_to_floor.inverse())) }, XRReferenceSpaceType::Viewer => base_pose.transform.map(cast_transform), _ => unimplemented!(),