mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
webxr: Update hand input to match latest spec (#32958)
* Update IDLs Signed-off-by: Daniel Adams <msub2official@gmail.com> * Update XRHand and XRJointSpace methods/bindings Signed-off-by: Daniel Adams <msub2official@gmail.com> * Implement fillJointRadii Signed-off-by: Daniel Adams <msub2official@gmail.com> * Implement fillPoses Signed-off-by: Daniel Adams <msub2official@gmail.com> * Formatting Signed-off-by: Daniel Adams <msub2official@gmail.com> * Update test expectations Signed-off-by: Daniel Adams <msub2official@gmail.com> * Tidy, missing spec link Signed-off-by: Daniel Adams <msub2official@gmail.com> * Remove idlharness expectation files, update hands pref Signed-off-by: Daniel Adams <msub2official@gmail.com> * Update interfaces Signed-off-by: Daniel Adams <msub2official@gmail.com> * XRJointPose interface Signed-off-by: Daniel Adams <msub2official@gmail.com> * XRHand interface Signed-off-by: Daniel Adams <msub2official@gmail.com> --------- Signed-off-by: Daniel Adams <msub2official@gmail.com>
This commit is contained in:
parent
057873c94a
commit
825d6f10e9
12 changed files with 314 additions and 553 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -7763,7 +7763,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webxr"
|
name = "webxr"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
source = "git+https://github.com/servo/webxr#355dce2140012ac1535ff6f2cf87b60297556eb4"
|
source = "git+https://github.com/servo/webxr#dd763293a85f57c6271c917033dac7c2c25eec33"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"euclid",
|
"euclid",
|
||||||
|
@ -7780,7 +7780,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webxr-api"
|
name = "webxr-api"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
source = "git+https://github.com/servo/webxr#355dce2140012ac1535ff6f2cf87b60297556eb4"
|
source = "git+https://github.com/servo/webxr#dd763293a85f57c6271c917033dac7c2c25eec33"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"euclid",
|
"euclid",
|
||||||
"ipc-channel",
|
"ipc-channel",
|
||||||
|
|
|
@ -10,6 +10,16 @@ interface XRFrame {
|
||||||
|
|
||||||
[Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
|
[Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace);
|
||||||
[Throws] XRPose? getPose(XRSpace space, XRSpace relativeTo);
|
[Throws] XRPose? getPose(XRSpace space, XRSpace relativeTo);
|
||||||
[Pref="dom.webxr.hands.enabled", Throws] XRJointPose? getJointPose(XRJointSpace space, XRSpace relativeTo);
|
|
||||||
|
// WebXR Hand Input
|
||||||
|
[Pref="dom.webxr.hands.enabled", Throws]
|
||||||
|
XRJointPose? getJointPose(XRJointSpace joint, XRSpace baseSpace);
|
||||||
|
[Pref="dom.webxr.hands.enabled", Throws]
|
||||||
|
boolean fillJointRadii(sequence<XRJointSpace> jointSpaces, Float32Array radii);
|
||||||
|
|
||||||
|
[Pref="dom.webxr.hands.enabled", Throws]
|
||||||
|
boolean fillPoses(sequence<XRSpace> spaces, XRSpace baseSpace, Float32Array transforms);
|
||||||
|
|
||||||
|
// WebXR Hit Test
|
||||||
sequence<XRHitTestResult> getHitTestResults(XRHitTestSource hitTestSource);
|
sequence<XRHitTestResult> getHitTestResults(XRHitTestSource hitTestSource);
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,38 +4,43 @@
|
||||||
|
|
||||||
// https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md
|
// https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md
|
||||||
|
|
||||||
|
enum XRHandJoint {
|
||||||
|
"wrist",
|
||||||
|
|
||||||
|
"thumb-metacarpal",
|
||||||
|
"thumb-phalanx-proximal",
|
||||||
|
"thumb-phalanx-distal",
|
||||||
|
"thumb-tip",
|
||||||
|
|
||||||
|
"index-finger-metacarpal",
|
||||||
|
"index-finger-phalanx-proximal",
|
||||||
|
"index-finger-phalanx-intermediate",
|
||||||
|
"index-finger-phalanx-distal",
|
||||||
|
"index-finger-tip",
|
||||||
|
|
||||||
|
"middle-finger-metacarpal",
|
||||||
|
"middle-finger-phalanx-proximal",
|
||||||
|
"middle-finger-phalanx-intermediate",
|
||||||
|
"middle-finger-phalanx-distal",
|
||||||
|
"middle-finger-tip",
|
||||||
|
|
||||||
|
"ring-finger-metacarpal",
|
||||||
|
"ring-finger-phalanx-proximal",
|
||||||
|
"ring-finger-phalanx-intermediate",
|
||||||
|
"ring-finger-phalanx-distal",
|
||||||
|
"ring-finger-tip",
|
||||||
|
|
||||||
|
"pinky-finger-metacarpal",
|
||||||
|
"pinky-finger-phalanx-proximal",
|
||||||
|
"pinky-finger-phalanx-intermediate",
|
||||||
|
"pinky-finger-phalanx-distal",
|
||||||
|
"pinky-finger-tip"
|
||||||
|
};
|
||||||
|
|
||||||
[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"]
|
[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"]
|
||||||
interface XRHand {
|
interface XRHand {
|
||||||
readonly attribute long length;
|
iterable<XRHandJoint, XRJointSpace>;
|
||||||
getter XRJointSpace(unsigned long index);
|
|
||||||
|
|
||||||
const unsigned long WRIST = 0;
|
readonly attribute unsigned long size;
|
||||||
const unsigned long THUMB_METACARPAL = 1;
|
XRJointSpace get(XRHandJoint key);
|
||||||
const unsigned long THUMB_PHALANX_PROXIMAL = 2;
|
|
||||||
const unsigned long THUMB_PHALANX_DISTAL = 3;
|
|
||||||
const unsigned long THUMB_PHALANX_TIP = 4;
|
|
||||||
|
|
||||||
const unsigned long INDEX_METACARPAL = 5;
|
|
||||||
const unsigned long INDEX_PHALANX_PROXIMAL = 6;
|
|
||||||
const unsigned long INDEX_PHALANX_INTERMEDIATE = 7;
|
|
||||||
const unsigned long INDEX_PHALANX_DISTAL = 8;
|
|
||||||
const unsigned long INDEX_PHALANX_TIP = 9;
|
|
||||||
|
|
||||||
const unsigned long MIDDLE_METACARPAL = 10;
|
|
||||||
const unsigned long MIDDLE_PHALANX_PROXIMAL = 11;
|
|
||||||
const unsigned long MIDDLE_PHALANX_INTERMEDIATE = 12;
|
|
||||||
const unsigned long MIDDLE_PHALANX_DISTAL = 13;
|
|
||||||
const unsigned long MIDDLE_PHALANX_TIP = 14;
|
|
||||||
|
|
||||||
const unsigned long RING_METACARPAL = 15;
|
|
||||||
const unsigned long RING_PHALANX_PROXIMAL = 16;
|
|
||||||
const unsigned long RING_PHALANX_INTERMEDIATE = 17;
|
|
||||||
const unsigned long RING_PHALANX_DISTAL = 18;
|
|
||||||
const unsigned long RING_PHALANX_TIP = 19;
|
|
||||||
|
|
||||||
const unsigned long LITTLE_METACARPAL = 20;
|
|
||||||
const unsigned long LITTLE_PHALANX_PROXIMAL = 21;
|
|
||||||
const unsigned long LITTLE_PHALANX_INTERMEDIATE = 22;
|
|
||||||
const unsigned long LITTLE_PHALANX_DISTAL = 23;
|
|
||||||
const unsigned long LITTLE_PHALANX_TIP = 24;
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,4 +5,6 @@
|
||||||
// https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md
|
// https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md
|
||||||
|
|
||||||
[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"]
|
[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"]
|
||||||
interface XRJointSpace: XRSpace {};
|
interface XRJointSpace: XRSpace {
|
||||||
|
readonly attribute XRHandJoint jointName;
|
||||||
|
};
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
use js::gc::CustomAutoRooterGuard;
|
||||||
|
use js::typedarray::Float32Array;
|
||||||
use webxr_api::{Frame, LayerId, SubImages};
|
use webxr_api::{Frame, LayerId, SubImages};
|
||||||
|
|
||||||
use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods;
|
use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods;
|
||||||
|
@ -175,4 +177,107 @@ impl XRFrameMethods for XRFrame {
|
||||||
.map(|r| XRHitTestResult::new(&self.global(), *r, self))
|
.map(|r| XRHitTestResult::new(&self.global(), *r, self))
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
/// <https://www.w3.org/TR/webxr-hand-input-1/#dom-xrframe-filljointradii>
|
||||||
|
fn FillJointRadii(
|
||||||
|
&self,
|
||||||
|
joint_spaces: Vec<DomRoot<XRJointSpace>>,
|
||||||
|
mut radii: CustomAutoRooterGuard<Float32Array>,
|
||||||
|
) -> Result<bool, Error> {
|
||||||
|
if !self.active.get() {
|
||||||
|
return Err(Error::InvalidState);
|
||||||
|
}
|
||||||
|
|
||||||
|
for joint_space in &joint_spaces {
|
||||||
|
if self.session != joint_space.upcast::<XRSpace>().session() {
|
||||||
|
return Err(Error::InvalidState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if joint_spaces.len() > radii.len() {
|
||||||
|
return Err(Error::Type(
|
||||||
|
"Length of radii does not match length of joint spaces".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut radii_vec = radii.to_vec();
|
||||||
|
let mut all_valid = true;
|
||||||
|
radii_vec.iter_mut().enumerate().for_each(|(i, radius)| {
|
||||||
|
if let Some(joint_frame) = joint_spaces
|
||||||
|
.get(i)
|
||||||
|
.and_then(|joint_space| joint_space.frame(&self.data))
|
||||||
|
{
|
||||||
|
*radius = joint_frame.radius;
|
||||||
|
} else {
|
||||||
|
all_valid = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if !all_valid {
|
||||||
|
radii_vec.fill(f32::NAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
radii.update(&radii_vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(all_valid)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
/// <https://www.w3.org/TR/webxr-hand-input-1/#dom-xrframe-fillposes>
|
||||||
|
fn FillPoses(
|
||||||
|
&self,
|
||||||
|
spaces: Vec<DomRoot<XRSpace>>,
|
||||||
|
base_space: &XRSpace,
|
||||||
|
mut transforms: CustomAutoRooterGuard<Float32Array>,
|
||||||
|
) -> Result<bool, Error> {
|
||||||
|
if !self.active.get() {
|
||||||
|
return Err(Error::InvalidState);
|
||||||
|
}
|
||||||
|
|
||||||
|
for space in &spaces {
|
||||||
|
if self.session != space.session() {
|
||||||
|
return Err(Error::InvalidState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.session != base_space.session() {
|
||||||
|
return Err(Error::InvalidState);
|
||||||
|
}
|
||||||
|
|
||||||
|
if spaces.len() * 16 > transforms.len() {
|
||||||
|
return Err(Error::Type(
|
||||||
|
"Transforms array length does not match 16 * spaces length".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut transforms_vec = transforms.to_vec();
|
||||||
|
let mut all_valid = true;
|
||||||
|
spaces.iter().enumerate().for_each(|(i, space)| {
|
||||||
|
let Some(joint_pose) = self.get_pose(space) else {
|
||||||
|
all_valid = false;
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let Some(base_pose) = self.get_pose(base_space) else {
|
||||||
|
all_valid = false;
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let pose = joint_pose.then(&base_pose.inverse());
|
||||||
|
let elements = pose.to_transform();
|
||||||
|
let elements_arr = elements.to_array();
|
||||||
|
transforms_vec[i * 16..(i + 1) * 16].copy_from_slice(&elements_arr);
|
||||||
|
});
|
||||||
|
|
||||||
|
if !all_valid {
|
||||||
|
transforms_vec.fill(f32::NAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
transforms.update(&transforms_vec);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(all_valid)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,13 +5,101 @@
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use webxr_api::{FingerJoint, Hand, Joint};
|
use webxr_api::{FingerJoint, Hand, Joint};
|
||||||
|
|
||||||
use crate::dom::bindings::codegen::Bindings::XRHandBinding::{XRHandConstants, XRHandMethods};
|
use crate::dom::bindings::codegen::Bindings::XRHandBinding::{XRHandJoint, XRHandMethods};
|
||||||
|
use crate::dom::bindings::iterable::Iterable;
|
||||||
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;
|
||||||
use crate::dom::xrinputsource::XRInputSource;
|
use crate::dom::xrinputsource::XRInputSource;
|
||||||
use crate::dom::xrjointspace::XRJointSpace;
|
use crate::dom::xrjointspace::XRJointSpace;
|
||||||
|
|
||||||
|
const JOINT_SPACE_MAP: [(XRHandJoint, Joint); 25] = [
|
||||||
|
(XRHandJoint::Wrist, Joint::Wrist),
|
||||||
|
(XRHandJoint::Thumb_metacarpal, Joint::ThumbMetacarpal),
|
||||||
|
(
|
||||||
|
XRHandJoint::Thumb_phalanx_proximal,
|
||||||
|
Joint::ThumbPhalanxProximal,
|
||||||
|
),
|
||||||
|
(XRHandJoint::Thumb_phalanx_distal, Joint::ThumbPhalanxDistal),
|
||||||
|
(XRHandJoint::Thumb_tip, Joint::ThumbPhalanxTip),
|
||||||
|
(
|
||||||
|
XRHandJoint::Index_finger_metacarpal,
|
||||||
|
Joint::Index(FingerJoint::Metacarpal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Index_finger_phalanx_proximal,
|
||||||
|
Joint::Index(FingerJoint::PhalanxProximal),
|
||||||
|
),
|
||||||
|
(XRHandJoint::Index_finger_phalanx_intermediate, {
|
||||||
|
Joint::Index(FingerJoint::PhalanxIntermediate)
|
||||||
|
}),
|
||||||
|
(
|
||||||
|
XRHandJoint::Index_finger_phalanx_distal,
|
||||||
|
Joint::Index(FingerJoint::PhalanxDistal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Index_finger_tip,
|
||||||
|
Joint::Index(FingerJoint::PhalanxTip),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Middle_finger_metacarpal,
|
||||||
|
Joint::Middle(FingerJoint::Metacarpal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Middle_finger_phalanx_proximal,
|
||||||
|
Joint::Middle(FingerJoint::PhalanxProximal),
|
||||||
|
),
|
||||||
|
(XRHandJoint::Middle_finger_phalanx_intermediate, {
|
||||||
|
Joint::Middle(FingerJoint::PhalanxIntermediate)
|
||||||
|
}),
|
||||||
|
(
|
||||||
|
XRHandJoint::Middle_finger_phalanx_distal,
|
||||||
|
Joint::Middle(FingerJoint::PhalanxDistal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Middle_finger_tip,
|
||||||
|
Joint::Middle(FingerJoint::PhalanxTip),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Ring_finger_metacarpal,
|
||||||
|
Joint::Ring(FingerJoint::Metacarpal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Ring_finger_phalanx_proximal,
|
||||||
|
Joint::Ring(FingerJoint::PhalanxProximal),
|
||||||
|
),
|
||||||
|
(XRHandJoint::Ring_finger_phalanx_intermediate, {
|
||||||
|
Joint::Ring(FingerJoint::PhalanxIntermediate)
|
||||||
|
}),
|
||||||
|
(
|
||||||
|
XRHandJoint::Ring_finger_phalanx_distal,
|
||||||
|
Joint::Ring(FingerJoint::PhalanxDistal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Ring_finger_tip,
|
||||||
|
Joint::Ring(FingerJoint::PhalanxTip),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Pinky_finger_metacarpal,
|
||||||
|
Joint::Little(FingerJoint::Metacarpal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Pinky_finger_phalanx_proximal,
|
||||||
|
Joint::Little(FingerJoint::PhalanxProximal),
|
||||||
|
),
|
||||||
|
(XRHandJoint::Pinky_finger_phalanx_intermediate, {
|
||||||
|
Joint::Little(FingerJoint::PhalanxIntermediate)
|
||||||
|
}),
|
||||||
|
(
|
||||||
|
XRHandJoint::Pinky_finger_phalanx_distal,
|
||||||
|
Joint::Little(FingerJoint::PhalanxDistal),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
XRHandJoint::Pinky_finger_tip,
|
||||||
|
Joint::Little(FingerJoint::PhalanxTip),
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct XRHand {
|
pub struct XRHand {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
|
@ -34,57 +122,55 @@ impl XRHand {
|
||||||
pub fn new(global: &GlobalScope, source: &XRInputSource, support: Hand<()>) -> DomRoot<XRHand> {
|
pub fn new(global: &GlobalScope, source: &XRInputSource, support: Hand<()>) -> DomRoot<XRHand> {
|
||||||
let id = source.id();
|
let id = source.id();
|
||||||
let session = source.session();
|
let session = source.session();
|
||||||
let spaces = support
|
let spaces = support.map(|field, joint| {
|
||||||
.map(|field, joint| field.map(|_| XRJointSpace::new(global, session, id, joint)));
|
let hand_joint = JOINT_SPACE_MAP
|
||||||
|
.iter()
|
||||||
|
.find(|&&(_, value)| value == joint)
|
||||||
|
.map(|&(hand_joint, _)| hand_joint)
|
||||||
|
.expect("Invalid joint name");
|
||||||
|
field.map(|_| XRJointSpace::new(global, session, id, joint, hand_joint))
|
||||||
|
});
|
||||||
reflect_dom_object(Box::new(XRHand::new_inherited(source, &spaces)), global)
|
reflect_dom_object(Box::new(XRHand::new_inherited(source, &spaces)), global)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XRHandMethods for XRHand {
|
impl XRHandMethods for XRHand {
|
||||||
/// <https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md>
|
/// <https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md>
|
||||||
fn Length(&self) -> i32 {
|
fn Size(&self) -> u32 {
|
||||||
XRHandConstants::LITTLE_PHALANX_TIP as i32 + 1
|
XRHandJoint::Pinky_finger_tip as u32 + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md>
|
/// <https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md>
|
||||||
fn IndexedGetter(&self, joint_index: u32) -> Option<DomRoot<XRJointSpace>> {
|
fn Get(&self, joint_name: XRHandJoint) -> DomRoot<XRJointSpace> {
|
||||||
let joint = match joint_index {
|
let joint = JOINT_SPACE_MAP
|
||||||
XRHandConstants::WRIST => Joint::Wrist,
|
.iter()
|
||||||
XRHandConstants::THUMB_METACARPAL => Joint::ThumbMetacarpal,
|
.find(|&&(key, _)| key == joint_name)
|
||||||
XRHandConstants::THUMB_PHALANX_PROXIMAL => Joint::ThumbPhalanxProximal,
|
.map(|&(_, joint)| joint)
|
||||||
XRHandConstants::THUMB_PHALANX_DISTAL => Joint::ThumbPhalanxDistal,
|
.expect("Invalid joint name");
|
||||||
XRHandConstants::THUMB_PHALANX_TIP => Joint::ThumbPhalanxTip,
|
self.spaces
|
||||||
XRHandConstants::INDEX_METACARPAL => Joint::Index(FingerJoint::Metacarpal),
|
.get(joint)
|
||||||
XRHandConstants::INDEX_PHALANX_PROXIMAL => Joint::Index(FingerJoint::PhalanxProximal),
|
.map(|j| DomRoot::from_ref(&**j))
|
||||||
XRHandConstants::INDEX_PHALANX_INTERMEDIATE => {
|
.expect("Failed to get joint pose")
|
||||||
Joint::Index(FingerJoint::PhalanxIntermediate)
|
}
|
||||||
},
|
}
|
||||||
XRHandConstants::INDEX_PHALANX_DISTAL => Joint::Index(FingerJoint::PhalanxDistal),
|
|
||||||
XRHandConstants::INDEX_PHALANX_TIP => Joint::Index(FingerJoint::PhalanxTip),
|
impl Iterable for XRHand {
|
||||||
XRHandConstants::MIDDLE_METACARPAL => Joint::Middle(FingerJoint::Metacarpal),
|
type Key = XRHandJoint;
|
||||||
XRHandConstants::MIDDLE_PHALANX_PROXIMAL => Joint::Middle(FingerJoint::PhalanxProximal),
|
type Value = DomRoot<XRJointSpace>;
|
||||||
XRHandConstants::MIDDLE_PHALANX_INTERMEDIATE => {
|
|
||||||
Joint::Middle(FingerJoint::PhalanxIntermediate)
|
fn get_iterable_length(&self) -> u32 {
|
||||||
},
|
JOINT_SPACE_MAP.len() as u32
|
||||||
XRHandConstants::MIDDLE_PHALANX_DISTAL => Joint::Middle(FingerJoint::PhalanxDistal),
|
}
|
||||||
XRHandConstants::MIDDLE_PHALANX_TIP => Joint::Middle(FingerJoint::PhalanxTip),
|
|
||||||
XRHandConstants::RING_METACARPAL => Joint::Ring(FingerJoint::Metacarpal),
|
fn get_value_at_index(&self, n: u32) -> DomRoot<XRJointSpace> {
|
||||||
XRHandConstants::RING_PHALANX_PROXIMAL => Joint::Ring(FingerJoint::PhalanxProximal),
|
let joint = JOINT_SPACE_MAP[n as usize].1;
|
||||||
XRHandConstants::RING_PHALANX_INTERMEDIATE => {
|
self.spaces
|
||||||
Joint::Ring(FingerJoint::PhalanxIntermediate)
|
.get(joint)
|
||||||
},
|
.map(|j| DomRoot::from_ref(&**j))
|
||||||
XRHandConstants::RING_PHALANX_DISTAL => Joint::Ring(FingerJoint::PhalanxDistal),
|
.expect("Failed to get joint pose")
|
||||||
XRHandConstants::RING_PHALANX_TIP => Joint::Ring(FingerJoint::PhalanxTip),
|
}
|
||||||
XRHandConstants::LITTLE_METACARPAL => Joint::Little(FingerJoint::Metacarpal),
|
|
||||||
XRHandConstants::LITTLE_PHALANX_PROXIMAL => Joint::Little(FingerJoint::PhalanxProximal),
|
fn get_key_at_index(&self, n: u32) -> XRHandJoint {
|
||||||
XRHandConstants::LITTLE_PHALANX_INTERMEDIATE => {
|
JOINT_SPACE_MAP[n as usize].0
|
||||||
Joint::Little(FingerJoint::PhalanxIntermediate)
|
|
||||||
},
|
|
||||||
XRHandConstants::LITTLE_PHALANX_DISTAL => Joint::Little(FingerJoint::PhalanxDistal),
|
|
||||||
XRHandConstants::LITTLE_PHALANX_TIP => Joint::Little(FingerJoint::PhalanxTip),
|
|
||||||
// XXXManishearth should this be a TypeError?
|
|
||||||
_ => return None,
|
|
||||||
};
|
|
||||||
self.spaces.get(joint).map(|j| DomRoot::from_ref(&**j))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@ use dom_struct::dom_struct;
|
||||||
use euclid::RigidTransform3D;
|
use euclid::RigidTransform3D;
|
||||||
use webxr_api::{BaseSpace, Frame, InputId, Joint, JointFrame, Space};
|
use webxr_api::{BaseSpace, Frame, InputId, Joint, JointFrame, Space};
|
||||||
|
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRHandBinding::XRHandJoint;
|
||||||
|
use crate::dom::bindings::codegen::Bindings::XRJointSpaceBinding::XRJointSpaceMethods;
|
||||||
use crate::dom::bindings::reflector::reflect_dom_object;
|
use crate::dom::bindings::reflector::reflect_dom_object;
|
||||||
use crate::dom::bindings::root::DomRoot;
|
use crate::dom::bindings::root::DomRoot;
|
||||||
use crate::dom::globalscope::GlobalScope;
|
use crate::dom::globalscope::GlobalScope;
|
||||||
|
@ -21,14 +23,21 @@ pub struct XRJointSpace {
|
||||||
#[ignore_malloc_size_of = "defined in rust-webxr"]
|
#[ignore_malloc_size_of = "defined in rust-webxr"]
|
||||||
#[no_trace]
|
#[no_trace]
|
||||||
joint: Joint,
|
joint: Joint,
|
||||||
|
hand_joint: XRHandJoint,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl XRJointSpace {
|
impl XRJointSpace {
|
||||||
pub fn new_inherited(session: &XRSession, input: InputId, joint: Joint) -> XRJointSpace {
|
pub fn new_inherited(
|
||||||
|
session: &XRSession,
|
||||||
|
input: InputId,
|
||||||
|
joint: Joint,
|
||||||
|
hand_joint: XRHandJoint,
|
||||||
|
) -> XRJointSpace {
|
||||||
XRJointSpace {
|
XRJointSpace {
|
||||||
xrspace: XRSpace::new_inherited(session),
|
xrspace: XRSpace::new_inherited(session),
|
||||||
input,
|
input,
|
||||||
joint,
|
joint,
|
||||||
|
hand_joint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,8 +47,12 @@ impl XRJointSpace {
|
||||||
session: &XRSession,
|
session: &XRSession,
|
||||||
input: InputId,
|
input: InputId,
|
||||||
joint: Joint,
|
joint: Joint,
|
||||||
|
hand_joint: XRHandJoint,
|
||||||
) -> DomRoot<XRJointSpace> {
|
) -> DomRoot<XRJointSpace> {
|
||||||
reflect_dom_object(Box::new(Self::new_inherited(session, input, joint)), global)
|
reflect_dom_object(
|
||||||
|
Box::new(Self::new_inherited(session, input, joint, hand_joint)),
|
||||||
|
global,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn space(&self) -> Space {
|
pub fn space(&self) -> Space {
|
||||||
|
@ -61,3 +74,10 @@ impl XRJointSpace {
|
||||||
self.frame(frame).map(|f| f.pose).map(|t| t.cast_unit())
|
self.frame(frame).map(|f| f.pose).map(|t| t.cast_unit())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl XRJointSpaceMethods for XRJointSpace {
|
||||||
|
/// <https://www.w3.org/TR/webxr-hand-input-1/#xrjointspace-jointname>
|
||||||
|
fn JointName(&self) -> XRHandJoint {
|
||||||
|
self.hand_joint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
"dom.webxr.glwindow.left-right": false,
|
"dom.webxr.glwindow.left-right": false,
|
||||||
"dom.webxr.glwindow.red-cyan": false,
|
"dom.webxr.glwindow.red-cyan": false,
|
||||||
"dom.webxr.glwindow.spherical": false,
|
"dom.webxr.glwindow.spherical": false,
|
||||||
"dom.webxr.hands.enabled": false,
|
"dom.webxr.hands.enabled": true,
|
||||||
"dom.webxr.layers.enabled": false,
|
"dom.webxr.layers.enabled": false,
|
||||||
"dom.webxr.openxr.enabled": false,
|
"dom.webxr.openxr.enabled": false,
|
||||||
"dom.webxr.sessionavailable": false,
|
"dom.webxr.sessionavailable": false,
|
||||||
|
|
|
@ -1,235 +0,0 @@
|
||||||
[idlharness.https.window.html]
|
|
||||||
[XRHand interface object name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: attribute radius]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: iterable<XRJointSpace>]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRFrame interface: operation fillJointRadii(sequence<XRJointSpace>, Float32Array)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant WRIST on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface object length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface object name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant WRIST on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRFrame interface: operation fillPoses(sequence<XRSpace>, XRSpace, Float32Array)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface object length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: attribute length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface object length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: operation joint(unsigned long)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface object name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: iterable<XRHandJoint, XRJointSpace>]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: operation get(XRHandJoint)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: attribute size]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: attribute jointName]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,235 +0,0 @@
|
||||||
[idlharness.https.window.html]
|
|
||||||
[XRHand interface object name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: attribute radius]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: iterable<XRJointSpace>]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRFrame interface: operation fillJointRadii(sequence<XRJointSpace>, Float32Array)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant WRIST on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface object length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant THUMB_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface object name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface prototype object's "constructor" property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant WRIST on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRFrame interface: operation fillPoses(sequence<XRSpace>, XRSpace, Float32Array)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_INTERMEDIATE on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_DISTAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_DISTAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: existence and properties of interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface prototype object's @@unscopables property]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface object length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_TIP on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: attribute length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface object length]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_TIP on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointPose interface: existence and properties of interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: operation joint(unsigned long)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_PHALANX_INTERMEDIATE on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant RING_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface object name]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_PHALANX_PROXIMAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant INDEX_PHALANX_PROXIMAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: existence and properties of interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant LITTLE_METACARPAL on interface object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: constant MIDDLE_METACARPAL on interface prototype object]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: iterable<XRHandJoint, XRJointSpace>]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: operation get(XRHandJoint)]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRHand interface: attribute size]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[XRJointSpace interface: attribute jointName]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
2
tests/wpt/mozilla/meta/MANIFEST.json
vendored
2
tests/wpt/mozilla/meta/MANIFEST.json
vendored
|
@ -13466,7 +13466,7 @@
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"interfaces.html": [
|
"interfaces.html": [
|
||||||
"ee31ffa62be1623831a6379ace46a4784df7608c",
|
"7a7d6c0a467ab2006d5edd9ef3a3b4a07f99cd64",
|
||||||
[
|
[
|
||||||
null,
|
null,
|
||||||
{}
|
{}
|
||||||
|
|
|
@ -279,11 +279,14 @@ test_interfaces([
|
||||||
"XMLHttpRequestUpload",
|
"XMLHttpRequestUpload",
|
||||||
"XMLSerializer",
|
"XMLSerializer",
|
||||||
"XRFrame",
|
"XRFrame",
|
||||||
|
"XRHand",
|
||||||
"XRHitTestResult",
|
"XRHitTestResult",
|
||||||
"XRHitTestSource",
|
"XRHitTestSource",
|
||||||
"XRInputSource",
|
"XRInputSource",
|
||||||
"XRInputSourceArray",
|
"XRInputSourceArray",
|
||||||
"XRInputSourceEvent",
|
"XRInputSourceEvent",
|
||||||
|
"XRJointPose",
|
||||||
|
"XRJointSpace",
|
||||||
"XRLayer",
|
"XRLayer",
|
||||||
"XRPose",
|
"XRPose",
|
||||||
"XRReferenceSpace",
|
"XRReferenceSpace",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue