Skip to content

Commit

Permalink
Fill in updateRenderState() stubs
Browse files Browse the repository at this point in the history
  • Loading branch information
Manishearth committed Jul 11, 2019
1 parent d55ed42 commit c7ed437
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 10 deletions.
2 changes: 1 addition & 1 deletion components/script/dom/webidls/XRSession.webidl
Expand Up @@ -29,7 +29,7 @@ interface XRSession : EventTarget {
// FrozenArray<XRInputSource> getInputSources();
sequence<XRInputSource> getInputSources();

Promise<void> updateRenderState(optional XRRenderStateInit state);
void updateRenderState(optional XRRenderStateInit state);
long requestAnimationFrame(XRFrameRequestCallback callback);
void cancelAnimationFrame(long handle);

Expand Down
22 changes: 20 additions & 2 deletions components/script/dom/xrrenderstate.rs
Expand Up @@ -4,8 +4,7 @@

use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::{self, XRRenderStateMethods};
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::reflector::reflect_dom_object;
use crate::dom::bindings::reflector::Reflector;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::globalscope::GlobalScope;
use crate::dom::xrlayer::XRLayer;
Expand Down Expand Up @@ -47,6 +46,25 @@ impl XRRenderState {
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 {
Expand Down
41 changes: 34 additions & 7 deletions components/script/dom/xrsession.rs
Expand Up @@ -12,7 +12,7 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCal
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods;
use crate::dom::bindings::error::Error;
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::globalscope::GlobalScope;
use crate::dom::promise::Promise;
Expand All @@ -23,6 +23,7 @@ use crate::dom::xrrenderstate::XRRenderState;
use crate::dom::xrspace::XRSpace;
use dom_struct::dom_struct;
use euclid::Vector3D;
use std::cell::Cell;
use std::rc::Rc;
use webxr_api::Session;

Expand All @@ -34,23 +35,30 @@ pub struct XRSession {
viewer_space: MutNullableDom<XRSpace>,
#[ignore_malloc_size_of = "defined in webxr"]
session: Session,
frame_requested: Cell<bool>,
pending_render_state: MutNullableDom<XRRenderState>,
active_render_state: MutDom<XRRenderState>,
}

impl XRSession {
fn new_inherited(session: Session) -> XRSession {
fn new_inherited(session: Session, render_state: &XRRenderState) -> XRSession {
XRSession {
eventtarget: EventTarget::new_inherited(),
base_layer: Default::default(),
// we don't yet support any AR devices
blend_mode: XREnvironmentBlendMode::Opaque,
viewer_space: Default::default(),
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> {
let render_state = XRRenderState::new(global, 0.1, 1000.0, None);
reflect_dom_object(
Box::new(XRSession::new_inherited(session)),
Box::new(XRSession::new_inherited(session, &render_state)),
global,
XRSessionBinding::Wrap,
)
Expand All @@ -77,12 +85,31 @@ impl XRSessionMethods for XRSession {

// https://immersive-web.github.io/webxr/#dom-xrsession-renderstate
fn RenderState(&self) -> DomRoot<XRRenderState> {
unimplemented!()
self.active_render_state.get()
}

/// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe
fn UpdateRenderState(&self, init: &XRRenderStateInit, comp: InCompartment) -> Rc<Promise> {
unimplemented!()
/// https://immersive-web.github.io/webxr/#dom-xrsession-updaterenderstate
fn UpdateRenderState(&self, init: &XRRenderStateInit, _: InCompartment) {
// XXXManishearth various checks:
// If session’s ended value is true, throw an InvalidStateError and abort these steps
// If newState’s baseLayer's was created with an XRSession other than session,
// throw an InvalidStateError and abort these steps
// If newState’s 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
Expand Down

0 comments on commit c7ed437

Please sign in to comment.