UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 3.82 kB
import{EventHandler as i}from"../../core/event-handler.js";import{platform as t}from"../../core/platform.js";import{Vec3 as n}from"../../core/math/vec3.js";import{XRHAND_LEFT as e}from"./constants.js";import{XrFinger as s}from"./xr-finger.js";import{XrJoint as r}from"./xr-joint.js";let o=[];const a=new n,l=new n,h=new n;t.browser&&window.XRHand&&(o=[["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"]]);class p extends i{constructor(i){super(),this._manager=void 0,this._inputSource=void 0,this._tracking=!1,this._fingers=[],this._joints=[],this._jointsById={},this._tips=[],this._wrist=null;const t=i._xrInputSource.hand;if(this._manager=i._manager,this._inputSource=i,t.get("wrist")){const i=new r(0,"wrist",this,null);this._wrist=i,this._joints.push(i),this._jointsById.wrist=i}for(let i=0;i<o.length;i++){const n=new s(i,this);for(let e=0;e<o[i].length;e++){const s=o[i][e];if(!t.get(s))continue;const a=new r(e,s,this,n);this._joints.push(a),this._jointsById[s]=a,a.tip&&(this._tips.push(a),n._tip=a),n._joints.push(a)}}}update(i){const t=this._inputSource._xrInputSource;for(let n=0;n<this._joints.length;n++){const e=this._joints[n],s=t.hand.get(e._id);if(s){let t;if("hidden"!==i.session.visibilityState&&(t=i.getJointPose(s,this._manager._referenceSpace)),t)e.update(t),e.wrist&&!this._tracking&&(this._tracking=!0,this.fire("tracking"));else if(e.wrist){this._tracking&&(this._tracking=!1,this.fire("trackinglost"));break}}}const n=this._jointsById["thumb-metacarpal"],s=this._jointsById["thumb-tip"],r=this._jointsById["index-finger-phalanx-proximal"],o=this._jointsById["index-finger-tip"],p=this._jointsById["ring-finger-phalanx-proximal"],_=this._jointsById["pinky-finger-phalanx-proximal"];if(n&&s&&r&&o&&p&&_){this._inputSource._dirtyRay=!0,this._inputSource._rayLocal.origin.lerp(s._localPosition,o._localPosition,.5);let i=n,t=_;if(this._inputSource.handedness===e){const n=i;i=t,t=n}a.sub2(i._localPosition,this._wrist._localPosition),l.sub2(t._localPosition,this._wrist._localPosition),h.cross(a,l).normalize(),a.lerp(r._localPosition,p._localPosition,.5),a.sub(this._wrist._localPosition).normalize(),this._inputSource._rayLocal.direction.lerp(h,a,.5).normalize()}this._fingerIsClosed(1)&&this._fingerIsClosed(2)&&this._fingerIsClosed(3)&&this._fingerIsClosed(4)?this._inputSource._squeezing||(this._inputSource._squeezing=!0,this._inputSource.fire("squeezestart"),this._manager.input.fire("squeezestart",this._inputSource)):this._inputSource._squeezing&&(this._inputSource._squeezing=!1,this._inputSource.fire("squeeze"),this._manager.input.fire("squeeze",this._inputSource),this._inputSource.fire("squeezeend"),this._manager.input.fire("squeezeend",this._inputSource))}_fingerIsClosed(i){const t=this._fingers[i];return a.sub2(t.joints[0]._localPosition,t.joints[1]._localPosition).normalize(),l.sub2(t.joints[2]._localPosition,t.joints[3]._localPosition).normalize(),a.dot(l)<-.8}getJointById(i){return this._jointsById[i]||null}get fingers(){return this._fingers}get joints(){return this._joints}get tips(){return this._tips}get wrist(){return this._wrist}get tracking(){return this._tracking}}p.EVENT_TRACKING="tracking",p.EVENT_TRACKINGLOST="trackinglost";export{p as XrHand};