mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Add XRHand interface
This commit is contained in:
parent
6ad3e0c047
commit
c89dc821ba
7 changed files with 116 additions and 3 deletions
|
@ -157,8 +157,8 @@ use webgpu::{
|
||||||
WebGPUPipelineLayout, WebGPUQueue, WebGPUShaderModule,
|
WebGPUPipelineLayout, WebGPUQueue, WebGPUShaderModule,
|
||||||
};
|
};
|
||||||
use webrender_api::{DocumentId, ImageKey};
|
use webrender_api::{DocumentId, ImageKey};
|
||||||
use webxr_api::Ray;
|
|
||||||
use webxr_api::SwapChainId as WebXRSwapChainId;
|
use webxr_api::SwapChainId as WebXRSwapChainId;
|
||||||
|
use webxr_api::{Finger, Hand, Ray};
|
||||||
|
|
||||||
unsafe_no_jsmanaged_fields!(Tm);
|
unsafe_no_jsmanaged_fields!(Tm);
|
||||||
|
|
||||||
|
@ -881,6 +881,58 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl<J> JSTraceable for Hand<J>
|
||||||
|
where
|
||||||
|
J: JSTraceable,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
unsafe fn trace(&self, trc: *mut JSTracer) {
|
||||||
|
// exhaustive match so we don't miss new fields
|
||||||
|
let Hand {
|
||||||
|
ref wrist,
|
||||||
|
ref thumb_metacarpal,
|
||||||
|
ref thumb_phalanx_proximal,
|
||||||
|
ref thumb_phalanx_distal,
|
||||||
|
ref thumb_phalanx_tip,
|
||||||
|
ref index,
|
||||||
|
ref middle,
|
||||||
|
ref ring,
|
||||||
|
ref little,
|
||||||
|
} = *self;
|
||||||
|
wrist.trace(trc);
|
||||||
|
thumb_metacarpal.trace(trc);
|
||||||
|
thumb_phalanx_proximal.trace(trc);
|
||||||
|
thumb_phalanx_distal.trace(trc);
|
||||||
|
thumb_phalanx_tip.trace(trc);
|
||||||
|
index.trace(trc);
|
||||||
|
middle.trace(trc);
|
||||||
|
ring.trace(trc);
|
||||||
|
little.trace(trc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl<J> JSTraceable for Finger<J>
|
||||||
|
where
|
||||||
|
J: JSTraceable,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
unsafe fn trace(&self, trc: *mut JSTracer) {
|
||||||
|
// exhaustive match so we don't miss new fields
|
||||||
|
let Finger {
|
||||||
|
ref metacarpal,
|
||||||
|
ref phalanx_proximal,
|
||||||
|
ref phalanx_intermediate,
|
||||||
|
ref phalanx_distal,
|
||||||
|
ref phalanx_tip,
|
||||||
|
} = *self;
|
||||||
|
metacarpal.trace(trc);
|
||||||
|
phalanx_proximal.trace(trc);
|
||||||
|
phalanx_intermediate.trace(trc);
|
||||||
|
phalanx_distal.trace(trc);
|
||||||
|
phalanx_tip.trace(trc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Holds a set of JSTraceables that need to be rooted
|
/// Holds a set of JSTraceables that need to be rooted
|
||||||
struct RootedTraceableSet {
|
struct RootedTraceableSet {
|
||||||
set: Vec<*const dyn JSTraceable>,
|
set: Vec<*const dyn JSTraceable>,
|
||||||
|
|
|
@ -572,6 +572,7 @@ pub mod xmlhttprequesteventtarget;
|
||||||
pub mod xmlhttprequestupload;
|
pub mod xmlhttprequestupload;
|
||||||
pub mod xmlserializer;
|
pub mod xmlserializer;
|
||||||
pub mod xrframe;
|
pub mod xrframe;
|
||||||
|
pub mod xrhand;
|
||||||
pub mod xrhittestresult;
|
pub mod xrhittestresult;
|
||||||
pub mod xrhittestsource;
|
pub mod xrhittestsource;
|
||||||
pub mod xrinputsource;
|
pub mod xrinputsource;
|
||||||
|
|
10
components/script/dom/webidls/XRHand.webidl
Normal file
10
components/script/dom/webidls/XRHand.webidl
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/* 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/. */
|
||||||
|
|
||||||
|
// https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md
|
||||||
|
|
||||||
|
[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"]
|
||||||
|
interface XRHand {
|
||||||
|
// getter XRJoint(unsigned short jointIndex);
|
||||||
|
};
|
|
@ -24,4 +24,7 @@ interface XRInputSource {
|
||||||
[SameObject] readonly attribute XRSpace? gripSpace;
|
[SameObject] readonly attribute XRSpace? gripSpace;
|
||||||
// [SameObject] readonly attribute Gamepad? gamepad;
|
// [SameObject] readonly attribute Gamepad? gamepad;
|
||||||
/* [SameObject] */ readonly attribute /* FrozenArray<DOMString> */ any profiles;
|
/* [SameObject] */ readonly attribute /* FrozenArray<DOMString> */ any profiles;
|
||||||
|
|
||||||
|
[Pref="dom.webxr.hands.enabled"]
|
||||||
|
readonly attribute XRHand? hand;
|
||||||
};
|
};
|
||||||
|
|
33
components/script/dom/xrhand.rs
Normal file
33
components/script/dom/xrhand.rs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/* 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 crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
|
||||||
|
use crate::dom::bindings::root::{Dom, DomRoot};
|
||||||
|
use crate::dom::globalscope::GlobalScope;
|
||||||
|
use crate::dom::xrinputsource::XRInputSource;
|
||||||
|
use dom_struct::dom_struct;
|
||||||
|
use webxr_api::Hand;
|
||||||
|
|
||||||
|
#[dom_struct]
|
||||||
|
pub struct XRHand {
|
||||||
|
reflector_: Reflector,
|
||||||
|
#[ignore_malloc_size_of = "defined in webxr"]
|
||||||
|
source: Dom<XRInputSource>,
|
||||||
|
#[ignore_malloc_size_of = "partially defind in webxr"]
|
||||||
|
support: Hand<()>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl XRHand {
|
||||||
|
fn new_inherited(source: &XRInputSource, support: Hand<()>) -> XRHand {
|
||||||
|
XRHand {
|
||||||
|
reflector_: Reflector::new(),
|
||||||
|
source: Dom::from_ref(source),
|
||||||
|
support,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new(global: &GlobalScope, source: &XRInputSource, support: Hand<()>) -> DomRoot<XRHand> {
|
||||||
|
reflect_dom_object(Box::new(XRHand::new_inherited(source, support)), global)
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding::{
|
||||||
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
|
||||||
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
|
use crate::dom::bindings::root::{Dom, DomRoot, MutNullableDom};
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
|
use crate::dom::xrhand::XRHand;
|
||||||
use crate::dom::xrsession::XRSession;
|
use crate::dom::xrsession::XRSession;
|
||||||
use crate::dom::xrspace::XRSpace;
|
use crate::dom::xrspace::XRSpace;
|
||||||
use crate::realms::enter_realm;
|
use crate::realms::enter_realm;
|
||||||
|
@ -24,10 +25,9 @@ pub struct XRInputSource {
|
||||||
session: Dom<XRSession>,
|
session: Dom<XRSession>,
|
||||||
#[ignore_malloc_size_of = "Defined in rust-webxr"]
|
#[ignore_malloc_size_of = "Defined in rust-webxr"]
|
||||||
info: InputSource,
|
info: InputSource,
|
||||||
#[ignore_malloc_size_of = "Defined in rust-webxr"]
|
|
||||||
target_ray_space: MutNullableDom<XRSpace>,
|
target_ray_space: MutNullableDom<XRSpace>,
|
||||||
#[ignore_malloc_size_of = "Defined in rust-webxr"]
|
|
||||||
grip_space: MutNullableDom<XRSpace>,
|
grip_space: MutNullableDom<XRSpace>,
|
||||||
|
hand: MutNullableDom<XRHand>,
|
||||||
#[ignore_malloc_size_of = "mozjs"]
|
#[ignore_malloc_size_of = "mozjs"]
|
||||||
profiles: Heap<JSVal>,
|
profiles: Heap<JSVal>,
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ impl XRInputSource {
|
||||||
info,
|
info,
|
||||||
target_ray_space: Default::default(),
|
target_ray_space: Default::default(),
|
||||||
grip_space: Default::default(),
|
grip_space: Default::default(),
|
||||||
|
hand: Default::default(),
|
||||||
profiles: Heap::default(),
|
profiles: Heap::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,4 +113,16 @@ impl XRInputSourceMethods for XRInputSource {
|
||||||
fn Profiles(&self, _cx: JSContext) -> JSVal {
|
fn Profiles(&self, _cx: JSContext) -> JSVal {
|
||||||
self.profiles.get()
|
self.profiles.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md
|
||||||
|
fn GetHand(&self) -> Option<DomRoot<XRHand>> {
|
||||||
|
if let Some(ref hand) = self.info.hand_support {
|
||||||
|
Some(
|
||||||
|
self.hand
|
||||||
|
.or_init(|| XRHand::new(&self.global(), &self, hand.clone())),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,7 @@ WEBIDL_STANDARDS = [
|
||||||
b"//webaudio.github.io",
|
b"//webaudio.github.io",
|
||||||
b"//immersive-web.github.io/",
|
b"//immersive-web.github.io/",
|
||||||
b"//github.com/immersive-web/webxr-test-api/",
|
b"//github.com/immersive-web/webxr-test-api/",
|
||||||
|
b"//github.com/immersive-web/webxr-hands-input/",
|
||||||
b"//gpuweb.github.io",
|
b"//gpuweb.github.io",
|
||||||
# Not a URL
|
# Not a URL
|
||||||
b"// This interface is entirely internal to Servo, and should not be" +
|
b"// This interface is entirely internal to Servo, and should not be" +
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue