mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Add requestReferenceSpace
This commit is contained in:
parent
f2a6164a52
commit
191fcf66cc
5 changed files with 64 additions and 18 deletions
|
@ -4,16 +4,6 @@
|
||||||
|
|
||||||
// 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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,39 @@ 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
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* 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::window::Window;
|
use crate::dom::window::Window;
|
||||||
|
@ -14,24 +15,31 @@ 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(
|
pub fn new_inherited(
|
||||||
session: &XRSession,
|
session: &XRSession,
|
||||||
|
ty: XRStationaryReferenceSpaceSubtype,
|
||||||
transform: &XRRigidTransform,
|
transform: &XRRigidTransform,
|
||||||
) -> XRStationaryReferenceSpace {
|
) -> XRStationaryReferenceSpace {
|
||||||
XRStationaryReferenceSpace {
|
XRStationaryReferenceSpace {
|
||||||
xrreferencespace: XRReferenceSpace::new_inherited(session, transform),
|
xrreferencespace: XRReferenceSpace::new_inherited(session, transform),
|
||||||
|
ty,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(window: &Window, session: &XRSession) -> DomRoot<XRStationaryReferenceSpace> {
|
pub fn new(
|
||||||
|
window: &Window,
|
||||||
|
session: &XRSession,
|
||||||
|
ty: XRStationaryReferenceSpaceSubtype,
|
||||||
|
) -> DomRoot<XRStationaryReferenceSpace> {
|
||||||
let transform = XRRigidTransform::identity(window);
|
let transform = XRRigidTransform::identity(window);
|
||||||
reflect_dom_object(
|
reflect_dom_object(
|
||||||
Box::new(XRStationaryReferenceSpace::new_inherited(
|
Box::new(XRStationaryReferenceSpace::new_inherited(
|
||||||
session, &transform,
|
session, ty, &transform,
|
||||||
)),
|
)),
|
||||||
window,
|
window,
|
||||||
XRStationaryReferenceSpaceBinding::Wrap,
|
XRStationaryReferenceSpaceBinding::Wrap,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue