mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +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 {
|
interface XRView {
|
||||||
readonly attribute XREye eye;
|
readonly attribute XREye eye;
|
||||||
readonly attribute Float32Array projectionMatrix;
|
readonly attribute Float32Array projectionMatrix;
|
||||||
readonly attribute XRRigidTransform transform;
|
[SameObject] readonly attribute XRRigidTransform transform;
|
||||||
|
readonly attribute double? recommendedViewportScale;
|
||||||
|
|
||||||
|
undefined requestViewportScale(double? scale);
|
||||||
|
|
||||||
// AR Module
|
// AR Module
|
||||||
readonly attribute boolean isFirstPersonObserver;
|
readonly attribute boolean isFirstPersonObserver;
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
use std::cell::Cell;
|
||||||
|
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use euclid::RigidTransform3D;
|
use euclid::RigidTransform3D;
|
||||||
use js::typedarray::{Float32, Float32Array};
|
use js::typedarray::{Float32, Float32Array};
|
||||||
|
@ -9,6 +11,7 @@ use webxr_api::{ApiSpace, View};
|
||||||
|
|
||||||
use super::bindings::buffer_source::HeapBufferSource;
|
use super::bindings::buffer_source::HeapBufferSource;
|
||||||
use crate::dom::bindings::codegen::Bindings::XRViewBinding::{XREye, XRViewMethods};
|
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::reflector::{reflect_dom_object, Reflector};
|
||||||
use crate::dom::bindings::root::{Dom, DomRoot};
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
|
@ -28,6 +31,7 @@ pub struct XRView {
|
||||||
#[no_trace]
|
#[no_trace]
|
||||||
view: View<ApiSpace>,
|
view: View<ApiSpace>,
|
||||||
transform: Dom<XRRigidTransform>,
|
transform: Dom<XRRigidTransform>,
|
||||||
|
requested_viewport_scale: Cell<f64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XRView {
|
impl XRView {
|
||||||
|
@ -46,6 +50,7 @@ impl XRView {
|
||||||
proj: HeapBufferSource::default(),
|
proj: HeapBufferSource::default(),
|
||||||
view,
|
view,
|
||||||
transform: Dom::from_ref(transform),
|
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)
|
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>
|
/// <https://www.w3.org/TR/webxr-ar-module-1/#dom-xrview-isfirstpersonobserver>
|
||||||
fn IsFirstPersonObserver(&self) -> bool {
|
fn IsFirstPersonObserver(&self) -> bool {
|
||||||
// Servo is not currently supported anywhere that supports this, so return false
|
// 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 index = view.viewport_index();
|
||||||
|
|
||||||
let viewport = self.session().with_session(|s| {
|
let viewport = self.session().with_session(|s| {
|
||||||
// Inline sssions
|
// Inline sessions
|
||||||
if s.viewports().is_empty() {
|
if s.viewports().is_empty() {
|
||||||
Rect::from_size(self.size().to_i32())
|
Rect::from_size(self.size().to_i32())
|
||||||
} else {
|
} 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))
|
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]
|
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[XRView interface: attribute recommendedViewportScale]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRView interface: operation requestViewportScale(double?)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRPose interface: attribute linearVelocity]
|
[XRPose interface: attribute linearVelocity]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,85 +1,24 @@
|
||||||
[xr_viewport_scale.https.html]
|
[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]
|
[requestViewportScale applied next frame for immersive-vr session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale same frame for inline session - webgl]
|
[requestViewportScale same frame for inline session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale same frame for immersive-vr session - webgl]
|
[requestViewportScale same frame for immersive-vr session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
||||||
[requestViewportScale applied next frame for immersive-vr session - webgl2]
|
[requestViewportScale applied next frame for immersive-vr session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale valid viewport for immersive-vr session - webgl]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale applied next frame for inline session - webgl]
|
[requestViewportScale applied next frame for inline session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[recommendedViewportScale for inline session - webgl2]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale same frame for immersive-vr session - webgl2]
|
[requestViewportScale same frame for immersive-vr session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
||||||
[requestViewportScale same frame for inline session - webgl2]
|
[requestViewportScale same frame for inline session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale applied next frame for inline session - webgl2]
|
[requestViewportScale applied next frame for inline session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
|
@ -260,12 +260,6 @@
|
||||||
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
|
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[XRView interface: attribute recommendedViewportScale]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRView interface: operation requestViewportScale(double?)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRPose interface: attribute linearVelocity]
|
[XRPose interface: attribute linearVelocity]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
|
@ -1,127 +1,24 @@
|
||||||
[xr_viewport_scale.https.html]
|
[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]
|
[requestViewportScale applied next frame for immersive-vr session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale same frame for inline session - webgl]
|
[requestViewportScale same frame for inline session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale same frame for immersive-vr session - webgl]
|
[requestViewportScale same frame for immersive-vr session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
||||||
[requestViewportScale applied next frame for immersive-vr session - webgl2]
|
[requestViewportScale applied next frame for immersive-vr session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale valid viewport for immersive-vr session - webgl]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale applied next frame for inline session - webgl]
|
[requestViewportScale applied next frame for inline session - webgl]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[recommendedViewportScale for inline session - webgl2]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
|
|
||||||
expected: NOTRUN
|
|
||||||
|
|
||||||
[requestViewportScale same frame for immersive-vr session - webgl2]
|
[requestViewportScale same frame for immersive-vr session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
||||||
[requestViewportScale same frame for inline session - webgl2]
|
[requestViewportScale same frame for inline session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[requestViewportScale applied next frame for inline session - webgl2]
|
[requestViewportScale applied next frame for inline session - webgl2]
|
||||||
expected: NOTRUN
|
expected: PRECONDITION_FAILED
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue