mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Fill in updateRenderState() stubs
This commit is contained in:
parent
d55ed4240c
commit
c7ed4379e8
3 changed files with 55 additions and 10 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 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
|
/// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue