Fill in updateRenderState() stubs

This commit is contained in:
Manish Goregaokar 2019-07-08 15:25:35 -07:00
parent d55ed4240c
commit c7ed4379e8
3 changed files with 55 additions and 10 deletions

View file

@ -29,7 +29,7 @@ interface XRSession : EventTarget {
// FrozenArray<XRInputSource> getInputSources(); // FrozenArray<XRInputSource> getInputSources();
sequence<XRInputSource> getInputSources(); sequence<XRInputSource> getInputSources();
Promise<void> updateRenderState(optional XRRenderStateInit state); void updateRenderState(optional XRRenderStateInit state);
long requestAnimationFrame(XRFrameRequestCallback callback); long requestAnimationFrame(XRFrameRequestCallback callback);
void cancelAnimationFrame(long handle); void cancelAnimationFrame(long handle);

View file

@ -4,8 +4,7 @@
use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::{self, XRRenderStateMethods}; use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::{self, XRRenderStateMethods};
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, DomObject, Reflector};
use crate::dom::bindings::reflector::Reflector;
use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::xrlayer::XRLayer; use crate::dom::xrlayer::XRLayer;
@ -47,6 +46,25 @@ impl XRRenderState {
XRRenderStateBinding::Wrap, XRRenderStateBinding::Wrap,
) )
} }
pub fn copy(&self) -> DomRoot<Self> {
XRRenderState::new(
&self.global(),
self.depth_near.get(),
self.depth_far.get(),
self.layer.get().as_ref().map(|x| &**x),
)
}
pub fn set_depth_near(&self, depth: f64) {
self.depth_near.set(depth)
}
pub fn set_depth_far(&self, depth: f64) {
self.depth_far.set(depth)
}
pub fn set_layer(&self, layer: Option<&XRLayer>) {
self.layer.set(layer)
}
} }
impl XRRenderStateMethods for XRRenderState { impl XRRenderStateMethods for XRRenderState {

View file

@ -12,7 +12,7 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCal
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods;
use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Error;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::root::{DomRoot, MutDom, 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;
@ -23,6 +23,7 @@ use crate::dom::xrrenderstate::XRRenderState;
use crate::dom::xrspace::XRSpace; use crate::dom::xrspace::XRSpace;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use euclid::Vector3D; use euclid::Vector3D;
use std::cell::Cell;
use std::rc::Rc; use std::rc::Rc;
use webxr_api::Session; use webxr_api::Session;
@ -34,10 +35,13 @@ pub struct XRSession {
viewer_space: MutNullableDom<XRSpace>, viewer_space: MutNullableDom<XRSpace>,
#[ignore_malloc_size_of = "defined in webxr"] #[ignore_malloc_size_of = "defined in webxr"]
session: Session, session: Session,
frame_requested: Cell<bool>,
pending_render_state: MutNullableDom<XRRenderState>,
active_render_state: MutDom<XRRenderState>,
} }
impl XRSession { impl XRSession {
fn new_inherited(session: Session) -> XRSession { fn new_inherited(session: Session, render_state: &XRRenderState) -> XRSession {
XRSession { XRSession {
eventtarget: EventTarget::new_inherited(), eventtarget: EventTarget::new_inherited(),
base_layer: Default::default(), base_layer: Default::default(),
@ -45,12 +49,16 @@ impl XRSession {
blend_mode: XREnvironmentBlendMode::Opaque, blend_mode: XREnvironmentBlendMode::Opaque,
viewer_space: Default::default(), viewer_space: Default::default(),
session, session,
frame_requested: Cell::new(false),
pending_render_state: MutNullableDom::new(None),
active_render_state: MutDom::new(render_state),
} }
} }
pub fn new(global: &GlobalScope, session: Session) -> DomRoot<XRSession> { pub fn new(global: &GlobalScope, session: Session) -> DomRoot<XRSession> {
let render_state = XRRenderState::new(global, 0.1, 1000.0, None);
reflect_dom_object( reflect_dom_object(
Box::new(XRSession::new_inherited(session)), Box::new(XRSession::new_inherited(session, &render_state)),
global, global,
XRSessionBinding::Wrap, XRSessionBinding::Wrap,
) )
@ -77,12 +85,31 @@ impl XRSessionMethods for XRSession {
// https://immersive-web.github.io/webxr/#dom-xrsession-renderstate // https://immersive-web.github.io/webxr/#dom-xrsession-renderstate
fn RenderState(&self) -> DomRoot<XRRenderState> { fn RenderState(&self) -> DomRoot<XRRenderState> {
unimplemented!() self.active_render_state.get()
} }
/// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe /// https://immersive-web.github.io/webxr/#dom-xrsession-updaterenderstate
fn UpdateRenderState(&self, init: &XRRenderStateInit, comp: InCompartment) -> Rc<Promise> { fn UpdateRenderState(&self, init: &XRRenderStateInit, _: InCompartment) {
unimplemented!() // XXXManishearth various checks:
// If sessions ended value is true, throw an InvalidStateError and abort these steps
// If newStates baseLayer's was created with an XRSession other than session,
// throw an InvalidStateError and abort these steps
// If newStates inlineVerticalFieldOfView is set and session is an
// immersive session, throw an InvalidStateError and abort these steps.
let pending = self
.pending_render_state
.or_init(|| self.active_render_state.get().copy());
if let Some(near) = init.depthNear {
pending.set_depth_near(*near);
}
if let Some(far) = init.depthFar {
pending.set_depth_far(*far);
}
if let Some(ref layer) = init.baseLayer {
pending.set_layer(Some(&layer))
}
// XXXManishearth handle inlineVerticalFieldOfView
} }
/// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe /// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe