aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared')
-rw-r--r--components/shared/webxr/Cargo.toml24
-rw-r--r--components/shared/webxr/device.rs30
-rw-r--r--components/shared/webxr/events.rs17
-rw-r--r--components/shared/webxr/frame.rs16
-rw-r--r--components/shared/webxr/hand.rs15
-rw-r--r--components/shared/webxr/hittest.rs42
-rw-r--r--components/shared/webxr/input.rs17
-rw-r--r--components/shared/webxr/layer.rs38
-rw-r--r--components/shared/webxr/lib.rs152
-rw-r--r--components/shared/webxr/mock.rs31
-rw-r--r--components/shared/webxr/registry.rs31
-rw-r--r--components/shared/webxr/session.rs96
-rw-r--r--components/shared/webxr/space.rs8
-rw-r--r--components/shared/webxr/util.rs9
-rw-r--r--components/shared/webxr/view.rs18
15 files changed, 194 insertions, 350 deletions
diff --git a/components/shared/webxr/Cargo.toml b/components/shared/webxr/Cargo.toml
index 47caee00131..a424c880855 100644
--- a/components/shared/webxr/Cargo.toml
+++ b/components/shared/webxr/Cargo.toml
@@ -1,14 +1,12 @@
[package]
name = "webxr-api"
-version = "0.0.1"
-authors = ["The Servo Project Developers"]
-edition = "2018"
-
-homepage = "https://github.com/servo/webxr"
-repository = "https://github.com/servo/webxr"
+version.workspace = true
+authors.workspace = true
+license.workspace = true
+edition.workspace = true
+publish.workspace = true
+rust-version.workspace = true
keywords = ["ar", "headset", "openxr", "vr", "webxr"]
-license = "MPL-2.0"
-
description = '''A safe Rust API that provides a way to interact with
virtual reality and augmented reality devices and integration with OpenXR.
The API is inspired by the WebXR Device API (https://www.w3.org/TR/webxr/)
@@ -21,8 +19,8 @@ path = "lib.rs"
ipc = ["serde", "ipc-channel", "euclid/serde"]
[dependencies]
-euclid = "0.22"
-ipc-channel = { version = "0.19", optional = true }
-log = "0.4"
-serde = { version = "1.0", optional = true }
-time = { version = "0.1", optional = true }
+euclid = { workspace = true }
+ipc-channel = { workspace = true, optional = true }
+log = { workspace = true }
+serde = { workspace = true, optional = true }
+time_03 = { workspace = true, optional = true }
diff --git a/components/shared/webxr/device.rs b/components/shared/webxr/device.rs
index 65f34d8560b..0c6a7161686 100644
--- a/components/shared/webxr/device.rs
+++ b/components/shared/webxr/device.rs
@@ -4,28 +4,14 @@
//! Traits to be implemented by backends
-use crate::ContextId;
-use crate::EnvironmentBlendMode;
-use crate::Error;
-use crate::Event;
-use crate::Floor;
-use crate::Frame;
-use crate::HitTestId;
-use crate::HitTestSource;
-use crate::InputSource;
-use crate::LayerId;
-use crate::LayerInit;
-use crate::Native;
-use crate::Quitter;
-use crate::Sender;
-use crate::Session;
-use crate::SessionBuilder;
-use crate::SessionInit;
-use crate::SessionMode;
-use crate::Viewports;
-
use euclid::{Point2D, RigidTransform3D};
+use crate::{
+ ContextId, EnvironmentBlendMode, Error, Event, Floor, Frame, HitTestId, HitTestSource,
+ InputSource, LayerId, LayerInit, Native, Quitter, Sender, Session, SessionBuilder, SessionInit,
+ SessionMode, Viewports,
+};
+
/// A trait for discovering XR devices
pub trait DiscoveryAPI<GL>: 'static {
fn request_session(
@@ -105,10 +91,10 @@ impl<GL: 'static> DiscoveryAPI<GL> for Box<dyn DiscoveryAPI<GL>> {
init: &SessionInit,
xr: SessionBuilder<GL>,
) -> Result<Session, Error> {
- (&mut **self).request_session(mode, init, xr)
+ (**self).request_session(mode, init, xr)
}
fn supports_session(&self, mode: SessionMode) -> bool {
- (&**self).supports_session(mode)
+ (**self).supports_session(mode)
}
}
diff --git a/components/shared/webxr/events.rs b/components/shared/webxr/events.rs
index 338913464ba..c56332a0b7a 100644
--- a/components/shared/webxr/events.rs
+++ b/components/shared/webxr/events.rs
@@ -4,18 +4,13 @@
use euclid::RigidTransform3D;
-use crate::ApiSpace;
-use crate::BaseSpace;
-use crate::Frame;
-use crate::InputFrame;
-use crate::InputId;
-use crate::InputSource;
-use crate::SelectEvent;
-use crate::SelectKind;
-use crate::Sender;
+use crate::{
+ ApiSpace, BaseSpace, Frame, InputFrame, InputId, InputSource, SelectEvent, SelectKind, Sender,
+};
#[derive(Clone, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
+#[allow(clippy::large_enum_variant)]
pub enum Event {
/// Input source connected
AddInput(InputSource),
@@ -35,7 +30,7 @@ pub enum Event {
ReferenceSpaceChanged(BaseSpace, RigidTransform3D<f32, ApiSpace, ApiSpace>),
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum Visibility {
/// Session fully displayed to user
@@ -65,7 +60,7 @@ impl EventBuffer {
EventBuffer::Buffered(ref mut events) => events.push(event),
EventBuffer::Sink(ref dest) => {
let _ = dest.send(event);
- }
+ },
}
}
diff --git a/components/shared/webxr/frame.rs b/components/shared/webxr/frame.rs
index 2589953ecba..d97a212dbcd 100644
--- a/components/shared/webxr/frame.rs
+++ b/components/shared/webxr/frame.rs
@@ -2,20 +2,14 @@
* 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 crate::Floor;
-use crate::HitTestId;
-use crate::HitTestResult;
-use crate::InputFrame;
-use crate::Native;
-use crate::SubImages;
-use crate::Viewer;
-use crate::Viewports;
-use crate::Views;
-
use euclid::RigidTransform3D;
+use crate::{
+ Floor, HitTestId, HitTestResult, InputFrame, Native, SubImages, Viewer, Viewports, Views,
+};
+
/// The per-frame data that is provided by the device.
-/// https://www.w3.org/TR/webxr/#xrframe
+/// <https://www.w3.org/TR/webxr/#xrframe>
// TODO: other fields?
#[derive(Clone, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
diff --git a/components/shared/webxr/hand.rs b/components/shared/webxr/hand.rs
index fa6e8fafe80..09c6b4c6df1 100644
--- a/components/shared/webxr/hand.rs
+++ b/components/shared/webxr/hand.rs
@@ -1,7 +1,12 @@
-use crate::Native;
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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 euclid::RigidTransform3D;
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+use crate::Native;
+
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct HandSpace;
@@ -29,7 +34,7 @@ pub struct Finger<J> {
pub phalanx_tip: Option<J>,
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct JointFrame {
pub pose: RigidTransform3D<f32, HandSpace, Native>,
@@ -97,7 +102,7 @@ impl<J> Finger<J> {
}
}
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum FingerJoint {
Metacarpal,
@@ -107,7 +112,7 @@ pub enum FingerJoint {
PhalanxTip,
}
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum Joint {
Wrist,
diff --git a/components/shared/webxr/hittest.rs b/components/shared/webxr/hittest.rs
index 3e56ff8c357..9bf1cbe6dd1 100644
--- a/components/shared/webxr/hittest.rs
+++ b/components/shared/webxr/hittest.rs
@@ -1,16 +1,16 @@
-use crate::ApiSpace;
-use crate::Native;
-use crate::Space;
-use euclid::Point3D;
-use euclid::RigidTransform3D;
-use euclid::Rotation3D;
-use euclid::Vector3D;
-use std::f32::EPSILON;
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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::iter::FromIterator;
+use euclid::{Point3D, RigidTransform3D, Rotation3D, Vector3D};
+
+use crate::{ApiSpace, Native, Space};
+
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
-/// https://immersive-web.github.io/hit-test/#xrray
+/// <https://immersive-web.github.io/hit-test/#xrray>
pub struct Ray<Space> {
/// The origin of the ray
pub origin: Vector3D<f32, Space>,
@@ -20,16 +20,16 @@ pub struct Ray<Space> {
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
-/// https://immersive-web.github.io/hit-test/#enumdef-xrhittesttrackabletype
+/// <https://immersive-web.github.io/hit-test/#enumdef-xrhittesttrackabletype>
pub enum EntityType {
Point,
Plane,
Mesh,
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
-/// https://immersive-web.github.io/hit-test/#dictdef-xrhittestoptionsinit
+/// <https://immersive-web.github.io/hit-test/#dictdef-xrhittestoptionsinit>
pub struct HitTestSource {
pub id: HitTestId,
pub space: Space,
@@ -37,11 +37,11 @@ pub struct HitTestSource {
pub types: EntityTypes,
}
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct HitTestId(pub u32);
-#[derive(Copy, Clone, Debug, Default)]
+#[derive(Clone, Copy, Debug, Default)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
/// Vec<EntityType>, but better
pub struct EntityTypes {
@@ -50,7 +50,7 @@ pub struct EntityTypes {
pub mesh: bool,
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct HitTestResult {
pub id: HitTestId,
@@ -62,7 +62,7 @@ pub struct HitTestResult {
/// The coordinate space of a hit test result
pub struct HitTestSpace;
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct Triangle {
pub first: Point3D<f32, Native>,
@@ -101,7 +101,7 @@ impl FromIterator<EntityType> for EntityTypes {
}
impl Triangle {
- /// https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
+ /// <https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm>
pub fn intersect(
self,
ray: Ray<Native>,
@@ -117,7 +117,7 @@ impl Triangle {
let h = ray.direction.cross(edge2);
let a = edge1.dot(h);
- if a > -EPSILON && a < EPSILON {
+ if a > -f32::EPSILON && a < f32::EPSILON {
// ray is parallel to triangle
return None;
}
@@ -129,7 +129,7 @@ impl Triangle {
// barycentric coordinate of intersection point u
let u = f * s.dot(h);
// barycentric coordinates have range (0, 1)
- if u < 0. || u > 1. {
+ if !(0. ..=1.).contains(&u) {
// the intersection is outside the triangle
return None;
}
@@ -147,7 +147,7 @@ impl Triangle {
let t = f * edge2.dot(q);
- if t > EPSILON {
+ if t > f32::EPSILON {
let origin = ray.origin + ray.direction * t;
// this is not part of the Möller-Trumbore algorithm, the hit test spec
@@ -156,7 +156,7 @@ impl Triangle {
let normal = edge1.cross(edge2).normalize();
let y = Vector3D::new(0., 1., 0.);
let dot = normal.dot(y);
- let rotation = if dot > -EPSILON && dot < EPSILON {
+ let rotation = if dot > -f32::EPSILON && dot < f32::EPSILON {
// vectors are parallel, return the vector itself
// XXXManishearth it's possible for the vectors to be
// antiparallel, unclear if normals need to be flipped
diff --git a/components/shared/webxr/input.rs b/components/shared/webxr/input.rs
index 9fcd2a18554..ba200b76ec6 100644
--- a/components/shared/webxr/input.rs
+++ b/components/shared/webxr/input.rs
@@ -2,18 +2,15 @@
* 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 crate::Hand;
-use crate::Input;
-use crate::JointFrame;
-use crate::Native;
-
use euclid::RigidTransform3D;
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+use crate::{Hand, Input, JointFrame, Native};
+
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct InputId(pub u32);
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum Handedness {
None,
@@ -21,7 +18,7 @@ pub enum Handedness {
Right,
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum TargetRayMode {
Gaze,
@@ -55,7 +52,7 @@ pub struct InputFrame {
pub input_changed: bool,
}
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum SelectEvent {
/// Selection started
@@ -66,7 +63,7 @@ pub enum SelectEvent {
Select,
}
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub enum SelectKind {
Select,
diff --git a/components/shared/webxr/layer.rs b/components/shared/webxr/layer.rs
index b0a607f290f..d98a8b83893 100644
--- a/components/shared/webxr/layer.rs
+++ b/components/shared/webxr/layer.rs
@@ -2,16 +2,12 @@
* 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 crate::Error;
-use crate::Viewport;
-use crate::Viewports;
+use std::fmt::Debug;
+use std::sync::atomic::{AtomicUsize, Ordering};
-use euclid::Rect;
-use euclid::Size2D;
+use euclid::{Rect, Size2D};
-use std::fmt::Debug;
-use std::sync::atomic::AtomicUsize;
-use std::sync::atomic::Ordering;
+use crate::{Error, Viewport, Viewports};
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
#[cfg_attr(feature = "ipc", derive(Deserialize, Serialize))]
@@ -165,12 +161,14 @@ impl LayerManager {
impl Drop for LayerManager {
fn drop(&mut self) {
log::debug!("Dropping LayerManager");
- for (context_id, layer_id) in self.0.layers().to_vec() {
+ let layers: Vec<_> = self.0.layers().to_vec();
+ for (context_id, layer_id) in layers.into_iter() {
self.destroy_layer(context_id, layer_id);
}
}
}
+#[allow(clippy::type_complexity)]
pub struct LayerManagerFactory<GL: GLTypes>(
Box<
dyn Send
@@ -213,16 +211,16 @@ pub struct LayerId(usize);
static NEXT_LAYER_ID: AtomicUsize = AtomicUsize::new(0);
-impl LayerId {
- pub fn new() -> LayerId {
+impl Default for LayerId {
+ fn default() -> Self {
LayerId(NEXT_LAYER_ID.fetch_add(1, Ordering::SeqCst))
}
}
-#[derive(Copy, Clone, Debug)]
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(Deserialize, Serialize))]
pub enum LayerInit {
- // https://www.w3.org/TR/webxr/#dictdef-xrwebgllayerinit
+ /// <https://www.w3.org/TR/webxr/#dictdef-xrwebgllayerinit>
WebGLLayer {
antialias: bool,
depth: bool,
@@ -231,7 +229,7 @@ pub enum LayerInit {
ignore_depth_values: bool,
framebuffer_scale_factor: f32,
},
- // https://immersive-web.github.io/layers/#xrprojectionlayerinittype
+ /// <https://immersive-web.github.io/layers/#xrprojectionlayerinittype>
ProjectionLayer {
depth: bool,
stencil: bool,
@@ -247,8 +245,8 @@ impl LayerInit {
LayerInit::WebGLLayer {
framebuffer_scale_factor: scale,
..
- }
- | LayerInit::ProjectionLayer {
+ } |
+ LayerInit::ProjectionLayer {
scale_factor: scale,
..
} => {
@@ -258,13 +256,13 @@ impl LayerInit {
.fold(Rect::zero(), |acc, view| acc.union(view))
.size;
(native_size.to_f32() * *scale).to_i32()
- }
+ },
}
}
}
-/// https://immersive-web.github.io/layers/#enumdef-xrlayerlayout
-#[derive(Copy, Clone, Debug)]
+/// <https://immersive-web.github.io/layers/#enumdef-xrlayerlayout>
+#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(Deserialize, Serialize))]
pub enum LayerLayout {
// TODO: Default
@@ -284,7 +282,7 @@ pub struct SubImages {
pub view_sub_images: Vec<SubImage>,
}
-/// https://immersive-web.github.io/layers/#xrsubimagetype
+/// <https://immersive-web.github.io/layers/#xrsubimagetype>
#[derive(Clone, Debug)]
#[cfg_attr(feature = "ipc", derive(Deserialize, Serialize))]
pub struct SubImage {
diff --git a/components/shared/webxr/lib.rs b/components/shared/webxr/lib.rs
index 9acad34e0e5..2348947d3b9 100644
--- a/components/shared/webxr/lib.rs
+++ b/components/shared/webxr/lib.rs
@@ -19,130 +19,48 @@ mod space;
pub mod util;
mod view;
-pub use device::DeviceAPI;
-pub use device::DiscoveryAPI;
-
-pub use error::Error;
-
-pub use events::Event;
-pub use events::EventBuffer;
-pub use events::Visibility;
-
-pub use frame::Frame;
-pub use frame::FrameUpdateEvent;
-pub use frame::ViewerPose;
-
-pub use hand::Finger;
-pub use hand::FingerJoint;
-pub use hand::Hand;
-pub use hand::HandSpace;
-pub use hand::Joint;
-pub use hand::JointFrame;
-
-pub use hittest::EntityType;
-pub use hittest::EntityTypes;
-pub use hittest::HitTestId;
-pub use hittest::HitTestResult;
-pub use hittest::HitTestSource;
-pub use hittest::HitTestSpace;
-pub use hittest::Ray;
-pub use hittest::Triangle;
-
-pub use input::Handedness;
-pub use input::InputFrame;
-pub use input::InputId;
-pub use input::InputSource;
-pub use input::SelectEvent;
-pub use input::SelectKind;
-pub use input::TargetRayMode;
-
-pub use layer::ContextId;
-pub use layer::GLContexts;
-pub use layer::GLTypes;
-pub use layer::LayerGrandManager;
-pub use layer::LayerGrandManagerAPI;
-pub use layer::LayerId;
-pub use layer::LayerInit;
-pub use layer::LayerLayout;
-pub use layer::LayerManager;
-pub use layer::LayerManagerAPI;
-pub use layer::LayerManagerFactory;
-pub use layer::SubImage;
-pub use layer::SubImages;
-
-pub use mock::MockButton;
-pub use mock::MockButtonType;
-pub use mock::MockDeviceInit;
-pub use mock::MockDeviceMsg;
-pub use mock::MockDiscoveryAPI;
-pub use mock::MockInputInit;
-pub use mock::MockInputMsg;
-pub use mock::MockRegion;
-pub use mock::MockViewInit;
-pub use mock::MockViewsInit;
-pub use mock::MockWorld;
-
-pub use registry::MainThreadRegistry;
-pub use registry::MainThreadWaker;
-pub use registry::Registry;
-
-pub use session::EnvironmentBlendMode;
-pub use session::MainThreadSession;
-pub use session::Quitter;
-pub use session::Session;
-pub use session::SessionBuilder;
-pub use session::SessionId;
-pub use session::SessionInit;
-pub use session::SessionMode;
-pub use session::SessionThread;
-
-pub use space::ApiSpace;
-pub use space::BaseSpace;
-pub use space::Space;
-
-pub use view::Capture;
-pub use view::CubeBack;
-pub use view::CubeBottom;
-pub use view::CubeLeft;
-pub use view::CubeRight;
-pub use view::CubeTop;
-pub use view::Display;
-pub use view::Floor;
-pub use view::Input;
-pub use view::LeftEye;
-pub use view::Native;
-pub use view::RightEye;
-pub use view::SomeEye;
-pub use view::View;
-pub use view::Viewer;
-pub use view::Viewport;
-pub use view::Viewports;
-pub use view::Views;
-pub use view::CUBE_BACK;
-pub use view::CUBE_BOTTOM;
-pub use view::CUBE_LEFT;
-pub use view::CUBE_RIGHT;
-pub use view::CUBE_TOP;
-pub use view::LEFT_EYE;
-pub use view::RIGHT_EYE;
-pub use view::VIEWER;
-
+#[cfg(not(feature = "ipc"))]
+pub use std::sync::mpsc::{Receiver, RecvTimeoutError, Sender};
#[cfg(feature = "ipc")]
use std::thread;
-
use std::time::Duration;
+pub use device::{DeviceAPI, DiscoveryAPI};
+pub use error::Error;
+pub use events::{Event, EventBuffer, Visibility};
+pub use frame::{Frame, FrameUpdateEvent, ViewerPose};
+pub use hand::{Finger, FingerJoint, Hand, HandSpace, Joint, JointFrame};
+pub use hittest::{
+ EntityType, EntityTypes, HitTestId, HitTestResult, HitTestSource, HitTestSpace, Ray, Triangle,
+};
+pub use input::{
+ Handedness, InputFrame, InputId, InputSource, SelectEvent, SelectKind, TargetRayMode,
+};
#[cfg(feature = "ipc")]
-pub use ipc_channel::ipc::IpcSender as Sender;
-
+pub use ipc_channel::ipc::channel;
#[cfg(feature = "ipc")]
pub use ipc_channel::ipc::IpcReceiver as Receiver;
-
#[cfg(feature = "ipc")]
-pub use ipc_channel::ipc::channel;
-
-#[cfg(not(feature = "ipc"))]
-pub use std::sync::mpsc::{Receiver, RecvTimeoutError, Sender};
+pub use ipc_channel::ipc::IpcSender as Sender;
+pub use layer::{
+ ContextId, GLContexts, GLTypes, LayerGrandManager, LayerGrandManagerAPI, LayerId, LayerInit,
+ LayerLayout, LayerManager, LayerManagerAPI, LayerManagerFactory, SubImage, SubImages,
+};
+pub use mock::{
+ MockButton, MockButtonType, MockDeviceInit, MockDeviceMsg, MockDiscoveryAPI, MockInputInit,
+ MockInputMsg, MockRegion, MockViewInit, MockViewsInit, MockWorld,
+};
+pub use registry::{MainThreadRegistry, MainThreadWaker, Registry};
+pub use session::{
+ EnvironmentBlendMode, MainThreadSession, Quitter, Session, SessionBuilder, SessionId,
+ SessionInit, SessionMode, SessionThread,
+};
+pub use space::{ApiSpace, BaseSpace, Space};
+pub use view::{
+ Capture, CubeBack, CubeBottom, CubeLeft, CubeRight, CubeTop, Display, Floor, Input, LeftEye,
+ Native, RightEye, SomeEye, View, Viewer, Viewport, Viewports, Views, CUBE_BACK, CUBE_BOTTOM,
+ CUBE_LEFT, CUBE_RIGHT, CUBE_TOP, LEFT_EYE, RIGHT_EYE, VIEWER,
+};
#[cfg(not(feature = "ipc"))]
pub fn channel<T>() -> Result<(Sender<T>, Receiver<T>), ()> {
@@ -169,7 +87,7 @@ where
return Ok(msg);
}
thread::sleep(delay);
- delay = delay * 2;
+ delay *= 2;
}
receiver.try_recv()
}
diff --git a/components/shared/webxr/mock.rs b/components/shared/webxr/mock.rs
index 91c15bae44b..5c8d855e5ab 100644
--- a/components/shared/webxr/mock.rs
+++ b/components/shared/webxr/mock.rs
@@ -2,33 +2,16 @@
* 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 crate::DiscoveryAPI;
-use crate::Display;
-use crate::EntityType;
-use crate::Error;
-use crate::Floor;
-use crate::Handedness;
-use crate::Input;
-use crate::InputId;
-use crate::InputSource;
-use crate::LeftEye;
-use crate::Native;
-use crate::Receiver;
-use crate::RightEye;
-use crate::SelectEvent;
-use crate::SelectKind;
-use crate::Sender;
-use crate::TargetRayMode;
-use crate::Triangle;
-use crate::Viewer;
-use crate::Viewport;
-use crate::Visibility;
-
use euclid::{Point2D, Rect, RigidTransform3D, Transform3D};
-
#[cfg(feature = "ipc")]
use serde::{Deserialize, Serialize};
+use crate::{
+ DiscoveryAPI, Display, EntityType, Error, Floor, Handedness, Input, InputId, InputSource,
+ LeftEye, Native, Receiver, RightEye, SelectEvent, SelectKind, Sender, TargetRayMode, Triangle,
+ Viewer, Viewport, Visibility,
+};
+
/// A trait for discovering mock XR devices
pub trait MockDiscoveryAPI<GL>: 'static {
fn simulate_device_connection(
@@ -103,7 +86,7 @@ pub enum MockInputMsg {
SetGripOrigin(Option<RigidTransform3D<f32, Input, Native>>),
/// Note: SelectEvent::Select here refers to a complete Select event,
/// not just the end event, i.e. it refers to
- /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-simulateselect
+ /// <https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-simulateselect>
TriggerSelect(SelectKind, SelectEvent),
Disconnect,
Reconnect,
diff --git a/components/shared/webxr/registry.rs b/components/shared/webxr/registry.rs
index 337bb80a8a2..5835424e375 100644
--- a/components/shared/webxr/registry.rs
+++ b/components/shared/webxr/registry.rs
@@ -2,28 +2,16 @@
* 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 crate::DiscoveryAPI;
-use crate::Error;
-use crate::Frame;
-use crate::GLTypes;
-use crate::LayerGrandManager;
-use crate::MainThreadSession;
-use crate::MockDeviceInit;
-use crate::MockDeviceMsg;
-use crate::MockDiscoveryAPI;
-use crate::Receiver;
-use crate::Sender;
-use crate::Session;
-use crate::SessionBuilder;
-use crate::SessionId;
-use crate::SessionInit;
-use crate::SessionMode;
-
use log::warn;
-
#[cfg(feature = "ipc")]
use serde::{Deserialize, Serialize};
+use crate::{
+ DiscoveryAPI, Error, Frame, GLTypes, LayerGrandManager, MainThreadSession, MockDeviceInit,
+ MockDeviceMsg, MockDiscoveryAPI, Receiver, Sender, Session, SessionBuilder, SessionId,
+ SessionInit, SessionMode,
+};
+
#[derive(Clone)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub struct Registry {
@@ -188,13 +176,13 @@ impl<GL: 'static + GLTypes> MainThreadRegistry<GL> {
match msg {
RegistryMsg::SupportsSession(mode, dest) => {
let _ = dest.send(self.supports_session(mode));
- }
+ },
RegistryMsg::RequestSession(mode, init, dest, raf_sender) => {
let _ = dest.send(self.request_session(mode, init, raf_sender));
- }
+ },
RegistryMsg::SimulateDeviceConnection(init, dest) => {
let _ = dest.send(self.simulate_device_connection(init));
- }
+ },
}
}
@@ -250,6 +238,7 @@ impl<GL: 'static + GLTypes> MainThreadRegistry<GL> {
}
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
+#[allow(clippy::large_enum_variant)]
enum RegistryMsg {
RequestSession(
SessionMode,
diff --git a/components/shared/webxr/session.rs b/components/shared/webxr/session.rs
index be731b8c243..17219d03868 100644
--- a/components/shared/webxr/session.rs
+++ b/components/shared/webxr/session.rs
@@ -2,43 +2,24 @@
* 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 crate::channel;
-use crate::ContextId;
-use crate::DeviceAPI;
-use crate::Error;
-use crate::Event;
-use crate::Floor;
-use crate::Frame;
-use crate::FrameUpdateEvent;
-use crate::HitTestId;
-use crate::HitTestSource;
-use crate::InputSource;
-use crate::LayerGrandManager;
-use crate::LayerId;
-use crate::LayerInit;
-use crate::Native;
-use crate::Receiver;
-use crate::Sender;
-use crate::Viewport;
-use crate::Viewports;
-
-use euclid::Point2D;
-use euclid::Rect;
-use euclid::RigidTransform3D;
-use euclid::Size2D;
-
-use log::warn;
-
use std::thread;
use std::time::Duration;
+use euclid::{Point2D, Rect, RigidTransform3D, Size2D};
+use log::warn;
#[cfg(feature = "ipc")]
use serde::{Deserialize, Serialize};
+use crate::{
+ channel, ContextId, DeviceAPI, Error, Event, Floor, Frame, FrameUpdateEvent, HitTestId,
+ HitTestSource, InputSource, LayerGrandManager, LayerId, LayerInit, Native, Receiver, Sender,
+ Viewport, Viewports,
+};
+
// How long to wait for an rAF.
static TIMEOUT: Duration = Duration::from_millis(5);
-/// https://www.w3.org/TR/webxr/#xrsessionmode-enum
+/// <https://www.w3.org/TR/webxr/#xrsessionmode-enum>
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub enum SessionMode {
@@ -47,7 +28,7 @@ pub enum SessionMode {
ImmersiveAR,
}
-/// https://immersive-web.github.io/webxr/#dictdef-xrsessioninit
+/// <https://immersive-web.github.io/webxr/#dictdef-xrsessioninit>
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub struct SessionInit {
@@ -76,9 +57,9 @@ impl SessionInit {
}
let mut granted = self.required_features.clone();
for f in &self.optional_features {
- if f == "viewer"
- || (f == "local" && mode != SessionMode::Inline)
- || supported.contains(f)
+ if f == "viewer" ||
+ (f == "local" && mode != SessionMode::Inline) ||
+ supported.contains(f)
{
granted.push(f.clone());
}
@@ -91,12 +72,11 @@ impl SessionInit {
self.required_features
.iter()
.chain(self.optional_features.iter())
- .find(|x| *x == f)
- .is_some()
+ .any(|x| *x == f)
}
}
-/// https://immersive-web.github.io/webxr-ar-module/#xrenvironmentblendmode-enum
+/// <https://immersive-web.github.io/webxr-ar-module/#xrenvironmentblendmode-enum>
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub enum EnvironmentBlendMode {
@@ -137,7 +117,7 @@ impl Quitter {
/// An object that represents an XR session.
/// This is owned by the content thread.
-/// https://www.w3.org/TR/webxr/#xrsession-interface
+/// <https://www.w3.org/TR/webxr/#xrsession-interface>
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub struct Session {
floor_transform: Option<RigidTransform3D<f32, Native, Floor>>,
@@ -160,7 +140,7 @@ impl Session {
}
pub fn floor_transform(&self) -> Option<RigidTransform3D<f32, Native, Floor>> {
- self.floor_transform.clone()
+ self.floor_transform
}
pub fn reference_space_bounds(&self) -> Option<Vec<Point2D<f32, Floor>>> {
@@ -182,7 +162,7 @@ impl Session {
}
/// A resolution large enough to contain all the viewports.
- /// https://immersive-web.github.io/webxr/#recommended-webgl-framebuffer-resolution
+ /// <https://immersive-web.github.io/webxr/#recommended-webgl-framebuffer-resolution>
///
/// Returns None if the session is inline
pub fn recommended_framebuffer_resolution(&self) -> Option<Size2D<i32, Viewport>> {
@@ -335,13 +315,9 @@ where
}
pub fn run(&mut self) {
- loop {
- if let Ok(msg) = self.receiver.recv() {
- if !self.handle_msg(msg) {
- self.running = false;
- break;
- }
- } else {
+ while let Ok(msg) = self.receiver.recv() {
+ if !self.handle_msg(msg) {
+ self.running = false;
break;
}
}
@@ -352,24 +328,24 @@ where
match msg {
SessionMsg::SetEventDest(dest) => {
self.device.set_event_dest(dest);
- }
+ },
SessionMsg::RequestHitTest(source) => {
self.device.request_hit_test(source);
- }
+ },
SessionMsg::CancelHitTest(id) => {
self.device.cancel_hit_test(id);
- }
+ },
SessionMsg::CreateLayer(context_id, layer_init, sender) => {
let result = self.device.create_layer(context_id, layer_init);
let _ = sender.send(result);
- }
+ },
SessionMsg::DestroyLayer(context_id, layer_id) => {
self.layers.retain(|&(_, other_id)| layer_id != other_id);
self.device.destroy_layer(context_id, layer_id);
- }
+ },
SessionMsg::SetLayers(layers) => {
self.pending_layers = Some(layers);
- }
+ },
SessionMsg::StartRenderLoop => {
if let Some(layers) = self.pending_layers.take() {
self.layers = layers;
@@ -379,11 +355,11 @@ where
None => {
warn!("Device stopped providing frames, exiting");
return false;
- }
+ },
};
self.render_state = RenderState::InRenderLoop;
let _ = self.frame_sender.send(frame);
- }
+ },
SessionMsg::UpdateClipPlanes(near, far) => self.device.update_clip_planes(near, far),
SessionMsg::RenderAnimationFrame => {
self.frame_count += 1;
@@ -404,15 +380,15 @@ where
None => {
warn!("Device stopped providing frames, exiting");
return false;
- }
+ },
};
let _ = self.frame_sender.send(frame);
- }
+ },
SessionMsg::UpdateFrameRate(rate, sender) => {
let new_framerate = self.device.update_frame_rate(rate);
let _ = sender.send(new_framerate);
- }
+ },
SessionMsg::Quit => {
if self.render_state == RenderState::NotInRenderLoop {
self.quit();
@@ -420,11 +396,11 @@ where
} else {
self.render_state = RenderState::PendingQuit;
}
- }
+ },
SessionMsg::GetBoundsGeometry(sender) => {
let bounds = self.device.reference_space_bounds();
let _ = sender.send(bounds);
- }
+ },
}
true
}
@@ -506,10 +482,10 @@ impl<'a, GL: 'static> SessionBuilder<'a, GL> {
let session = thread.new_session();
let _ = acks.send(Ok(session));
thread.run();
- }
+ },
Err(err) => {
let _ = acks.send(Err(err));
- }
+ },
}
});
ackr.recv().unwrap_or(Err(Error::CommunicationError))
diff --git a/components/shared/webxr/space.rs b/components/shared/webxr/space.rs
index 4ab116c5b90..e48c614d027 100644
--- a/components/shared/webxr/space.rs
+++ b/components/shared/webxr/space.rs
@@ -1,7 +1,11 @@
-use crate::InputId;
-use crate::Joint;
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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 euclid::RigidTransform3D;
+use crate::{InputId, Joint};
+
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
/// A stand-in type for "the space isn't statically known since
diff --git a/components/shared/webxr/util.rs b/components/shared/webxr/util.rs
index e6342d42faf..312a1dfe68e 100644
--- a/components/shared/webxr/util.rs
+++ b/components/shared/webxr/util.rs
@@ -1,8 +1,11 @@
-use crate::FrameUpdateEvent;
-use crate::HitTestId;
-use crate::HitTestSource;
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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 euclid::Transform3D;
+use crate::{FrameUpdateEvent, HitTestId, HitTestSource};
+
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(serde::Serialize, serde::Deserialize))]
pub struct ClipPlanes {
diff --git a/components/shared/webxr/view.rs b/components/shared/webxr/view.rs
index 566748f8a7a..9490f051729 100644
--- a/components/shared/webxr/view.rs
+++ b/components/shared/webxr/view.rs
@@ -4,35 +4,32 @@
//! This crate uses `euclid`'s typed units, and exposes different coordinate spaces.
-use euclid::Rect;
-use euclid::RigidTransform3D;
-use euclid::Transform3D;
+use std::marker::PhantomData;
+use euclid::{Rect, RigidTransform3D, Transform3D};
#[cfg(feature = "ipc")]
use serde::{Deserialize, Serialize};
-use std::marker::PhantomData;
-
/// The coordinate space of the viewer
-/// https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-viewer
+/// <https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-viewer>
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub enum Viewer {}
/// The coordinate space of the floor
-/// https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-local-floor
+/// <https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-local-floor>
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub enum Floor {}
/// The coordinate space of the left eye
-/// https://immersive-web.github.io/webxr/#dom-xreye-left
+/// <https://immersive-web.github.io/webxr/#dom-xreye-left>
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub enum LeftEye {}
/// The coordinate space of the right eye
-/// https://immersive-web.github.io/webxr/#dom-xreye-right
+/// <https://immersive-web.github.io/webxr/#dom-xreye-right>
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub enum RightEye {}
@@ -115,7 +112,7 @@ pub enum Capture {}
/// its projection onto its display.
/// For stereo displays, we have a `View<LeftEye>` and a `View<RightEye>`.
/// For mono displays, we hagve a `View<Viewer>`
-/// https://immersive-web.github.io/webxr/#xrview
+/// <https://immersive-web.github.io/webxr/#xrview>
#[derive(Clone, Debug)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
pub struct View<Eye> {
@@ -144,6 +141,7 @@ impl<Eye> View<Eye> {
/// Whether a device is mono or stereo, and the views it supports.
#[derive(Clone, Debug)]
#[cfg_attr(feature = "ipc", derive(Serialize, Deserialize))]
+#[allow(clippy::large_enum_variant)]
pub enum Views {
/// Mono view for inline VR, viewport and projection matrices are calculated by client
Inline,