Hook webxr data into XRFrame/XRView/XRSpace

This commit is contained in:
Manish Goregaokar 2019-07-08 17:17:13 -07:00
parent 104a712a28
commit 8780edb165
12 changed files with 110 additions and 106 deletions

View file

@ -10,14 +10,13 @@ use crate::dom::bindings::root::DomRoot;
use crate::dom::globalscope::GlobalScope;
use crate::dom::xrpose::XRPose;
use crate::dom::xrrigidtransform::XRRigidTransform;
use crate::dom::xrsession::XRSession;
use crate::dom::xrsession::{ApiRigidTransform, XRSession};
use crate::dom::xrview::XRView;
use dom_struct::dom_struct;
use euclid::RigidTransform3D;
use js::conversions::ToJSValConvertible;
use js::jsapi::{Heap, JSContext};
use js::jsval::{JSVal, UndefinedValue};
use webvr_traits::WebVRFrameData;
use webxr_api::Views;
#[dom_struct]
pub struct XRViewerPose {
@ -38,11 +37,18 @@ impl XRViewerPose {
pub fn new(
global: &GlobalScope,
session: &XRSession,
pose: RigidTransform3D<f64>,
data: &WebVRFrameData,
pose: ApiRigidTransform,
) -> DomRoot<XRViewerPose> {
let left = XRView::new(global, session, XREye::Left, &pose, &data);
let right = XRView::new(global, session, XREye::Right, &pose, &data);
rooted_vec!(let mut views);
session.with_session(|s| match s.views() {
Views::Mono(view) => {
views.push(XRView::new(global, session, &view, XREye::Unknown, &pose))
},
Views::Stereo(left, right) => {
views.push(XRView::new(global, session, &left, XREye::Left, &pose));
views.push(XRView::new(global, session, &right, XREye::Right, &pose));
},
});
let transform = XRRigidTransform::new(global, pose);
let pose = reflect_dom_object(
Box::new(XRViewerPose::new_inherited(&transform)),
@ -53,8 +59,7 @@ impl XRViewerPose {
unsafe {
let cx = global.get_cx();
rooted!(in(cx) let mut jsval = UndefinedValue());
let vec = vec![left, right];
vec.to_jsval(cx, jsval.handle_mut());
views.to_jsval(cx, jsval.handle_mut());
pose.views.set(jsval.get());
}