ecspresso
Version:
A minimal Entity-Component-System library for typescript and javascript.
5 lines (3 loc) • 7.02 kB
JavaScript
var Xj=((j)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(j,{get:(J,W)=>(typeof require<"u"?require:J)[W]}):j)(function(j){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+j+'" is not supported')});import{definePlugin as t}from"ecspresso";function Cj(j){return j}function Rj(j,...J){return J.map((W)=>({pad:j,button:W}))}function Ej(j,J,W,G){return G===void 0?{pad:j,axis:J,direction:W}:{pad:j,axis:J,direction:W,threshold:G}}var a=0.5,e=0.15,T=4;function jj(){return{keysDown:new Set,keysPressed:[],keysReleased:[],pointerButtonsDown:new Set,pointerButtonsPressed:[],pointerButtonsReleased:[],pointerX:0,pointerY:0,lastPointerX:0,lastPointerY:0,pointerMoved:!1}}function qj(){return{keysDown:new Set,keysPressed:new Set,keysReleased:new Set,pointerButtonsDown:new Set,pointerButtonsPressed:new Set,pointerButtonsReleased:new Set,pointerX:0,pointerY:0,pointerDeltaX:0,pointerDeltaY:0}}function Jj(){return{connected:!1,id:null,buttonsDown:new Set,buttonsPrev:new Set,buttonsPressed:new Set,buttonsReleased:new Set,buttonValues:[],axes:[],rawAxes:[]}}function k(){return{active:new Set,prev:new Set}}function N(j,J){j.clear();for(let W of J)j.add(W)}function Qj(j,J){N(j.keysDown,J.keysDown),N(j.keysPressed,J.keysPressed),N(j.keysReleased,J.keysReleased),N(j.pointerButtonsDown,J.pointerButtonsDown),N(j.pointerButtonsPressed,J.pointerButtonsPressed),N(j.pointerButtonsReleased,J.pointerButtonsReleased),j.pointerDeltaX=J.pointerMoved?J.pointerX-J.lastPointerX:0,j.pointerDeltaY=J.pointerMoved?J.pointerY-J.lastPointerY:0,j.pointerX=J.pointerX,j.pointerY=J.pointerY,J.keysPressed.length=0,J.keysReleased.length=0,J.pointerButtonsPressed.length=0,J.pointerButtonsReleased.length=0,J.lastPointerX=J.pointerX,J.lastPointerY=J.pointerY,J.pointerMoved=!1}function Vj(j){return()=>{if(typeof navigator>"u"||typeof navigator.getGamepads!=="function"){for(let W=0;W<j.length;W++)j[W]=null;return j}let J=navigator.getGamepads();for(let W=0;W<j.length;W++)j[W]=J[W]??null;return j}}function D(j,J,W,G,Z){let Y=Math.sqrt(j*j+J*J);if(Y<W){G[Z]=0,G[Z+1]=0;return}let V=Math.min((Y-W)/(1-W),1);G[Z]=j/Y*V,G[Z+1]=J/Y*V}function Wj(j,J,W){if(J.length=j.length,j.length>=2)D(j[0]??0,j[1]??0,W,J,0);if(j.length>=4)D(j[2]??0,j[3]??0,W,J,2);for(let G=4;G<j.length;G++)J[G]=j[G]??0}function Yj(j,J,W){let G=J();for(let Z=0;Z<T;Z++){let Y=G[Z]??null,V=j[Z];if(!V)continue;let E=V.buttonsPrev;if(N(E,V.buttonsDown),V.buttonsDown.clear(),V.buttonsPressed.clear(),V.buttonsReleased.clear(),!Y||!Y.connected){if(V.connected){for(let $ of E)V.buttonsReleased.add($);V.connected=!1,V.id=null,V.buttonValues.length=0,V.axes.length=0,V.rawAxes.length=0}continue}V.connected=!0,V.id=Y.id,V.buttonValues.length=Y.buttons.length;for(let $=0;$<Y.buttons.length;$++){let B=Y.buttons[$];if(!B){V.buttonValues[$]=0;continue}if(V.buttonValues[$]=B.value,B.pressed)V.buttonsDown.add($)}for(let $ of V.buttonsDown)if(!E.has($))V.buttonsPressed.add($);for(let $ of E)if(!V.buttonsDown.has($))V.buttonsReleased.add($);V.rawAxes.length=Y.axes.length;for(let $=0;$<Y.axes.length;$++)V.rawAxes[$]=Y.axes[$]??0;Wj(V.rawAxes,V.axes,W)}}function $j(j,J,W,G){if(j.keys?.some((Z)=>J.has(Z)))return!0;if(j.pointerButtons?.some((Z)=>W.has(Z)))return!0;if(j.gamepadButtons?.some(({pad:Z,button:Y})=>G[Z]?.buttonsDown.has(Y)??!1))return!0;if(j.gamepadAxes?.some(({pad:Z,axis:Y,direction:V,threshold:E=a})=>{let $=G[Z]?.axes[Y]??0;return V>0?$>E:$<-E}))return!0;return!1}function S(j,J,W,G,Z){let Y=j.prev;j.prev=j.active,j.active=Y,Y.clear();for(let[V,E]of Object.entries(J))if($j(E,W,G,Z))Y.add(V)}function A(j){return{isActive:(J)=>j.active.has(J),justActivated:(J)=>j.active.has(J)&&!j.prev.has(J),justDeactivated:(J)=>!j.active.has(J)&&j.prev.has(J)}}function Kj(j){let{systemGroup:J="input",priority:W=100,phase:G="preUpdate",target:Z=globalThis,gamepad:Y={},coordinateTransform:V,shouldPreventDefault:E,preventDefaultKeys:$,preventDefaultPointerButtons:B}=j??{},y=new Set($??[]),b=new Set(B??[]);function H(q){if(E){if(E(q))q.preventDefault();return}if("key"in q){if(y.has(q.key))q.preventDefault()}else if(b.has(q.button))q.preventDefault()}let x={...j?.actions??{}},K=new Map(Object.entries(j?.players??{})),c=Y.deadzone??e,f=Y.poll??Vj(Array(T).fill(null)),R=jj(),C=qj(),O=Array.from({length:T},Jj),g=k(),I=new Map,_=new Map,F=[],U={x:0,y:0},z={x:0,y:0},M=x,m={isDown:(q)=>C.keysDown.has(q),justPressed:(q)=>C.keysPressed.has(q),justReleased:(q)=>C.keysReleased.has(q)},u={position:U,delta:z,isDown:(q)=>C.pointerButtonsDown.has(q),justPressed:(q)=>C.pointerButtonsPressed.has(q),justReleased:(q)=>C.pointerButtonsReleased.has(q)};function w(q){let Q=O[q];if(!Q)throw Error(`Invalid gamepad index: ${q}`);return{get connected(){return Q.connected},get id(){return Q.id},isDown:(X)=>Q.buttonsDown.has(X),justPressed:(X)=>Q.buttonsPressed.has(X),justReleased:(X)=>Q.buttonsReleased.has(X),buttonValue:(X)=>Q.buttonValues[X]??0,axis:(X)=>Q.axes[X]??0,rawAxis:(X)=>Q.rawAxes[X]??0}}let l=Array.from({length:T},(q,Q)=>w(Q)),p=A(g);function P(q){let Q=I.get(q);if(Q)return Q;let X=k();return I.set(q,X),X}function h(q){let Q=P(q);return{actions:A(Q),setActionMap:(X)=>{if(!K.has(q))throw Error(`Player '${q}' was removed`);K.set(q,{...X})},getActionMap:()=>{let X=K.get(q);if(!X)throw Error(`Player '${q}' was removed`);return{...X}}}}for(let q of K.keys())_.set(q,h(q));let i={keyboard:m,pointer:u,gamepads:l,actions:p,setActionMap(q){M={...q}},getActionMap(){return{...M}},definePlayer(q,Q){if(K.set(q,{...Q}),!_.has(q))_.set(q,h(q))},removePlayer(q){let Q=K.delete(q);return _.delete(q),I.delete(q),Q},player(q){return _.get(q)},playerIds(){return Array.from(K.keys())}};function s(q){let Q=q;if(Q.repeat)return;H(Q),R.keysDown.add(Q.key),R.keysPressed.push(Q.key)}function d(q){let Q=q;H(Q),R.keysDown.delete(Q.key),R.keysReleased.push(Q.key)}function o(q){let Q=q;H(Q),R.pointerButtonsDown.add(Q.button),R.pointerButtonsPressed.push(Q.button)}function n(q){let Q=q;if(V){let{x:X,y:v}=V(Q.clientX,Q.clientY);R.pointerX=X,R.pointerY=v}else R.pointerX=Q.clientX,R.pointerY=Q.clientY;R.pointerMoved=!0}function r(q){let Q=q;H(Q),R.pointerButtonsDown.delete(Q.button),R.pointerButtonsReleased.push(Q.button)}function L(q,Q){Z.addEventListener(q,Q),F.push(()=>{Z.removeEventListener(q,Q)})}return t("input").withResourceTypes().withLabels().withGroups().install((q)=>{q.addResource("inputState",i),q.addSystem("input-state").setPriority(W).inPhase(G).inGroup(J).setOnInitialize(()=>{L("keydown",s),L("keyup",d),L("pointerdown",o),L("pointermove",n),L("pointerup",r)}).setOnDetach(()=>{for(let Q of F)Q();F.length=0}).setProcess(()=>{Yj(O,f,c),Qj(C,R),U.x=C.pointerX,U.y=C.pointerY,z.x=C.pointerDeltaX,z.y=C.pointerDeltaY,S(g,M,C.keysDown,C.pointerButtonsDown,O);for(let[Q,X]of K){let v=P(Q);S(v,X,C.keysDown,C.pointerButtonsDown,O)}})})}export{Rj as gamepadButtonsOn,Ej as gamepadAxisOn,Kj as createInputPlugin,Cj as createActionBinding};
//# debugId=79740F7A05160D2964756E2164756E21
//# sourceMappingURL=input.js.map