mirror of
https://github.com/servo/servo.git
synced 2025-07-23 23:33:43 +01:00
webxr: Update XRView to latest spec (#33145)
* Add recommendedViewportScale and requestViewportScale Signed-off-by: Daniel Adams <msub2official@gmail.com> * Remove currently unused internal slots Signed-off-by: Daniel Adams <msub2official@gmail.com> --------- Signed-off-by: Daniel Adams <msub2official@gmail.com>
This commit is contained in:
parent
75b817cca3
commit
8e224cb4d3
7 changed files with 47 additions and 194 deletions
|
@ -14,7 +14,10 @@ enum XREye {
|
|||
interface XRView {
|
||||
readonly attribute XREye eye;
|
||||
readonly attribute Float32Array projectionMatrix;
|
||||
readonly attribute XRRigidTransform transform;
|
||||
[SameObject] readonly attribute XRRigidTransform transform;
|
||||
readonly attribute double? recommendedViewportScale;
|
||||
|
||||
undefined requestViewportScale(double? scale);
|
||||
|
||||
// AR Module
|
||||
readonly attribute boolean isFirstPersonObserver;
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use std::cell::Cell;
|
||||
|
||||
use dom_struct::dom_struct;
|
||||
use euclid::RigidTransform3D;
|
||||
use js::typedarray::{Float32, Float32Array};
|
||||
|
@ -9,6 +11,7 @@ use webxr_api::{ApiSpace, View};
|
|||
|
||||
use super::bindings::buffer_source::HeapBufferSource;
|
||||
use crate::dom::bindings::codegen::Bindings::XRViewBinding::{XREye, XRViewMethods};
|
||||
use crate::dom::bindings::num::Finite;
|
||||
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||
use crate::dom::globalscope::GlobalScope;
|
||||
|
@ -28,6 +31,7 @@ pub struct XRView {
|
|||
#[no_trace]
|
||||
view: View<ApiSpace>,
|
||||
transform: Dom<XRRigidTransform>,
|
||||
requested_viewport_scale: Cell<f64>,
|
||||
}
|
||||
|
||||
impl XRView {
|
||||
|
@ -46,6 +50,7 @@ impl XRView {
|
|||
proj: HeapBufferSource::default(),
|
||||
view,
|
||||
transform: Dom::from_ref(transform),
|
||||
requested_viewport_scale: Cell::new(1.0),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -107,6 +112,22 @@ impl XRViewMethods for XRView {
|
|||
DomRoot::from_ref(&self.transform)
|
||||
}
|
||||
|
||||
/// <https://www.w3.org/TR/webxr/#dom-xrview-recommendedviewportscale>
|
||||
fn GetRecommendedViewportScale(&self) -> Option<Finite<f64>> {
|
||||
// Just return 1.0 since we currently will always use full-sized viewports
|
||||
Finite::new(1.0)
|
||||
}
|
||||
|
||||
/// <https://www.w3.org/TR/webxr/#dom-xrview-requestviewportscale>
|
||||
fn RequestViewportScale(&self, scale: Option<Finite<f64>>) {
|
||||
if let Some(scale) = scale {
|
||||
if *scale > 0.0 {
|
||||
let clamped_scale = scale.clamp(0.0, 1.0);
|
||||
self.requested_viewport_scale.set(clamped_scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <https://www.w3.org/TR/webxr-ar-module-1/#dom-xrview-isfirstpersonobserver>
|
||||
fn IsFirstPersonObserver(&self) -> bool {
|
||||
// Servo is not currently supported anywhere that supports this, so return false
|
||||
|
|
|
@ -316,7 +316,7 @@ impl XRWebGLLayerMethods for XRWebGLLayer {
|
|||
let index = view.viewport_index();
|
||||
|
||||
let viewport = self.session().with_session(|s| {
|
||||
// Inline sssions
|
||||
// Inline sessions
|
||||
if s.viewports().is_empty() {
|
||||
Rect::from_size(self.size().to_i32())
|
||||
} else {
|
||||
|
@ -324,6 +324,11 @@ impl XRWebGLLayerMethods for XRWebGLLayer {
|
|||
}
|
||||
});
|
||||
|
||||
// NOTE: According to spec, viewport sizes should be recalculated here if the
|
||||
// requested viewport scale has changed. However, existing browser implementations
|
||||
// don't seem to do this for stereoscopic immersive sessions.
|
||||
// Revisit if Servo gets support for handheld AR/VR via ARCore/ARKit
|
||||
|
||||
Some(XRViewport::new(&self.global(), viewport))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -317,12 +317,6 @@
|
|||
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[XRView interface: attribute recommendedViewportScale]
|
||||
expected: FAIL
|
||||
|
||||
[XRView interface: operation requestViewportScale(double?)]
|
||||
expected: FAIL
|
||||
|
||||
[XRPose interface: attribute linearVelocity]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,85 +1,24 @@
|
|||
[xr_viewport_scale.https.html]
|
||||
expected: ERROR
|
||||
[requestViewportScale valid viewport for inline session - webgl]
|
||||
expected: TIMEOUT
|
||||
|
||||
[recommendedViewportScale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale applied next frame for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale applied next frame for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale applied next frame for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale applied next frame for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
|
|
@ -260,12 +260,6 @@
|
|||
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[XRView interface: attribute recommendedViewportScale]
|
||||
expected: FAIL
|
||||
|
||||
[XRView interface: operation requestViewportScale(double?)]
|
||||
expected: FAIL
|
||||
|
||||
[XRPose interface: attribute linearVelocity]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,127 +1,24 @@
|
|||
[xr_viewport_scale.https.html]
|
||||
expected: ERROR
|
||||
[requestViewportScale valid viewport for inline session]
|
||||
expected: TIMEOUT
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for inline session]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale applied next frame for inline session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for inline session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale same frame for inline session]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for inline session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale same frame for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for inline session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale applied next frame for immersive-vr session]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for inline session - webgl]
|
||||
expected: TIMEOUT
|
||||
|
||||
[recommendedViewportScale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale applied next frame for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale applied next frame for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale applied next frame for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale same frame for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
||||
[requestViewportScale applied next frame for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[recommendedViewportScale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for inline session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl2]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl]
|
||||
expected: NOTRUN
|
||||
|
||||
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl2]
|
||||
expected: NOTRUN
|
||||
expected: PRECONDITION_FAILED
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue