mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
Implement the changes to updating the render state from the WebXR Layers spec
This commit is contained in:
parent
bf7f4eae31
commit
31de34704d
1 changed files with 56 additions and 17 deletions
|
@ -602,12 +602,67 @@ impl XRSessionMethods for XRSession {
|
||||||
return Err(Error::InvalidState);
|
return Err(Error::InvalidState);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Add the checks in
|
|
||||||
// https://immersive-web.github.io/layers/#updaterenderstatechanges
|
// https://immersive-web.github.io/layers/#updaterenderstatechanges
|
||||||
|
// Step 1.
|
||||||
|
// TODO: support the `layers' feature.
|
||||||
|
let session_created_with_layers_enabled = false;
|
||||||
|
if init.baseLayer.is_some() {
|
||||||
|
if session_created_with_layers_enabled {
|
||||||
|
return Err(Error::NotSupported);
|
||||||
|
}
|
||||||
|
// https://github.com/immersive-web/layers/issues/189
|
||||||
|
if init.layers.is_some() {
|
||||||
|
return Err(Error::Type(String::from(
|
||||||
|
"Cannot set WebXR layers and baseLayer",
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(Some(ref layers)) = init.layers {
|
||||||
|
// Step 2
|
||||||
|
for layer in layers {
|
||||||
|
let count = layers
|
||||||
|
.iter()
|
||||||
|
.filter(|other| other.layer_id() == layer.layer_id())
|
||||||
|
.count();
|
||||||
|
if count > 1 {
|
||||||
|
return Err(Error::Type(String::from("Duplicate entry in WebXR layers")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3
|
||||||
|
for layer in layers {
|
||||||
|
if layer.session() != self {
|
||||||
|
return Err(Error::Type(String::from(
|
||||||
|
"Layer from different session in WebXR layers",
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4-5
|
||||||
let pending = self
|
let pending = self
|
||||||
.pending_render_state
|
.pending_render_state
|
||||||
.or_init(|| self.active_render_state.get().clone_object());
|
.or_init(|| self.active_render_state.get().clone_object());
|
||||||
|
|
||||||
|
// Step 6
|
||||||
|
if let Some(ref layers) = init.layers {
|
||||||
|
let layers = layers.as_deref().unwrap_or_default();
|
||||||
|
pending.set_base_layer(None);
|
||||||
|
pending.set_layers(layers.iter().map(|x| &**x).collect());
|
||||||
|
let layers = layers
|
||||||
|
.iter()
|
||||||
|
.filter_map(|layer| {
|
||||||
|
let context_id = WebXRContextId::from(layer.context_id());
|
||||||
|
let layer_id = layer.layer_id()?;
|
||||||
|
Some((context_id, layer_id))
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
self.session.borrow_mut().set_layers(layers);
|
||||||
|
}
|
||||||
|
|
||||||
|
// End of https://immersive-web.github.io/layers/#updaterenderstatechanges
|
||||||
|
|
||||||
if let Some(near) = init.depthNear {
|
if let Some(near) = init.depthNear {
|
||||||
let mut near = *near;
|
let mut near = *near;
|
||||||
// Step 8 from #apply-the-pending-render-state
|
// Step 8 from #apply-the-pending-render-state
|
||||||
|
@ -657,22 +712,6 @@ impl XRSessionMethods for XRSession {
|
||||||
.update_clip_planes(*pending.DepthNear() as f32, *pending.DepthFar() as f32);
|
.update_clip_planes(*pending.DepthNear() as f32, *pending.DepthFar() as f32);
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://immersive-web.github.io/layers/#updaterenderstatechanges
|
|
||||||
if let Some(ref layers) = init.layers {
|
|
||||||
let layers = layers.as_deref().unwrap_or_default();
|
|
||||||
pending.set_base_layer(None);
|
|
||||||
pending.set_layers(layers.iter().map(|x| &**x).collect());
|
|
||||||
let layers = layers
|
|
||||||
.iter()
|
|
||||||
.filter_map(|layer| {
|
|
||||||
let context_id = WebXRContextId::from(layer.context_id());
|
|
||||||
let layer_id = layer.layer_id()?;
|
|
||||||
Some((context_id, layer_id))
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
self.session.borrow_mut().set_layers(layers);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue