From 4b930b9e305ff67f26f19cb8bd70430a1d4fff1c Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 29 May 2019 15:59:27 -0700 Subject: [PATCH] Add FakeXRDeviceController.setViews() --- .../script/dom/fakexrdevicecontroller.rs | 58 ++++++++++++++++++- .../dom/webidls/FakeXRDeviceController.webidl | 2 +- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/components/script/dom/fakexrdevicecontroller.rs b/components/script/dom/fakexrdevicecontroller.rs index 181de822fc7..f690a1bcc43 100644 --- a/components/script/dom/fakexrdevicecontroller.rs +++ b/components/script/dom/fakexrdevicecontroller.rs @@ -6,11 +6,16 @@ * 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::FakeXRDeviceControllerBinding; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::codegen::Bindings::FakeXRDeviceControllerBinding::{ + self, FakeXRDeviceControllerMethods, FakeXRViewInit, +}; +use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; +use crate::dom::bindings::error::{Error, Fallible}; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::globalscope::GlobalScope; use dom_struct::dom_struct; +use webvr_traits::{MockVRControlMsg, WebVREyeParameters, WebVRMsg}; #[dom_struct] pub struct FakeXRDeviceController { @@ -31,4 +36,53 @@ impl FakeXRDeviceController { FakeXRDeviceControllerBinding::Wrap, ) } + + pub fn send_msg(&self, msg: MockVRControlMsg) { + self.global() + .as_window() + .webvr_thread() + .unwrap() + .send(WebVRMsg::MessageMockDisplay(msg)); + } +} + +impl FakeXRDeviceControllerMethods for FakeXRDeviceController { + // check-tidy: no specs after this line + fn SetViews(&self, views: Vec) -> Fallible<()> { + if views.len() != 2 { + return Err(Error::NotSupported); + } + + let (left, right) = match (views[0].eye, views[1].eye) { + (XREye::Left, XREye::Right) => (&views[0], &views[1]), + (XREye::Right, XREye::Left) => (&views[1], &views[0]), + _ => return Err(Error::NotSupported), + }; + + if left.projectionMatrix.len() != 16 || + right.projectionMatrix.len() != 16 || + left.viewOffset.position.len() != 4 || + right.viewOffset.position.len() != 4 + { + return Err(Error::Type("Incorrectly sized matrix".into())); + } + + let mut proj_l = [0.; 16]; + let mut proj_r = [0.; 16]; + let v: Vec<_> = left.projectionMatrix.iter().map(|x| **x).collect(); + proj_l.copy_from_slice(&v); + let v: Vec<_> = right.projectionMatrix.iter().map(|x| **x).collect(); + proj_r.copy_from_slice(&v); + + let mut params_l = WebVREyeParameters::default(); + let mut params_r = WebVREyeParameters::default(); + let v: Vec<_> = left.viewOffset.position.iter().map(|x| **x).collect(); + params_l.offset.copy_from_slice(&v); + let v: Vec<_> = right.viewOffset.position.iter().map(|x| **x).collect(); + params_r.offset.copy_from_slice(&v); + + self.send_msg(MockVRControlMsg::SetProjectionMatrices(proj_l, proj_r)); + self.send_msg(MockVRControlMsg::SetEyeParameters(params_l, params_r)); + Ok(()) + } } diff --git a/components/script/dom/webidls/FakeXRDeviceController.webidl b/components/script/dom/webidls/FakeXRDeviceController.webidl index dbeb93428d7..723088096a0 100644 --- a/components/script/dom/webidls/FakeXRDeviceController.webidl +++ b/components/script/dom/webidls/FakeXRDeviceController.webidl @@ -11,7 +11,7 @@ interface FakeXRDeviceController { // // Sets the values to be used for subsequent // // requestAnimationFrame() callbacks. - // void setViews(Array views); + [Throws] void setViews(sequence views); // void setViewerOrigin(FakeXRRigidTransform origin);