mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #23055 - Manishearth:xrspace, r=asajeffrey
Some XRSpace improvements Proper XRSpace support is blocked on https://github.com/immersive-web/webxr/issues/565 , but in the meantime this improves XRSpace support a little bit, preparing both for support in getViewerPose and getPose as well as handling input spaces eventually. r? @jdm <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23055) <!-- Reviewable:end -->
This commit is contained in:
commit
e58226814f
12 changed files with 206 additions and 53 deletions
|
@ -2,6 +2,7 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit;
|
||||||
use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::{
|
use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::{
|
||||||
DOMPointReadOnlyMethods, Wrap,
|
DOMPointReadOnlyMethods, Wrap,
|
||||||
};
|
};
|
||||||
|
@ -50,6 +51,10 @@ impl DOMPointReadOnly {
|
||||||
) -> Fallible<DomRoot<DOMPointReadOnly>> {
|
) -> Fallible<DomRoot<DOMPointReadOnly>> {
|
||||||
Ok(DOMPointReadOnly::new(global, x, y, z, w))
|
Ok(DOMPointReadOnly::new(global, x, y, z, w))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_from_init(global: &GlobalScope, p: &DOMPointInit) -> DomRoot<DOMPointReadOnly> {
|
||||||
|
DOMPointReadOnly::new(global, p.x, p.y, p.z, p.w)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DOMPointReadOnlyMethods for DOMPointReadOnly {
|
impl DOMPointReadOnlyMethods for DOMPointReadOnly {
|
||||||
|
|
|
@ -8,6 +8,6 @@
|
||||||
interface XRFrame {
|
interface XRFrame {
|
||||||
readonly attribute XRSession session;
|
readonly attribute XRSession session;
|
||||||
|
|
||||||
XRViewerPose? getViewerPose(optional XRReferenceSpace referenceSpace);
|
XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
|
||||||
// XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace);
|
// XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace);
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,18 +4,8 @@
|
||||||
|
|
||||||
// https://immersive-web.github.io/webxr/#xrreferencespace-interface
|
// https://immersive-web.github.io/webxr/#xrreferencespace-interface
|
||||||
|
|
||||||
enum XRReferenceSpaceType {
|
|
||||||
"stationary",
|
|
||||||
"bounded",
|
|
||||||
"unbounded"
|
|
||||||
};
|
|
||||||
|
|
||||||
dictionary XRReferenceSpaceOptions {
|
|
||||||
required XRReferenceSpaceType type;
|
|
||||||
};
|
|
||||||
|
|
||||||
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
|
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
|
||||||
interface XRReferenceSpace : XRSpace {
|
interface XRReferenceSpace : XRSpace {
|
||||||
// attribute XRRigidTransform originOffset;
|
attribute XRRigidTransform originOffset;
|
||||||
// attribute EventHandler onreset;
|
// attribute EventHandler onreset;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
|
|
||||||
// https://immersive-web.github.io/webxr/#xrrigidtransform-interface
|
// https://immersive-web.github.io/webxr/#xrrigidtransform-interface
|
||||||
|
|
||||||
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
|
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled",
|
||||||
// [Constructor(optional DOMPointInit position, optional DOMPointInit orientation)]
|
Constructor(optional DOMPointInit position, optional DOMPointInit orientation)]
|
||||||
interface XRRigidTransform {
|
interface XRRigidTransform {
|
||||||
// readonly attribute DOMPointReadOnly position;
|
readonly attribute DOMPointReadOnly position;
|
||||||
// readonly attribute DOMPointReadOnly orientation;
|
readonly attribute DOMPointReadOnly orientation;
|
||||||
// readonly attribute Float32Array matrix;
|
// readonly attribute Float32Array matrix;
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,8 +24,7 @@ interface XRSession : EventTarget {
|
||||||
attribute XRLayer? baseLayer;
|
attribute XRLayer? baseLayer;
|
||||||
|
|
||||||
// // Methods
|
// // Methods
|
||||||
// Promise<XRReferenceSpace> requestReferenceSpace(XRReferenceSpaceType type,
|
Promise<XRReferenceSpace> requestReferenceSpace(XRReferenceSpaceOptions options);
|
||||||
// optional XRReferenceSpaceOptions options);
|
|
||||||
|
|
||||||
// FrozenArray<XRInputSource> getInputSources();
|
// FrozenArray<XRInputSource> getInputSources();
|
||||||
|
|
||||||
|
@ -43,3 +42,15 @@ interface XRSession : EventTarget {
|
||||||
// attribute EventHandler onselectstart;
|
// attribute EventHandler onselectstart;
|
||||||
// attribute EventHandler onselectend;
|
// attribute EventHandler onselectend;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum XRReferenceSpaceType {
|
||||||
|
"identity",
|
||||||
|
"stationary",
|
||||||
|
"bounded",
|
||||||
|
"unbounded"
|
||||||
|
};
|
||||||
|
|
||||||
|
dictionary XRReferenceSpaceOptions {
|
||||||
|
required XRReferenceSpaceType type;
|
||||||
|
XRStationaryReferenceSpaceSubtype subtype;
|
||||||
|
};
|
||||||
|
|
|
@ -10,10 +10,6 @@ enum XRStationaryReferenceSpaceSubtype {
|
||||||
"position-disabled"
|
"position-disabled"
|
||||||
};
|
};
|
||||||
|
|
||||||
dictionary XRStationaryReferenceSpaceOptions : XRReferenceSpaceOptions {
|
|
||||||
required XRStationaryReferenceSpaceSubtype subtype;
|
|
||||||
};
|
|
||||||
|
|
||||||
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
|
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
|
||||||
interface XRStationaryReferenceSpace: XRReferenceSpace {
|
interface XRStationaryReferenceSpace: XRReferenceSpace {
|
||||||
// readonly attribute XRStationaryReferenceSpaceSubtype subtype;
|
// readonly attribute XRStationaryReferenceSpaceSubtype subtype;
|
||||||
|
|
|
@ -5,11 +5,13 @@
|
||||||
use crate::dom::bindings::codegen::Bindings::XRFrameBinding;
|
use crate::dom::bindings::codegen::Bindings::XRFrameBinding;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods;
|
use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye;
|
use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye;
|
||||||
|
use crate::dom::bindings::inheritance::Castable;
|
||||||
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
||||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::xrreferencespace::XRReferenceSpace;
|
use crate::dom::xrreferencespace::XRReferenceSpace;
|
||||||
use crate::dom::xrsession::XRSession;
|
use crate::dom::xrsession::XRSession;
|
||||||
|
use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace;
|
||||||
use crate::dom::xrview::XRView;
|
use crate::dom::xrview::XRView;
|
||||||
use crate::dom::xrviewerpose::XRViewerPose;
|
use crate::dom::xrviewerpose::XRViewerPose;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
@ -52,16 +54,17 @@ impl XRFrameMethods for XRFrame {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose
|
/// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose
|
||||||
fn GetViewerPose(&self, reference: Option<&XRReferenceSpace>) -> Option<DomRoot<XRViewerPose>> {
|
fn GetViewerPose(&self, reference: &XRReferenceSpace) -> Option<DomRoot<XRViewerPose>> {
|
||||||
// We assume the reference space is eye level for now
|
if let Some(_) = reference.downcast::<XRStationaryReferenceSpace>() {
|
||||||
// since it's the only one 3DOF devices support
|
// For 3DOF devices all three kinds of reference spaces are identical
|
||||||
if reference.is_some() {
|
// FIXME(#23070, Manishearth) support originOffset
|
||||||
// it's not possible to obtain a reference
|
let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data);
|
||||||
// space at all yet
|
let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data);
|
||||||
return None;
|
Some(XRViewerPose::new(&self.global(), &left, &right))
|
||||||
|
} else {
|
||||||
|
// FIXME(#23070, Manishearth) support identity reference spaces
|
||||||
|
// depends on https://github.com/immersive-web/webxr/issues/565
|
||||||
|
None
|
||||||
}
|
}
|
||||||
let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data);
|
|
||||||
let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data);
|
|
||||||
Some(XRViewerPose::new(&self.global(), &left, &right))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,30 +3,64 @@
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* 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;
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceMethods;
|
||||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||||
use crate::dom::bindings::root::DomRoot;
|
use crate::dom::bindings::root::{DomRoot, MutDom};
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::dompointreadonly::DOMPointReadOnly;
|
||||||
|
use crate::dom::window::Window;
|
||||||
|
use crate::dom::xrrigidtransform::XRRigidTransform;
|
||||||
|
use crate::dom::xrsession::XRSession;
|
||||||
use crate::dom::xrspace::XRSpace;
|
use crate::dom::xrspace::XRSpace;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct XRReferenceSpace {
|
pub struct XRReferenceSpace {
|
||||||
xrspace: XRSpace,
|
xrspace: XRSpace,
|
||||||
|
transform: MutDom<XRRigidTransform>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XRReferenceSpace {
|
impl XRReferenceSpace {
|
||||||
pub fn new_inherited() -> XRReferenceSpace {
|
pub fn new_inherited(session: &XRSession, transform: &XRRigidTransform) -> XRReferenceSpace {
|
||||||
XRReferenceSpace {
|
XRReferenceSpace {
|
||||||
xrspace: XRSpace::new_inherited(),
|
xrspace: XRSpace::new_inherited(session),
|
||||||
|
transform: MutDom::new(transform),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub fn new(global: &GlobalScope) -> DomRoot<XRReferenceSpace> {
|
pub fn new(
|
||||||
|
global: &Window,
|
||||||
|
session: &XRSession,
|
||||||
|
position: &DOMPointReadOnly,
|
||||||
|
orientation: &DOMPointReadOnly,
|
||||||
|
) -> DomRoot<XRReferenceSpace> {
|
||||||
|
let transform = XRRigidTransform::new(global, position, orientation);
|
||||||
reflect_dom_object(
|
reflect_dom_object(
|
||||||
Box::new(XRReferenceSpace::new_inherited()),
|
Box::new(XRReferenceSpace::new_inherited(session, &transform)),
|
||||||
|
global,
|
||||||
|
XRReferenceSpaceBinding::Wrap,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
pub fn identity(global: &Window, session: &XRSession) -> DomRoot<XRReferenceSpace> {
|
||||||
|
let transform = XRRigidTransform::identity(global);
|
||||||
|
reflect_dom_object(
|
||||||
|
Box::new(XRReferenceSpace::new_inherited(session, &transform)),
|
||||||
global,
|
global,
|
||||||
XRReferenceSpaceBinding::Wrap,
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2,30 +2,81 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding;
|
use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding;
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRRigidTransformBinding::XRRigidTransformMethods;
|
||||||
|
use crate::dom::bindings::error::Fallible;
|
||||||
|
use crate::dom::bindings::reflector::DomObject;
|
||||||
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
||||||
use crate::dom::bindings::root::DomRoot;
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::dompointreadonly::DOMPointReadOnly;
|
||||||
|
use crate::dom::window::Window;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct XRRigidTransform {
|
pub struct XRRigidTransform {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
|
position: Dom<DOMPointReadOnly>,
|
||||||
|
orientation: Dom<DOMPointReadOnly>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XRRigidTransform {
|
impl XRRigidTransform {
|
||||||
fn new_inherited() -> XRRigidTransform {
|
fn new_inherited(
|
||||||
|
position: &DOMPointReadOnly,
|
||||||
|
orientation: &DOMPointReadOnly,
|
||||||
|
) -> XRRigidTransform {
|
||||||
XRRigidTransform {
|
XRRigidTransform {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
|
position: Dom::from_ref(position),
|
||||||
|
orientation: Dom::from_ref(orientation),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub fn new(global: &GlobalScope) -> DomRoot<XRRigidTransform> {
|
pub fn new(
|
||||||
|
global: &Window,
|
||||||
|
position: &DOMPointReadOnly,
|
||||||
|
orientation: &DOMPointReadOnly,
|
||||||
|
) -> DomRoot<XRRigidTransform> {
|
||||||
reflect_dom_object(
|
reflect_dom_object(
|
||||||
Box::new(XRRigidTransform::new_inherited()),
|
Box::new(XRRigidTransform::new_inherited(position, orientation)),
|
||||||
global,
|
global,
|
||||||
XRRigidTransformBinding::Wrap,
|
XRRigidTransformBinding::Wrap,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[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,
|
||||||
|
position: &DOMPointInit,
|
||||||
|
orientation: &DOMPointInit,
|
||||||
|
) -> Fallible<DomRoot<Self>> {
|
||||||
|
let global = window.global();
|
||||||
|
let position = DOMPointReadOnly::new_from_init(&global, &position);
|
||||||
|
let orientation = DOMPointReadOnly::new_from_init(&global, &orientation);
|
||||||
|
Ok(XRRigidTransform::new(window, &position, &orientation))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl XRRigidTransformMethods for XRRigidTransform {
|
||||||
|
// https://immersive-web.github.io/webxr/#dom-xrrigidtransform-position
|
||||||
|
fn Position(&self) -> DomRoot<DOMPointReadOnly> {
|
||||||
|
DomRoot::from_ref(&self.position)
|
||||||
|
}
|
||||||
|
// https://immersive-web.github.io/webxr/#dom-xrrigidtransform-orientation
|
||||||
|
fn Orientation(&self) -> DomRoot<DOMPointReadOnly> {
|
||||||
|
DomRoot::from_ref(&self.orientation)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,17 +7,23 @@ use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRSessionBinding;
|
use crate::dom::bindings::codegen::Bindings::XRSessionBinding;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlendMode;
|
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlendMode;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback;
|
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback;
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRReferenceSpaceOptions;
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRReferenceSpaceType;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods;
|
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods;
|
use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods;
|
||||||
|
use crate::dom::bindings::error::Error;
|
||||||
use crate::dom::bindings::inheritance::Castable;
|
use crate::dom::bindings::inheritance::Castable;
|
||||||
use crate::dom::bindings::num::Finite;
|
use crate::dom::bindings::num::Finite;
|
||||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||||
|
use crate::dom::bindings::reflector::DomObject;
|
||||||
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
|
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
|
||||||
use crate::dom::eventtarget::EventTarget;
|
use crate::dom::eventtarget::EventTarget;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::promise::Promise;
|
use crate::dom::promise::Promise;
|
||||||
use crate::dom::vrdisplay::VRDisplay;
|
use crate::dom::vrdisplay::VRDisplay;
|
||||||
use crate::dom::xrlayer::XRLayer;
|
use crate::dom::xrlayer::XRLayer;
|
||||||
|
use crate::dom::xrreferencespace::XRReferenceSpace;
|
||||||
|
use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace;
|
||||||
use crate::dom::xrwebgllayer::XRWebGLLayer;
|
use crate::dom::xrwebgllayer::XRWebGLLayer;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
@ -111,4 +117,42 @@ impl XRSessionMethods for XRSession {
|
||||||
fn EnvironmentBlendMode(&self) -> XREnvironmentBlendMode {
|
fn EnvironmentBlendMode(&self) -> XREnvironmentBlendMode {
|
||||||
self.blend_mode
|
self.blend_mode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// https://immersive-web.github.io/webxr/#dom-xrsession-requestreferencespace
|
||||||
|
fn RequestReferenceSpace(&self, options: &XRReferenceSpaceOptions) -> Rc<Promise> {
|
||||||
|
let p = Promise::new(&self.global());
|
||||||
|
|
||||||
|
// https://immersive-web.github.io/webxr/#create-a-reference-space
|
||||||
|
|
||||||
|
// XXXManishearth reject based on session type
|
||||||
|
// https://github.com/immersive-web/webxr/blob/master/spatial-tracking-explainer.md#practical-usage-guidelines
|
||||||
|
|
||||||
|
match options.type_ {
|
||||||
|
XRReferenceSpaceType::Identity => {
|
||||||
|
p.resolve_native(&XRReferenceSpace::identity(
|
||||||
|
&self.global().as_window(),
|
||||||
|
self,
|
||||||
|
));
|
||||||
|
},
|
||||||
|
XRReferenceSpaceType::Stationary => {
|
||||||
|
if let Some(subtype) = options.subtype {
|
||||||
|
p.resolve_native(&XRStationaryReferenceSpace::new(
|
||||||
|
&self.global().as_window(),
|
||||||
|
self,
|
||||||
|
subtype,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
p.reject_error(Error::Type(format!(
|
||||||
|
"stationary XRReferenceSpaces must specify a subtype"
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
XRReferenceSpaceType::Bounded | XRReferenceSpaceType::Unbounded => {
|
||||||
|
// XXXManishearth eventually support these
|
||||||
|
p.reject_error(Error::NotSupported)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
p
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,27 +4,30 @@
|
||||||
|
|
||||||
use crate::dom::bindings::codegen::Bindings::XRSpaceBinding;
|
use crate::dom::bindings::codegen::Bindings::XRSpaceBinding;
|
||||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||||
use crate::dom::bindings::root::DomRoot;
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
use crate::dom::eventtarget::EventTarget;
|
use crate::dom::eventtarget::EventTarget;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
|
use crate::dom::xrsession::XRSession;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct XRSpace {
|
pub struct XRSpace {
|
||||||
eventtarget: EventTarget,
|
eventtarget: EventTarget,
|
||||||
|
session: Dom<XRSession>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XRSpace {
|
impl XRSpace {
|
||||||
pub fn new_inherited() -> XRSpace {
|
pub fn new_inherited(session: &XRSession) -> XRSpace {
|
||||||
XRSpace {
|
XRSpace {
|
||||||
eventtarget: EventTarget::new_inherited(),
|
eventtarget: EventTarget::new_inherited(),
|
||||||
|
session: Dom::from_ref(session),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub fn new(global: &GlobalScope) -> DomRoot<XRSpace> {
|
pub fn new(global: &GlobalScope, session: &XRSession) -> DomRoot<XRSpace> {
|
||||||
reflect_dom_object(
|
reflect_dom_object(
|
||||||
Box::new(XRSpace::new_inherited()),
|
Box::new(XRSpace::new_inherited(session)),
|
||||||
global,
|
global,
|
||||||
XRSpaceBinding::Wrap,
|
XRSpaceBinding::Wrap,
|
||||||
)
|
)
|
||||||
|
|
|
@ -3,29 +3,45 @@
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use crate::dom::bindings::codegen::Bindings::XRStationaryReferenceSpaceBinding;
|
use crate::dom::bindings::codegen::Bindings::XRStationaryReferenceSpaceBinding;
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRStationaryReferenceSpaceBinding::XRStationaryReferenceSpaceSubtype;
|
||||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||||
use crate::dom::bindings::root::DomRoot;
|
use crate::dom::bindings::root::DomRoot;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::window::Window;
|
||||||
use crate::dom::xrreferencespace::XRReferenceSpace;
|
use crate::dom::xrreferencespace::XRReferenceSpace;
|
||||||
|
use crate::dom::xrrigidtransform::XRRigidTransform;
|
||||||
|
use crate::dom::xrsession::XRSession;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct XRStationaryReferenceSpace {
|
pub struct XRStationaryReferenceSpace {
|
||||||
xrreferencespace: XRReferenceSpace,
|
xrreferencespace: XRReferenceSpace,
|
||||||
|
ty: XRStationaryReferenceSpaceSubtype,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
impl XRStationaryReferenceSpace {
|
impl XRStationaryReferenceSpace {
|
||||||
pub fn new_inherited() -> XRStationaryReferenceSpace {
|
pub fn new_inherited(
|
||||||
|
session: &XRSession,
|
||||||
|
ty: XRStationaryReferenceSpaceSubtype,
|
||||||
|
transform: &XRRigidTransform,
|
||||||
|
) -> XRStationaryReferenceSpace {
|
||||||
XRStationaryReferenceSpace {
|
XRStationaryReferenceSpace {
|
||||||
xrreferencespace: XRReferenceSpace::new_inherited(),
|
xrreferencespace: XRReferenceSpace::new_inherited(session, transform),
|
||||||
|
ty,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(global: &GlobalScope) -> DomRoot<XRStationaryReferenceSpace> {
|
pub fn new(
|
||||||
|
window: &Window,
|
||||||
|
session: &XRSession,
|
||||||
|
ty: XRStationaryReferenceSpaceSubtype,
|
||||||
|
) -> DomRoot<XRStationaryReferenceSpace> {
|
||||||
|
let transform = XRRigidTransform::identity(window);
|
||||||
reflect_dom_object(
|
reflect_dom_object(
|
||||||
Box::new(XRStationaryReferenceSpace::new_inherited()),
|
Box::new(XRStationaryReferenceSpace::new_inherited(
|
||||||
global,
|
session, ty, &transform,
|
||||||
|
)),
|
||||||
|
window,
|
||||||
XRStationaryReferenceSpaceBinding::Wrap,
|
XRStationaryReferenceSpaceBinding::Wrap,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue