diff --git a/wle_pp/wle_pp_bundle.js b/wle_pp/wle_pp_bundle.js index acb4e0e..95bbaa2 100644 --- a/wle_pp/wle_pp_bundle.js +++ b/wle_pp/wle_pp_bundle.js @@ -6,7 +6,7 @@ `,i="",s="name: ",n="components: ",o=", ",r=t.concat(e);return function(){let y="",c=this.pp_getName();c.length>0?y=y.concat(s,c):y=y.concat(s,i);let a=this.pp_getComponents();if(a.length>0){y=y.concat(o,n);for(let u=0;u0){y=y.concat(t);for(let u=0;u0;){let i=t.shift();e.push(i);for(let s of i.children)t.push(s)}return e},WL.Object.prototype.pp_getChildren=function(){return this.children},WL.Object.prototype.pp_markDirty=function(){return this.setDirty()},WL.Object.prototype.pp_equals=function(e){return this.equals(e)},WL.Object.prototype.pp_destroy=function(){return this.destroy()},WL.Object.prototype.pp_reserveObjects=function(e){let t=this.pp_getComponentAmountMap();this._pp_reserveObjects(e,t)},WL.Object.prototype.pp_reserveObjectsHierarchy=function(e){let t=this.pp_getComponentAmountMapHierarchy();this._pp_reserveObjects(e,t)},WL.Object.prototype.pp_reserveObjectsDescendants=function(e){let t=this.pp_getComponentAmountMapDescendants();this._pp_reserveObjects(e,t)},WL.Object.prototype.pp_reserveObjectsChildren=function(e){let t=this.pp_getComponentAmountMapChildren();this._pp_reserveObjects(e,t)},WL.Object.prototype.pp_getComponentAmountMap=function(e=new Map){let t=e.get("object");t==null&&(t=0),t+=1,e.set("object",t);let i=this.pp_getComponents();for(let s of i){let n=s.type,o=e.get(n);o==null&&(o=0),o+=1,e.set(n,o)}return e},WL.Object.prototype.pp_getComponentAmountMapHierarchy=function(e=new Map){let t=this.pp_getHierarchy();for(let i of t)i.pp_getComponentAmountMap(e);return e},WL.Object.prototype.pp_getComponentAmountMapDescendants=function(e=new Map){let t=this.pp_getDescendants();for(let i of t)i.pp_getComponentAmountMap(e);return e},WL.Object.prototype.pp_getComponentAmountMapChildren=function(e=new Map){let t=this.children;for(let i of t)i.pp_getComponentAmountMap(e);return e},WL.Object.prototype._pp_epsilon=1e-6,WL.Object.prototype._pp_quaternionToRadians=function(){let e=V.create();return function(i,s=d.create()){return V.fromQuat(e,i),s[1]=Math.asin(-this._pp_clamp(e[2],-1,1)),Math.abs(e[2])<.9999999?(s[0]=Math.atan2(e[5],e[8]),s[2]=Math.atan2(e[1],e[0])):(s[0]=0,s[2]=Math.atan2(-e[3],e[4])),s}}(),WL.Object.prototype._pp_degreesToQuaternion=function(e,t=g.create()){return g.fromEuler(t,e[0],e[1],e[2]),t},WL.Object.prototype._pp_toDegrees=function(e){return e*(180/Math.PI)},WL.Object.prototype._pp_clamp=function(e,t,i){return Math.min(Math.max(e,t),i)},WL.Object.prototype._pp_reserveObjects=function(e,t){let i=t.get("object")*e;t.delete("object");let s={};for(let[n,o]of t.entries())s[n]=o*e;WL.scene.reserveObjects(i,s)},WL.Object.prototype._pp_setAxes=function(){let e=[d.create(),d.create(),d.create()],t=[[1,-1,1],[1,1,-1],[-1,1,-1]],i=d.create(),s=d.create(),n=d.create(),o=d.create(),r=d.create(),l=V.create(),y=g.create();return function(a,m,u){let h=a[m[0]],_=a[m[1]],P=a[m[2]];if(h==null)return;let p=!1;_!=null&&d.angle(h,_)>this._pp_epsilon&&(p=!0);let f=!1;if(P!=null&&d.angle(h,P)>this._pp_epsilon&&(f=!0),p||f){let b=null,C=null,v=null;p?(b=_,C=1,v=2):(b=P,C=2,v=1);let x=t[m[0]];d.cross(e[v],h,b),d.scale(e[v],e[v],x[m[v]]),d.cross(e[C],h,e[v]),d.scale(e[C],e[C],x[m[C]]),d.cross(e[0],e[1],e[2]),d.scale(e[0],e[0],x[m[0]]),d.normalize(i,e[m.pp_findIndexEqual(0)]),d.normalize(s,e[m.pp_findIndexEqual(1)]),d.normalize(n,e[m.pp_findIndexEqual(2)]),V.set(l,i[0],i[1],i[2],s[0],s[1],s[2],n[0],n[1],n[2]),g.fromMat3(y,l),g.normalize(y,y),u?this.pp_setRotationLocalQuat(y):this.pp_setRotationWorldQuat(y)}else{m[0]==0?u?this.pp_getLeftLocal(o):this.pp_getLeftWorld(o):m[0]==1?u?this.pp_getUpLocal(o):this.pp_getUpWorld(o):u?this.pp_getForwardLocal(o):this.pp_getForwardWorld(o);let b=d.angle(h,o);b!=0&&(d.cross(r,o,h),d.normalize(r,r),g.setAxisAngle(y,r,b),u?this.pp_rotateLocalQuat(y):this.pp_rotateWorldQuat(y))}}}();for(let e in WL.Object.prototype){let t=["pp_","_pp_"],i=!1;for(let s of t)if(e.startsWith(s)){i=!0;break}i&&Object.defineProperty(WL.Object.prototype,e,{enumerable:!1})}}});var He=T(()=>{Math.PP_EPSILON_NUMBER=1e-5;Math.PP_EPSILON_DEGREES=1e-4;Math.pp_clamp=function(e,t,i){let s=t??-Number.MAX_VALUE,n=i??Number.MAX_VALUE,o=Math.min(s,n),r=Math.max(s,n);return Math.min(Math.max(e,o),r)};Math.pp_sign=function(e,t=1){let i=Math.sign(e);return i==0&&(i=Math.sign(t)),i};Math.pp_toDegrees=function(e){return e*(180/Math.PI)};Math.pp_toRadians=function(e){return e*(Math.PI/180)};Math.pp_roundDecimal=function(e,t){let i=Math.pow(10,t);return e=Math.round(e*i)/i,e};Math.pp_mapToRange=function(e,t,i,s,n){if(t==i)return s;let o=Math.pp_clamp(e,t,i);if(o==t)return s;if(o==i)return n;let r=s+(n-s)/(i-t)*(o-t);return Math.pp_clamp(r,s,n)};Math.pp_random=function(e=0,t=1){return Math.random()*(t-e)+e};Math.pp_randomInt=function(e,t){let i=Math.min(e,t),s=Math.max(e,t);return Math.floor(Math.random()*(s-i+1)+i)};Math.pp_randomBool=function(){return Math.pp_randomInt(0,1)==0};Math.pp_randomSign=function(){return Math.random()<.5?1:-1};Math.pp_randomPick=function(...e){let t=null;if(e.length>0)if(e.length==1&&e[0].length!=null){if(e[0].length>0){let i=Math.pp_randomInt(0,e[0].length-1);t=e[0][i]}}else{let i=Math.pp_randomInt(0,e.length-1);t=e[i]}return t};Math.pp_lerp=function(e,t,i){return i<=0?e:i>=1?t:i*(t-e)+e};PP.EasingFunction={linear:e=>e,easeIn:e=>e*e*e,easeOut:e=>(e-1)*(e-1)*(e-1)+1,easeInOut:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1};Math.pp_interpolate=function(e,t,i,s=PP.EasingFunction.linear){let n=s(i);return Math.pp_lerp(e,t,n)};Math.pp_angleDistance=function(e,t){return Math.pp_angleDistanceDegrees(e,t)};Math.pp_angleDistanceDegrees=function(e,t){return Math.abs(Math.pp_angleDistanceSignedDegrees(e,t))};Math.pp_angleDistanceRadians=function(e,t){return Math.abs(Math.pp_angleDistanceSignedRadians(e,t))};Math.pp_angleDistanceSigned=function(e,t){return Math.pp_angleDistanceSignedDegrees(e,t)};Math.pp_angleDistanceSignedDegrees=function(e,t){let i=Math.pp_angleClampDegrees(e,!0),s=Math.pp_angleClampDegrees(t,!0),n=s-i;return s-i>180?n=s-i-360:s-i<-180&&(n=s-i+360),n};Math.pp_angleDistanceSignedRadians=function(e,t){return Math.pp_toRadians(Math.pp_angleDistanceSignedDegrees(Math.pp_toDegrees(e),Math.pp_toDegrees(t)))};Math.pp_angleClamp=function(e,t=!1){return Math.pp_angleClampDegrees(e,t)};Math.pp_angleClampDegrees=function(e,t=!1){let i=e%360;return i<0&&(i+=360),t||i>180&&(i-=360),i};Math.pp_angleClampRadians=function(e,t=!1){return Math.pp_toRadians(Math.pp_angleClampDegrees(Math.pp_toDegrees(e),t))};Math.pp_isInsideAngleRange=function(e,t,i,s=!1){return Math.pp_isInsideAngleRangeDegrees(e,t,i,s)};Math.pp_isInsideAngleRangeDegrees=function(e,t,i,s=!1){let n=!1,o=Math.pp_angleClampDegrees(e,!0),r=Math.pp_angleClampDegrees(t,!0),l=Math.pp_angleClampDegrees(i,!0);if(s&&Math.pp_angleDistanceSignedDegrees(r,l)<0){let y=r;r=l,l=y}return r=r&&o<=l:n=o>=r||o<=l,n};Math.pp_isInsideAngleRangeRadians=function(e,t,i,s=!1){return Math.pp_isInsideAngleRangeDegrees(Math.pp_toDegrees(e),Math.pp_toDegrees(t),Math.pp_toDegrees(i),s)};for(let e in Math){let t=["pp_","_pp_"],i=!1;for(let s of t)if(e.startsWith(s)){i=!0;break}i&&Object.defineProperty(Math,e,{enumerable:!1})}});var ct=T(ut=>{(function(){"use strict";var e=function(){this.init()};e.prototype={init:function(){var a=this||t;return a._counter=1e3,a._html5AudioPool=[],a.html5PoolSize=10,a._codecs={},a._howls=[],a._muted=!1,a._volume=1,a._canPlayEvent="canplaythrough",a._navigator=typeof window<"u"&&window.navigator?window.navigator:null,a.masterGain=null,a.noAudio=!1,a.usingWebAudio=!0,a.autoSuspend=!0,a.ctx=null,a.autoUnlock=!0,a._setup(),a},volume:function(a){var m=this||t;if(a=parseFloat(a),m.ctx||c(),typeof a<"u"&&a>=0&&a<=1){if(m._volume=a,m._muted)return m;m.usingWebAudio&&m.masterGain.gain.setValueAtTime(a,t.ctx.currentTime);for(var u=0;u=0;m--)a._howls[m].unload();return a.usingWebAudio&&a.ctx&&typeof a.ctx.close<"u"&&(a.ctx.close(),a.ctx=null,c()),a},codecs:function(a){return(this||t)._codecs[a.replace(/^x-/,"")]},_setup:function(){var a=this||t;if(a.state=a.ctx&&a.ctx.state||"suspended",a._autoSuspend(),!a.usingWebAudio)if(typeof Audio<"u")try{var m=new Audio;typeof m.oncanplaythrough>"u"&&(a._canPlayEvent="canplay")}catch{a.noAudio=!0}else a.noAudio=!0;try{var m=new Audio;m.muted&&(a.noAudio=!0)}catch{}return a.noAudio||a._setupCodecs(),a},_setupCodecs:function(){var a=this||t,m=null;try{m=typeof Audio<"u"?new Audio:null}catch{return a}if(!m||typeof m.canPlayType!="function")return a;var u=m.canPlayType("audio/mpeg;").replace(/^no$/,""),h=a._navigator?a._navigator.userAgent:"",_=h.match(/OPR\/([0-6].)/g),P=_&&parseInt(_[0].split("/")[1],10)<33,p=h.indexOf("Safari")!==-1&&h.indexOf("Chrome")===-1,f=h.match(/Version\/(.*?) /),b=p&&f&&parseInt(f[1],10)<15;return a._codecs={mp3:!!(!P&&(u||m.canPlayType("audio/mp3;").replace(/^no$/,""))),mpeg:!!u,opus:!!m.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!m.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!m.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!(m.canPlayType('audio/wav; codecs="1"')||m.canPlayType("audio/wav")).replace(/^no$/,""),aac:!!m.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!m.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(m.canPlayType("audio/x-m4a;")||m.canPlayType("audio/m4a;")||m.canPlayType("audio/aac;")).replace(/^no$/,""),m4b:!!(m.canPlayType("audio/x-m4b;")||m.canPlayType("audio/m4b;")||m.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(m.canPlayType("audio/x-mp4;")||m.canPlayType("audio/mp4;")||m.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!!(!b&&m.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),webm:!!(!b&&m.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),dolby:!!m.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,""),flac:!!(m.canPlayType("audio/x-flac;")||m.canPlayType("audio/flac;")).replace(/^no$/,"")},a},_unlockAudio:function(){var a=this||t;if(!(a._audioUnlocked||!a.ctx)){a._audioUnlocked=!1,a.autoUnlock=!1,!a._mobileUnloaded&&a.ctx.sampleRate!==44100&&(a._mobileUnloaded=!0,a.unload()),a._scratchBuffer=a.ctx.createBuffer(1,1,22050);var m=function(u){for(;a._html5AudioPool.length"u"?b.noteOn(0):b.start(0),typeof a.ctx.resume=="function"&&a.ctx.resume(),b.onended=function(){b.disconnect(0),a._audioUnlocked=!0,document.removeEventListener("touchstart",m,!0),document.removeEventListener("touchend",m,!0),document.removeEventListener("click",m,!0),document.removeEventListener("keydown",m,!0);for(var C=0;C"u"||!t.usingWebAudio)){for(var m=0;m"u"||!t.usingWebAudio))return a.state==="running"&&a.ctx.state!=="interrupted"&&a._suspendTimer?(clearTimeout(a._suspendTimer),a._suspendTimer=null):a.state==="suspended"||a.state==="running"&&a.ctx.state==="interrupted"?(a.ctx.resume().then(function(){a.state="running";for(var m=0;m"u"&&(a="__default",!u._playLock)){for(var _=0,P=0;P0?p._seek:u._sprite[a][0]/1e3),C=Math.max(0,(u._sprite[a][0]+u._sprite[a][1])/1e3-b),v=C*1e3/Math.abs(p._rate),x=u._sprite[a][0]/1e3,M=(u._sprite[a][0]+u._sprite[a][1])/1e3;p._sprite=a,p._ended=!1;var E=function(){p._paused=!1,p._seek=b,p._start=x,p._stop=M,p._loop=!!(p._loop||u._sprite[a][2])};if(b>=M){u._ended(p);return}var A=p._node;if(u._webAudio){var W=function(){u._playLock=!1,E(),u._refreshBuffer(p);var O=p._muted||u._muted?0:p._volume;A.gain.setValueAtTime(O,t.ctx.currentTime),p._playStart=t.ctx.currentTime,typeof A.bufferSource.start>"u"?p._loop?A.bufferSource.noteGrainOn(0,b,86400):A.bufferSource.noteGrainOn(0,b,C):p._loop?A.bufferSource.start(0,b,86400):A.bufferSource.start(0,b,C),v!==1/0&&(u._endTimers[p._id]=setTimeout(u._ended.bind(u,p),v)),m||setTimeout(function(){u._emit("play",p._id),u._loadQueue()},0)};t.state==="running"&&t.ctx.state!=="interrupted"?W():(u._playLock=!0,u.once("resume",W),u._clearTimer(p._id))}else{var I=function(){A.currentTime=b,A.muted=p._muted||u._muted||t._muted||A.muted,A.volume=p._volume*t.volume(),A.playbackRate=p._rate;try{var O=A.play();if(O&&typeof Promise<"u"&&(O instanceof Promise||typeof O.then=="function")?(u._playLock=!0,E(),O.then(function(){u._playLock=!1,A._unlocked=!0,m?u._loadQueue():u._emit("play",p._id)}).catch(function(){u._playLock=!1,u._emit("playerror",p._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction."),p._ended=!0,p._paused=!0})):m||(u._playLock=!1,E(),u._emit("play",p._id)),A.playbackRate=p._rate,A.paused){u._emit("playerror",p._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");return}a!=="__default"||p._loop?u._endTimers[p._id]=setTimeout(u._ended.bind(u,p),v):(u._endTimers[p._id]=function(){u._ended(p),A.removeEventListener("ended",u._endTimers[p._id],!1)},A.addEventListener("ended",u._endTimers[p._id],!1))}catch(R){u._emit("playerror",p._id,R)}};A.src==="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"&&(A.src=u._src,A.load());var j=window&&window.ejecta||!A.readyState&&t._navigator.isCocoonJS;if(A.readyState>=3||j)I();else{u._playLock=!0,u._state="loading";var k=function(){u._state="loaded",I(),A.removeEventListener(t._canPlayEvent,k,!1)};A.addEventListener(t._canPlayEvent,k,!1),u._clearTimer(p._id)}}return p._id},pause:function(a){var m=this;if(m._state!=="loaded"||m._playLock)return m._queue.push({event:"pause",action:function(){m.pause(a)}}),m;for(var u=m._getSoundIds(a),h=0;h"u"?_._node.bufferSource.noteOff(0):_._node.bufferSource.stop(0),m._cleanBuffer(_._node)}else(!isNaN(_._node.duration)||_._node.duration===1/0)&&_._node.pause();arguments[1]||m._emit("pause",_?_._id:null)}return m},stop:function(a,m){var u=this;if(u._state!=="loaded"||u._playLock)return u._queue.push({event:"stop",action:function(){u.stop(a)}}),u;for(var h=u._getSoundIds(a),_=0;_"u"?P._node.bufferSource.noteOff(0):P._node.bufferSource.stop(0),u._cleanBuffer(P._node)):(!isNaN(P._node.duration)||P._node.duration===1/0)&&(P._node.currentTime=P._start||0,P._node.pause(),P._node.duration===1/0&&u._clearSound(P._node))),m||u._emit("stop",P._id))}return u},mute:function(a,m){var u=this;if(u._state!=="loaded"||u._playLock)return u._queue.push({event:"mute",action:function(){u.mute(a,m)}}),u;if(typeof m>"u")if(typeof a=="boolean")u._muted=a;else return u._muted;for(var h=u._getSoundIds(m),_=0;_"u"){var _=a._getSoundIds(),P=_.indexOf(m[0]);P>=0?h=parseInt(m[0],10):u=parseFloat(m[0])}else m.length>=2&&(u=parseFloat(m[0]),h=parseInt(m[1],10));var p;if(typeof u<"u"&&u>=0&&u<=1){if(a._state!=="loaded"||a._playLock)return a._queue.push({event:"volume",action:function(){a.volume.apply(a,m)}}),a;typeof h>"u"&&(a._volume=u),h=a._getSoundIds(h);for(var f=0;f"u")}}return _},_startFadeInterval:function(a,m,u,h,_,P){var p=this,f=m,b=u-m,C=Math.abs(b/.01),v=Math.max(4,C>0?h/C:h),x=Date.now();a._fadeTo=u,a._interval=setInterval(function(){var M=(Date.now()-x)/h;x=Date.now(),f+=b*M,f=Math.round(f*100)/100,b<0?f=Math.max(u,f):f=Math.min(u,f),p._webAudio?a._volume=f:p.volume(f,a._id,!0),P&&(p._volume=f),(um&&f>=u)&&(clearInterval(a._interval),a._interval=null,a._fadeTo=null,p.volume(u,a._id),p._emit("fade",a._id))},v)},_stopFade:function(a){var m=this,u=m._soundById(a);return u&&u._interval&&(m._webAudio&&u._node.gain.cancelScheduledValues(t.ctx.currentTime),clearInterval(u._interval),u._interval=null,m.volume(u._fadeTo,a),u._fadeTo=null,m._emit("fade",a)),m},loop:function(){var a=this,m=arguments,u,h,_;if(m.length===0)return a._loop;if(m.length===1)if(typeof m[0]=="boolean")u=m[0],a._loop=u;else return _=a._soundById(parseInt(m[0],10)),_?_._loop:!1;else m.length===2&&(u=m[0],h=parseInt(m[1],10));for(var P=a._getSoundIds(h),p=0;p=0?h=parseInt(m[0],10):u=parseFloat(m[0])}else m.length===2&&(u=parseFloat(m[0]),h=parseInt(m[1],10));var p;if(typeof u=="number"){if(a._state!=="loaded"||a._playLock)return a._queue.push({event:"rate",action:function(){a.rate.apply(a,m)}}),a;typeof h>"u"&&(a._rate=u),h=a._getSoundIds(h);for(var f=0;f=0?h=parseInt(m[0],10):a._sounds.length&&(h=a._sounds[0]._id,u=parseFloat(m[0]))}else m.length===2&&(u=parseFloat(m[0]),h=parseInt(m[1],10));if(typeof h>"u")return 0;if(typeof u=="number"&&(a._state!=="loaded"||a._playLock))return a._queue.push({event:"seek",action:function(){a.seek.apply(a,m)}}),a;var p=a._soundById(h);if(p)if(typeof u=="number"&&u>=0){var f=a.playing(h);f&&a.pause(h,!0),p._seek=u,p._ended=!1,a._clearTimer(h),!a._webAudio&&p._node&&!isNaN(p._node.duration)&&(p._node.currentTime=u);var b=function(){f&&a.play(h,!0),a._emit("seek",h)};if(f&&!a._webAudio){var C=function(){a._playLock?setTimeout(C,0):b()};setTimeout(C,0)}else b()}else if(a._webAudio){var v=a.playing(h)?t.ctx.currentTime-p._playStart:0,x=p._rateSeek?p._rateSeek-p._seek:0;return p._seek+(x+v*Math.abs(p._rate))}else return p._node.currentTime;return a},playing:function(a){var m=this;if(typeof a=="number"){var u=m._soundById(a);return u?!u._paused:!1}for(var h=0;h=0&&t._howls.splice(h,1);var _=!0;for(u=0;u=0){_=!1;break}return n&&_&&delete n[a._src],t.noAudio=!1,a._state="unloaded",a._sounds=[],a=null,null},on:function(a,m,u,h){var _=this,P=_["_on"+a];return typeof m=="function"&&P.push(h?{id:u,fn:m,once:h}:{id:u,fn:m}),_},off:function(a,m,u){var h=this,_=h["_on"+a],P=0;if(typeof m=="number"&&(u=m,m=null),m||u)for(P=0;P<_.length;P++){var p=u===_[P].id;if(m===_[P].fn&&p||!m&&p){_.splice(P,1);break}}else if(a)h["_on"+a]=[];else{var f=Object.keys(h);for(P=0;P=0;P--)(!_[P].id||_[P].id===m||a==="load")&&(setTimeout(function(p){p.call(this,m,u)}.bind(h,_[P].fn),0),_[P].once&&h.off(a,_[P].fn,_[P].id));return h._loadQueue(a),h},_loadQueue:function(a){var m=this;if(m._queue.length>0){var u=m._queue[0];u.event===a&&(m._queue.shift(),m._loadQueue()),a||u.action()}return m},_ended:function(a){var m=this,u=a._sprite;if(!m._webAudio&&a._node&&!a._node.paused&&!a._node.ended&&a._node.currentTime=0;h--){if(u<=m)return;a._sounds[h]._ended&&(a._webAudio&&a._sounds[h]._node&&a._sounds[h]._node.disconnect(0),a._sounds.splice(h,1),u--)}}},_getSoundIds:function(a){var m=this;if(typeof a>"u"){for(var u=[],h=0;h=0;if(t._scratchBuffer&&a.bufferSource&&(a.bufferSource.onended=null,a.bufferSource.disconnect(0),u))try{a.bufferSource.buffer=t._scratchBuffer}catch{}return a.bufferSource=null,m},_clearSound:function(a){var m=/MSIE |Trident\//.test(t._navigator&&t._navigator.userAgent);m||(a.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA")}};var s=function(a){this._parent=a,this.init()};s.prototype={init:function(){var a=this,m=a._parent;return a._muted=m._muted,a._loop=m._loop,a._volume=m._volume,a._rate=m._rate,a._seek=0,a._paused=!0,a._ended=!0,a._sprite="__default",a._id=++t._counter,m._sounds.push(a),a.create(),a},create:function(){var a=this,m=a._parent,u=t._muted||a._muted||a._parent._muted?0:a._volume;return m._webAudio?(a._node=typeof t.ctx.createGain>"u"?t.ctx.createGainNode():t.ctx.createGain(),a._node.gain.setValueAtTime(u,t.ctx.currentTime),a._node.paused=!0,a._node.connect(t.masterGain)):t.noAudio||(a._node=t._obtainHtml5Audio(),a._errorFn=a._errorListener.bind(a),a._node.addEventListener("error",a._errorFn,!1),a._loadFn=a._loadListener.bind(a),a._node.addEventListener(t._canPlayEvent,a._loadFn,!1),a._endFn=a._endListener.bind(a),a._node.addEventListener("ended",a._endFn,!1),a._node.src=m._src,a._node.preload=m._preload===!0?"auto":m._preload,a._node.volume=u*t.volume(),a._node.load()),a},reset:function(){var a=this,m=a._parent;return a._muted=m._muted,a._loop=m._loop,a._volume=m._volume,a._rate=m._rate,a._seek=0,a._rateSeek=0,a._paused=!0,a._ended=!0,a._sprite="__default",a._id=++t._counter,a},_errorListener:function(){var a=this;a._parent._emit("loaderror",a._id,a._node.error?a._node.error.code:0),a._node.removeEventListener("error",a._errorFn,!1)},_loadListener:function(){var a=this,m=a._parent;m._duration=Math.ceil(a._node.duration*10)/10,Object.keys(m._sprite).length===0&&(m._sprite={__default:[0,m._duration*1e3]}),m._state!=="loaded"&&(m._state="loaded",m._emit("load"),m._loadQueue()),a._node.removeEventListener(t._canPlayEvent,a._loadFn,!1)},_endListener:function(){var a=this,m=a._parent;m._duration===1/0&&(m._duration=Math.ceil(a._node.duration*10)/10,m._sprite.__default[1]===1/0&&(m._sprite.__default[1]=m._duration*1e3),m._ended(a)),a._node.removeEventListener("ended",a._endFn,!1)}};var n={},o=function(a){var m=a._src;if(n[m]){a._duration=n[m].duration,y(a);return}if(/^data:[^;]+;base64,/.test(m)){for(var u=atob(m.split(",")[1]),h=new Uint8Array(u.length),_=0;_0?(n[m._src]=_,y(m,_)):u()};typeof Promise<"u"&&t.ctx.decodeAudioData.length===1?t.ctx.decodeAudioData(a).then(h).catch(u):t.ctx.decodeAudioData(a,h,u)},y=function(a,m){m&&!a._duration&&(a._duration=m.duration),Object.keys(a._sprite).length===0&&(a._sprite={__default:[0,a._duration*1e3]}),a._state!=="loaded"&&(a._state="loaded",a._emit("load"),a._loadQueue())},c=function(){if(!!t.usingWebAudio){try{typeof AudioContext<"u"?t.ctx=new AudioContext:typeof webkitAudioContext<"u"?t.ctx=new webkitAudioContext:t.usingWebAudio=!1}catch{t.usingWebAudio=!1}t.ctx||(t.usingWebAudio=!1);var a=/iP(hone|od|ad)/.test(t._navigator&&t._navigator.platform),m=t._navigator&&t._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),u=m?parseInt(m[1],10):null;if(a&&u&&u<9){var h=/safari/.test(t._navigator&&t._navigator.userAgent.toLowerCase());t._navigator&&!h&&(t.usingWebAudio=!1)}t.usingWebAudio&&(t.masterGain=typeof t.ctx.createGain>"u"?t.ctx.createGainNode():t.ctx.createGain(),t.masterGain.gain.setValueAtTime(t._muted?0:t._volume,t.ctx.currentTime),t.masterGain.connect(t.ctx.destination)),t._setup()}};typeof define=="function"&&define.amd&&define([],function(){return{Howler:t,Howl:i}}),typeof ut<"u"&&(ut.Howler=t,ut.Howl=i),typeof global<"u"?(global.HowlerGlobal=e,global.Howler=t,global.Howl=i,global.Sound=s):typeof window<"u"&&(window.HowlerGlobal=e,window.Howler=t,window.Howl=i,window.Sound=s)})();(function(){"use strict";HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(t){var i=this;if(!i.ctx||!i.ctx.listener)return i;for(var s=i._howls.length-1;s>=0;s--)i._howls[s].stereo(t);return i},HowlerGlobal.prototype.pos=function(t,i,s){var n=this;if(!n.ctx||!n.ctx.listener)return n;if(i=typeof i!="number"?n._pos[1]:i,s=typeof s!="number"?n._pos[2]:s,typeof t=="number")n._pos=[t,i,s],typeof n.ctx.listener.positionX<"u"?(n.ctx.listener.positionX.setTargetAtTime(n._pos[0],Howler.ctx.currentTime,.1),n.ctx.listener.positionY.setTargetAtTime(n._pos[1],Howler.ctx.currentTime,.1),n.ctx.listener.positionZ.setTargetAtTime(n._pos[2],Howler.ctx.currentTime,.1)):n.ctx.listener.setPosition(n._pos[0],n._pos[1],n._pos[2]);else return n._pos;return n},HowlerGlobal.prototype.orientation=function(t,i,s,n,o,r){var l=this;if(!l.ctx||!l.ctx.listener)return l;var y=l._orientation;if(i=typeof i!="number"?y[1]:i,s=typeof s!="number"?y[2]:s,n=typeof n!="number"?y[3]:n,o=typeof o!="number"?y[4]:o,r=typeof r!="number"?y[5]:r,typeof t=="number")l._orientation=[t,i,s,n,o,r],typeof l.ctx.listener.forwardX<"u"?(l.ctx.listener.forwardX.setTargetAtTime(t,Howler.ctx.currentTime,.1),l.ctx.listener.forwardY.setTargetAtTime(i,Howler.ctx.currentTime,.1),l.ctx.listener.forwardZ.setTargetAtTime(s,Howler.ctx.currentTime,.1),l.ctx.listener.upX.setTargetAtTime(n,Howler.ctx.currentTime,.1),l.ctx.listener.upY.setTargetAtTime(o,Howler.ctx.currentTime,.1),l.ctx.listener.upZ.setTargetAtTime(r,Howler.ctx.currentTime,.1)):l.ctx.listener.setOrientation(t,i,s,n,o,r);else return y;return l},Howl.prototype.init=function(t){return function(i){var s=this;return s._orientation=i.orientation||[1,0,0],s._stereo=i.stereo||null,s._pos=i.pos||null,s._pannerAttr={coneInnerAngle:typeof i.coneInnerAngle<"u"?i.coneInnerAngle:360,coneOuterAngle:typeof i.coneOuterAngle<"u"?i.coneOuterAngle:360,coneOuterGain:typeof i.coneOuterGain<"u"?i.coneOuterGain:0,distanceModel:typeof i.distanceModel<"u"?i.distanceModel:"inverse",maxDistance:typeof i.maxDistance<"u"?i.maxDistance:1e4,panningModel:typeof i.panningModel<"u"?i.panningModel:"HRTF",refDistance:typeof i.refDistance<"u"?i.refDistance:1,rolloffFactor:typeof i.rolloffFactor<"u"?i.rolloffFactor:1},s._onstereo=i.onstereo?[{fn:i.onstereo}]:[],s._onpos=i.onpos?[{fn:i.onpos}]:[],s._onorientation=i.onorientation?[{fn:i.onorientation}]:[],t.call(this,i)}}(Howl.prototype.init),Howl.prototype.stereo=function(t,i){var s=this;if(!s._webAudio)return s;if(s._state!=="loaded")return s._queue.push({event:"stereo",action:function(){s.stereo(t,i)}}),s;var n=typeof Howler.ctx.createStereoPanner>"u"?"spatial":"stereo";if(typeof i>"u")if(typeof t=="number")s._stereo=t,s._pos=[t,0,0];else return s._stereo;for(var o=s._getSoundIds(i),r=0;r"u")if(typeof t=="number")o._pos=[t,i,s];else return o._pos;for(var r=o._getSoundIds(n),l=0;l"u")if(typeof t=="number")o._orientation=[t,i,s];else return o._orientation;for(var r=o._getSoundIds(n),l=0;l"u"&&(s.pannerAttr||(s.pannerAttr={coneInnerAngle:s.coneInnerAngle,coneOuterAngle:s.coneOuterAngle,coneOuterGain:s.coneOuterGain,distanceModel:s.distanceModel,maxDistance:s.maxDistance,refDistance:s.refDistance,rolloffFactor:s.rolloffFactor,panningModel:s.panningModel}),t._pannerAttr={coneInnerAngle:typeof s.pannerAttr.coneInnerAngle<"u"?s.pannerAttr.coneInnerAngle:t._coneInnerAngle,coneOuterAngle:typeof s.pannerAttr.coneOuterAngle<"u"?s.pannerAttr.coneOuterAngle:t._coneOuterAngle,coneOuterGain:typeof s.pannerAttr.coneOuterGain<"u"?s.pannerAttr.coneOuterGain:t._coneOuterGain,distanceModel:typeof s.pannerAttr.distanceModel<"u"?s.pannerAttr.distanceModel:t._distanceModel,maxDistance:typeof s.pannerAttr.maxDistance<"u"?s.pannerAttr.maxDistance:t._maxDistance,refDistance:typeof s.pannerAttr.refDistance<"u"?s.pannerAttr.refDistance:t._refDistance,rolloffFactor:typeof s.pannerAttr.rolloffFactor<"u"?s.pannerAttr.rolloffFactor:t._rolloffFactor,panningModel:typeof s.pannerAttr.panningModel<"u"?s.pannerAttr.panningModel:t._panningModel});else return o=t._soundById(parseInt(i[0],10)),o?o._pannerAttr:t._pannerAttr;else i.length===2&&(s=i[0],n=parseInt(i[1],10));for(var r=t._getSoundIds(n),l=0;l{Ht=pt(ct());WL.registerComponent("pp-spatial-audio-listener",{_myEnabled:{type:WL.Type.Enum,values:["always","vr","non vr"],default:"always"}},{init:function(){this._myOrigin=new Float32Array(3),this._myForward=new Float32Array(3),this._myUp=new Float32Array(3)},update:function(){(this._myEnabled==0||this._myEnabled==1&&WL.xrSession||this._myEnabled==2&&!WL.xrSession)&&(this.object.pp_getPosition(this._myOrigin),this.object.pp_getForward(this._myForward),this.object.pp_getUp(this._myUp),Ht.Howler.pos(this._myOrigin[0],this._myOrigin[1],this._myOrigin[2]),Ht.Howler.orientation(this._myForward[0],this._myForward[1],this._myForward[2],this._myUp[0],this._myUp[1],this._myUp[2]))}})});var qe=T(()=>{WL.registerComponent("pp-audio-manager",{},{init:function(){PP.myAudioManager=new PP.AudioManagerClass},start:function(){},update:function(e){}});PP.myAudioManager=null});var xl={};var ht,Ue=w(()=>{ht=pt(ct());PP.AudioManager=class{constructor(){this._myAudioSetupMap=new Map}createAudioPlayer(t){return this.getAudioSetup(t)!=null?new PP.AudioPlayer(this.getAudioSetup(t)):null}getAudioSetup(t){return this._myAudioSetupMap.get(t)}addAudioSetup(t,i,s=!0){this._myAudioSetupMap.set(t,i),s&&this.createAudioPlayer(t)}removeAudioSetup(t){this._myAudioSetupMap.delete(t)}setVolume(t){ht.Howler.volume(t)}setMute(t){ht.Howler.mute(t)}stop(){ht.Howler.stop()}}});var Ge=T(()=>{PP.AudioEvent={END:"end",STOP:"stop",LOAD:"load",LOAD_ERROR:"loaderror",PLAY:"play",PLAY_ERROR:"playerror",PAUSE:"pause",MUTE:"mute",VOLUME:"volume",RATE:"rate",SEEK:"seek",FADE:"fade",UNLOCK:"unlock"};PP.AudioPlayer=class{constructor(t){typeof t=="string"?this._myAudioSetup=new PP.AudioSetup(audioSetupOrAudioFile):this._myAudioSetup=t.clone(),this._myAudio=new Howl({src:[this._myAudioSetup.myAudioFilePath],loop:this._myAudioSetup.myLoop,volume:this._myAudioSetup.myVolume,autoplay:this._myAudioSetup.myAutoplay,rate:this._myAudioSetup.myRate,pool:this._myAudioSetup.myPool,preload:!0}),this._myAudio._pannerAttr.refDistance=this._myAudioSetup.myReferenceDistance,this._myLastAudioID=null,this._myCallbackMap=new Map;for(let i in PP.AudioEvent)this._myCallbackMap.set(PP.AudioEvent[i],new Map);this._addListeners()}play(){let t=this._myAudio.play();t!=null&&(this._myLastAudioID=t,this.updatePosition(this._myAudioSetup.myPosition,!0),this.updatePitch(this._myAudioSetup.myPitch,!0),this.updateVolume(this._myAudioSetup.myVolume,!0))}stop(){this._myAudio.stop()}pause(){this._myAudio.pause()}resume(){this._myAudio.play()}isPlaying(t=!1){let i=!1;return t?i=this._myAudio.playing(this._myLastAudioID):i=this._myAudio.playing(),i}isLoaded(){return this._myAudio.state()=="loaded"}fade(t,i,s,n=!1){this.setVolume(i),n?this._myAudio.fade(t,i,s*1e3,this._myLastAudioID):this._myAudio.fade(t,i,s*1e3)}updatePosition(t,i=!1){this.setPosition(t),this._myAudioSetup.mySpatial&&t&&(i?this._myAudio.pos(t[0],t[1],t[2],this._myLastAudioID):this._myAudio.pos(t[0],t[1],t[2]))}updatePitch(t,i=!1){this.updateRate(t,i)}updateRate(t,i=!1){this.setRate(t),t!=null&&(i?this._myAudio.rate(t,this._myLastAudioID):this._myAudio.rate(t))}updateVolume(t,i=!1){this.setVolume(t),t!=null&&(i?this._myAudio.volume(t,this._myLastAudioID):this._myAudio.volume(t))}setSpatial(t){this._myAudioSetup.mySpatial=t}setPosition(t){this._myAudioSetup.myPosition=t}setPitch(t){this._myAudioSetup.myPitch=t}setRate(t){this._myAudioSetup.myRate=t}setVolume(t){this._myAudioSetup.myVolume=t}getDuration(){return this._myAudio.duration()}getVolume(){return this._myAudioSetup.myVolume}getPitch(){return this._myAudioSetup.myPitch}getRate(){return this._myAudioSetup.myRate}registerAudioEventListener(t,i,s){this._myCallbackMap.get(t).set(i,s)}unregisterAudioEventListener(t,i){this._myCallbackMap.get(t).delete(i)}_addListeners(){for(let t in PP.AudioEvent){let i=PP.AudioEvent[t];this._myAudio.on(i,function(s){let n=this._myCallbackMap.get(i);for(let o of n.values())o(s)}.bind(this))}}}});var ze=T(()=>{PP.AudioSetup=class{constructor(t=null){this.myAudioFilePath=t?t.slice(0):null,this.myLoop=!1,this.myAutoplay=!1,this.myVolume=1,this._myRate=1,this.myPool=5,this.myPosition=null,this.mySpatial=!0,this.myReferenceDistance=1}clone(){let t=new PP.AudioSetup;return t.myAudioFilePath=this.myAudioFilePath.slice(0),t.myLoop=this.myLoop,t.myAutoplay=this.myAutoplay,t.myVolume=this.myVolume,t.myPitch=this.myPitch,t.myRate=this.myRate,t.myPool=this.myPool,t.myPosition=this.myPosition,t.mySpatial=this.mySpatial,t.myReferenceDistance=this.myReferenceDistance,t}get myPitch(){return this._myRate}get myRate(){return this._myRate}set myPitch(t){this._myRate=t}set myRate(t){this._myRate=t}}});var Ml={};var Qe,Xe=w(()=>{Qe=pt(ct());WL.registerComponent("pp-mute-everything",{},{init:function(){},start:function(){Qe.Howler.mute(!0)},update:function(e){}})});var Bl={};var Ke=w(()=>{Z();WL.registerComponent("pp-benchmark-max-physx",{_myStaticDomeSize:{type:WL.Type.Float,default:40},_myStaticPhysXCount:{type:WL.Type.Int,default:1e3},_myDynamicDomeSize:{type:WL.Type.Float,default:80},_myDynamicPhysXCount:{type:WL.Type.Int,default:250},_myKinematicDomeSize:{type:WL.Type.Float,default:120},_myKinematicPhysXCount:{type:WL.Type.Int,default:250},_myRaycastCount:{type:WL.Type.Int,default:100},_myVisualizeRaycast:{type:WL.Type.Bool,default:!1},_myVisualizeRaycastDelay:{type:WL.Type.Float,default:.5},_myUseConvexMesh:{type:WL.Type.Bool,default:!1},_myShapeIndex:{type:WL.Type.Int,default:0},_myShapeScaleMultiplier:{type:WL.Type.Float,default:1},_myEnableLog:{type:WL.Type.Bool,default:!0}},{start:function(){this._myRootObject=WL.scene.addObject(this.object),this._myRaycastSetup=new PP.RaycastSetup,this._myRaycastResult=new PP.RaycastResult,this._myStaticPhysXObjects=[],this._myStaticPhysXComponents=[],this._myStaticPhysXCollectors=[],this._myDynamicPhysXObjects=[],this._myDynamicPhysXComponents=[],this._myDynamicPhysXCollectors=[],this._myKinematicPhysXObjects=[],this._myKinematicPhysXComponents=[],this._myKinematicPhysXCollectors=[],this._spawnDome(!0,!1),this._spawnDome(!1,!1),this._spawnDome(!1,!0),this._myStartTimer=new PP.Timer(1),this._myTimer=new PP.Timer(0),this._myDebugTimer=new PP.Timer(this._myVisualizeRaycastDelay),this._myEnableLogTimer=new PP.Timer(1),this._myFPSHistory=[];for(let e=0;e<7;e++)this._myFPSHistory.push(0);this._myAddVelocityDelay=10,this._myTranslateVec3=PP.vec3_create(),this._myRotateVec3=PP.vec3_create()},update:function(e){if(this._myStartTimer.update(e),this._myStartTimer.isDone()){if(this._myTimer.update(e),this._myDebugTimer.update(e),this._myEnableLogTimer.update(e),this._myTimer.isDone()){this._myTimer.start();let t=!1;this._myDebugTimer.isDone()&&(this._myDebugTimer.start(),t=!0),t=t&&this._myVisualizeRaycast,this._raycastTest(t)}if(this._myFPSHistory.pop(),this._myFPSHistory.unshift(Math.round(1/e)),this._myEnableLog&&this._myEnableLogTimer.isDone()){this._myEnableLogTimer.start(),console.clear(),console.log("Static PhysX Dome Size:",this._myStaticPhysXObjects.length),console.log("Dynamic PhysX Dome Size:",this._myDynamicPhysXObjects.length),console.log("Kinematic PhysX Dome Size:",this._myKinematicPhysXObjects.length);let t=0;for(let r of this._myStaticPhysXCollectors)t+=r.getCollisions().length;let i=0;for(let r of this._myDynamicPhysXCollectors)i+=r.getCollisions().length;let s=0;for(let r of this._myKinematicPhysXCollectors)s+=r.getCollisions().length;let n=(t+i+s)/2;console.log("Current Collisions Count:",n),console.log("Raycast Count:",this._myRaycastCount),console.log("FPS History:");let o="";for(let r of this._myFPSHistory)o=o.concat(r,` `);console.log(o)}}if(this._myAddVelocityDelay>0&&(this._myAddVelocityDelay--,this._myAddVelocityDelay==0))for(let t of this._myDynamicPhysXComponents){t.kinematic=!1;let i=50;t.linearVelocity=[Math.pp_random(-i,i),Math.pp_random(-i,i),Math.pp_random(-i,i)],t.angularVelocity=[Math.pp_random(-i,i),Math.pp_random(-i,i),Math.pp_random(-i,i)]}for(let t of this._myKinematicPhysXObjects){let i=5*e;this._myTranslateVec3.vec3_set(Math.pp_random(-i,i),Math.pp_random(-i,i),Math.pp_random(-i,i)),t.pp_translate(this._myTranslateVec3),rotateStrength=50*e,this._myRotateVec3.vec3_set(Math.pp_random(-rotateStrength,rotateStrength),Math.pp_random(-rotateStrength,rotateStrength),Math.pp_random(-rotateStrength,rotateStrength)),t.pp_rotate(this._myRotateVec3)}},_raycastTest(e){let t=this._myRaycastCount,i=1e4;for(let s=0;s{WL.registerComponent("pp-benchmark-max-visible-triangles",{_myTargetFrameRate:{type:WL.Type.Int,default:-1},_myTargetFrameRateThreshold:{type:WL.Type.Int,default:3},_myStartPlaneCount:{type:WL.Type.Int,default:1},_myPlaneTriangles:{type:WL.Type.Int,default:100},_mySecondsBeforeDoubling:{type:WL.Type.Float,default:.5},_myDTHistoryToIgnorePercentage:{type:WL.Type.Float,default:.25},_myCloneMaterial:{type:WL.Type.Bool,default:!1},_myCloneMesh:{type:WL.Type.Bool,default:!1},_myEnableLog:{type:WL.Type.Bool,default:!0},_myPlaneMaterial:{type:WL.Type.Material},_myBackgroundMaterial:{type:WL.Type.Material},_myTextMaterial:{type:WL.Type.Material,default:null}},{_start(){this._myBackgroundSize=4,this._myBackgroundObject.pp_setActive(!0),this._myBackgroundObject.pp_setScale(this._myBackgroundSize+.1),this._myBackgroundObject.pp_translate([0,0,-.001]),this._myDoubleTimer=new PP.Timer(this._mySecondsBeforeDoubling),this._myIsDone=!1,this._myCurrentPlanes=this._myStartPlaneCount,this._myDTHistory=[],this._myUpperLimit=-1,this._myLowerLimit=0,this._myPlanes=[],this._mySkipNextFrames=0,this._myMaxWaitFrames=0,this._myMaxPlanesReached=!1,this._myFirstTime=!0},_update(e){{if(e<1e-5)return;if(e>.5&&this._myMaxWaitFrames>0){this._myMaxWaitFrames--;return}if(this._myMaxWaitFrames=10,this._mySkipNextFrames>0){this._mySkipNextFrames--;return}}if(!this._myIsDone&&(this._myDoubleTimer.update(e),this._myDTHistory.push(e),this._myDoubleTimer.isDone())){this._myDoubleTimer.start();let t=this._computeAverageFrameRate(!1);if(this._myFirstTime)this._myFirstTime=!1;else{let i=!1;t0&&(this._myUpperLimit=Math.max(this._myUpperLimit,this._myLowerLimit))),this._myTriangleTextComponent.text="Triangles: "+this._myCurrentPlanes*this._myRealTrianglesAmount,this._myPlaneTextComponent.text="Planes: "+this._myCurrentPlanes,this._myFPSTextComponent.text="FPS: "+t+" / "+this._myStableFrameRate,i?(this._myTriangleTextComponent.material.color=this._myLagColor,this._myPlaneTextComponent.material.color=this._myLagColor,this._myFPSTextComponent.material.color=this._myLagColor):(this._myTriangleTextComponent.material.color=this._myNormalColor,this._myPlaneTextComponent.material.color=this._myNormalColor,this._myFPSTextComponent.material.color=this._myNormalColor);let s=!1;(this._myUpperLimit>0&&!i&&this._myUpperLimit-this._myLowerLimit<=Math.max(2,1e3/this._myRealTrianglesAmount)||i&&this._myUpperLimit-this._myLowerLimit<=1||!i&&this._myMaxPlanesReached)&&(t0?(this._myCurrentPlanes=Math.floor((this._myUpperLimit+this._myLowerLimit)/2),this._myCurrentPlanes=Math.max(this._myCurrentPlanes,1)):s?this._myCurrentPlanes=this._myLowerLimit:this._myCurrentPlanes=this._myLowerLimit*2,this._myCurrentPlanes>5e4?(this._myCurrentPlanes=5e4,this._myMaxPlanesReached=!0):this._myMaxPlanesReached=!1)}this._myIsDone||(this._displayPlanes(this._myCurrentPlanes),this._myElapsedTime=0,this._myFrameCount=0,this._mySkipNextFrames=30)}},_displayPlanes(e){for(;this._myPlanes.length>e;){let r=this._myPlanes.pop();this._myPlanePool.release(r)}for(;this._myPlanes.length0;r++)for(let l=0;l0;l++){let y=this._myPlanes[o-1];y.pp_setScale(n);let c=[-this._myBackgroundSize+n+l*n*2+l*i,this._myBackgroundSize-n-r*n*2-r*i,0];y.pp_setPositionLocal(c),y.pp_setActive(!0),o--}},start(){this._myLagColor=[.5,0,0,1],this._myNormalColor=[0,0,0,1],this._myRealTrianglesAmount=0,this._myTrianglesObject=WL.scene.addObject(this.object),this._myBackgroundObject=WL.scene.addObject(this._myTrianglesObject);{let t=this._myBackgroundObject.addComponent("mesh");t.mesh=PP.MeshUtils.createPlaneMesh(),t.material=this._myBackgroundMaterial.clone()}this._myPlaneObject=WL.scene.addObject(this._myTrianglesObject);{let t=this._myPlaneObject.addComponent("mesh");t.mesh=this._createPlaneMesh(this._myPlaneTriangles),this._myRealTrianglesAmount=t.mesh.indexData.length/3,t.material=this._myPlaneMaterial.clone()}let e=new PP.ObjectPoolParams;this._myCloneMesh?this._myRealTrianglesAmount<=4?e.myInitialPoolSize=15e3:this._myRealTrianglesAmount<=8?e.myInitialPoolSize=1e4:this._myRealTrianglesAmount<=64?e.myInitialPoolSize=7500:e.myInitialPoolSize=5e3:e.myInitialPoolSize=3e4,e.myPercentageToAddWhenEmpty=0,e.myAmountToAddWhenEmpty=1e4,e.myCloneParams=new PP.CloneParams,e.myCloneParams.myDeepCloneParams.setDeepCloneComponentVariable("mesh","material",this._myCloneMaterial),e.myCloneParams.myDeepCloneParams.setDeepCloneComponentVariable("mesh","mesh",this._myCloneMesh),this._myPlanePool=new PP.ObjectPool(this._myPlaneObject,e),this._myBackgroundObject.pp_setActive(!1),this._myPlaneObject.pp_setActive(!1),this._myStartTimer=new PP.Timer(this._mySecondsBeforeDoubling*2),this._mySessionStarted=!1,this._myTextsObject=WL.scene.addObject(this._myTrianglesObject),this._myTriangleTextObject=WL.scene.addObject(this._myTextsObject),this._myTriangleTextComponent=this._myTriangleTextObject.addComponent("text"),this._myTriangleTextComponent.alignment=WL.Alignment.Left,this._myTriangleTextComponent.justification=WL.Justification.Line,this._myTriangleTextComponent.material=this._myTextMaterial.clone(),this._myTriangleTextComponent.material.color=this._myNormalColor,this._myTriangleTextComponent.text=" ",this._myPlaneTextObject=WL.scene.addObject(this._myTextsObject),this._myPlaneTextComponent=this._myPlaneTextObject.addComponent("text"),this._myPlaneTextComponent.alignment=WL.Alignment.Left,this._myPlaneTextComponent.justification=WL.Justification.Line,this._myPlaneTextComponent.material=this._myTextMaterial.clone(),this._myPlaneTextComponent.material.color=this._myNormalColor,this._myPlaneTextComponent.text=" ",this._myFPSTextObject=WL.scene.addObject(this._myTextsObject),this._myFPSTextComponent=this._myFPSTextObject.addComponent("text"),this._myFPSTextComponent.alignment=WL.Alignment.Left,this._myFPSTextComponent.justification=WL.Justification.Line,this._myFPSTextComponent.material=this._myTextMaterial.clone(),this._myFPSTextComponent.material.color=this._myNormalColor,this._myFPSTextComponent.text=" ",this._myDoneTextObject=WL.scene.addObject(this._myTrianglesObject),this._myDoneTextComponent=this._myDoneTextObject.addComponent("text"),this._myDoneTextComponent.alignment=WL.Alignment.Center,this._myDoneTextComponent.justification=WL.Justification.Line,this._myDoneTextComponent.material=this._myTextMaterial.clone(),this._myDoneTextComponent.material.color=this._myNormalColor,this._myDoneTextComponent.text=" ",this._myTextsObject.pp_setPositionLocal([0,4.3,0]),this._myTextsObject.pp_setScale(2.75),this._myTriangleTextObject.pp_setPositionLocal([-1.4,0,0]),this._myPlaneTextObject.pp_setPositionLocal([.55,0,0]),this._myFPSTextObject.pp_setPositionLocal([-.315,0,0]),this._myDoneTextObject.pp_setPositionLocal([0,-4.6,0]),this._myDoneTextObject.pp_setScale(4),this._myDTHistory=[]},update(e){this._mySessionStarted?this._myStartTimer.isRunning()?(this._myStartTimer.update(e),this._myDTHistory.push(e),this._myStartTimer.isDone()&&(this._myStableFrameRate=this._computeAverageFrameRate(!0),this._myTargetFrameRate>0&&(this._myStableFrameRate=this._myTargetFrameRate),this._myEnableLog&&(console.log(` -Plane Triangles (Adjusted):`,this._myRealTrianglesAmount),console.log("Target Frame Rate:",this._myStableFrameRate,"- Threshold: ",this._myStableFrameRate-this._myTargetFrameRateThreshold),console.log("")),this._start())):this._update(e):this._mySessionStarted=WL.xrSession!=null},_computeAverageFrameRate(e){let t=0;this._myDTHistory.sort();let i=Math.floor(this._myDTHistory.length)*Math.min(.9,this._myDTHistoryToIgnorePercentage*(e?2:1));for(let n=0;n1&&s>1&&i*s>t&&(i-1)*s>=t;)i--;let o=new PP.MeshCreationParams;for(let l=0;l{Number.prototype.get=function(){return this.valueOf()};Object.defineProperty(Number.prototype,"get",{enumerable:!1});PP.NumberOverValue=class{constructor(t,i=null,s=0,n=0,o=PP.EasingFunction.linear,r=null){i==null&&(i=t),this._myStartNumber=t,this._myEndNumber=i,this._myStartInterpolationValue=s,this._myEndInterpolationValue=n,this._myEasingFunction=o,this._myRoundingFunction=r}get(t){let i=this._myEasingFunction(Math.pp_mapToRange(t,this._myStartInterpolationValue,this._myEndInterpolationValue,0,1)),s=Math.pp_lerp(this._myStartNumber,this._myEndNumber,i);return this._myRoundingFunction&&(s=this._myRoundingFunction(s,this._myStartNumber,this._myEndNumber)),s}getAverage(t){return this.get(t)}getRange(t){let i=this.get(t);return[i,i]}getMax(t){return this.get(t)}getMin(t){return this.get(t)}isInside(t,i){return this.get(i)==t}isInsideAngleRange(t,i){return this.isInsideAngleRangeDegrees(t,i)}isInsideAngleRangeDegrees(t,i){let s=this.get(i),n=Math.pp_angleClampDegrees(t),o=Math.pp_angleClampDegrees(s);return n==o}isInsideAngleRangeRadians(t,i){let s=this.get(i),n=Math.pp_angleClampRadians(t),o=Math.pp_angleClampRadians(s);return n==o}};PP.IntOverValue=class extends PP.NumberOverValue{constructor(t,i,s,n,o=PP.EasingFunction.linear,r=null){r==null&&(r=function(l,y,c){let a=null;return y<=c?a=Math.floor(l):a=Math.ceil(l),a}),super(t,i,s,n,o,r)}};PP.NumberRangeOverValue=class{constructor(t,i=null,s=0,n=0,o=PP.EasingFunction.linear,r=null){i==null&&(i=t),this._myStartNumberOverValue=new PP.NumberOverValue(t[0],i[0],s,n,o,r),this._myEndNumberOverValue=new PP.NumberOverValue(t[1],i[1],s,n,o,r),this._myRoundingFunction=r}get(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t),n=null;return this._myRoundingFunction?n=Math.pp_randomInt(i,s):n=Math.pp_random(i,s),n}getAverage(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t),n=(i+s)/2;return this._myRoundingFunction&&(n=this._myRoundingFunction(n,i,s)),n}getRange(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t);return[i,s]}getMax(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t);return Math.max(i,s)}getMin(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t);return Math.min(i,s)}isInside(t,i){let s=this._myStartNumberOverValue.get(i),n=this._myEndNumberOverValue.get(i),o=Math.min(s,n),r=Math.max(s,n);return t>=o&&t<=r}isInsideAngleRange(t,i){return this.isInsideAngleRangeDegrees(t,i)}isInsideAngleRangeDegrees(t,i){let s=this._myStartNumberOverValue.get(i),n=this._myEndNumberOverValue.get(i);return Math.pp_isInsideAngleRangeDegrees(t,s,n)}isInsideAngleRangeRadians(t,i){let s=this._myStartNumberOverValue.get(i),n=this._myEndNumberOverValue.get(i);return Math.pp_isInsideAngleRangeRadians(t,s,n)}};PP.IntRangeOverValue=class extends PP.NumberRangeOverValue{constructor(t,i,s,n,o=PP.EasingFunction.linear,r=null){r==null&&(r=function(l,y,c){let a=null;return y<=c?a=Math.floor(l):a=Math.ceil(l),a}),super(t,i,s,n,o,r)}}});var Ze=T(()=>{PP.ObjectPoolManager=class{constructor(){this._myPoolMap=new Map}addPool(t,i,s=new PP.ObjectPoolParams){if(this._myPoolMap.has(t))console.error("Pool already created with this ID");else{let n=new PP.ObjectPool(i,s);this._myPoolMap.set(t,n)}}increasePool(t,i){let s=this._myPoolMap.get(t);s&&s.increase(i)}increasePoolPercentage(t,i){let s=this._myPoolMap.get(t);s&&s.increasePercentage(i)}getPool(t){return this._myPoolMap.get(t)}hasPool(t){return this._myPoolMap.has(t)}getObject(t){return this._myPoolMap.has(t)?this._myPoolMap.get(t).get():null}releaseObject(t,i){this._myPoolMap.get(t).release(i)}};PP.ObjectPoolParams=class{constructor(){this.myInitialPoolSize=0,this.myAmountToAddWhenEmpty=1,this.myPercentageToAddWhenEmpty=.5,this.myCloneParams=void 0,this.myOptimizeObjectsAllocation=!0,this.myCloneCallback=void 0,this.mySetActiveCallback=void 0,this.myEqualCallback=void 0,this.myOptimizeObjectsAllocationCallback=void 0,this.myEnableDebugLog=!0}};PP.ObjectPool=class{constructor(t,i){this._myObjectPoolParams=i,this._myPrototype=this._clone(t),this._myAvailableObjects=[],this._myBusyObjects=[],this._addToPool(i.myInitialPoolSize,!1)}get(){let t=this._myAvailableObjects.shift();if(t==null){let i=Math.ceil(this._myBusyObjects.length*this._myObjectPoolParams.myPercentageToAddWhenEmpty);i+=this._myObjectPoolParams.myAmountToAddWhenEmpty,this._addToPool(i,this._myObjectPoolParams.myEnableDebugLog),t=this._myAvailableObjects.shift()}return t!=null&&this._myBusyObjects.push(t),t}release(t){let i=this._myBusyObjects.pp_remove(this._equals.bind(this,t));i&&(this._setActive(i,!1),this._myAvailableObjects.push(i))}increase(t){this._addToPool(t,!1)}increasePercentage(t){let i=Math.ceil(this.getSize()*t);this._addToPool(i,!1)}getSize(){return this._myBusyObjects.length+this._myAvailableObjects.length}getAvailableSize(){return this._myAvailableObjects.length}getBusySize(){return this._myAvailableObjects.length}_addToPool(t,i){if(!(t<=0)){this._myObjectPoolParams.myOptimizeObjectsAllocation&&(this._myObjectPoolParams.myOptimizeObjectsAllocationCallback?this._myObjectPoolParams.myOptimizeObjectsAllocationCallback(this._myPrototype,t):this._myPrototype.pp_reserveObjectsHierarchy!=null&&this._myPrototype.pp_reserveObjectsHierarchy(t));for(let s=0;s{PP.PhysXCollisionCollector=class{constructor(t,i=!1){this._myPhysX=t,this._myIsTrigger=i,this._myCollisions=[],this._myCollisionsStart=[],this._myCollisionsEnd=[],this._myUpdateActive=!1,this._myCollisionsStartToProcess=[],this._myCollisionsEndToProcess=[],this._myCollisionCallbackID=null,this._myIsActive=!1,this.setActive(!0),this._myDebugActive=!1,this._myTriggerDesyncFixDelay=new PP.Timer(.1),this._myCollisionCallbacks=new Map,this._myCollisionStartCallbacks=new Map,this._myCollisionEndCallbacks=new Map}getPhysX(){return this._myPhysX}getCollisions(){return this._myCollisions}getCollisionsStart(){return this._myCollisionsStart}getCollisionsEnd(){return this._myCollisionsEnd}setActive(t){this._myIsActive!=t&&(this._myIsActive=t,this._myCollisions=[],this._myCollisionsStart=[],this._myCollisionsEnd=[],this._myUpdateActive=!1,this._myCollisionsStartToProcess=[],this._myCollisionsEndToProcess=[],this._myIsActive?this._myCollisionCallbackID=this._myPhysX.onCollision(this._onCollision.bind(this)):this._myCollisionCallbackID!=null&&(this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID),this._myCollisionCallbackID=null))}setUpdateActive(t){this._myUpdateActive=t}update(t){!this._myIsActive||(this._myUpdateActive=!0,this._myCollisionsStart=this._myCollisionsStartToProcess,this._myCollisionsStartToProcess=[],this._myCollisionsEnd=this._myCollisionsEndToProcess,this._myCollisionsEndToProcess=[],this._myIsTrigger&&this._triggerDesyncFix(t))}destroy(){this._myCollisionCallbackID!=null&&(this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID),this._myCollisionCallbackID=null)}setDebugActive(t){this._myDebugActive=t}registerCollisionEventListener(t,i){this._myCollisionCallbacks.set(t,i)}unregisterCollisionEventListener(t){this._myCollisionCallbacks.delete(t)}registerCollisionStartEventListener(t,i){this._myCollisionStartCallbacks.set(t,i)}unregisterCollisionStartEventListener(t){this._myCollisionStartCallbacks.delete(t)}registerCollisionEndEventListener(t,i){this._myCollisionEndCallbacks.set(t,i)}unregisterCollisionEndEventListener(t){this._myCollisionEndCallbacks.delete(t)}_onCollision(t,i){t==WL.CollisionEventType.Touch||t==WL.CollisionEventType.TriggerTouch?this._onCollisionStart(i):(t==WL.CollisionEventType.TouchLost||t==WL.CollisionEventType.TriggerTouchLost)&&this._onCollisionEnd(i),this._myCollisionCallbacks.size>0&&this._myCollisionCallbacks.forEach(function(s){s(this._myPhysX,i,t)})}_onCollisionStart(t){if(this._myDebugActive){let i=!1;for(let s of this._myCollisions)if(s.pp_equals(t.object)){i=!0;break}i&&console.error("Collision Start on object already collected")}this._myCollisions.push(t.object),this._myUpdateActive&&(this._myCollisionsStartToProcess.push(t.object),this._myCollisionsEndToProcess.pp_removeAll(function(i){return i.pp_equals(t.object)})),this._myDebugActive&&console.log("Collision Start -",this._myCollisions.length),this._myCollisionStartCallbacks.size>0&&this._myCollisionStartCallbacks.forEach(function(i){i(this._myPhysX,t,type)})}_onCollisionEnd(t){if(this._myDebugActive){let i=!1;for(let s of this._myCollisions)if(s.pp_equals(t.object)){i=!0;break}i||console.error("Collision End on object not collected")}this._myCollisions.pp_removeAll(function(i){return i.pp_equals(t.object)}),this._myUpdateActive&&(this._myCollisionsEndToProcess.push(t.object),this._myCollisionsStartToProcess.pp_removeAll(function(i){return i.pp_equals(t.object)})),this._myDebugActive&&console.log("Collision End -",this._myCollisions.length),this._myCollisionEndCallbacks.size>0&&this._myCollisionEndCallbacks.forEach(function(i){i(this._myPhysX,t,type)})}_triggerDesyncFix(t){if(this._myTriggerDesyncFixDelay.update(t),this._myTriggerDesyncFixDelay.isDone()){this._myTriggerDesyncFixDelay.start();let i=this._myCollisions.pp_findAll(function(s){let n=s.pp_getComponent("physx");return n==null||!n.active});if(i.length>0)for(let s of i){let n=s.pp_getComponent("physx");n?this._onCollisionEnd(n):console.error("NO PHYSX, HOW?")}}}}});var ti=T(()=>{PP.SaveManager=class{constructor(){this._mySaveCache=new Map,this._myCommitSavesDelayTimer=new PP.Timer(0,!1),this._myDelaySavesCommit=!0,this._myIDsToCommit=[],this._myCacheDefaultValueOnFail=!0,WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this)),this._myClearCallbacks=new Map,this._myDeleteCallbacks=new Map,this._myDeleteIDCallbacks=new Map,this._mySaveCallbacks=new Map,this._mySaveValueChangedCallbacks=new Map,this._mySaveIDCallbacks=new Map,this._mySaveValueChangedIDCallbacks=new Map,this._myCommitSaveCallbacks=new Map,this._myCommitSaveIDCallbacks=new Map,this._myCommitSavesCallbacks=new Map,this._myLoadCallbacks=new Map,this._myLoadIDCallbacks=new Map}setCommitSavesDelay(t){this._myCommitSavesDelayTimer.start(t)}setDelaySavesCommit(t){this._myDelaySavesCommit=t}setCacheDefaultValueOnFail(t){this._myCacheDefaultValueOnFail=t}update(t){this._myCommitSavesDelayTimer.isRunning()&&(this._myCommitSavesDelayTimer.update(t),this._myCommitSavesDelayTimer.isDone()&&this.commitSaves())}save(t,i,s=null){let n=!1;if(this._mySaveCache.has(t)&&(n=this._mySaveCache.get(t)===i),!n)if(this._mySaveCache.set(t,i),this._myDelaySavesCommit&&s==null||s!=null&&s)this._myIDsToCommit.pp_pushUnique(t),this._myCommitSavesDelayTimer.isRunning()||this._myCommitSavesDelayTimer.start();else{let o=this._commitSave(t,!1);if(this._myCommitSavesCallbacks.size>0){let r=!1;this._myCommitSavesCallbacks.forEach(function(l){l(r,o)})}}if(this._mySaveCallbacks.size>0&&this._mySaveCallbacks.forEach(function(o){o(t,i)}),this._mySaveIDCallbacks.size>0){let o=this._mySaveIDCallbacks.get(t);o?.forEach(function(r){r(t,i)})}if(!n&&(this._mySaveValueChangedCallbacks.size>0&&this._mySaveValueChangedCallbacks.forEach(function(o){o(t,i)}),this._mySaveValueChangedIDCallbacks.size>0)){let o=this._mySaveValueChangedIDCallbacks.get(t);o?.forEach(function(r){r(t,i)})}}commitSaves(){if(this._myIDsToCommit.length>0){let t=!1;for(let i of this._myIDsToCommit)if(this._mySaveCache.has(i)){let s=this._commitSave(i,!0);t=t||s}if(this._myIDsToCommit=[],this._myCommitSavesCallbacks.size>0){let i=!0;this._myCommitSavesCallbacks.forEach(function(s){s(i,t)})}}}has(t){return this._mySaveCache.has(t)||PP.SaveUtils.has(t)}delete(t){if(this._mySaveCache.delete(t),PP.SaveUtils.delete(t),this._myDeleteCallbacks.size>0&&this._myDeleteCallbacks.forEach(function(i){i(t)}),this._myDeleteIDCallbacks.size>0){let i=this._myDeleteIDCallbacks.get(t);i?.forEach(function(s){s(t)})}}clear(){this._mySaveCache.clear(),PP.SaveUtils.clear(),this._myClearCallbacks.size>0&&this._myClearCallbacks.forEach(function(t){t()})}load(t,i=null){return this._load(t,i,"load")}loadString(t,i=null){return this._load(t,i,"loadString")}loadNumber(t,i=null){return this._load(t,i,"loadNumber")}loadBool(t,i=null){return this._load(t,i,"loadBool")}getCommitSavesDelay(){return this._myCommitSavesDelayTimer.getDuration()}isDelaySavesCommit(){return this._myDelaySavesCommit}isCacheDefaultValueOnFail(){return this._myCacheDefaultValueOnFail}_commitSave(t,i){let s=this._mySaveCache.get(t),n=!1;try{PP.SaveUtils.save(t,s)}catch{n=!0}if(this._myCommitSaveCallbacks.size>0&&this._myCommitSaveCallbacks.forEach(function(o){o(t,s,i,n)}),this._myCommitSaveIDCallbacks.size>0){let o=this._myCommitSaveIDCallbacks.get(t);o?.forEach(function(r){r(t,s,i,n)})}return n}_load(t,i,s){let n=null,o=!1,r=!1;if(this._mySaveCache.has(t))n=this._mySaveCache.get(t),n==null&&i!=null&&(n=i,this._myCacheDefaultValueOnFail&&this._mySaveCache.set(t,n)),r=!0;else{let l=null;try{l=PP.SaveUtils[s](t,null)}catch{l=null,o=!0}l==null?n=i:n=l,l!=null||this._myCacheDefaultValueOnFail?this._mySaveCache.set(t,n):this._mySaveCache.set(t,null)}if(this._myLoadCallbacks.size>0&&this._myLoadCallbacks.forEach(function(l){l(t,n,r,o)}),this._myLoadIDCallbacks.size>0){let l=this._myLoadIDCallbacks.get(t);l?.forEach(function(y){y(t,n,r,o)})}return n}_onXRSessionStart(t){t.addEventListener("visibilitychange",function(i){i.session.visibilityState!="visible"&&this._onXRSessionInterrupt()}.bind(this))}_onXRSessionEnd(){this._onXRSessionInterrupt()}_onXRSessionInterrupt(){this.commitSaves()}registerClearEventListener(t,i){this._myClearCallbacks.set(t,i)}unregisterClearEventListener(t){this._myClearCallbacks.delete(t)}registerDeleteEventListener(t,i){this._myDeleteCallbacks.set(t,i)}unregisterDeleteEventListener(t){this._myDeleteCallbacks.delete(t)}registerDeleteIDEventListener(t,i,s){let n=this._myDeleteIDCallbacks.get(t);n==null&&(this._myDeleteIDCallbacks.set(t,new Map),n=this._myDeleteIDCallbacks.get(t)),n.set(i,s)}unregisterDeleteIDEventListener(t,i){let s=this._myDeleteIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myDeleteIDCallbacks.delete(t))}registerSaveEventListener(t,i){this._mySaveCallbacks.set(t,i)}unregisterSaveEventListener(t){this._mySaveCallbacks.delete(t)}registerSaveIDEventListener(t,i,s){let n=this._mySaveIDCallbacks.get(t);n==null&&(this._mySaveIDCallbacks.set(t,new Map),n=this._mySaveIDCallbacks.get(t)),n.set(i,s)}unregisterSaveIDEventListener(t,i){let s=this._mySaveIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._mySaveIDCallbacks.delete(t))}registerSaveValueChangedEventListener(t,i){this._mySaveValueChangedCallbacks.set(t,i)}unregisterSaveValueChangedEventListener(t){this._mySaveValueChangedCallbacks.delete(t)}registerSaveValueChangedIDEventListener(t,i,s){let n=this._mySaveValueChangedIDCallbacks.get(t);n==null&&(this._mySaveValueChangedIDCallbacks.set(t,new Map),n=this._mySaveValueChangedIDCallbacks.get(t)),n.set(i,s)}unregisterSaveValueChangedIDEventListener(t,i){let s=this._mySaveValueChangedIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._mySaveValueChangedIDCallbacks.delete(t))}registerCommitSavesEventListener(t,i){this._myCommitSavesCallbacks.set(t,i)}unregisterCommitSavesEventListener(t){this._myCommitSavesCallbacks.delete(t)}registerCommitSaveEventListener(t,i){this._myCommitSaveCallbacks.set(t,i)}unregisterCommitSaveEventListener(t){this._myCommitSaveCallbacks.delete(t)}registerCommitSaveIDEventListener(t,i,s){let n=this._myCommitSaveIDCallbacks.get(t);n==null&&(this._myCommitSaveIDCallbacks.set(t,new Map),n=this._myCommitSaveIDCallbacks.get(t)),n.set(i,s)}unregisterCommitSaveIDEventListener(t,i){let s=this._myCommitSaveIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myCommitSaveIDCallbacks.delete(t))}registerLoadEventListener(t,i){this._myLoadCallbacks.set(t,i)}unregisterLoadEventListener(t){this._myLoadCallbacks.delete(t)}registerLoadIDEventListener(t,i,s){let n=this._myLoadIDCallbacks.get(t);n==null&&(this._myLoadIDCallbacks.set(t,new Map),n=this._myLoadIDCallbacks.get(t)),n.set(i,s)}unregisterLoadIDEventListener(t,i){let s=this._myLoadIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myLoadIDCallbacks.delete(t))}}});var ei=T(()=>{PP.Timer=class{constructor(t,i=!0){this._myDuration=t,this._myOnEndCallbacks=new Map,this._myDone=!1,this._myJustDone=!1,this._myStarted=!1,i?this.start():this.reset()}start(t=null){this.reset(t),this._myStarted=!0}end(){this._done()}reset(t=null){t!=null&&(this._myDuration=Math.max(0,t)),this._myTimer=this._myDuration,this._myDone=!1,this._myJustDone=!1,this._myStarted=!1}update(t){this._myJustDone=!1,this.isRunning()&&(this._myTimer=Math.max(0,this._myTimer-t),this._myTimer==0&&this._done())}isDone(){return this._myDone}isJustDone(){return this._myJustDone}isStarted(){return this._myStarted}isRunning(){return this.isStarted()&&!this.isDone()}getDuration(){return this._myDuration}setDuration(t){this._myDuration=Math.max(0,t)}getTimer(){return this._myTimer}getPercentage(){let t=1;return this._myTimer>0&&(t=(this._myDuration-this._myTimer)/this._myDuration),Math.pp_clamp(t,0,1)}onEnd(t,i=null){this._myOnEndCallbacks.set(i,t)}unregisterOnEnd(t=null){this._myOnEndCallbacks.delete(t)}_done(){if(this._myTimer=0,this._myDone=!0,this._myJustDone=!0,this._myOnEndCallbacks.size>0)for(let t of this._myOnEndCallbacks.values())t()}}});var ii=T(()=>{WL.registerComponent("pp-clear-console-on-xr-session-start",{},{init:function(){},start:function(){this._myFirstTime=!0,WL.onXRSessionStart.push(function(){this._myFirstTime&&(this._myFirstTime=!1,console.clear())}.bind(this))},update:function(e){}})});var si=T(()=>{WL.registerComponent("pp-set-active",{_myActive:{type:WL.Type.Bool,default:!0},_mySetActiveOn:{type:WL.Type.Enum,values:["self","children","descendants","hierarchy"],default:"hierarchy"},_mySetActiveWhen:{type:WL.Type.Enum,values:["init","start","first_update"],default:"init"}},{init:function(){this.active&&this._mySetActiveWhen==0&&this._setActive()},start:function(){this._mySetActiveWhen==1&&this._setActive(),this._myFirst=!0},update:function(e){this._mySetActiveWhen==2&&this._myFirst&&(this._myFirst=!1,this._setActive())},_setActive(){this._mySetActiveOn==0?this.object.pp_setActiveSelf(this._myActive):this._mySetActiveOn==1?this.object.pp_setActiveChildren(this._myActive):this._mySetActiveOn==2?this.object.pp_setActiveDescendants(this._myActive):this.object.pp_setActiveHierarchy(this._myActive)}})});var ni=T(()=>{WL.registerComponent("pp-adjust-hierarchy-physx-scale",{_myWhen:{type:WL.Type.Enum,values:["init","start","first_update"],default:"start"}},{init:function(){this.active&&this._myWhen==0&&this._adjustScale()},start:function(){this._myWhen==1&&this._adjustScale(),this._myFirst=!0},update:function(e){this._myWhen==2&&this._myFirst&&(this._myFirst=!1,this._adjustScale())},_adjustScale(){let e=this.object.pp_getScale(),t=this.object.pp_getComponentsHierarchy("physx");for(let i of t)i.extents[0]=i.extents[0]*e[0],i.extents[1]=i.extents[1]*e[1],i.extents[2]=i.extents[2]*e[2],i.active&&(i.active=!1,i.active=!0)}})});var oi=T(()=>{WL.registerComponent("pp-get-player-objects",{_myPlayer:{type:WL.Type.Object},_myPlayerPivot:{type:WL.Type.Object},_myNonVRCamera:{type:WL.Type.Object},_myEyeLeft:{type:WL.Type.Object},_myEyeRight:{type:WL.Type.Object},_myHead:{type:WL.Type.Object},_myNonVRHead:{type:WL.Type.Object},_myVRHead:{type:WL.Type.Object},_myHandLeft:{type:WL.Type.Object},_myHandRight:{type:WL.Type.Object}},{init:function(){PP.myPlayerObjects.myPlayer=this._myPlayer,PP.myPlayerObjects.myPlayerPivot=this._myPlayerPivot,PP.myPlayerObjects.myNonVRCamera=this._myNonVRCamera,PP.myPlayerObjects.myHead=this._myHead,PP.myPlayerObjects.myNonVRHead=this._myNonVRHead,PP.myPlayerObjects.myVRHead=this._myVRHead,PP.myPlayerObjects.myEyeLeft=this._myEyeLeft,PP.myPlayerObjects.myEyeRight=this._myEyeRight,PP.myPlayerObjects.myHandLeft=this._myHandLeft,PP.myPlayerObjects.myHandRight=this._myHandRight,PP.myPlayerObjects.myEyes=[],PP.myPlayerObjects.myEyes[PP.Handedness.LEFT]=this._myEyeLeft,PP.myPlayerObjects.myEyes[PP.Handedness.RIGHT]=this._myEyeRight,PP.myPlayerObjects.myHands=[],PP.myPlayerObjects.myHands[PP.Handedness.LEFT]=this._myHandLeft,PP.myPlayerObjects.myHands[PP.Handedness.RIGHT]=this._myHandRight,PP.myPlayerObjects.myPlayerPivot==null&&(PP.myPlayerObjects.myPlayerPivot=PP.myPlayerObjects.myPlayer)}});PP.myPlayerObjects={myPlayer:null,myPlayerPivot:null,myNonVRCamera:null,myNonVRHead:null,myVRHead:null,myHead:null,myEyeLeft:null,myEyeRight:null,myEyes:[],myHandLeft:null,myHandRight:null,myHands:[]}});var ai=T(()=>{WL.registerComponent("pp-get-default-resources",{_myPlane:{type:WL.Type.Mesh},_myCube:{type:WL.Type.Mesh},_mySphere:{type:WL.Type.Mesh},_myCone:{type:WL.Type.Mesh},_myCylinder:{type:WL.Type.Mesh},_myCircle:{type:WL.Type.Mesh},_myFlatOpaque:{type:WL.Type.Material},_myFlatTransparentNoDepth:{type:WL.Type.Material},_myPhongOpaque:{type:WL.Type.Material},_myText:{type:WL.Type.Material}},{init(){PP.myDefaultResources.myMeshes.myPlane=PP.MeshUtils.cloneMesh(this._myPlane),PP.myDefaultResources.myMeshes.myCube=PP.MeshUtils.cloneMesh(this._myCube),PP.myDefaultResources.myMeshes.mySphere=PP.MeshUtils.cloneMesh(this._mySphere),PP.myDefaultResources.myMeshes.myCone=PP.MeshUtils.cloneMesh(this._myCone),PP.myDefaultResources.myMeshes.myCylinder=PP.MeshUtils.cloneMesh(this._myCylinder),PP.myDefaultResources.myMeshes.myCircle=PP.MeshUtils.cloneMesh(this._myCircle),PP.myDefaultResources.myMeshes.myInvertedCube=PP.MeshUtils.invertMesh(this._myCube),PP.myDefaultResources.myMeshes.myInvertedSphere=PP.MeshUtils.invertMesh(this._mySphere),PP.myDefaultResources.myMeshes.myInvertedCone=PP.MeshUtils.invertMesh(this._myCone),PP.myDefaultResources.myMeshes.myInvertedCylinder=PP.MeshUtils.invertMesh(this._myCylinder),this._myFlatOpaque!=null&&(PP.myDefaultResources.myMaterials.myFlatOpaque=this._myFlatOpaque.clone()),this._myFlatTransparentNoDepth!=null&&(PP.myDefaultResources.myMaterials.myFlatTransparentNoDepth=this._myFlatTransparentNoDepth.clone()),this._myPhongOpaque!=null&&(PP.myDefaultResources.myMaterials.myPhongOpaque=this._myPhongOpaque.clone()),this._myText!=null&&(PP.myDefaultResources.myMaterials.myText=this._myText.clone())}});PP.myDefaultResources={myMeshes:{myPlane:null,myCube:null,mySphere:null,myCone:null,myCylinder:null,myCircle:null,myInvertedCube:null,myInvertedSphere:null,myInvertedCone:null,myInvertedCylinder:null},myMaterials:{myFlatOpaque:null,myFlatTransparentNoDepth:null,myPhongOpaque:null,myText:null}}});var ri=T(()=>{WL.registerComponent("pp-show-fps",{_myRefreshSeconds:{type:WL.Type.Float,default:.25},_myTextMaterial:{type:WL.Type.Material}},{init:function(){},start(){this._myTimer=new PP.Timer(this._myRefreshSeconds),this._myTotalDT=0,this._myFrames=0,this._myVisualFPSParent=this.object.pp_addObject();let e=new PP.VisualTextParams;e.myText="0",e.myTransform.mat4_setPositionRotationScale([-.115,-.115,.35],[0,180,0],[.3,.3,.3]),this._myTextMaterial!=null?e.myMaterial=this._myTextMaterial.clone():(e.myMaterial=PP.myDefaultResources.myMaterials.myText.clone(),e.myMaterial.color=[0,1,0,1]),e.myParent=this._myVisualFPSParent,this._myVisualFPS=new PP.VisualText(e),PP.myEasyTuneVariables.add(new PP.EasyTuneNumber("FPS X",-.25,.1,3)),PP.myEasyTuneVariables.add(new PP.EasyTuneNumber("FPS Y",-.13,.1,3)),PP.myEasyTuneVariables.add(new PP.EasyTuneNumber("FPS Z",.35,.1,3))},update:function(){let e=PP.quat2_create();return function(i){if(this._myTotalDT+=i,this._myFrames++,this._myTimer.update(i),this._myTimer.isDone()){this._myTimer.start();let s=Math.round(this._myFrames/this._myTotalDT),n=this._myVisualFPS.getParams();PP.XRUtils.isXRSessionActive()?n.myTransform.mat4_setPositionRotationScale([-.115,-.115,.35],[0,180,0],[.3,.3,.3]):n.myTransform.mat4_setPositionRotationScale([-.25,-.13,.35],[0,180,0],[.3,.3,.3]),n.myText=s.toFixed(0),this._myVisualFPS.paramsUpdated(),this._myTotalDT=0,this._myFrames=0}this._myVisualFPSParent.pp_setTransformQuat(PP.myPlayerObjects.myHead.pp_getTransformQuat(e))}}()})});var li=T(()=>{PP.StateData=class{constructor(t,i){this.myID=t,this.myObject=i}};PP.TransitionData=class{constructor(t,i,s,n,o){this.myID=t,this.myFromState=i,this.myToState=s,this.myObject=n,this.mySkipStateFunction=o}};PP.PendingPerform=class{constructor(t,...i){this.myID=t,this.myArgs=i}};PP.PerformType={IMMEDIATE:0,DELAYED:1};PP.PerformDelayedType={QUEUE:0,KEEP_FIRST:1,KEEP_LAST:2};PP.SkipStateFunction={NONE:0,END:1,START:2,BOTH:3};PP.FSM=class{constructor(t=PP.PerformType.IMMEDIATE,i=PP.PerformDelayedType.QUEUE){this._myCurrentStateData=null,this._myStateMap=new Map,this._myTransitionMap=new Map,this._myDebugLogActive=!1,this._myDebugShowDelayedInfo=!1,this._myDebugLogName="FSM",this._myPerformType=t,this._myPerformDelayedType=i,this._myPendingPerforms=[],this._myCurrentlyPerformedTransition=null,this._myInitCallbacks=new Map,this._myInitIDCallbacks=new Map,this._myTransitionCallbacks=new Map,this._myTransitionIDCallbacks=[]}addState(t,i=null){let s=null;!i||typeof i=="function"?(s={},typeof i=="function"?s.update=i:s.update=null,s.clone=function(){let o={};return o.update=this.update,o.clone=this.clone,o}):s=i;let n=new PP.StateData(t,s);this._myStateMap.set(t,n),this._myTransitionMap.set(t,new Map)}addTransition(t,i,s,n=null,o=PP.SkipStateFunction.NONE){let r=null;if(!n||typeof n=="function"?(r={},typeof n=="function"?r.perform=n:r.perform=null,r.clone=function(){let l={};return l.perform=this.perform,l.clone=this.clone,l}):r=n,this.hasState(t)&&this.hasState(i)){let l=this._getTransitionMapFromState(t),y=new PP.TransitionData(s,this.getState(t),this.getState(i),r,o);l.set(s,y)}else!this.hasState(t)&&!this.hasState(i)?console.error("Can't add transition:",s,"- from state not found:",t,"- to state not found:",i):this.hasState(t)?this.hasState(i)||console.error("Can't add transition:",s,"- to state not found:",i):console.error("Can't add transition:",s,"- from state not found:",t)}init(t,i=null,...s){let n=i;if(i&&typeof i=="function"&&(n={},n.performInit=i),this.hasState(t)){let o=this._myStateMap.get(t);if(this._myDebugLogActive&&console.log(this._myDebugLogName,"- Init:",t),n&&n.performInit?n.performInit(this,o,...s):o.myObject&&o.myObject.init&&o.myObject.init(this,o,...s),this._myCurrentStateData=o,this._myInitCallbacks.size>0&&this._myInitCallbacks.forEach(function(r){r(this,o,n,...s)}.bind(this)),this._myInitIDCallbacks.size>0){let r=this._myInitIDCallbacks.get(t);r?.forEach(function(l){l(this,o,n,...s)}.bind(this))}}else this._myDebugLogActive&&console.warn(this._myDebugLogName,"- Init state not found:",t)}update(t,...i){if(this._myPendingPerforms.length>0){for(let s=0;s=0}hasTransitionFromStateToState(t,i,s=null){let n=this.getTransitionsFromStateToState(t,i),o=!1;return s?o=n.findIndex(function(l){return l.myID==s})>=0:o=n.length>0,o}setPerformType(t){this._myPerformType=t}getPerformType(){return this._myPerformType}setPerformDelayedType(t){this._myPerformDelayedType=t}getPerformDelayedType(){return this._myPerformDelayedType}hasPendingPerforms(){return this._myPendingPerforms.length>0}getPendingPerforms(){return this._myPendingPerforms.slice(0)}clone(t=!1){if(!this.isCloneable(t))return null;let i=new PP.FSM;i._myDebugLogActive=this._myDebugLogActive,i._myDebugShowDelayedInfo=this._myDebugShowDelayedInfo,i._myDebugLogName=this._myDebugLogName.slice(0),i._myPerformType=this._myPerformType,i._myPerformDelayedType=this._myPerformDelayedType,i._myPendingPerforms=this._myPendingPerforms.slice(0);for(let s of this._myStateMap.entries()){let n=null;t?n=new PP.StateData(s[1].myID,s[1].myObject.clone()):n=new PP.StateData(s[1].myID,s[1].myObject),i._myStateMap.set(n.myID,n)}for(let s of this._myTransitionMap.entries()){let n=new Map;i._myTransitionMap.set(s[0],n);for(let o of s[1].entries()){let r=null,l=i.getState(o[1].myFromState.myID),y=i.getState(o[1].myToState.myID);t?r=new PP.TransitionData(o[1].myID,l,y,o[1].myObject.clone(),o[1].mySkipStateFunction):r=new PP.TransitionData(o[1].myID,l,y,o[1].myObject,o[1].mySkipStateFunction),n.set(r.myID,r)}}return this._myCurrentStateData&&(i._myCurrentStateData=i.getState(this._myCurrentStateData.myID)),i}isCloneable(t=!1){if(!t)return!0;let i=!0;for(let s of this._myStateMap.entries())i=i&&s[1].myObject.clone!=null;for(let s of this._myTransitionMap.entries())for(let n of s[1].entries())i=i&&n[1].myObject.clone!=null;return i}setDebugLogActive(t,i=null,s=!1){this._myDebugLogActive=t,this._myDebugShowDelayedInfo=s,i&&(this._myDebugLogName="FSM: ".concat(i))}registerInitEventListener(t,i){this._myInitCallbacks.set(t,i)}unregisterInitEventListener(t){this._myInitCallbacks.delete(t)}registerInitIDEventListener(t,i,s){let n=this._myInitIDCallbacks.get(t);n==null&&(this._myInitIDCallbacks.set(t,new Map),n=this._myInitIDCallbacks.get(t)),n.set(i,s)}unregisterInitIDEventListener(t,i){let s=this._myInitIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myInitIDCallbacks.delete(t))}registerTransitionEventListener(t,i){this._myTransitionCallbacks.set(t,i)}unregisterTransitionEventListener(t){this._myTransitionCallbacks.delete(t)}registerTransitionIDEventListener(t,i,s,n,o){let r=null;for(let l of this._myTransitionIDCallbacks)if(l[0]==t&&l[1]==i&&l[2]==s){r=l[3];break}if(r==null){let l=[];l[0]=t,l[1]=i,l[2]=s,l[3]=new Map,r=l[3],this._myTransitionIDCallbacks.push(l)}r.set(n,o)}unregisterTransitionIDEventListener(t,i,s,n){let o=null;for(let r of this._myTransitionIDCallbacks)if(r[0]==t&&r[1]==i&&r[2]==s){o=r[3];break}o!=null&&(o.delete(n),o.size<=0&&this._myTransitionIDCallbacks.pp_remove(r=>r[0]==t&&r[1]==i&&r[2]==s))}_perform(t,i,...s){if(this.isPerformingTransition()){let n=this.getCurrentlyPerformedTransition(),o=[this._myDebugLogName,"- Trying to perform:",t];return this._myDebugShowDelayedInfo&&o.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),o.push("- But another transition is currently being performed -",n.myID),console.warn(...o),!1}if(this._myCurrentStateData){if(this.canPerform(t)){let o=this._myTransitionMap.get(this._myCurrentStateData.myID).get(t);this._myCurrentlyPerformedTransition=o;let r=this._myCurrentStateData,l=this._myStateMap.get(o.myToState.myID);if(this._myDebugLogActive){let y=[this._myDebugLogName,"- From:",r.myID,"- To:",l.myID,"- With:",t];this._myDebugShowDelayedInfo&&y.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),console.log(...y)}if(o.mySkipStateFunction!=PP.SkipStateFunction.END&&o.mySkipStateFunction!=PP.SkipStateFunction.BOTH&&r.myObject&&r.myObject.end&&r.myObject.end(this,o,...s),o.myObject&&o.myObject.perform&&o.myObject.perform(this,o,...s),o.mySkipStateFunction!=PP.SkipStateFunction.START&&o.mySkipStateFunction!=PP.SkipStateFunction.BOTH&&l.myObject&&l.myObject.start&&l.myObject.start(this,o,...s),this._myCurrentStateData=o.myToState,this._myTransitionCallbacks.size>0&&this._myTransitionCallbacks.forEach(function(y){y(this,r,l,o,i,...s)}.bind(this)),this._myTransitionIDCallbacks.length>0){let y=[];for(let c of this._myTransitionIDCallbacks)(c[0]==null||c[0]==r.myID)&&(c[1]==null||c[1]==l.myID)&&(c[2]==null||c[2]==o.myID)&&y.push(c[3]);for(let c of this.transitionIDMaps)c.forEach(function(a){a(this,r,l,o,i,...s)}.bind(this))}return this._myCurrentlyPerformedTransition=null,!0}else if(this._myDebugLogActive){let n=[this._myDebugLogName,"- No Transition:",t,"- From:",this._myCurrentStateData.myID];this._myDebugShowDelayedInfo&&n.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),console.warn(...n)}}else if(this._myDebugLogActive){let n=[this._myDebugLogName,"- FSM not initialized yet"];this._myDebugShowDelayedInfo&&n.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),console.warn(...n)}return!1}_getTransitionMapFromState(t){return this._myTransitionMap.get(t)}}});var mi=T(()=>{PP.State=class{update(t,i,...s){}init(t,i,...s){}start(t,i,...s){}end(t,i,...s){}}});var yi=T(()=>{PP.Transition=class{performInit(t,i,...s){}perform(t,i,...s){}}});var ui=T(()=>{PP.TimerState=class extends PP.State{constructor(t=0,i=null,...s){super(),this._myTransitionToPerformOnEnd=i,this._myTransitionArgs=s,this._myTimer=new PP.Timer(t,!1)}setDuration(t){this._myTimer.setDuration(t)}setTransitionToPerformOnEnd(t,...i){this._myTransitionToPerformOnEnd=t,this._myTransitionArgs=i}onEnd(t,i=null){this._myTimer.onEnd(t,i)}unregisterOnEnd(t=null){this._myTimer.unregisterOnEnd(t)}update(t,i){this._myTimer.update(t),this._myTimer.isDone()&&this._myTransitionToPerformOnEnd!=null&&i.perform(this._myTransitionToPerformOnEnd,...this._myTransitionArgs)}start(t,i,s=null,n=null,...o){this._myTimer.start(s),n!=null&&(this._myTransitionToPerformOnEnd=n,this._myTransitionArgs=o)}init(t,i,s=null,n=null,...o){this._myTimer.start(s),n!=null&&(this._myTransitionToPerformOnEnd=n,this._myTransitionArgs=o)}}});var ci=T(()=>{PP.CAUtils={_myDummyServer:null,_myUseDummyServerOnSDKMissing:!1,_myUseDummyServerOnError:!1,setUseDummyServerOnSDKMissing:function(e){PP.CAUtils._myUseDummyServerOnSDKMissing=e},setUseDummyServerOnError:function(e){PP.CAUtils._myUseDummyServerOnError=e},setDummyServer:function(e){PP.CAUtils._myDummyServer=e},isUseDummyServerOnSDKMissing:function(){return PP.CAUtils._myUseDummyServerOnSDKMissing},isUseDummyServerOnError:function(){return PP.CAUtils._myUseDummyServerOnError},getDummyServer:function(){return PP.CAUtils._myDummyServer},isSDKAvailable:function(){return"casdk"in window},getLeaderboard:function(e,t,i,s,n,o,r=null){if(PP.CAUtils.isSDKAvailable())i?PP.CAUtils.getUser(function(l){let y=l.displayName;casdk.getLeaderboard(e,t,i,s).then(function(c){if(c.leaderboard){let a=!1;for(let m of c.leaderboard)if(m.displayName==y&&m.score!=0){a=!0;break}if(a)n&&n(c.leaderboard);else if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let m={};m.reason="Searching for around player but the user has not submitted a score yet",m.type=PP.CAUtils.ErrorType.USER_HAS_NO_SCORE,o(m,c)}}else if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let a={};a.reason="Get leaderboard failed",a.type=PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED,o(a,c)}})},function(){if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let l={};l.reason="Searching for around player but the user can't be retrieved",l.type=PP.CAUtils.ErrorType.GET_USER_FAILED,o(l,result)}},!1):casdk.getLeaderboard(e,t,i,s).then(function(l){if(l.leaderboard)n&&n(l.leaderboard);else if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let y={};y.reason="Get leaderboard failed",y.type=PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED,o(y,l)}});else if(PP.CAUtils._myUseDummyServerOnSDKMissing&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let l={};l.reason="Construct Arcade SDK missing",l.type=PP.CAUtils.ErrorType.CA_SDK_MISSING,o(l,null)}},getLeaderboardDummy(e,t,i,s,n,o){if(PP.CAUtils._myDummyServer)PP.CAUtils._myDummyServer.getLeaderboard(e,t,i,s,n,o);else if(o){let r={};r.reason="Dummy server not initialized",r.type=PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED,o(r)}},submitScore:function(e,t,i,s,n=null){if(PP.CAUtils.isSDKAvailable())casdk.submitScore(e,t).then(function(o){if(o.error){if(PP.CAUtils._myUseDummyServerOnError&&n==null||n!=null&&n)PP.CAUtils.submitScoreDummy(e,t,i,s);else if(s){let r={};r.reason="Submit score failed",r.type=PP.CAUtils.ErrorType.SUBMIT_SCORE_FAILED,s(r,o)}}else i()});else if(PP.CAUtils._myUseDummyServerOnSDKMissing&&n==null||n!=null&&n)PP.CAUtils.submitScoreDummy(e,t,i,s);else if(s){let o={};o.reason="Construct Arcade SDK missing",o.type=PP.CAUtils.ErrorType.CA_SDK_MISSING,s(o,null)}},submitScoreDummy(e,t,i,s){if(PP.CAUtils._myDummyServer)PP.CAUtils._myDummyServer.submitScore(e,t,i,s);else if(s){let n={};n.reason="Dummy server not initialized",n.type=PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED,s(n)}},getUser:function(e,t,i=null){if(PP.CAUtils.isSDKAvailable())casdk.getUser().then(function(s){if(s.user)e&&e(s.user);else if(PP.CAUtils._myUseDummyServerOnError&&i==null||i!=null&&i)PP.CAUtils.getUserDummy(e,t);else if(t){let n={};n.reason="Get user failed",n.type=PP.CAUtils.ErrorType.GET_USER_FAILED,t(n,s)}});else if(PP.CAUtils._myUseDummyServerOnSDKMissing&&i==null||i!=null&&i)PP.CAUtils.getUserDummy(e,t);else if(t){let s={};s.reason="Construct Arcade SDK missing",s.type=PP.CAUtils.ErrorType.CA_SDK_MISSING,t(s,null)}},getUserDummy(e,t){if(PP.CAUtils._myDummyServer)PP.CAUtils._myDummyServer.getUser(e,t);else if(t){let i={};i.reason="Dummy server not initialized",i.type=PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED,t(i)}},ErrorType:{DUMMY_NOT_INITIALIZED:0,CA_SDK_MISSING:1,SUBMIT_SCORE_FAILED:2,GET_LEADERBOARD_FAILED:3,GET_USER_FAILED:4,USER_HAS_NO_SCORE:5}};PP.CADummyServer=class{constructor(){}getLeaderboard(t,i,s,n,o,r){let l=null;for(s?l=[{rank:7,displayName:"Player 1",score:1e6},{rank:8,displayName:"Player 2",score:1e6},{rank:9,displayName:"Player 3",score:9e5},{rank:10,displayName:"Player 4",score:8e5},{rank:11111,displayName:"Player 5",score:7e7},{rank:22222,displayName:"VeryLongName_06",score:6e5},{rank:33333,displayName:"Player 7",score:5e5},{rank:44444,displayName:"Player 8",score:4e5},{rank:55555,displayName:"Player 9",score:3e5},{rank:66666,displayName:"Player 10",score:2e5}]:l=[{rank:0,displayName:"Player 1",score:1e6},{rank:1,displayName:"Player 2",score:1e6},{rank:2,displayName:"Player 3",score:9e5},{rank:3,displayName:"Player 4",score:8e5},{rank:4,displayName:"Player 5",score:7e5},{rank:5,displayName:"Player 6",score:6e5},{rank:6,displayName:"Player 7",score:5e5},{rank:7,displayName:"Player 8",score:4e5},{rank:8,displayName:"Player 9",score:3e5},{rank:9,displayName:"Player 10",score:2e5}];l.length>n;)l.pop();o&&o(l)}submitScore(t,i,s,n){s&&s()}getUser(t,i){let s={};s.displayName="Jonathan",t&&t(s)}}});var hi=T(()=>{PP.ColorUtils={rgbToHsv:function(e){let t=e.pp_clone(),i=e[0],s=e[1],n=e[2];var o=Math.max(i,s,n),r=Math.min(i,s,n),l=o-r,y,c=o===0?0:l/o,a=o;switch(o){case r:y=0;break;case i:y=s-n+l*(s{PP.MeshCreationVertexParams=class{constructor(){this.myPosition=null,this.myTextureCoordinates=null,this.myNormal=null,this.myColor=null}};PP.MeshCreationTriangleParams=class{constructor(){this.myIndexes=new Uint32Array(3)}};PP.MeshCreationParams=class{constructor(){this.myVertexes=[],this.myTriangles=[]}};PP.MeshUtils={createPlaneMesh:function(){let e=4,t=new PP.MeshCreationParams;for(let o=0;o>1)*2,r.myPosition[2]=0,r.myTextureCoordinates=new PP.vec2_create,r.myTextureCoordinates[0]=o&1,r.myTextureCoordinates[1]=(o&2)>>1,r.myNormal=new PP.vec3_create,r.myNormal[0]=0,r.myNormal[1]=0,r.myNormal[2]=1,t.myVertexes.push(r)}let i=new PP.MeshCreationTriangleParams;i.myIndexes[0]=0,i.myIndexes[1]=1,i.myIndexes[2]=2;let s=new PP.MeshCreationTriangleParams;return s.myIndexes[0]=2,s.myIndexes[1]=1,s.myIndexes[2]=3,t.myTriangles.push(i),t.myTriangles.push(s),PP.MeshUtils.createMesh(t)},createMesh:function(e){let t=[];for(let c of e.myTriangles)t.push(c.myIndexes[0]),t.push(c.myIndexes[1]),t.push(c.myIndexes[2]);let i=new Uint32Array(t.length);i.pp_copy(t);let s=e.myVertexes.length,n=new WL.Mesh({vertexCount:s,indexData:i,indexType:WL.MeshIndexType.UnsignedInt}),o=null,r=null,l=null,y=null;try{o=n.attribute(WL.MeshAttribute.Position)}catch{o=null}try{r=n.attribute(WL.MeshAttribute.TextureCoordinate)}catch{r=null}try{l=n.attribute(WL.MeshAttribute.Normal)}catch{l=null}try{y=n.attribute(WL.MeshAttribute.Color)}catch{y=null}for(let c=0;c{PP.SaveUtils={save:function(e,t){t!=null&&localStorage.setItem(e,t)},has:function(e){return PP.SaveUtils.loadString(e,null)!=null},delete:function(e){return localStorage.removeItem(e)},clear:function(){return localStorage.clear()},load:function(e,t=null){return PP.SaveUtils.loadString(e,t)},loadString:function(e,t=null){let i=localStorage.getItem(e);return i==null&&(i=t),i},loadNumber:function(e,t=null){let i=PP.SaveUtils.loadString(e);return i!=null?Number(i):t},loadBool:function(e,t=null){let i=PP.SaveUtils.loadString(e);return i=="true"?!0:i=="false"?!1:t}}});var _i=T(()=>{PP.TextUtils={setClonedMaterials:function(e){let t=e.pp_getComponentsHierarchy("text");for(let i of t)i.material=i.material.clone()}}});var Pi=T(()=>{PP.XRUtils={isDeviceEmulated:function(){return"CustomWebXRPolyfill"in window},isXRSessionActive:function(){return WL.xrSession!=null},isReferenceSpaceLocalFloor:function(){return!["local","viewer"].includes(WebXR.refSpace)}}});var gi=T(()=>{PP.PhysicsUtils={_myLayerFlagAmount:8,_myLayerFlagNames:["0","1","2","3","4","5","6","7"],setLayerFlagAmount:function(e){PP.PhysicsUtils._myLayerFlagAmount=e},setLayerFlagNames:function(e){PP.PhysicsUtils._myLayerFlagNames=e},getLayerFlagAmount:function(){return PP.PhysicsUtils._myLayerFlagAmount},getLayerFlagNames:function(){return PP.PhysicsUtils._myLayerFlagNames},raycast:function(){let e=(t,i)=>t.pp_equals(i);return function(i,s=new PP.RaycastResult){let n=WL.physics.rayCast(i.myOrigin,i.myDirection,i.myBlockLayerFlags.getMask(),i.myDistance);s.myRaycastSetup=i;let o=0,r=0;for(let l=0;l0?(a=s._myUnusedHits.pop(),s.myHits.push(a)):(a=new PP.RaycastHit,s.myHits.push(a)),a.myPosition.vec3_copy(n.locations[l]),a.myNormal.vec3_copy(n.normals[l]),a.myDistance=n.distances[l],a.myObject=n.objects[l],a.myIsInsideCollision=c,r++,o++}}if(s.myHits.length>r){s._myUnusedHits==null&&(s._myUnusedHits=[]);let l=s.myHits.length-r;for(let y=0;y{PP.RaycastSetup=class{constructor(){this.myOrigin=[0,0,0],this.myDirection=[0,0,0],this.myDistance=0,this.myBlockLayerFlags=new PP.PhysicsLayerFlags,this.myObjectsToIgnore=[],this.myIgnoreHitsInsideCollision=!1}copy(t){this.myOrigin.vec3_copy(t.myOrigin),this.myDirection.vec3_copy(t.myDirection),this.myDistance=t.myDistance,this.myBlockLayerFlags.copy(t.myBlockLayerFlags),this.myObjectsToIgnore.pp_copy(t.myObjectsToIgnore),this.myIgnoreHitsInsideCollision=t.myIgnoreHitsInsideCollision}};PP.RaycastResult=class{constructor(){this.myRaycastSetup=null,this.myHits=[],this._myUnusedHits=null}isColliding(t=!1){return t?this.getFirstHitOutsideCollision()!=null:this.myHits.length>0}getFirstHitInsideCollision(){let t=null;for(let i of this.myHits)if(i.myIsInsideCollision){t=i;break}return t}getFirstHitOutsideCollision(){let t=null;for(let i of this.myHits)if(!i.myIsInsideCollision){t=i;break}return t}getHitsInsideCollision(){let t=[];for(let i of this.myHits)i.myIsInsideCollision&&t.push(i);return t}getHitsOutsideCollision(){let t=[];for(let i of this.myHits)i.myIsInsideCollision||t.push(i);return t}removeHit(t){let i=this.myHits.pp_removeIndex(t);return i!=null&&(this._myUnusedHits==null&&(this._myUnusedHits=[]),this._myUnusedHits.push(i)),i}copy(t){}};PP.RaycastResult.prototype.copy=function(){let e=function(t,i){return t==null&&(t=new PP.RaycastHit),t.copy(i),t};return function(i){if(i.myRaycastSetup==null?this.myRaycastSetup=null:(this.myRaycastSetup==null&&(this.myRaycastSetup=new PP.RaycastSetup),this.myRaycastSetup.copy(i.myRaycastSetup)),this.myHits.length>i.myHits.length){this._myUnusedHits==null&&(this._myUnusedHits=[]);for(let s=0;s{PP.PhysicsLayerFlags=class{constructor(){this._myLayerMask=0}setFlagActive(t,i){let s=t;if(isNaN(t)&&(s=PP.PhysicsUtils.getLayerFlagNames().pp_findIndexEqual(t)),s>=0&&s=0&&i{PP.VisualManager=class{constructor(){this._myVisualElementTypeMap=new Map,this._myVisualElementLastID=0,this._myVisualElementsPool=new PP.ObjectPoolManager,this._myVisualElementsToShow=[],this._myActive=!0}setActive(t){this._myActive!=t&&(this._myActive=t,this._myActive||this.clearDraw())}isActive(){return this._myActive}start(){}update(t){this._updateDraw(t)}draw(t,i=0,s=null){if(!this._myActive)return 0;let n=null,o=!1;if(s!=null&&this._myVisualElementTypeMap.has(t.myType)){let y=this._myVisualElementTypeMap.get(t.myType);y.has(s)&&(n=y.get(s)[0],n.setParams(t),n.setVisible(!1),o=!0)}if(n==null&&(n=this._getVisualElement(t)),n==null)return console.error("Couldn't create the requested visual element"),null;this._myVisualElementTypeMap.has(t.myType)||this._myVisualElementTypeMap.set(t.myType,new Map);let r=this._myVisualElementTypeMap.get(t.myType),l=null;if(!o)l=this._myVisualElementLastID+1,this._myVisualElementLastID=l,r.set(l,[n,new PP.Timer(i,i!=null)]);else{l=s;let y=r.get(l);y[0]=n,y[1].reset(i),i!=null&&y[1].start()}return this._myVisualElementsToShow.push(n),l}getDraw(t){let i=null;for(let s of this._myVisualElementTypeMap.values())if(s.has(t)){i=s.get(t)[0];break}return i}clearDraw(t=null){if(t==null){for(let i of this._myVisualElementTypeMap.values())for(let s of i.values())this._myVisualElementsPool.releaseObject(s[0].getParams().myType,s[0]);this._myVisualElementsToShow=[],this._myVisualElementTypeMap=new Map,this._myVisualElementLastID=0}else for(let i of this._myVisualElementTypeMap.values())if(i.has(t)){let s=i.get(t);this._myVisualElementsPool.releaseObject(s[0].getParams().myType,s[0]),i.delete(t),this._myVisualElementsToShow.pp_removeEqual(s[0]);break}}allocateDraw(t,i){this._myVisualElementsPool.hasPool(t)||this._addVisualElementTypeToPool(t);let s=this._myVisualElementsPool.getPool(t),n=s.getAvailableSize()-i;n<0&&s.increase(-n)}_updateDraw(t){for(let i of this._myVisualElementsToShow)i.setVisible(!0);this._myVisualElementsToShow=[];for(let i of this._myVisualElementTypeMap.values()){let s=[];for(let n of i.entries()){let o=n[1];o[1].isDone()&&(this._myVisualElementsPool.releaseObject(o[0].getParams().myType,o[0]),s.push(n[0])),o[1].update(t)}for(let n of s)i.delete(n)}}_getVisualElement(t){let i=null;return this._myVisualElementsPool.hasPool(t.myType)||this._addVisualElementTypeToPool(t.myType),i=this._myVisualElementsPool.getObject(t.myType),i?.setParams(t),i}_addVisualElementTypeToPool(t){let i=new PP.ObjectPoolParams;i.myInitialPoolSize=10,i.myPercentageToAddWhenEmpty=1,i.myEnableDebugLog=!1,i.mySetActiveCallback=function(n,o){n.setVisible(o)};let s=null;switch(t){case PP.VisualElementType.LINE:s=new PP.VisualLine;break;case PP.VisualElementType.MESH:s=new PP.VisualMesh;break;case PP.VisualElementType.POINT:s=new PP.VisualPoint;break;case PP.VisualElementType.ARROW:s=new PP.VisualArrow;break;case PP.VisualElementType.TEXT:s=new PP.VisualText;break;case PP.VisualElementType.TRANSFORM:s=new PP.VisualTransform;break;case PP.VisualElementType.RAYCAST:s=new PP.VisualRaycast;break;case PP.VisualElementType.TORUS:s=new PP.VisualTorus;break}s.setVisible(!1),s.setAutoRefresh(!0),s!=null?this._myVisualElementsPool.addPool(t,s,i):console.error("Visual element type not supported")}}});var bi=T(()=>{PP.VisualElementType={MESH:0,LINE:1,POINT:2,TEXT:3,ARROW:4,TRANSFORM:5,RAYCAST:6,TORUS:7}});var Si=T(()=>{PP.VisualLineParams=class{constructor(){this.myStart=[0,0,0],this.myDirection=[0,0,1],this.myLength=0,this.myThickness=.005,this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.LINE}setStartEnd(t,i){return i.vec3_sub(t,this.myDirection),this.myLength=this.myDirection.vec3_length(),this.myDirection.vec3_normalize(this.myDirection),this.myStart.vec3_copy(t),this}};PP.VisualLine=class{constructor(t=new PP.VisualLineParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myLineRootObject=null,this._myLineObject=null,this._myLineMeshComponent=null,this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myLineRootObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_build(){this._myLineRootObject=WL.scene.addObject(null),this._myLineObject=WL.scene.addObject(this._myLineRootObject),this._myLineMeshComponent=this._myLineObject.addComponent("mesh"),this._myLineMeshComponent.mesh=PP.myDefaultResources.myMeshes.myCylinder}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualLineParams;t.myStart.vec3_copy(this._myParams.myStart),t.myDirection.vec3_copy(this._myParams.myDirection),t.myLength=this._myParams.myLength,t.myThickness=this._myParams.myThickness,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualLine(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}};PP.VisualLine.prototype._refresh=function(){let e=PP.vec3_create(),t=PP.vec3_create(),i=PP.vec3_create(0,0,1);return function(){this._myLineRootObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myLineRootObject.pp_setPositionLocal(this._myParams.myStart),this._myLineObject.pp_resetPositionLocal(),this._myLineObject.pp_resetScaleLocal(),e.vec3_set(this._myParams.myThickness/2,this._myParams.myLength/2,this._myParams.myThickness/2),this._myLineObject.pp_scaleObject(e),this._myLineObject.pp_setUpLocal(this._myParams.myDirection,i),t.vec3_set(0,this._myParams.myLength/2,0),this._myLineObject.pp_translateObject(t),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myLineMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:(this._myFlatOpaqueMaterial==null&&(this._myFlatOpaqueMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone()),this._myLineMeshComponent.material=this._myFlatOpaqueMaterial,this._myFlatOpaqueMaterial.color=this._myParams.myColor):this._myLineMeshComponent.material=this._myParams.myMaterial}}();Object.defineProperty(PP.VisualLine.prototype,"_refresh",{enumerable:!1})});var vi=T(()=>{PP.VisualMeshParams=class{constructor(){this.myTransform=PP.mat4_create(),this.myMesh=null,this.myMaterial=null,this.myParent=null,this.myType=PP.VisualElementType.MESH}};PP.VisualMesh=class{constructor(t=new PP.VisualMeshParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myMeshObject=null,this._myMeshComponent=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myMeshObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_refresh(){this._myMeshObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myMeshObject.pp_setTransformLocal(this._myParams.myTransform),this._myParams.myMesh==null?this._myMeshComponent.mesh=PP.myDefaultResources.myMeshes.mySphere:this._myMeshComponent.mesh=this._myParams.myMesh,this._myParams.myMaterial==null?this._myMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:this._myMeshComponent.material=this._myParams.myMaterial}_build(){this._myMeshObject=WL.scene.addObject(null),this._myMeshComponent=this._myMeshObject.addComponent("mesh")}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualMeshParams;t.myTransform.pp_copy(this._myParams.myTransform),this._myParams.myMesh!=null?t.myMesh=this._myParams.myMesh:t.myMesh=null,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,t.myParent=this._myParams.myParent;let i=new PP.VisualMesh(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}}});var xi=T(()=>{PP.VisualPointParams=class{constructor(){this.myPosition=[0,0,0],this.myRadius=.005,this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.POINT}};PP.VisualPoint=class{constructor(t=new PP.VisualPointParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myPointObject=null,this._myPointMeshComponent=null,this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myPointObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_refresh(){this._myPointObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myPointObject.pp_setPositionLocal(this._myParams.myPosition),this._myPointObject.pp_setScaleLocal(this._myParams.myRadius),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myPointMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:(this._myFlatOpaqueMaterial==null&&(this._myFlatOpaqueMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone()),this._myPointMeshComponent.material=this._myFlatOpaqueMaterial,this._myFlatOpaqueMaterial.color=this._myParams.myColor):this._myPointMeshComponent.material=this._myParams.myMaterial}_build(){this._myPointObject=WL.scene.addObject(null),this._myPointMeshComponent=this._myPointObject.addComponent("mesh"),this._myPointMeshComponent.mesh=PP.myDefaultResources.myMeshes.mySphere}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualPointParams;t.myPosition.vec3_copy(this._myParams.myPosition),t.myRadius=this._myParams.myRadius,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualPoint(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}}});var Mi=T(()=>{PP.VisualArrowParams=class extends PP.VisualLineParams{constructor(){super(),this.myType=PP.VisualElementType.ARROW}};PP.VisualArrow=class{constructor(t=new PP.VisualArrowParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myVisualLine=new PP.VisualLine,this._myVisualLine.setAutoRefresh(!1),this._myArrowRootObject=null,this._myArrowObject=null,this._myArrowMeshComponent=null,this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myVisualLine.setVisible(t),this._myArrowRootObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh(),this._myVisualLine.forceRefresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1),this._myVisualLine.update(t)}_build(){this._myArrowRootObject=WL.scene.addObject(null),this._myArrowObject=WL.scene.addObject(this._myArrowRootObject),this._myArrowMeshComponent=this._myArrowObject.addComponent("mesh"),this._myArrowMeshComponent.mesh=PP.myDefaultResources.myMeshes.myCone}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualArrowParams;t.myStart.vec3_copy(this._myParams.myStart),t.myDirection.vec3_copy(this._myParams.myDirection),t.myLength=this._myParams.myLength,t.myThickness=this._myParams.myThickness,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualArrow(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}};PP.VisualArrow.prototype._refresh=function(){let e=PP.vec3_create(),t=PP.vec3_create(),i=PP.vec3_create(),s=PP.vec3_create(),n=PP.vec3_create(0,0,1);return function(){this._myArrowRootObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myParams.myDirection.vec3_scale(Math.max(.001,this._myParams.myLength-this._myParams.myThickness*4),e),e.vec3_add(this._myParams.myStart,e),this._myArrowRootObject.pp_setPositionLocal(e),this._myArrowRootObject.pp_setUpLocal(this._myParams.myDirection,n),t.vec3_set(0,this._myParams.myThickness*2-1e-5,0),this._myArrowRootObject.pp_translateObject(t),this._myArrowObject.pp_resetScaleLocal(),i.vec3_set(this._myParams.myThickness*1.25,this._myParams.myThickness*2,this._myParams.myThickness*1.25),this._myArrowObject.pp_scaleObject(i),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myArrowMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:(this._myFlatOpaqueMaterial==null&&(this._myFlatOpaqueMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone()),this._myArrowMeshComponent.material=this._myFlatOpaqueMaterial,this._myFlatOpaqueMaterial.color=this._myParams.myColor):this._myArrowMeshComponent.material=this._myParams.myMaterial,s=e.vec3_sub(this._myParams.myStart,s);let r=this._myVisualLine.getParams();r.myStart.vec3_copy(this._myParams.myStart),r.myDirection=s.vec3_normalize(r.myDirection),r.myLength=s.vec3_length(),r.myThickness=this._myParams.myThickness,r.myMaterial=this._myArrowMeshComponent.material,r.myParent=this._myParams.myParent,this._myVisualLine.paramsUpdated()}}();Object.defineProperty(PP.VisualArrow.prototype,"_refresh",{enumerable:!1})});var Bi=T(()=>{PP.VisualTextParams=class{constructor(){this.myText="",this.myAlignment=WL.Alignment.Center,this.myJustification=WL.Justification.Middle,this.myTransform=PP.mat4_create(),this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.TEXT}};PP.VisualText=class{constructor(t=new PP.VisualTextParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myTextObject=null,this._myTextComponent=null,this._myTextMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myTextObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_refresh(){this._myTextObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myTextObject.pp_setTransformLocal(this._myParams.myTransform),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myTextComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial:(this._myTextMaterial==null&&(this._myTextMaterial=PP.myDefaultResources.myMaterials.myText.clone()),this._myTextComponent.material=this._myTextMaterial,this._myTextMaterial.color=this._myParams.myColor):this._myTextComponent.material=this._myParams.myMaterial,this._myTextComponent.text=this._myParams.myText,this._myTextComponent.alignment=this._myParams.myAlignment,this._myTextComponent.justification=this._myParams.myJustification,this._myDirty=!1}_build(){this._myTextObject=WL.scene.addObject(null),this._myTextComponent=this._myTextObject.addComponent("text")}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualTextParams;t.myText=this._myParams.myText,t.myAlignment=this._myParams.myAlignment,t.myJustification=this._myParams.myJustification,t.myTransform.mat4_copy(this._myParams.myTransform),this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualText(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}}});var Li=T(()=>{PP.VisualTransformParams=class{constructor(){this.myTransform=PP.mat4_create(),this.myLength=.2,this.myThickness=.005,this.myForwardMaterial=null,this.myUpMaterial=null,this.myRightMaterial=null,this.myParent=null,this.myType=PP.VisualElementType.TRANSFORM}};PP.VisualTransform=class{constructor(t=new PP.VisualTransformParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myVisualRight=new PP.VisualArrow,this._myVisualUp=new PP.VisualArrow,this._myVisualForward=new PP.VisualArrow,this._myVisualRight.setAutoRefresh(!1),this._myVisualUp.setAutoRefresh(!1),this._myVisualForward.setAutoRefresh(!1),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myVisualRight.setVisible(t),this._myVisualUp.setVisible(t),this._myVisualForward.setVisible(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh(),this._myVisualRight.forceRefresh(),this._myVisualUp.forceRefresh(),this._myVisualForward.forceRefresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1),this._myVisualRight.update(t),this._myVisualUp.update(t),this._myVisualForward.update(t)}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualTransformParams;t.myTransform.mat4_copy(this._myParams.myTransform),t.myLength=this._myParams.myLength,t.myThickness=this._myParams.myThickness,this._myParams.myRightMaterial!=null?t.myRightMaterial=this._myParams.myRightMaterial.clone():t.myRightMaterial=null,this._myParams.myUpMaterial!=null?t.myUpMaterial=this._myParams.myUpMaterial.clone():t.myUpMaterial=null,this._myParams.myForwardMaterial!=null?t.myForwardMaterial=this._myParams.myForwardMaterial.clone():t.myForwardMaterial=null,t.myParent=this._myParams.myParent;let i=new PP.VisualTransform(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}};PP.VisualTransform.prototype._refresh=function(){let e=[PP.vec3_create(),PP.vec3_create(),PP.vec3_create()],t=PP.vec3_create(),i=PP.vec3_create();return function(){e=this._myParams.myTransform.mat4_getAxes(e),t=this._myParams.myTransform.mat4_getScale(t);let n=0;for(let o of t)n=Math.max(o,n);n==0?(t[0]=1,t[1]=1,t[2]=1):(t[0]=t[0]/n,t[1]=t[1]/n,t[2]=t[2]/n),i=this._myParams.myTransform.mat4_getPosition(i);{let o=this._myVisualRight.getParams();o.myStart.vec3_copy(i),o.myDirection=e[0].vec3_negate(o.myDirection).vec3_normalize(o.myDirection),o.myLength=Math.max(this._myParams.myLength*t[0],.001),o.myThickness=this._myParams.myThickness,this._myParams.myRightMaterial==null?o.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial:o.myMaterial=this._myParams.myRightMaterial,o.myParent=this._myParams.myParent,this._myVisualRight.paramsUpdated()}{let o=this._myVisualUp.getParams();o.myStart.vec3_copy(i),o.myDirection=e[1].vec3_normalize(o.myDirection),o.myLength=Math.max(this._myParams.myLength*t[1],.001),o.myThickness=this._myParams.myThickness,this._myParams.myUpMaterial==null?o.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial:o.myMaterial=this._myParams.myUpMaterial,o.myParent=this._myParams.myParent,this._myVisualUp.paramsUpdated()}{let o=this._myVisualForward.getParams();o.myStart.vec3_copy(i),o.myDirection=e[2].vec3_normalize(o.myDirection),o.myLength=Math.max(this._myParams.myLength*t[2],.001),o.myThickness=this._myParams.myThickness,this._myParams.myForwardMaterial==null?o.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial:o.myMaterial=this._myParams.myForwardMaterial,o.myParent=this._myParams.myParent,this._myVisualForward.paramsUpdated()}}}();Object.defineProperty(PP.VisualTransform.prototype,"_refresh",{enumerable:!1})});var Ai=T(()=>{PP.VisualRaycastParams=class{constructor(){this._myRaycastResult=new PP.RaycastResult,this.myHitNormalLength=.2,this.myThickness=.005,this.myShowOnlyFirstHit=!0,this.myRayMaterial=null,this.myHitNormalMaterial=null,this.myParent=null,this.myType=PP.VisualElementType.RAYCAST}get myRaycastResult(){return this._myRaycastResult}set myRaycastResult(t){this._myRaycastResult.copy(t)}};PP.VisualRaycast=class{constructor(t=new PP.VisualRaycastParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myVisualRaycast=new PP.VisualArrow,this._myVisualRaycast.setAutoRefresh(!1),this._myVisualRaycastHitList=[],this._addVisualRaycastHit(),this.setVisible(!0)}setVisible(t){if(this._myVisible!=t)if(this._myVisible=t,this._myVisible){if(this._myParams.myRaycastResult.myRaycastSetup!=null&&this._myVisualRaycast.setVisible(!0),this._myParams.myRaycastResult.myHits.length>0){let i=Math.min(this._myParams.myRaycastResult.myHits.length,this._myVisualRaycastHitList.length);for(let s=0;s0){let t=this._myParams.myShowOnlyFirstHit?this._myParams.myRaycastResult.myHits.pp_first().myDistance:this._myParams.myRaycastResult.myHits.pp_last().myDistance;{let s=this._myVisualRaycast.getParams();s.myStart.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myOrigin),s.myDirection.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myDirection),s.myLength=t,s.myThickness=this._myParams.myThickness,this._myParams.myRayMaterial==null?s.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial:s.myMaterial=this._myParams.myRayMaterial,s.myParent=this._myParams.myParent,this._myVisualRaycast.paramsUpdated(),this._myVisualRaycast.setVisible(this._myVisible)}let i=this._myParams.myShowOnlyFirstHit?1:this._myParams.myRaycastResult.myHits.length;for(;i>this._myVisualRaycastHitList.length;)this._addVisualRaycastHit();for(let s=0;s{PP.VisualTorusParams=class{constructor(){this.myRadius=0,this.mySegmentAmount=12,this.mySegmentThickness=.05,this.myTransform=PP.mat4_create(),this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.TORUS}};PP.VisualTorus=class{constructor(t=new PP.VisualTorusParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myTorusRootObject=null,this._myVisualSegmentList=[],this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){if(this._myVisible!=t)if(this._myVisible=t,this._myVisible){let i=Math.min(this._myParams.mySegmentAmount,this._myVisualSegmentList.length);for(let s=0;s{WL.registerComponent("pp-visual-manager",{},{init:function(){this.active&&(PP.myVisualData.myRootObject=WL.scene.addObject(null),PP.myVisualManager=new PP.VisualManager)},start(){PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial=PP.myDefaultResources.myMaterials.myText.clone(),PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial.color=[1,0,0,1],PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial.color=[0,1,0,1],PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial.color=[0,0,1,1],PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial.color=[0,1,0,1],PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial.color=[1,0,0,1],PP.myVisualManager.start()},update(e){PP.myVisualManager.update(e)}});PP.myVisualManager=null;PP.myVisualData={myRootObject:null,myDefaultMaterials:{myDefaultMeshMaterial:null,myDefaultTextMaterial:null,myDefaultRightMaterial:null,myDefaultUpMaterial:null,myDefaultForwardMaterial:null,myDefaultRayMaterial:null,myDefaultHitNormalMaterial:null}}});var Di=T(()=>{PP.DebugManager=class{constructor(){this._myDebugVisualManager=new PP.DebugVisualManager}getDebugVisualManager(){return this._myDebugVisualManager}start(){this._myDebugVisualManager.start()}update(t){this._myDebugVisualManager.update(t)}}});var Ii=T(()=>{PP.DebugVisualManager=class extends PP.VisualManager{drawLine(t,i,s,n,o=[0,1,0,1],r=.005){let l=new PP.VisualLineParams;l.myStart.vec3_copy(i),l.myDirection.vec3_copy(s),l.myLength=n,l.myThickness=r,l.myColor=PP.vec4_create(),l.myColor.vec4_copy(o),this.draw(l,t)}drawLineEnd(t,i,s,n=[0,1,0,1],o=.005){}drawArrow(t,i,s,n,o=[0,1,0,1],r=.005){let l=new PP.VisualArrowParams;l.myStart.vec3_copy(i),l.myDirection.vec3_copy(s),l.myLength=n,l.myThickness=r,l.myColor=PP.vec4_create(),l.myColor.vec4_copy(o),this.draw(l,t)}drawArrowEnd(t,i,s,n=[0,1,0,1],o=.005){}drawPoint(t,i,s=[0,1,0,1],n=.005){let o=new PP.VisualPointParams;o.myPosition.vec3_copy(i),o.myRadius=n,o.myColor=PP.vec4_create(),o.myColor.vec4_copy(s),this.draw(o,t)}drawText(t,i,s,n=[0,1,0,1],o=WL.Alignment.Center,r=WL.Justification.Middle){let l=new PP.VisualTextParams;l.myText=i,l.myAlignment=o,l.myJustification=r,l.myTransform.mat4_copy(s),l.myColor=PP.vec4_create(),l.myColor.vec4_copy(n),this.draw(l,t)}drawRaycast(t,i,s=!0,n=.2,o=.005){let r=new PP.VisualRaycastParams;r.myRaycastResult=i,r.myShowOnlyFirstHit=s,r.myHitNormalLength=n,r.myThickness=o,this.draw(r,t)}drawTransform(t,i,s=.2,n=.005){let o=new PP.VisualTransformParams;o.myTransform.mat4_copy(i),o.myLength=s,o.myThickness=n,this.draw(o,t)}};PP.DebugVisualManager.prototype.drawLineEnd=function(){let e=PP.vec3_create();return function(i,s,n,o=[0,1,0,1],r=.005){e=n.vec3_sub(s,e),length=e.vec3_length(),e.vec3_normalize(e),this.drawLine(i,s,e,length,o,r)}}();PP.DebugVisualManager.prototype.drawArrowEnd=function(){let e=PP.vec3_create();return function(i,s,n,o=[0,1,0,1],r=.005){e=n.vec3_sub(s,e),length=e.vec3_length(),e.vec3_normalize(e),this.drawArrow(i,s,e,length,o,r)}}();Object.defineProperty(PP.DebugVisualManager.prototype,"drawLineEnd",{enumerable:!1});Object.defineProperty(PP.DebugVisualManager.prototype,"drawArrowEnd",{enumerable:!1})});var Oi=T(()=>{WL.registerComponent("pp-debug-transform",{_myLength:{type:WL.Type.Float,default:.1},_myThickness:{type:WL.Type.Float,default:.005}},{init:function(){},start:function(){this._myDebugTransformParams=new PP.VisualTransformParams,this._myDebugTransformParams.myLength=this._myLength,this._myDebugTransformParams.myThickness=this._myThickness},update:function(e){this.object.pp_getTransform(this._myDebugTransformParams.myTransform),PP.myDebugVisualManager.draw(this._myDebugTransformParams)}})});var Ei=T(()=>{WL.registerComponent("pp-debug-manager",{},{init:function(){this.active&&(PP.myDebugManager=new PP.DebugManager,PP.myDebugVisualManager=PP.myDebugManager.getDebugVisualManager())},start(){PP.myDebugManager.start()},update(e){PP.myDebugManager.update(e)}});PP.myDebugManager=null;PP.myDebugVisualManager=null});var Wi=T(()=>{PP.Direction2DTo3DConverterParams=class{constructor(){this.myStartFlyingForward=!1,this.myStartFlyingRight=!1,this.myAutoUpdateFlyForward=!1,this.myAutoUpdateFlyRight=!1,this.myResetFlyForwardWhenZero=!1,this.myResetFlyRightWhenZero=!1,this.myMinAngleToFlyForwardUp=90,this.myMinAngleToFlyForwardDown=90,this.myMinAngleToFlyRightUp=90,this.myMinAngleToFlyRightDown=90}};PP.Direction2DTo3DConverter=class{constructor(t=new PP.Direction2DTo3DConverterParams){this._myParams=t,this._myIsFlyingForward=this._myParams.myStartFlyingForward,this._myIsFlyingRight=this._myParams.myStartFlyingRight,this._myLastValidFlatForward=PP.vec3_create(),this._myLastValidFlatRight=PP.vec3_create(),this._myMinAngleToBeValid=5}convert(t,i,s=null,n=PP.vec3_create()){}isFlying(){return this._myIsFlyingForward||this._myIsFlyingRight}isFlyingForward(){return this._myIsFlyingForward}isFlyingRight(){return this._myIsFlyingRight}startFlying(){this._myIsFlyingForward=!0,this._myIsFlyingRight=!0}startFlyingForward(){this._myIsFlyingForward=!0}startFlyingRight(){this._myIsFlyingRight=!0}stopFlying(){this._myIsFlyingForward=!1,this._myIsFlyingRight=!1}stopFlyingForward(){this._myIsFlyingForward=!1}stopFlyingRight(){this._myIsFlyingRight=!1}resetFly(){this.resetFlyForward(),this.resetFlyRight()}resetFlyForward(){this._myParams.myStartFlyingForward?this.startFlyingForward():this.stopFlyingForward(),this._myLastValidFlatForward.vec3_zero()}resetFlyRight(){this._myParams.myStartFlyingRight?this.startFlyingRight():this.stopFlyingRight(),this._myLastValidFlatRight.vec3_zero()}};PP.Direction2DTo3DConverter.prototype.convert=function(){let e=PP.vec3_create(),t=PP.vec3_create(),i=PP.vec3_create(),s=PP.vec3_create(),n=PP.vec3_create();return function(r,l,y=null,c=PP.vec3_create()){if(r.vec2_isZero())return this._myParams.myAutoUpdateFlyForward&&this._myParams.myResetFlyForwardWhenZero&&this.resetFlyForward(),this._myParams.myAutoUpdateFlyRight&&this._myParams.myResetFlyRightWhenZero&&this.resetFlyRight(),[0,0,0];if(r[0]==0&&this._myLastValidFlatRight.vec3_zero(),r[1]==0&&this._myLastValidFlatForward.vec3_zero(),e=l.quat2_getForward(e),t=l.quat2_getRight(t),y!=null){if(i=y.vec3_negate(i),this._myParams.myAutoUpdateFlyForward){let a=e.vec3_angle(y);this._myIsFlyingForward=this._myIsFlyingForward||a<90-this._myParams.myMinAngleToFlyForwardUp||a>90+this._myParams.myMinAngleToFlyForwardDown}if(this._myParams.myAutoUpdateFlyRight){let a=t.vec3_angle(y);this._myIsFlyingRight=this._myIsFlyingRight||a<90-this._myParams.myMinAngleToFlyRightUp||a>90+this._myParams.myMinAngleToFlyRightDown}this._myIsFlyingForward||(!this._myLastValidFlatForward.vec3_isZero(1e-6)&&(e.vec3_angle(y)this._myMinAngleToBeValid&&e.vec3_angle(i)>this._myMinAngleToBeValid||r[1]!=0&&this._myLastValidFlatForward.vec3_isZero(1e-6))&&(this._myLastValidFlatForward=e.vec3_removeComponentAlongAxis(y,this._myLastValidFlatForward),this._myLastValidFlatForward.vec3_normalize(this._myLastValidFlatForward)),(t.vec3_angle(y)>this._myMinAngleToBeValid&&t.vec3_angle(i)>this._myMinAngleToBeValid||r[0]!=0&&this._myLastValidFlatRight.vec3_isZero(1e-6))&&(this._myLastValidFlatRight=t.vec3_removeComponentAlongAxis(y,this._myLastValidFlatRight),this._myLastValidFlatRight.vec3_normalize(this._myLastValidFlatRight))}return c=t.vec3_scale(r[0],n).vec3_add(e.vec3_scale(r[1],s),c),y!=null&&!this._myIsFlyingForward&&!this._myIsFlyingRight&&(c=c.vec3_removeComponentAlongAxis(y,c)),c.vec3_normalize(c),c}}()});var ki=T(()=>{WL.registerComponent("pp-grabbable",{_myThrowLinearVelocityMultiplier:{type:WL.Type.Float,default:1},_myThrowAngularVelocityMultiplier:{type:WL.Type.Float,default:1},_myKinematicValueOnRelease:{type:WL.Type.Enum,values:["true","false","keep"],default:"false"}},{init:function(){this._myIsGrabbed=!1,this._myGrabber=null,this._myGrabCallbacks=new Map,this._myThrowCallbacks=new Map,this._myReleaseCallbacks=new Map},start:function(){this._myOldParent=this.object.parent,this._myPhysX=this.object.pp_getComponent("physx"),this._myOldKinematicValue=null},onDeactivate:function(){this.release()},grab:function(e){this.isGrabbed()||(this._myOldKinematicValue=this._myPhysX.kinematic),this.release(),this._myPhysX.kinematic=!0,this._myOldParent=this.object.parent,this.object.pp_setParent(e),this._myIsGrabbed=!0,this._myGrabCallbacks.forEach(function(t){t(e,this)}.bind(this))},throw:function(e,t){if(this._myIsGrabbed){let i=this._myGrabber;this._release(),this._myPhysX.linearVelocity=e.vec3_scale(this._myThrowLinearVelocityMultiplier),this._myPhysX.angularVelocity=t.vec3_scale(this._myThrowAngularVelocityMultiplier),this._myThrowCallbacks.forEach(function(s){s(i,this)}.bind(this)),this._myReleaseCallbacks.forEach(function(s){s(i,this,!0)}.bind(this))}},release(){if(this._myIsGrabbed){let e=this._myGrabber;this._release(),this._myReleaseCallbacks.forEach(function(t){t(e,this,!1)}.bind(this))}},getLinearVelocity(){let e=PP.vec3_create();return this._myPhysX.linearVelocity.vec3_clone(e),e},getAngularVelocity(){return this.getAngularVelocityDegrees()},getAngularVelocityDegrees(){let e=PP.vec3_create();return this._myPhysX.angularVelocity.vec3_toDegrees(e),e},getAngularVelocityRadians(){let e=PP.vec3_create();return this._myPhysX.angularVelocity.vec3_clone(e),e},isGrabbed(){return this._myIsGrabbed},getGrabber(){return this._myGrabber},registerGrabEventListener(e,t){this._myGrabCallbacks.set(e,t)},unregisterGrabEventListener(e){this._myGrabCallbacks.delete(e)},registerThrowEventListener(e,t){this._myThrowCallbacks.set(e,t)},unregisterThrowEventListener(e){this._myThrowCallbacks.delete(e)},registerReleaseEventListener(e,t){this._myReleaseCallbacks.set(e,t)},unregisterReleaseEventListener(e){this._myReleaseCallbacks.delete(e)},_release(){this.object.pp_setParent(this._myOldParent),this._myIsGrabbed=!1,this._myGrabber=null,this._myKinematicValueOnRelease==0?this._myPhysX.kinematic=!0:this._myKinematicValueOnRelease==1?this._myPhysX.kinematic=!1:this._myOldKinematicValue!=null&&(this._myPhysX.kinematic=this._myOldKinematicValue),this._myPhysX.kinematic&&(this._myPhysX.linearVelocity=[0,0,0],this._myPhysX.angularVelocity=[0,0,0])}})});var ji=T(()=>{WL.registerComponent("pp-grabber-hand",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myGrabButton:{type:WL.Type.Enum,values:["select","squeeze","both","both_exclusive"],default:"squeeze"},_mySnapOnPivot:{type:WL.Type.Bool,default:!1},_myMaxNumberOfObjects:{type:WL.Type.Int,default:1},_myThrowVelocitySource:{type:WL.Type.Enum,values:["hand","grabbable"],default:"hand"},_myThrowLinearVelocityMultiplier:{type:WL.Type.Float,default:1},_myThrowMaxLinearSpeed:{type:WL.Type.Float,default:15},_myThrowAngularVelocityMultiplier:{type:WL.Type.Float,default:.5},_myThrowMaxAngularSpeed:{type:WL.Type.Float,default:1080},_myThrowLinearVelocityBoost:{type:WL.Type.Float,default:1.75},_myThrowLinearVelocityBoostMinSpeedThreshold:{type:WL.Type.Float,default:.6},_myThrowLinearVelocityBoostMaxSpeedThreshold:{type:WL.Type.Float,default:2.5}},{init:function(){this._myGrabbables=[],this._myGamepad=null,this._myActiveGrabButton=null,this._myLinearVelocityHistorySize=5,this._myLinearVelocityHistorySpeedAverageSamplesFromStart=1,this._myLinearVelocityHistoryDirectionAverageSamplesFromStart=3,this._myLinearVelocityHistoryDirectionAverageSkipFromStart=0,this._myHandLinearVelocityHistory=new Array(this._myLinearVelocityHistorySize),this._myHandLinearVelocityHistory.fill([0,0,0]),this._myAngularVelocityHistorySize=1,this._myHandAngularVelocityHistory=new Array(this._myAngularVelocityHistorySize),this._myHandAngularVelocityHistory.fill([0,0,0]),this._myThrowMaxAngularSpeedRadians=Math.pp_toRadians(this._myThrowMaxAngularSpeed),this._myGrabCallbacks=new Map,this._myThrowCallbacks=new Map,this._myDebugActive=!1},start:function(){this._myHandedness==PP.HandednessIndex.LEFT?this._myGamepad=PP.myLeftGamepad:this._myGamepad=PP.myRightGamepad,this._myPhysX=this.object.pp_getComponent("physx"),this._myCollisionsCollector=new PP.PhysXCollisionCollector(this._myPhysX,!0)},update:function(e){this._myCollisionsCollector.update(e),this._myGrabbables.length>0&&(this._updateLinearVelocityHistory(),this._updateAngularVelocityHistory())},grab:function(e=null){this._grab(e)},throw:function(e=null){this._throw(e)},registerGrabEventListener(e,t){this._myGrabCallbacks.set(e,t)},unregisterGrabEventListener(e){this._myGrabCallbacks.delete(e)},registerThrowEventListener(e,t){this._myThrowCallbacks.set(e,t)},unregisterThrowEventListener(e){this._myThrowCallbacks.delete(e)},onActivate(){this._myGamepad!=null&&(this._myGrabButton==0?(this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SELECT)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SELECT))):this._myGrabButton==1?(this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SQUEEZE)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SQUEEZE))):(this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SQUEEZE)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SQUEEZE)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SELECT)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SELECT))))},onDeactivate(){this._myGamepad!=null&&(this._myGrabButton==0?(this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this)):this._myGrabButton==1?(this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this)):(this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this)))},_grab:function(e){if(!(this._myGrabbables.length>=this._myMaxNumberOfObjects)&&(this._myGrabButton==2||this._myActiveGrabButton==null||this._myActiveGrabButton==e||e==null)){let t=[],i=this._myCollisionsCollector.getCollisions();for(let n=0;n=this._myMaxNumberOfObjects)break}this._myGrabbables.length>0&&this._myActiveGrabButton==null&&(this._myActiveGrabButton=e)}},_throw:function(e){if(this._myGrabButton==2||this._myActiveGrabButton==null||this._myActiveGrabButton==e||e==null){if(this._myGrabbables.length>0){let t=null,i=null;this._myThrowVelocitySource==0&&(t=this._computeReleaseLinearVelocity(this._myHandLinearVelocityHistory),i=this._computeReleaseAngularVelocity(this._myHandAngularVelocityHistory));for(let s of this._myGrabbables){let n=s.getGrabbable();n.unregisterReleaseEventListener(this),this._myThrowVelocitySource==1&&(t=this._computeReleaseLinearVelocity(s.getLinearVelocityHistory()),i=this._computeReleaseAngularVelocity(s.getAngularVelocityHistory())),n.throw(t,i),this._myThrowCallbacks.forEach(function(o){o(this,n)}.bind(this))}this._myGrabbables=[]}this._myActiveGrabButton=null}},_onRelease(e,t){t.unregisterReleaseEventListener(this),this._myGrabbables.pp_remove(i=>i.getGrabbable()==t),this._myGrabbables.length<=0&&(this._myActiveGrabButton=null)},_updateLinearVelocityHistory(){let e=this._myGamepad.getHandPose();this._myHandLinearVelocityHistory.unshift(e.getLinearVelocity().pp_clone()),this._myHandLinearVelocityHistory.pop();for(let t of this._myGrabbables)t.updateLinearVelocityHistory()},_updateAngularVelocityHistory(){let e=this._myGamepad.getHandPose();this._myHandAngularVelocityHistory.unshift(e.getAngularVelocityRadians().pp_clone()),this._myHandAngularVelocityHistory.pop();for(let t of this._myGrabbables)t.updateAngularVelocityHistory()},_computeReleaseLinearVelocity(e){let t=e[0].vec3_length();for(let l=1;lthis._myLinearVelocityHistoryDirectionAverageSkipFromStart;t--){let i=t-this._myLinearVelocityHistoryDirectionAverageSkipFromStart,s=t-this._myLinearVelocityHistoryDirectionAverageSkipFromStart,n=[0,0,0];for(let r=this._myLinearVelocityHistoryDirectionAverageSkipFromStart;ri.getGrabbable()==e)!=null}});PP.GrabberHandGrabbableData=class{constructor(t,i,s,n){this._myGrabbable=t,this._myUseGrabbableAsVelocitySource=i,this._myUseGrabbableAsVelocitySource&&(this._myLinearVelocityHistory=new Array(s),this._myLinearVelocityHistory.fill([0,0,0]),this._myAngularVelocityHistory=new Array(n),this._myAngularVelocityHistory.fill([0,0,0]))}getGrabbable(){return this._myGrabbable}getLinearVelocityHistory(){return this._myLinearVelocityHistory}getAngularVelocityHistory(){return this._myAngularVelocityHistory}updateLinearVelocityHistory(){this._myUseGrabbableAsVelocitySource&&(this._myLinearVelocityHistory.unshift(this._myGrabbable.getLinearVelocity()),this._myLinearVelocityHistory.pop())}updateAngularVelocityHistory(){this._myUseGrabbableAsVelocitySource&&(this._myAngularVelocityHistory.unshift(this._myGrabbable.getAngularVelocityRadians()),this._myAngularVelocityHistory.pop())}}});var Fi=T(()=>{WL.registerComponent("pp-finger-cursor",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myEnableMultipleClicks:{type:WL.Type.Bool,default:!0},_myCollisionGroup:{type:WL.Type.Int,default:1},_myCollisionSize:{type:WL.Type.Float,default:.0125},_myCursorObject:{type:WL.Type.Object,default:null}},{init:function(){this._myLastTarget=null,this._myReferenceSpace=null,this._myHandInputSource=null,this._myHandednessString=["left","right"][this._myHandedness],this._myDoubleClickTimer=0,this._myTripleClickTimer=0,this._myMultipleClickObject=null,this._myMultipleClickDelay=.3},start:function(){this._myCursorObjectRoot=WL.scene.addObject(null),this._myCursorObject==null?this._myCursorObject=this._myCursorObjectRoot.pp_addObject():this._myCursorObject.pp_setParent(this._myCursorObjectRoot),this._myCollisionComponent=this._myCursorObject.addComponent("collision"),this._myCollisionComponent.collider=WL.Collider.Sphere,this._myCollisionComponent.group=1<0&&(this._myDoubleClickTimer-=e),this._myTripleClickTimer>0&&(this._myTripleClickTimer-=e),this._myCursorObjectRoot.pp_setTransformQuat(PP.myPlayerObjects.myPlayerPivot.pp_getTransformQuat()),this._updateHand(),this._myHandInputSource){let t=this._myCollisionComponent.queryOverlaps(),i=null;for(let s=0;s0&&this._myMultipleClickObject&&this._myMultipleClickObject.equals(this._myLastTarget.object)?(this._myLastTarget.onTripleClick(this._myLastTarget.object,this),this._myTripleClickTimer=0):this._myEnableMultipleClicks&&this._myDoubleClickTimer>0&&this._myMultipleClickObject&&this._myMultipleClickObject.equals(this._myLastTarget.object)?(this._myLastTarget.onDoubleClick(this._myLastTarget.object,this),this._myTripleClickTimer=this._myMultipleClickDelay,this._myDoubleClickTimer=0):(this._myLastTarget.onClick(this._myLastTarget.object,this),this._myTripleClickTimer=0,this._myDoubleClickTimer=this._myMultipleClickDelay,this._myMultipleClickObject=this._myLastTarget.object),this._myLastTarget.onUp(this._myLastTarget.object,this),this._myLastTarget.onUnhover(this._myLastTarget.object,this),this._myLastTarget=null)},onActivate:function(){this._myCursorObjectRoot.pp_setActive(!0)},onDeactivate:function(){this._myCursorObjectRoot.pp_setActive(!1)},_updateHand(){if(this._myHandInputSource=PP.InputUtils.getInputSource(this._myHandednessString,PP.InputSourceType.TRACKED_HAND),this._myHandInputSource){let e=Module.webxr_frame.getJointPose(this._myHandInputSource.hand.get("index-finger-tip"),this._myReferenceSpace);e&&(this._myCursorObject.pp_setRotationLocalQuat([e.transform.orientation.x,e.transform.orientation.y,e.transform.orientation.z,e.transform.orientation.w]),this._myCursorObject.pp_setPositionLocal([e.transform.position.x,e.transform.position.y,e.transform.position.z]))}},_onXRSessionStart:function(e){e.requestReferenceSpace(WebXR.refSpace).then(function(t){this._myReferenceSpace=t}.bind(this))},_onXRSessionEnd:function(e){this._myReferenceSpace=null}})});var wi=T(()=>{PP.Handedness={LEFT:"left",RIGHT:"right"};PP.HandednessIndex={LEFT:0,RIGHT:1};PP.InputSourceType={GAMEPAD:0,TRACKED_HAND:1};PP.TrackedHandJointType={WRIST:"wrist",THUMB_METACARPAL:"thumb-metacarpal",THUMB_PHALANX_PROXIMAL:"thumb-phalanx-proximal",THUMB_PHALANX_DISTAL:"thumb-phalanx-distal",THUMB_TIP:"thumb-tip",INDEX_FINGER_METACARPAL:"index-finger-metacarpal",INDEX_FINGER_PHALANX_PROXIMAL:"index-finger-phalanx-proximal",INDEX_FINGER_PHALANX_INTERMEDIATE:"index-finger-phalanx-intermediate",INDEX_FINGER_PHALANX_DISTAL:"index-finger-phalanx-distal",INDEX_FINGER_TIP:"index-finger-tip",MIDDLE_FINGER_METACARPAL:"middle-finger-metacarpal",MIDDLE_FINGER_PHALANX_PROXIMAL:"middle-finger-phalanx-proximal",MIDDLE_FINGER_PHALANX_INTERMEDIATE:"middle-finger-phalanx-intermediate",MIDDLE_FINGER_PHALANX_DISTAL:"middle-finger-phalanx-distal",MIDDLE_FINGER_TIP:"middle-finger-tip",RING_FINGER_METACARPAL:"ring-finger-metacarpal",RING_FINGER_PHALANX_PROXIMAL:"ring-finger-phalanx-proximal",RING_FINGER_PHALANX_INTERMEDIATE:"ring-finger-phalanx-intermediate",RING_FINGER_PHALANX_DISTAL:"ring-finger-phalanx-distal",RING_FINGER_TIP:"ring-finger-tip",PINKY_FINGER_METACARPAL:"pinky-finger-metacarpal",PINKY_FINGER_PHALANX_PROXIMAL:"pinky-finger-phalanx-proximal",PINKY_FINGER_PHALANX_INTERMEDIATE:"pinky-finger-phalanx-intermediate",PINKY_FINGER_PHALANX_DISTAL:"pinky-finger-phalanx-distal",PINKY_FINGER_TIP:"pinky-finger-tip"};PP.TrackedHandJointTypeIndex={WRIST:0,THUMB_METACARPAL:1,THUMB_PHALANX_PROXIMAL:2,THUMB_PHALANX_DISTAL:3,THUMB_TIP:4,INDEX_FINGER_METACARPAL:5,INDEX_FINGER_PHALANX_PROXIMAL:6,INDEX_FINGER_PHALANX_INTERMEDIATE:7,INDEX_FINGER_PHALANX_DISTAL:8,INDEX_FINGER_TIP:9,MIDDLE_FINGER_METACARPAL:10,MIDDLE_FINGER_PHALANX_PROXIMAL:11,MIDDLE_FINGER_PHALANX_INTERMEDIATE:12,MIDDLE_FINGER_PHALANX_DISTAL:13,MIDDLE_FINGER_TIP:14,RING_FINGER_METACARPAL:15,RING_FINGER_PHALANX_PROXIMAL:16,RING_FINGER_PHALANX_INTERMEDIATE:17,RING_FINGER_PHALANX_DISTAL:18,RING_FINGER_TIP:19,PINKY_FINGER_METACARPAL:20,PINKY_FINGER_PHALANX_PROXIMAL:21,PINKY_FINGER_PHALANX_INTERMEDIATE:22,PINKY_FINGER_PHALANX_DISTAL:23,PINKY_FINGER_TIP:24}});var Hi=T(()=>{PP.InputUtils={getHandednessByIndex:function(e){let t=null;switch(e){case PP.HandednessIndex.LEFT:t=PP.Handedness.LEFT;break;case PP.HandednessIndex.RIGHT:t=PP.Handedness.RIGHT;break}return t},getInputSource:function(e,t){let i=null;if(WL.xrSession&&WL.xrSession.inputSources)for(let s=0;s{PP.KeyType={_0:"0",_1:"1",_2:"2",_3:"3",_4:"4",_5:"5",_6:"6",_7:"7",_8:"8",_9:"9",A:"A",B:"B",C:"C",D:"D",E:"E",F:"F",G:"G",H:"H",I:"I",J:"J",K:"K",L:"L",M:"M",N:"N",O:"O",P:"P",Q:"Q",R:"R",S:"S",T:"T",U:"U",V:"V",W:"W",X:"X",Y:"Y",Z:"Z",a:"a",b:"b",c:"c",d:"d",e:"e",f:"f",g:"g",h:"h",i:"i",j:"j",k:"k",l:"l",m:"m",n:"n",o:"o",p:"p",q:"q",r:"r",s:"s",t:"t",u:"u",v:"v",w:"w",x:"x",y:"y",z:"z",UP:"ArrowUp",DOWN:"ArrowDown",LEFT:"ArrowLeft",RIGHT:"ArrowRight",SPACE:" ",ENTER:"Enter",BACKSPACE:"Backspace",ESC:"Escape",SHIFT_LEFT:"ShiftLeft",SHIFT_RIGHT:"ShiftRight",CONTROL_LEFT:"ControlLeft",CONTROL_RIGHT:"ControlRight",ALT_LEFT:"AltLeft",ALT_RIGHT:"AltRight"};PP.Keyboard=class{constructor(){this._myKeyInfos=new Map;for(let t in PP.KeyType)this.addKey(PP.KeyType[t])}isKeyPressed(t){let i=!1;return this._myKeyInfos.has(t)&&(i=this._myKeyInfos.get(t).myIsPressed),i}isKeyPressStart(t){let i=!1;return this._myKeyInfos.has(t)&&(i=this._myKeyInfos.get(t).myIsPressStart),i}isKeyPressEnd(t){let i=!1;return this._myKeyInfos.has(t)&&(i=this._myKeyInfos.get(t).myIsPressEnd),i}addKey(t){this._myKeyInfos.set(t,{myIsPressed:!1,myIsPressStart:!1,myIsPressStartToProcess:!1,myIsPressEnd:!1,myIsPressEndToProcess:!1})}start(){window.addEventListener("keydown",this._keyDown.bind(this)),window.addEventListener("keyup",this._keyUp.bind(this))}update(t){if(!document.hasFocus())for(let i of this._myKeyInfos.values())i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0);for(let i of this._myKeyInfos.values())i.myIsPressStart=i.myIsPressStartToProcess,i.myIsPressEnd=i.myIsPressEndToProcess,i.myIsPressStartToProcess=!1,i.myIsPressEndToProcess=!1}_keyDown(t){this._keyPressedChanged(t.key,!0),t.key!=t.code&&this._keyPressedChanged(t.code,!0)}_keyUp(t){this._keyPressedChanged(t.key,!1),t.key!=t.code&&this._keyPressedChanged(t.code,!1)}_keyPressedChanged(t,i){if(this._myKeyInfos.has(t)){let s=this._myKeyInfos.get(t);i?(s.myIsPressed=!0,s.myIsPressStartToProcess=!0):(s.myIsPressed=!1,s.myIsPressEndToProcess=!0)}}}});var qi=T(()=>{PP.MouseButtonType={LEFT:0,MIDDLE:1,RIGHT:2};PP.Mouse=class{constructor(){this._myButtonInfos=new Map;for(let t in PP.MouseButtonType)this._myButtonInfos.set(PP.MouseButtonType[t],{myIsPressed:!1,myIsPressStart:!1,myIsPressStartToProcess:!1,myIsPressEnd:!1,myIsPressEndToProcess:!1});this._myPreventContextMenuCallback=this._preventContextMenu.bind(this),this._myPreventMiddleButtonScrollCallback=this._preventMiddleButtonScroll.bind(this),this._myInternalMousePosition=PP.vec2_create(),this._myScreenSize=PP.vec2_create(),this._myResetMovingDelay=.15,this._myResetMovingTimer=new PP.Timer(this._myResetMovingDelay,!1),this._myIsMoving=!1,this._myIsInsideView=!0,this._myContextMenuActive=!0,this._myMiddleButtonScrollActive=!0,this._myProjectionMatrixInverse=PP.mat4_create(),this._myRotationQuat=PP.quat_create(),this._myOriginWorld=PP.vec3_create(),this._myDirectionWorld=PP.vec3_create()}start(){this._myOnMouseMoveCallback=this._onMouseMove.bind(this),WL.canvas.addEventListener("mousemove",this._myOnMouseMoveCallback),this._myOnMouseDownCallback=this._onMouseDown.bind(this),WL.canvas.addEventListener("mousedown",this._myOnMouseDownCallback),this._myOnMouseUpCallback=this._onMouseUp.bind(this),WL.canvas.addEventListener("mouseup",this._myOnMouseUpCallback),this._myOnMouseLeaveCallback=this._onMouseLeave.bind(this),WL.canvas.addEventListener("mouseleave",this._myOnMouseLeaveCallback),this._myOnMouseEnterCallback=this._onMouseEnter.bind(this),WL.canvas.addEventListener("mouseenter",this._myOnMouseEnterCallback)}update(t){this._myResetMovingTimer.isRunning()&&(this._myResetMovingTimer.update(t),this._myResetMovingTimer.isDone()&&(this._myResetMovingTimer.reset(),this._myIsMoving=!1));for(let i of this._myButtonInfos.values())i.myIsPressStart=i.myIsPressStartToProcess,i.myIsPressEnd=i.myIsPressEndToProcess,i.myIsPressStartToProcess=!1,i.myIsPressEndToProcess=!1}destroy(){WL.canvas.removeEventListener("mousemove",this._myOnMouseMoveCallback),WL.canvas.removeEventListener("mousedown",this._myOnMouseDownCallback),WL.canvas.removeEventListener("mouseup",this._myOnMouseUpCallback),WL.canvas.removeEventListener("mouseleave",this._myOnMouseLeaveCallback),WL.canvas.removeEventListener("contextmenu",this._myPreventContextMenuCallback),WL.canvas.removeEventListener("mousedown",this._myPreventMiddleButtonScrollCallback)}isButtonPressed(t){let i=!1;return this._myButtonInfos.has(t)&&(i=this._myButtonInfos.get(t).myIsPressed),i}isButtonPressStart(t){let i=!1;return this._myButtonInfos.has(t)&&(i=this._myButtonInfos.get(t).myIsPressStart),i}isButtonPressEnd(t=null){let i=!1;return this._myButtonInfos.has(t)&&(i=this._myButtonInfos.get(t).myIsPressEnd),i}isMoving(){return this._myIsMoving}isInsideView(){return this._myIsInsideView}setContextMenuActive(t){this._myContextMenuActive!=t&&(t?WL.canvas.removeEventListener("contextmenu",this._myPreventContextMenuCallback):WL.canvas.addEventListener("contextmenu",this._myPreventContextMenuCallback,!1),this._myContextMenuActive=t)}setMiddleButtonScrollActive(t){this._myMiddleButtonScrollActive!=t&&(t?WL.canvas.removeEventListener("mousedown",this._myPreventMiddleButtonScrollCallback):WL.canvas.addEventListener("mousedown",this._myPreventMiddleButtonScrollCallback,!1),this._myMiddleButtonScrollActive=t)}getPositionScreen(t=PP.vec2_create()){let i=t;return i[0]=this._myInternalMousePosition[0],i[1]=this._myScreenSize[1]-1-this._myInternalMousePosition[1],i}getScreenSize(){return this._myScreenSize}getPositionWorld(t,i=PP.vec3_create()){let s=this.getOriginWorld(this._myOriginWorld),n=this.getDirectionWorld(this._myDirectionWorld);return i=s.vec3_add(n.vec3_scale(t,i),i),i}getOriginWorld(t=PP.vec3_create()){return PP.XRUtils.isXRSessionActive()?PP.myPlayerObjects.myEyeLeft.pp_getPosition(t):PP.myPlayerObjects.myNonVRCamera.pp_getPosition(t),t}getDirectionWorld(t=PP.vec3_create()){let i=this._myInternalMousePosition[0]/this._myScreenSize[0],s=this._myInternalMousePosition[1]/this._myScreenSize[1],n=t;n.vec3_set(i*2-1,-s*2+1,-1);let o=this._myProjectionMatrixInverse;PP.XRUtils.isXRSessionActive()?o=PP.myPlayerObjects.myEyeLeft.pp_getComponentHierarchy("view").projectionMatrix.mat4_invert(o):o=PP.myPlayerObjects.myNonVRCamera.pp_getComponentHierarchy("view").projectionMatrix.mat4_invert(o),n.vec3_transformMat4(o,n),n.vec3_normalize(n);let r=n;return PP.XRUtils.isXRSessionActive()?r=n.vec3_transformQuat(PP.myPlayerObjects.myEyeLeft.pp_getRotationQuat(this._myRotationQuat),n):r=n.vec3_transformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getRotationQuat(this._myRotationQuat),n),r.vec3_normalize(r),t}raycastWorld(t,i=new PP.RaycastResult){return this.getOriginWorld(t.myOrigin),this.getDirectionWorld(t.myDirection),i=PP.PhysicsUtils.raycast(t,i),i}setResetMovingDelay(t){this._myResetMovingDelay=t}getResetMovingDelay(){return this._myResetMovingDelay}_updatePositionAndView(t){let i=t.target.getBoundingClientRect();this._myScreenSize[0]=i.width,this._myScreenSize[1]=i.height,this._myInternalMousePosition[0]=t.clientX,this._myInternalMousePosition[1]=t.clientY}_onMouseMove(t){this._myResetMovingTimer.start(this._myResetMovingDelay),this._myIsMoving=!0,this._updatePositionAndView(t)}_onMouseDown(t){let i=this._myButtonInfos.get(t.button);i.myIsPressed||(i.myIsPressed=!0,i.myIsPressStartToProcess=!0),this._updatePositionAndView(t)}_onMouseUp(t){let i=this._myButtonInfos.get(t.button);i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0),this._updatePositionAndView(t)}_onMouseLeave(t){this._myIsInsideView=!1;for(let i of this._myButtonInfos.values())i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0)}_onMouseEnter(t){this._myIsInsideView=!0;for(let i of this._myButtonInfos.values())i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0)}_preventContextMenu(t){t.preventDefault()}_preventMiddleButtonScroll(t){if(t.button==1)return t.preventDefault(),!1}}});var Ui=T(()=>{PP.InputManager=class{constructor(){this._myMouse=new PP.Mouse,this._myKeyboard=new PP.Keyboard,this._myGamepadManager=new PP.GamepadManager}start(){this._myMouse.start(),this._myKeyboard.start(),this._myGamepadManager.start()}update(t){this._myMouse.update(t),this._myKeyboard.update(t),this._myGamepadManager.update(t)}getMouse(){return this._myMouse}getKeyboard(){return this._myKeyboard}getGamepadManager(){return this._myGamepadManager}}});var Gi=T(()=>{WL.registerComponent("pp-input-manager",{_myGamepadFixForward:{type:WL.Type.Bool,default:!0},_myMousePreventContextMenu:{type:WL.Type.Bool,default:!0},_myMousePreventMiddleButtonScroll:{type:WL.Type.Bool,default:!0}},{init(){this._myInputManager=new PP.InputManager,PP.myInputManager=this._myInputManager,PP.myMouse=this._myInputManager.getMouse(),PP.myKeyboard=this._myInputManager.getKeyboard(),PP.myGamepadManager=this._myInputManager.getGamepadManager(),PP.myGamepads=PP.myGamepadManager.getGamepads(),PP.myLeftGamepad=PP.myGamepadManager.getLeftGamepad(),PP.myRightGamepad=PP.myGamepadManager.getRightGamepad()},start(){this._myInputManager.start(),this._setupMousePrevent(),this._addGamepadCores()},update(e){this._myInputManager.update(e)},_setupMousePrevent(){this._myMousePreventContextMenu&&PP.myMouse.setContextMenuActive(!1),this._myMousePreventMiddleButtonScroll&&PP.myMouse.setMiddleButtonScrollActive(!1)},_addGamepadCores(){let e=new PP.HandPoseParams;e.myReferenceObject=PP.myPlayerObjects.myPlayerPivot,e.myFixForward=this._myFixForward,e.myForceEmulatedVelocities=!1;let t=new PP.XRGamepadCore(PP.Handedness.LEFT,e),i=new PP.XRGamepadCore(PP.Handedness.RIGHT,e);PP.myLeftGamepad.addGamepadCore("left_xr_gamepad",t),PP.myRightGamepad.addGamepadCore("right_xr_gamepad",i);let s=new PP.KeyboardGamepadCore(PP.Handedness.LEFT,t.getHandPose()),n=new PP.KeyboardGamepadCore(PP.Handedness.RIGHT,i.getHandPose());PP.myLeftGamepad.addGamepadCore("left_keyboard_gamepad",s),PP.myRightGamepad.addGamepadCore("right_keyboard_gamepad",n)}});PP.myInputManager=null;PP.myMouse=null;PP.myKeyboard=null;PP.myGamepadManager=null;PP.myGamepads=null;PP.myLeftGamepad=null;PP.myRightGamepad=null});var zi=T(()=>{WL.registerComponent("pp-switch-hand-object",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myGamepad:{type:WL.Type.Object},_myTrackedHand:{type:WL.Type.Object}},{init:function(){},start:function(){this._myHandednessType=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myFirstUpdate=!0,this._myCurrentInputSourceType=null},onActivate(){this._myFirstUpdate=!0},update:function(e){this._myFirstUpdate&&(this._myFirstUpdate=!1,this._start());let t=PP.InputUtils.getInputSourceTypeByHandedness(this._myHandednessType);t!=null&&this._myCurrentInputSourceType!=t&&(this._myCurrentInputSourceType=t,t==PP.InputSourceType.TRACKED_HAND?(this._myGamepad.pp_setActive(!1),this._myTrackedHand.pp_setActive(!0)):t==PP.InputSourceType.GAMEPAD&&(this._myTrackedHand.pp_setActive(!1),this._myGamepad.pp_setActive(!0)))},_start(){this._myGamepad.pp_setActive(!1),this._myTrackedHand.pp_setActive(!1),this._myCurrentInputSourceType=null}})});var Qi=T(()=>{WL.registerComponent("pp-tracked-hand-draw-joint",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_myJointType:{type:WL.Type.Enum,values:["Wrist","Thumb Metacarpal","Thumb Phalanx Proximal","Thumb Phalanx Distal","Thumb Tip","Index Metacarpal","Index Phalanx Proximal","Index Phalanx Intermediate","Index Phalanx Distal","Index Tip","Middle Metacarpal","Middle Phalanx Proximal","Middle Phalanx Intermediate","Middle Phalanx Distal","Middle Tip","Ring Metacarpal","Ring Phalanx Proximal","Ring Phalanx Intermediate","Ring Phalanx Distal","Ring Tip","Pinky Metacarpal","Pinky Phalanx Proximal","Pinky Phalanx Intermediate","Pinky Phalanx Distal","Pinky Tip"],default:"Wrist"},_myJointMesh:{type:WL.Type.Mesh},_myJointMaterial:{type:WL.Type.Material}},{init:function(){this._myHandednessInternal=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myJointTypeInternal=PP.InputUtils.getJointTypeByIndex(this._myJointType),this._myTrackedHandJointPose=new PP.TrackedHandJointPose(this._myHandednessInternal,this._myJointTypeInternal),this._myTrackedHandJointPose.setFixForward(this._myFixForward)},start:function(){this._myTrackedHandJointPose.start(),this._buildTrackedHandHierarchy()},update:function(e){this._myTrackedHandJointPose.update(e),this._myJointMeshObject.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat()),this._myJointMeshObject.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius())},_buildTrackedHandHierarchy(){this._myJointMeshObject=this.object.pp_addObject();let e=this._myJointMeshObject.pp_addComponent("mesh");e.mesh=this._myJointMesh,e.material=this._myJointMaterial,this._myJointMeshObject.pp_setScaleLocal(0)}})});var Xi=T(()=>{WL.registerComponent("pp-tracked-hand-draw-all-joints",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_myHideMetacarpals:{type:WL.Type.Bool,default:!0},_myJointMesh:{type:WL.Type.Mesh},_myJointMaterial:{type:WL.Type.Material}},{init:function(){},start:function(){this._buildTrackedHandHierarchy()},update:function(e){},_buildTrackedHandHierarchy(){this._myTrackedHandMeshObject=this.object.pp_addObject(),this._myJointMeshObjectList=[];for(let e in PP.TrackedHandJointType){let t=PP.TrackedHandJointType[e];if(!this._myHideMetacarpals||t!=PP.TrackedHandJointType.THUMB_METACARPAL&&t!=PP.TrackedHandJointType.INDEX_FINGER_METACARPAL&&t!=PP.TrackedHandJointType.MIDDLE_FINGER_METACARPAL&&t!=PP.TrackedHandJointType.RING_FINGER_METACARPAL&&t!=PP.TrackedHandJointType.PINKY_FINGER_METACARPAL){let i=this._myTrackedHandMeshObject.pp_addObject();this._myJointMeshObjectList[t]=i,i.pp_addComponent("pp-tracked-hand-draw-joint",{_myHandedness:this._myHandedness,_myFixForward:this._myFixForward,_myJointType:PP.TrackedHandJointTypeIndex[e],_myJointMesh:this._myJointMesh,_myJointMaterial:this._myJointMaterial})}}}})});var Ki=T(()=>{WL.registerComponent("pp-tracked-hand-draw-skin",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_myHandSkin:{type:WL.Type.Skin,default:null}},{init:function(){this._myHandednessInternal=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myTrackedHandPose=new PP.TrackedHandPose(this._myHandednessInternal),this._myTrackedHandPose.setFixForward(this._myFixForward)},start:function(){this._myTrackedHandPose.start(),this._prepareJoints()},update:function(t){this._myTrackedHandPose.update(t);for(let i=0;i{PP.ButtonType={SELECT:0,SQUEEZE:1,TOUCHPAD:2,THUMBSTICK:3,BOTTOM_BUTTON:4,TOP_BUTTON:5,THUMB_REST:6};PP.ButtonEvent={PRESS_START:0,PRESS_END:1,PRESSED:2,NOT_PRESSED:3,TOUCH_START:4,TOUCH_END:5,TOUCHED:6,NOT_TOUCHED:7,VALUE_CHANGED:8,ALWAYS:9};PP.AxesEvent={X_CHANGED:0,Y_CHANGED:1,AXES_CHANGED:2,ALWAYS:3};PP.ButtonInfo=class Ji{constructor(t,i){this.myType=t,this.myHandedness=i,this.myIsPressed=!1,this.myPrevIsPressed=!1,this.myIsTouched=!1,this.myPrevIsTouched=!1,this.myValue=0,this.myPrevValue=0,this.myTimePressed=0,this.myPrevTimePressed=0,this.myTimeNotPressed=0,this.myPrevTimeNotPressed=0,this.myTimeTouched=0,this.myPrevTimeTouched=0,this.myTimeNotTouched=0,this.myPrevTimeNotTouched=0,this.myMultiplePressStartCount=0,this.myPrevMultiplePressStartCount=0,this.myMultiplePressEndCount=0,this.myPrevMultiplePressEndCount=0,this.myMultipleTouchStartCount=0,this.myPrevMultipleTouchStartCount=0,this.myMultipleTouchEndCount=0,this.myPrevMultipleTouchEndCount=0}getType(){return this.myType}getHandedness(){return this.myHandedness}getValue(){return this.myValue}isPressed(){return this.myIsPressed}isTouched(){return this.myIsTouched}isPressStart(t=null){return this.myIsPressed&&!this.myPrevIsPressed&&(t==null||this.myMultiplePressStartCount==t)}isPressEnd(t=null){return!this.myIsPressed&&this.myPrevIsPressed&&(t==null||this.myMultiplePressEndCount==t)}isTouchStart(t=null){return this.myIsTouched&&!this.myPrevIsTouched&&(t==null||this.myMultipleTouchStartCount==t)}isTouchEnd(t=null){return!this.myIsTouched&&this.myPrevIsTouched&&(t==null||this.myMultipleTouchEndCount==t)}clone(){let t=new Ji(this.myType,this.myHandedness);return t.myIsPressed=this.myIsPressed,t.myPrevIsPressed=this.myPrevIsPressed,t.myIsTouched=this.myIsTouched,t.myPrevIsTouched=this.myPrevIsTouched,t.myValue=this.myValue,t.myPrevValue=this.myPrevValue,t.myTimePressed=this.myTimePressed,t.myPrevTimePressed=this.myPrevTimePressed,t.myTimeNotPressed=this.myTimeNotPressed,t.myPrevTimeNotPressed=this.myPrevTimeNotPressed,t.myTimeTouched=this.myTimeTouched,t.myPrevTimeTouched=this.myPrevTimeTouched,t.myTimeNotTouched=this.myTimeNotTouched,t.myPrevTimeNotTouched=this.myPrevTimeNotTouched,t.myMultiplePressStartCount=this.myMultiplePressStartCount,t.myPrevMultiplePressStartCount=this.myPrevMultiplePressStartCount,t.myMultiplePressEndCount=this.myMultiplePressEndCount,t.myPrevMultiplePressEndCount=this.myPrevMultiplePressEndCount,t.myMultipleTouchStartCount=this.myMultipleTouchStartCount,t.myPrevMultipleTouchStartCount=this.myPrevMultipleTouchStartCount,t.myMultipleTouchEndCount=this.myMultipleTouchEndCount,t.myPrevMultipleTouchEndCount=this.myPrevMultipleTouchEndCount,t}};PP.AxesInfo=class Yi{constructor(t){this.myHandedness=t,this.myAxes=new Float32Array(2),this.myAxes.fill(0),this.myPrevAxes=new Float32Array(2),this.myPrevAxes.fill(0)}getAxes(){return this.myAxes}getHandedness(){return this.myHandedness}clone(){let t=new Yi(this.myHandedness);return t.myAxes=this.myAxes,t.myPrevAxes=this.myPrevAxes,t}};PP.PulseInfo=class Zi{constructor(){this.myIntensity=0,this.myDuration=0,this.myIsDevicePulsing=!1}clone(){let t=new Zi;return t.myIntensity=this.myIntensity,t.myDuration=this.myDuration,t.myIsDevicePulsing=this.myIsDevicePulsing,t}}});var ts=T(()=>{PP.BaseGamepad=class{constructor(t){this._myHandedness=t,this._myButtonInfos=[];for(let i in PP.ButtonType)this._myButtonInfos[PP.ButtonType[i]]=new PP.ButtonInfo(PP.ButtonType[i],this._myHandedness);this._myAxesInfo=new PP.AxesInfo(this._myHandedness),this._myButtonCallbacks=[];for(let i in PP.ButtonType){this._myButtonCallbacks[PP.ButtonType[i]]=[];for(let s in PP.ButtonEvent)this._myButtonCallbacks[PP.ButtonType[i]][PP.ButtonEvent[s]]=new Map}this._myAxesCallbacks=[];for(let i in PP.AxesEvent)this._myAxesCallbacks[PP.AxesEvent[i]]=new Map;this._myPulseInfo=new PP.PulseInfo,this._myMultiplePressMaxDelay=.3,this._myMultipleTouchMaxDelay=.3}getHandedness(){return this._myHandedness}getButtonInfo(t){return this._myButtonInfos[t]}registerButtonEventListener(t,i,s,n){this._myButtonCallbacks[t][i].set(s,n)}unregisterButtonEventListener(t,i,s){this._myButtonCallbacks[t][i].delete(s)}getAxesInfo(){return this._myAxesInfo}registerAxesEventListener(t,i,s){this._myAxesCallbacks[t].set(i,s)}unregisterAxesEventListener(t,i){this._myAxesCallbacks[t].delete(i)}pulse(t,i=0){this._myPulseInfo.myIntensity=Math.min(Math.max(t,0),1),this._myPulseInfo.myDuration=Math.max(i,0)}stopPulse(){this._myPulseInfo.myIntensity=0,this._myPulseInfo.myDuration=0}isPulsing(){return this._myPulseInfo.myIntensity>0||this._myPulseInfo.myDuration>0}getPulseInfo(){return this._myPulseInfo}getMultiplePressMaxDelay(){return this._myMultiplePressMaxDelay}setMultiplePressMaxDelay(t){this._myMultiplePressMaxDelay=t}getMultipleTouchMaxDelay(){return this._myMultipleTouchMaxDelay}setMultipleTouchMaxDelay(t){this._myMultipleTouchMaxDelay=t}getHandPose(){return null}isGamepadActive(){return!0}_start(){}_preUpdate(t){}_postUpdate(t){}_getButtonData(t){return{myIsPressed:!1,myIsTouched:!1,myValue:0}}_getAxesData(){return[0,0]}_getHapticActuators(){return[]}start(){this._start()}update(t){this._preUpdate(t),this._preUpdateButtonInfos(),this._updateButtonInfos(),this._postUpdateButtonInfos(t),this._preUpdateAxesInfos(),this._updateAxesInfos(),this._postUpdateAxesInfos(),this._updatePulse(t),this._postUpdate(t)}_preUpdateButtonInfos(){this._myButtonInfos.forEach(function(t){t.myPrevIsPressed=t.myIsPressed,t.myPrevIsTouched=t.myIsTouched,t.myPrevValue=t.myValue})}_updateButtonInfos(){this._updateSingleButtonInfo(PP.ButtonType.SELECT),this._updateSingleButtonInfo(PP.ButtonType.SQUEEZE),this._updateSingleButtonInfo(PP.ButtonType.TOUCHPAD),this._updateSingleButtonInfo(PP.ButtonType.THUMBSTICK),this._updateSingleButtonInfo(PP.ButtonType.BOTTOM_BUTTON),this._updateSingleButtonInfo(PP.ButtonType.TOP_BUTTON),this._updateSingleButtonInfo(PP.ButtonType.THUMB_REST)}_updateSingleButtonInfo(t){let i=this._myButtonInfos[t],s=this._getButtonData(t);i.myIsPressed=s.myIsPressed,i.myIsTouched=s.myIsTouched,i.myValue=s.myValue}_postUpdateButtonInfos(t){this._myButtonInfos.forEach(function(i){i.myIsPressed?(i.myTimePressed+=t,i.myPrevIsPressed||(i.myMultiplePressStartCount+=1,i.myPrevTimeNotPressed=i.myTimeNotPressed,i.myTimeNotPressed=0),i.myPrevTimeNotPressed+i.myTimePressed>this._myMultiplePressMaxDelay&&i.myMultiplePressEndCount>0&&(i.myPrevMultiplePressEndCount=i.myMultiplePressEndCount,i.myMultiplePressEndCount=0),i.myTimePressed>this._myMultiplePressMaxDelay&&i.myMultiplePressStartCount>0&&(i.myPrevMultiplePressStartCount=i.myMultiplePressStartCount,i.myMultiplePressStartCount=0)):(i.myTimeNotPressed+=t,i.myPrevIsPressed&&(i.myMultiplePressEndCount+=1,i.myPrevTimePressed=i.myTimePressed,i.myTimePressed=0),i.myPrevTimePressed+i.myTimeNotPressed>this._myMultiplePressMaxDelay&&i.myMultiplePressStartCount>0&&(i.myPrevMultiplePressStartCount=i.myMultiplePressStartCount,i.myMultiplePressStartCount=0),i.myTimeNotPressed>this._myMultiplePressMaxDelay&&i.myMultiplePressEndCount>0&&(i.myPrevMultiplePressEndCount=i.myMultiplePressEndCount,i.myMultiplePressEndCount=0)),i.myIsTouched?(i.myTimeTouched+=t,i.myPrevIsTouched||(i.myMultipleTouchStartCount+=1,i.myPrevTimeNotTouched=i.myTimeNotTouched,i.myTimeNotTouched=0),i.myPrevTimeNotTouched+i.myTimeTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchEndCount>0&&(i.myPrevMultipleTouchEndCount=i.myMultipleTouchEndCount,i.myMultipleTouchEndCount=0),i.myTimeTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchStartCount>0&&(i.myPrevMultipleTouchStartCount=i.myMultipleTouchStartCount,i.myMultipleTouchStartCount=0)):(i.myTimeNotTouched+=t,i.myPrevIsTouched&&(i.myMultipleTouchEndCount+=1,i.myPrevTimeTouched=i.myTimeTouched,i.myTimeTouched=0),i.myPrevTimeTouched+i.myTimeNotTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchStartCount>0&&(i.myPrevMultipleTouchStartCount=i.myMultipleTouchStartCount,i.myMultipleTouchStartCount=0),i.myTimeNotTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchEndCount>0&&(i.myPrevMultipleTouchEndCount=i.myMultipleTouchEndCount,i.myMultipleTouchEndCount=0))}.bind(this));for(let i in PP.ButtonType){let s=this._myButtonInfos[PP.ButtonType[i]],n=this._myButtonCallbacks[PP.ButtonType[i]];if(s.myIsPressed&&!s.myPrevIsPressed){let r=n[PP.ButtonEvent.PRESS_START];this._triggerCallbacks(r,s)}if(!s.myIsPressed&&s.myPrevIsPressed){let r=n[PP.ButtonEvent.PRESS_END];this._triggerCallbacks(r,s)}if(s.myIsPressed){let r=n[PP.ButtonEvent.PRESSED];this._triggerCallbacks(r,s)}else{let r=n[PP.ButtonEvent.NOT_PRESSED];this._triggerCallbacks(r,s)}if(s.myIsTouched&&!s.myPrevIsTouched){let r=n[PP.ButtonEvent.TOUCH_START];this._triggerCallbacks(r,s)}if(!s.myIsTouched&&s.myPrevIsTouched){let r=n[PP.ButtonEvent.TOUCH_END];this._triggerCallbacks(r,s)}if(s.myIsTouched){let r=n[PP.ButtonEvent.TOUCHED];this._triggerCallbacks(r,s)}else{let r=n[PP.ButtonEvent.NOT_TOUCHED];this._triggerCallbacks(r,s)}if(s.myValue!=s.myPrevValue){let r=n[PP.ButtonEvent.VALUE_CHANGED];this._triggerCallbacks(r,s)}let o=n[PP.ButtonEvent.ALWAYS];this._triggerCallbacks(o,s)}this._mySelectStart=!1,this._mySelectEnd=!1,this._mySqueezeStart=!1,this._mySqueezeEnd=!1}_preUpdateAxesInfos(){this._myAxesInfo.myPrevAxes=this._myAxesInfo.myAxes}_updateAxesInfos(){this._myAxesInfo.myAxes=this._getAxesData()}_postUpdateAxesInfos(){if(this._myAxesInfo.myAxes[0]!=this._myAxesInfo.myPrevAxes[0]){let i=this._myAxesCallbacks[PP.AxesEvent.X_CHANGED];this._triggerCallbacks(i,this._myAxesInfo)}if(this._myAxesInfo.myAxes[1]!=this._myAxesInfo.myPrevAxes[1]){let i=this._myAxesCallbacks[PP.AxesEvent.Y_CHANGED];this._triggerCallbacks(i,this._myAxesInfo)}if(this._myAxesInfo.myAxes[0]!=this._myAxesInfo.myPrevAxes[0]||this._myAxesInfo.myAxes[1]!=this._myAxesInfo.myPrevAxes[1]){let i=this._myAxesCallbacks[PP.AxesEvent.AXES_CHANGED];this._triggerCallbacks(i,this._myAxesInfo)}let t=this._myAxesCallbacks[PP.AxesEvent.ALWAYS];this._triggerCallbacks(t,this._myAxesInfo)}_updatePulse(t){if(this._myPulseInfo.myIsDevicePulsing||this._myPulseInfo.myIntensity>0){let i=this._getHapticActuators();if(i.length>0){if(this._myPulseInfo.myIntensity>0){for(let s of i)s.pulse(this._myPulseInfo.myIntensity,1e3);this._myPulseInfo.myIsDevicePulsing=!0}else if(this._myPulseInfo.myIsDevicePulsing){for(let s of i)s.reset();this._myPulseInfo.myIsDevicePulsing=!1}}else this._myPulseInfo.myIsDevicePulsing=!1}this._myPulseInfo.myDuration-=t,this._myPulseInfo.myDuration<=0&&(this._myPulseInfo.myIntensity=0,this._myPulseInfo.myDuration=0)}_triggerCallbacks(t,i){for(let s of t.values())s(i,this)}}});var es=T(()=>{PP.UniversalGamepad=class extends PP.BaseGamepad{constructor(t){super(t),this._myGamepadCores=new Map,this._myStarted=!1}addGamepadCore(t,i){i.getHandedness()==this.getHandedness()&&(this._myGamepadCores.set(t,i),this._myStarted&&i.start())}getGamepadCore(t){this._myGamepadCores.get(t)}removeGamepadCore(t){this._myGamepadCores.get(t)&&this._myGamepadCores.delete(t)}removeAllGamepadCores(){for(let t of this._myGamepadCores.keys())this.removeGamepadCore(t)}getHandPose(){let t=null;for(let i of this._myGamepadCores.values())if(i.isGamepadCoreActive()&&(t=i.getHandPose()),t!=null)break;return t}isGamepadActive(){let t=!1;for(let i of this._myGamepadCores.values())if(i.isGamepadCoreActive()){t=!0;break}return t}_start(){for(let t of this._myGamepadCores.values())t.start();this._myStarted=!0}_preUpdate(t){for(let i of this._myGamepadCores.values())i.preUpdate(t)}_postUpdate(t){for(let i of this._myGamepadCores.values())i.postUpdate(t)}_getButtonData(t){let i={myIsPressed:!1,myIsTouched:!1,myValue:0};for(let s of this._myGamepadCores.values())if(s.isGamepadCoreActive()){let n=s.getButtonData(t);i.myIsPressed=i.myIsPressed||n.myIsPressed,i.myIsTouched=i.myIsTouched||n.myIsTouched,Math.abs(n.myValue)>Math.abs(i.myValue)&&(i.myValue=n.myValue)}return i}_getAxesData(){let t=[0,0];for(let i of this._myGamepadCores.values())if(i.isGamepadCoreActive()){let s=i.getAxesData();Math.abs(s[0])>Math.abs(t[0])&&(t[0]=s[0]),Math.abs(s[1])>Math.abs(t[1])&&(t[1]=s[1])}return t}_getHapticActuators(){let t=[];for(let i of this._myGamepadCores.values())i.isGamepadCoreActive()&&t.push(...i.getHapticActuators());return t}}});var is=T(()=>{PP.GamepadCore=class{constructor(t){this._myHandedness=t}getHandedness(){return this._myHandedness}getHandPose(){return null}isGamepadCoreActive(){return!0}start(){}preUpdate(t){}postUpdate(t){}getButtonData(t){return{pressed:!1,touched:!1,value:0}}getAxesData(){return[0,0]}getHapticActuators(){return[]}}});var ss=T(()=>{PP.XRGamepadCore=class extends PP.GamepadCore{constructor(t,i=new PP.HandPoseParams){super(t),this._myHandPose=new PP.HandPose(this._myHandedness,i),this._mySelectPressed=!1,this._mySqueezePressed=!1,this._myIsXRSessionActive=!1,this._myInputSource=null,this._myGamepad=null}getHandedness(){return this._myHandedness}getHandPose(){return this._myHandPose}isGamepadCoreActive(){return this._myIsXRSessionActive&&this._myGamepad!=null&&(this._myGamepad.connected==null||this._myGamepad.connected)}start(){this._myHandPose.start(),WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))}preUpdate(t){this._updateHandPose(t)}getButtonData(t){let i={myIsPressed:!1,myIsTouched:!1,myValue:0};if(this.isGamepadCoreActive()){if(t=3){let s=this._myGamepad.buttons[2];i.myIsPressed=s.pressed,i.myIsTouched=s.touched,i.myValue=s.value}}return i}getAxesData(){let t=[0,0];if(this.isGamepadCoreActive()){let i=this._myGamepad.axes;i.length==4?(Math.abs(i[0])>Math.abs(i[2])?t[0]=i[0]:t[0]=i[2],Math.abs(i[1])>Math.abs(i[3])?t[1]=i[1]:t[1]=i[3]):i.length==2&&(t[0]=i[0],t[1]=i[1]),t[1]=-t[1]}return t}getHapticActuators(){let t=[];return this.isGamepadCoreActive()&&(this._myGamepad.hapticActuators&&this._myGamepad.hapticActuators.length>0?t=this._myGamepad.hapticActuators:this._myGamepad.vibrationActuator&&t.push(this._myGamepad.vibrationActuator)),t}_updateHandPose(t){this._myHandPose.update(t),this._myInputSource=this._myHandPose.getInputSource(),this._myInputSource!=null?this._myGamepad=this._myInputSource.gamepad:this._myGamepad=null}_getSpecialButtonPressed(t){let i=!1;return this.isGamepadCoreActive()&&(t==PP.ButtonType.SELECT?i=this._mySelectPressed:t==PP.ButtonType.SQUEEZE&&(i=this._mySqueezePressed)),i}_onXRSessionStart(t){t.addEventListener("selectstart",this._selectStart.bind(this)),t.addEventListener("selectend",this._selectEnd.bind(this)),t.addEventListener("squeezestart",this._squeezeStart.bind(this)),t.addEventListener("squeezeend",this._squeezeEnd.bind(this)),this._myIsXRSessionActive=!0}_onXRSessionEnd(t){this._myIsXRSessionActive=!1}_selectStart(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySelectPressed=!0)}_selectEnd(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySelectPressed=!1)}_squeezeStart(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySqueezePressed=!0)}_squeezeEnd(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySqueezePressed=!1)}}});var ns=T(()=>{PP.KeyboardGamepadCore=class extends PP.GamepadCore{constructor(t,i){super(t),this._myHandPose=i,this._myHandPoseUpdateActive=!1}getHandedness(){return this._myHandedness}getHandPose(){return this._myHandPose}setHandPoseUpdateActive(t){this._myHandPoseUpdateActive=t}isHandPoseUpdateActive(){return this._myHandPoseUpdateActive}isGamepadCoreActive(){return!0}start(){this._myHandPose&&this._myHandPoseUpdateActive&&this._myHandPose.start()}preUpdate(t){this._myHandPose&&this._myHandPoseUpdateActive&&this._myHandPose.update(t)}getButtonData(t){let i={myIsPressed:!1,myIsTouched:!1,myValue:0};if(this.isGamepadCoreActive())if(this.getHandedness()==PP.Handedness.LEFT)switch(t){case PP.ButtonType.SELECT:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.C)||PP.myKeyboard.isKeyPressed(PP.KeyType.c);break;case PP.ButtonType.SQUEEZE:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.F)||PP.myKeyboard.isKeyPressed(PP.KeyType.f);break;case PP.ButtonType.TOUCHPAD:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.X)||PP.myKeyboard.isKeyPressed(PP.KeyType.x);break;case PP.ButtonType.THUMBSTICK:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.R)||PP.myKeyboard.isKeyPressed(PP.KeyType.r);break;case PP.ButtonType.BOTTOM_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.Q)||PP.myKeyboard.isKeyPressed(PP.KeyType.q);break;case PP.ButtonType.TOP_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.E)||PP.myKeyboard.isKeyPressed(PP.KeyType.e);break;case PP.ButtonType.THUMB_REST:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.V)||PP.myKeyboard.isKeyPressed(PP.KeyType.v);break}else switch(t){case PP.ButtonType.SELECT:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.N)||PP.myKeyboard.isKeyPressed(PP.KeyType.n);break;case PP.ButtonType.SQUEEZE:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.H)||PP.myKeyboard.isKeyPressed(PP.KeyType.h);break;case PP.ButtonType.TOUCHPAD:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.M)||PP.myKeyboard.isKeyPressed(PP.KeyType.m);break;case PP.ButtonType.THUMBSTICK:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.Y)||PP.myKeyboard.isKeyPressed(PP.KeyType.y);break;case PP.ButtonType.BOTTOM_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.O)||PP.myKeyboard.isKeyPressed(PP.KeyType.o);break;case PP.ButtonType.TOP_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.U)||PP.myKeyboard.isKeyPressed(PP.KeyType.u);break;case PP.ButtonType.THUMB_REST:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.B)||PP.myKeyboard.isKeyPressed(PP.KeyType.b);break}return i.myIsPressed&&(i.myIsTouched=!0,i.myValue=1),i}getAxesData(){let t=[0,0];return this.isGamepadCoreActive()&&(this.getHandedness()==PP.Handedness.LEFT?((PP.myKeyboard.isKeyPressed(PP.KeyType.W)||PP.myKeyboard.isKeyPressed(PP.KeyType.w))&&(t[1]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.S)||PP.myKeyboard.isKeyPressed(PP.KeyType.s))&&(t[1]+=-1),(PP.myKeyboard.isKeyPressed(PP.KeyType.D)||PP.myKeyboard.isKeyPressed(PP.KeyType.d))&&(t[0]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.A)||PP.myKeyboard.isKeyPressed(PP.KeyType.a))&&(t[0]+=-1)):((PP.myKeyboard.isKeyPressed(PP.KeyType.I)||PP.myKeyboard.isKeyPressed(PP.KeyType.i)||PP.myKeyboard.isKeyPressed(PP.KeyType.UP))&&(t[1]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.K)||PP.myKeyboard.isKeyPressed(PP.KeyType.k)||PP.myKeyboard.isKeyPressed(PP.KeyType.DOWN))&&(t[1]+=-1),(PP.myKeyboard.isKeyPressed(PP.KeyType.L)||PP.myKeyboard.isKeyPressed(PP.KeyType.l)||PP.myKeyboard.isKeyPressed(PP.KeyType.RIGHT))&&(t[0]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.J)||PP.myKeyboard.isKeyPressed(PP.KeyType.j)||PP.myKeyboard.isKeyPressed(PP.KeyType.LEFT))&&(t[0]+=-1))),t}getHapticActuators(){return[]}}});var os=T(()=>{WL.registerComponent("pp-gamepad-mesh-animator",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_mySelect:{type:WL.Type.Object,default:null},_mySqueeze:{type:WL.Type.Object,default:null},_myThumbstick:{type:WL.Type.Object,default:null},_myTopButton:{type:WL.Type.Object,default:null},_myBottomButton:{type:WL.Type.Object,default:null},_mySelectRotateAngle:{type:WL.Type.Float,default:15},_mySqueezeRotateAngle:{type:WL.Type.Float,default:11},_myThumbstickRotateAngle:{type:WL.Type.Float,default:15},_myThumbstickPressOffset:{type:WL.Type.Float,default:625e-6},_myTopButtonPressOffset:{type:WL.Type.Float,default:.0015},_myBottomButtonPressOffset:{type:WL.Type.Float,default:.0015},_myUsePressForSqueeze:{type:WL.Type.Bool,default:!1},_mySqueezePressOffset:{type:WL.Type.Float,default:.0015}},{start:function(){let e=null;this._myHandedness==0?e=PP.myLeftGamepad:e=PP.myRightGamepad,this._mySelect!=null&&(this._mySelectOriginalRotation=this._mySelect.pp_getRotationLocalQuat(),this._mySelectOriginalLeft=this._mySelect.pp_getLeftLocal()),this._mySqueeze!=null&&(this._mySqueezeOriginalPosition=this._mySqueeze.pp_getPositionLocal(),this._mySqueezeOriginalRotation=this._mySqueeze.pp_getRotationLocalQuat(),this._mySqueezeOriginalLeft=this._mySqueeze.pp_getLeftLocal(),this._mySqueezeOriginalForward=this._mySqueeze.pp_getForwardLocal()),this._myThumbstick!=null&&(this._myThumbstickOriginalPosition=this._myThumbstick.pp_getPositionLocal(),this._myThumbstickOriginalRotation=this._myThumbstick.pp_getRotationLocalQuat(),this._myThumbstickOriginalLeft=this._myThumbstick.pp_getLeftLocal(),this._myThumbstickOriginalUp=this._myThumbstick.pp_getUpLocal(),this._myThumbstickOriginalForward=this._myThumbstick.pp_getForwardLocal()),this._myTopButton!=null&&(this._myTopButtonOriginalPosition=this._myTopButton.pp_getPositionLocal(),this._myTopButtonOriginalUp=this._myTopButton.pp_getUpLocal()),this._myBottomButton!=null&&(this._myBottomButtonOriginalPosition=this._myBottomButton.pp_getPositionLocal(),this._myBottomButtonOriginalUp=this._myBottomButton.pp_getUpLocal()),this._myThumbstick!=null&&(e.registerButtonEventListener(PP.ButtonType.THUMBSTICK,PP.ButtonEvent.PRESS_START,this,this._thumbstickPressedStart.bind(this)),e.registerButtonEventListener(PP.ButtonType.THUMBSTICK,PP.ButtonEvent.PRESS_END,this,this._thumbstickPressedEnd.bind(this))),this._myTopButton!=null&&(e.registerButtonEventListener(PP.ButtonType.TOP_BUTTON,PP.ButtonEvent.PRESS_START,this,this._topButtonPressedStart.bind(this)),e.registerButtonEventListener(PP.ButtonType.TOP_BUTTON,PP.ButtonEvent.PRESS_END,this,this._topButtonPressedEnd.bind(this))),this._myBottomButton!=null&&(e.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON,PP.ButtonEvent.PRESS_START,this,this._bottomButtonPressedStart.bind(this)),e.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON,PP.ButtonEvent.PRESS_END,this,this._bottomButtonPressedEnd.bind(this))),this._mySelect!=null&&e.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.VALUE_CHANGED,this,this._selectValueChanged.bind(this)),this._mySqueeze!=null&&e.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.VALUE_CHANGED,this,this._squeezeValueChanged.bind(this)),this._myThumbstick!=null&&e.registerAxesEventListener(PP.AxesEvent.AXES_CHANGED,this,this._thumbstickValueChanged.bind(this))},_thumbstickPressedStart:function(){let e=PP.vec3_create();return function(i,s){this._myThumbstickOriginalUp.vec3_scale(-this._myThumbstickPressOffset,e),this._myThumbstick.pp_translateLocal(e)}}(),_thumbstickPressedEnd:function(t,i){this._myThumbstick.pp_setPositionLocal(this._myThumbstickOriginalPosition)},_topButtonPressedStart:function(e,t){this._myTopButton.pp_translateAxisLocal(-this._myTopButtonPressOffset,this._myTopButtonOriginalUp)},_topButtonPressedEnd:function(e,t){this._myTopButton.pp_setPositionLocal(this._myTopButtonOriginalPosition)},_bottomButtonPressedStart:function(e,t){this._myBottomButton.pp_translateAxisLocal(-this._myBottomButtonPressOffset,this._myBottomButtonOriginalUp)},_bottomButtonPressedEnd:function(e,t){this._myBottomButton.pp_setPositionLocal(this._myBottomButtonOriginalPosition)},_selectValueChanged:function(e,t){this._mySelect.pp_setRotationLocalQuat(this._mySelectOriginalRotation),e.myValue>1e-5&&this._mySelect.pp_rotateAxisLocal(this._mySelectRotateAngle*e.myValue,this._mySelectOriginalLeft)},_squeezeValueChanged:function(e,t){if(this._mySqueeze.pp_setPositionLocal(this._mySqueezeOriginalPosition),this._mySqueeze.pp_setRotationLocalQuat(this._mySqueezeOriginalRotation),e.myValue>1e-5)if(this._myUsePressForSqueeze){let i=this._mySqueezePressOffset;this._myHandedness==1&&(i*=-1),this._mySqueeze.pp_translateAxisLocal(i*e.myValue,this._mySqueezeOriginalLeft)}else{let i=-this._mySqueezeRotateAngle;this._myHandedness==1&&(i*=-1),this._mySqueeze.pp_rotateAxisLocal(i*e.myValue,this._mySqueezeOriginalForward)}},_thumbstickValueChanged:function(e,t){this._myThumbstick.pp_setRotationLocalQuat(this._myThumbstickOriginalRotation);let i=this._myThumbstickRotateAngle*e.myAxes[1],s=this._myThumbstickRotateAngle*e.myAxes[0];Math.abs(i)>1e-4&&this._myThumbstick.pp_rotateAxisLocal(i,this._myThumbstickOriginalLeft),Math.abs(s)>1e-4&&this._myThumbstick.pp_rotateAxisLocal(s,this._myThumbstickOriginalForward)}})});var as=T(()=>{PP.GamepadManager=class{constructor(){this._myLeftGamepad=new PP.UniversalGamepad(PP.Handedness.LEFT),this._myRightGamepad=new PP.UniversalGamepad(PP.Handedness.RIGHT)}start(){this._myLeftGamepad.start(),this._myRightGamepad.start()}update(t){this._myLeftGamepad.update(t),this._myRightGamepad.update(t)}getLeftGamepad(){return this._myLeftGamepad}getRightGamepad(){return this._myRightGamepad}getGamepad(t){let i=null;switch(t){case PP.Handedness.LEFT:i=this._myLeftGamepad;break;case PP.Handedness.RIGHT:i=this._myRightGamepad;break;default:i=null}return i}getGamepads(){let t=[];return t[PP.Handedness.LEFT]=this._myLeftGamepad,t[PP.Handedness.RIGHT]=this._myRightGamepad,t}}});var rs=T(()=>{PP.GamepadUtils={_mySimultaneousPressMaxDelay:.15,_mySimultaneousTouchMaxDelay:.15,setSimultaneousPressMaxDelay:function(e){PP.GamepadUtils._mySimultaneousPressMaxDelay=e},setSimultaneousTouchMaxDelay:function(e){PP.GamepadUtils._mySimultaneousTouchMaxDelay=e},getSimultaneousPressMaxDelay:function(){return PP.GamepadUtils._mySimultaneousPressMaxDelay},getSimultaneousTouchMaxDelay:function(){return PP.GamepadUtils._mySimultaneousTouchMaxDelay},isAnyButtonPressStart:function(...e){let t=null,i=e;isNaN(e[0])||(t=e[0],i=e.slice(1));for(let n of i)if(n.length==1)for(let o in PP.ButtonType)n.push(PP.ButtonType[o]);let s=!1;for(let n of i){let o=n[0];for(let r=1;r{WL.registerComponent("pp-gamepad-control-scheme",{_myStartVisible:{type:WL.Type.Bool,default:!0},_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myTextScaleMultiplier:{type:WL.Type.Float,default:1},_myLineLengthMultiplier:{type:WL.Type.Float,default:1},_myLineThicknessMultiplier:{type:WL.Type.Float,default:1},_mySelectText:{type:WL.Type.String,default:""},_mySqueezeText:{type:WL.Type.String,default:""},_myThumbstickText:{type:WL.Type.String,default:""},_myBottomButtonText:{type:WL.Type.String,default:""},_myTopButtonText:{type:WL.Type.String,default:""},_mySelect:{type:WL.Type.Object,default:null},_mySqueeze:{type:WL.Type.Object,default:null},_myThumbstick:{type:WL.Type.Object,default:null},_myBottomButton:{type:WL.Type.Object,default:null},_myTopButton:{type:WL.Type.Object,default:null},_myTextMaterial:{type:WL.Type.Material},_myLineMaterial:{type:WL.Type.Material}},{init:function(){},start:function(){this._myTextMaterialFinal=this._myTextMaterial!=null?this._myTextMaterial:PP.myDefaultResources.myMaterials.myText.clone(),this._myLineMaterialFinal=this._myLineMaterial!=null?this._myLineMaterial:PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),this._myHandednessType=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myControlSchemeDirection=this._myHandednessType==PP.Handedness.LEFT?1:-1,this._myVisible=!1,this._mySetVisibleNextUpdate=!1,this._createControlScheme(),this.setVisible(this._myStartVisible)},update:function(e){this._mySetVisibleNextUpdate&&(this._mySetVisibleNextUpdate=!1,this.setVisible(!1),this.setVisible(this._myVisible))},onActivate(){this._mySetVisibleNextUpdate=!0},onDeactivate(){let e=this._myVisible;this.setVisible(!1),this._myVisible=e},isVisible(){return this._myVisible},setVisible(e){this._myVisible=e,this._myRootObject!=null&&(this._myRootObject.pp_setActive(this._myVisible),this._myVisible&&this._hideEmptySchemes())},setSelectText(e){this._mySelectText=e,this._mySelectTextComponent.text=this._mySelectText,this.setVisible(this._myVisible)},setSqueezeText(e){this._mySqueezeText=e,this._mySqueezeTextComponent.text=this._mySqueezeText,this.setVisible(this._myVisible)},setThumbstickText(e){this._myThumbstickText=e,this._myThumbstickTextComponent.text=this._myThumbstickText,this.setVisible(this._myVisible)},setBottomButtonText(e){this._myBottomButtonText=e,this._myBottomButtonTextComponent.text=this._myBottomButtonText,this.setVisible(this._myVisible)},setTopButtonText(e){this._myTopButtonText=e,this._myTopButtonTextComponent.text=this._myTopButtonText,this.setVisible(this._myVisible)},_createControlScheme(){this._myRootObject=this.object.pp_addObject();let e=this.object.pp_getScale();this.object.pp_resetScale();let t=.015,i=.0935*this._myLineLengthMultiplier,s=this._myThumbstick;this._mySelectObject=this._myRootObject.pp_addObject(),this._mySelectTextComponent=this._addScheme(this._mySelect,s,[0,0,t],[i*this._myControlSchemeDirection,0,0],this._mySelectObject),this._mySelectTextComponent.text=this._mySelectText,this._mySqueezeObject=this._myRootObject.pp_addObject(),this._mySqueezeTextComponent=this._addScheme(this._mySqueeze,s,[t*this._myControlSchemeDirection,0,0],[i*this._myControlSchemeDirection,0,0],this._mySqueezeObject),this._mySqueezeTextComponent.text=this._mySqueezeText,this._myThumbstickObject=this._myRootObject.pp_addObject(),this._myThumbstickTextComponent=this._addScheme(this._myThumbstick,s,[0,t,0],[-i*this._myControlSchemeDirection,0,0],this._myThumbstickObject),this._myThumbstickTextComponent.text=this._myThumbstickText,this._myBottomButtonObject=this._myRootObject.pp_addObject(),this._myBottomButtonTextComponent=this._addScheme(this._myBottomButton,s,[0,t,0],[0,0,-i],this._myBottomButtonObject),this._myBottomButtonTextComponent.text=this._myBottomButtonText,this._myTopButtonObject=this._myRootObject.pp_addObject(),this._myTopButtonTextComponent=this._addScheme(this._myTopButton,s,[0,t,0],[-i*this._myControlSchemeDirection,0,0].vec3_rotateAxis(-45*this._myControlSchemeDirection,[0,1,0]),this._myTopButtonObject),this._myTopButtonTextComponent.text=this._myTopButtonText,this.object.pp_setScale(e)},_addScheme(e,t,i,s,n){let o=e.pp_getPosition(),r=t.pp_getForward(),l=t.pp_getRight(),y=t.pp_getUp(),c=o.vec3_add(l.vec3_scale(i[0]));c.vec3_add(y.vec3_scale(i[1]),c),c.vec3_add(r.vec3_scale(i[2]),c);let a=c.vec3_add(l.vec3_scale(s[0]));a.vec3_add(y.vec3_scale(s[1]),a),a.vec3_add(r.vec3_scale(s[2]),a);let m=.01,u=a.vec3_add(r.vec3_scale(-m));return this._addLine(c,a,n),this._addText(u,r,y,n)},_addLine(e,t,i){let s=t.vec3_sub(e),n=s.vec3_length();s.vec3_normalize(s),lineRootObject=i.pp_addObject(),lineObject=lineRootObject.pp_addObject();let o=lineObject.addComponent("mesh");o.mesh=PP.myDefaultResources.myMeshes.myCube,o.material=this._myLineMaterialFinal,lineRootObject.pp_setPosition(e);let r=.001*this._myLineThicknessMultiplier;lineObject.pp_scaleObject([r/2,r/2,n/2]),lineObject.pp_lookTo(s),lineObject.pp_translateObject([0,0,n/2])},_addText(e,t,i,s){let n=s.pp_addObject();n.pp_setPosition(e),n.pp_lookTo(i,t),n.pp_scaleObject(.0935*this._myTextScaleMultiplier);let o=n.pp_addComponent("text");return o.alignment=WL.Alignment.Center,o.justification=WL.Justification.Top,o.material=this._myTextMaterialFinal,o},_hideEmptySchemes(){this._mySelectText.length==0&&this._mySelectObject.pp_setActive(!1),this._mySqueezeText.length==0&&this._mySqueezeObject.pp_setActive(!1),this._myThumbstickText.length==0&&this._myThumbstickObject.pp_setActive(!1),this._myBottomButtonText.length==0&&this._myBottomButtonObject.pp_setActive(!1),this._myTopButtonText.length==0&&this._myTopButtonObject.pp_setActive(!1)}})});var ms=T(()=>{PP.BasePoseParams=class{constructor(){this.myReferenceObject=null,this.myFixForward=!0,this.myForceEmulatedVelocities=!1}};PP.BasePose=class{constructor(t=new PP.BasePoseParams){this._myFixForward=t.myFixForward,this._myForceEmulatedVelocities=t.myForceEmulatedVelocities,this._myReferenceSpace=null,this._myReferenceObject=t.myReferenceObject,this._myPosition=[0,0,0],this._myRotation=[0,0,0,1],this._myPrevPosition=[0,0,0],this._myPrevRotation=[0,0,0,1],this._myLinearVelocity=[0,0,0],this._myAngularVelocity=[0,0,0],this._myIsValid=!1,this._myIsLinearVelocityEmulated=!0,this._myIsAngularVelocityEmulated=!0}setReferenceObject(t){this._myReferenceObject=t}getReferenceObject(){return this._myReferenceObject}setFixForward(t){this._myFixForward=t}isFixForward(){return this._myFixForward}setForceEmulatedVelocities(t){this._myForceEmulatedVelocities=t}isForceEmulatedVelocities(){return this._myForceEmulatedVelocities}getReferenceSpace(){return this._myReferenceSpace}getInputSource(){return this._myInputSource}getPosition(){}getRotation(){return this.getRotationDegrees()}getRotationDegrees(){return this.getRotationQuat().quat_toDegrees()}getRotationRadians(){return this.getRotationQuat().quat_toRadians()}getRotationQuat(){}getTransform(){return this.getTransformMatrix()}getTransformMatrix(){}getTransformQuat(){}getLinearVelocity(){}getAngularVelocity(){return this.getAngularVelocityDegrees()}getAngularVelocityDegrees(){}getAngularVelocityRadians(){}isValid(){return this._myIsValid}isLinearVelocityEmulated(){return this._myIsLinearVelocityEmulated}isAngularVelocityEmulated(){return this._myIsAngularVelocityEmulated}start(){WL.xrSession&&this._onXRSessionStart(!0,WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this,!1)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))}update(t){this._myPrevPosition.vec3_copy(this._myPosition),this._myPrevRotation.quat_copy(this._myRotation);let i=Module.webxr_frame;if(i&&this._isReadyToGetPose()){let s=null;try{s=this._getPose(i)}catch{}s?(this._myPosition[0]=s.transform.position.x,this._myPosition[1]=s.transform.position.y,this._myPosition[2]=s.transform.position.z,this._myRotation[0]=s.transform.orientation.x,this._myRotation[1]=s.transform.orientation.y,this._myRotation[2]=s.transform.orientation.z,this._myRotation[3]=s.transform.orientation.w,s.linearVelocity&&!this._myForceEmulatedVelocities?(this._myLinearVelocity[0]=s.linearVelocity.x,this._myLinearVelocity[1]=s.linearVelocity.y,this._myLinearVelocity[2]=s.linearVelocity.z,this._myIsLinearVelocityEmulated=!1):(this._computeEmulatedLinearVelocity(t),this._myIsLinearVelocityEmulated=!0),s.angularVelocity&&!this._myForceEmulatedVelocities?(this._myAngularVelocity[0]=s.angularVelocity.x,this._myAngularVelocity[1]=s.angularVelocity.y,this._myAngularVelocity[2]=s.angularVelocity.z,this._myIsAngularVelocityEmulated=!1):(this._computeEmulatedAngularVelocity(t),this._myIsAngularVelocityEmulated=!0),this._myIsValid=!0):(this._myLinearVelocity[0]=0,this._myLinearVelocity[1]=0,this._myLinearVelocity[2]=0,this._myAngularVelocity[0]=0,this._myAngularVelocity[1]=0,this._myAngularVelocity[2]=0,this._myIsValid=!1,this._myIsLinearVelocityEmulated=!0,this._myIsAngularVelocityEmulated=!0),this._updateHook(t,s)}else this._myLinearVelocity[0]=0,this._myLinearVelocity[1]=0,this._myLinearVelocity[2]=0,this._myAngularVelocity[0]=0,this._myAngularVelocity[1]=0,this._myAngularVelocity[2]=0,this._myIsValid=!1,this._myIsLinearVelocityEmulated=!0,this._myIsAngularVelocityEmulated=!0,this._updateHook(t,null)}_isReadyToGetPose(){return!0}_getPose(t){return null}_updateHook(t,i){}_onXRSessionStartHook(t,i){}_onXRSessionEndHook(){}_computeEmulatedLinearVelocity(t){t>0?(this._myPosition.vec3_sub(this._myPrevPosition,this._myLinearVelocity),this._myLinearVelocity.vec3_scale(1/t,this._myLinearVelocity)):(this._myLinearVelocity[0]=0,this._myLinearVelocity[1]=0,this._myLinearVelocity[2]=0)}_onXRSessionStart(t,i){i.requestReferenceSpace(WebXR.refSpace).then(function(s){this._myReferenceSpace=s}.bind(this)),this._onXRSessionStartHook(t,i)}_onXRSessionEnd(){this._onXRSessionEndHook(),this._myReferenceSpace=null}};PP.BasePose.prototype.getPosition=function(){let e=PP.vec3_create(),t=PP.mat4_create();return function(){return this._myReferenceObject==null?this._myPosition:this._myPosition.vec3_convertPositionToWorld(this._myReferenceObject.pp_getTransform(t),e)}}();PP.BasePose.prototype.getRotationQuat=function(){let e=PP.quat_create(),t=PP.quat_create(),i=PP.vec3_create();return function(){return e.quat_copy(this._myRotation),this._myFixForward&&e.quat_rotateAxisRadians(Math.PI,e.quat_getUp(i),e),this._myReferenceObject==null?e:e.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(t),e)}}();PP.BasePose.prototype.getTransformMatrix=function(){let e=PP.mat4_create();return function(){return this.getTransformQuat().quat2_toMatrix(e)}}();PP.BasePose.prototype.getTransformQuat=function(){let e=PP.quat2_create(),t=PP.quat2_create();return function(){return e.quat2_setPositionRotationQuat(this._myPosition,this.getRotationQuat()),this._myReferenceObject==null?e:e.quat_toWorld(this._myReferenceObject.pp_getTransformQuat(t),e)}}();PP.BasePose.prototype.getLinearVelocity=function(){let e=PP.vec3_create(),t=PP.mat4_create();return function(){return this._myReferenceObject==null?this._myLinearVelocity:this._myLinearVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(t),e)}}();PP.BasePose.prototype.getAngularVelocityDegrees=function(){let e=PP.vec3_create();return function(){this.getAngularVelocityRadians().vec3_toDegrees(e)}}();PP.BasePose.prototype.getAngularVelocityRadians=function(){let e=PP.vec3_create(),t=PP.mat4_create();return function(){return this._myReferenceObject==null?this._myAngularVelocity:this._myAngularVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(t),e)}}();PP.BasePose.prototype._computeEmulatedAngularVelocity=function(){let e=PP.vec3_create(),t=PP.vec3_create();return function(s){s>0?(e=this._myRotation.quat_toRadians(e),t=this._myPrevRotation.quat_toRadians(t),e.vec3_sub(t,this._myAngularVelocity),this._myAngularVelocity.vec3_scale(1/s,this._myAngularVelocity)):(this._myAngularVelocity[0]=0,this._myAngularVelocity[1]=0,this._myAngularVelocity[2]=0)}}();Object.defineProperty(PP.BasePose.prototype,"getPosition",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getRotationQuat",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getTransformMatrix",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getTransformQuat",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getLinearVelocity",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getAngularVelocityDegrees",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getAngularVelocityRadians",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"_computeEmulatedAngularVelocity",{enumerable:!1})});var ys=T(()=>{PP.HandPoseParams=class extends PP.BasePoseParams{constructor(){super(),this.myFixTrackedHandRotation=!0}};PP.HandPose=class extends PP.BasePose{constructor(t,i=new PP.HandPoseParams){super(i),this._myInputSource=null,this._myHandedness=t,this._myFixTrackedHandRotation=i.myFixTrackedHandRotation,this._myIsTrackedHand=!1}getInputSourceType(){return this._myInputSource==null?null:PP.InputUtils.getInputSourceType(this._myInputSource)}isFixTrackedHandRotation(){return this._myFixTrackedHandRotation}setFixTrackedHandRotation(t){this.myFixTrackedHandRotation=t}_isReadyToGetPose(){return this._myInputSource!=null}_getPose(t){return t.getPose(this._myInputSource.gripSpace,this._myReferenceSpace)}_onXRSessionStartHook(t,i){if(i.addEventListener("inputsourceschange",function(s){if(s.removed)for(let n of s.removed)n==this._myInputSource&&(this._myInputSource=null);if(s.added)for(let n of s.added)n.handedness==this._myHandedness&&(this._myInputSource=n,this._myIsTrackedHand=PP.InputUtils.getInputSourceType(this._myInputSource)==PP.InputSourceType.TRACKED_HAND)}.bind(this)),t&&this._myInputSource==null&&i.inputSources)for(let s of i.inputSources)s.handedness==this._myHandedness&&(this._myInputSource=s,this._myIsTrackedHand=PP.InputUtils.getInputSourceType(this._myInputSource)==PP.InputSourceType.TRACKED_HAND)}_onXRSessionEndHook(){this._myInputSource=null}};PP.HandPose.prototype.getRotationQuat=function(){let e=PP.quat_create(),t=PP.quat_create(),i=PP.vec3_create(),s=PP.vec3_create(),n=PP.vec3_create();return function(){if(e.quat_copy(this._myRotation),this._myFixForward&&e.quat_rotateAxisRadians(Math.PI,e.quat_getUp(i),e),this._myFixTrackedHandRotation&&this._myIsTrackedHand){e.quat_rotateAxis(-60,e.quat_getRight(s),e);let r=20;r=this._myHandedness==PP.Handedness.LEFT?r:-r,e.quat_rotateAxis(r,e.quat_getForward(n),e)}return this._myReferenceObject==null?e:e.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(t),e)}}();Object.defineProperty(PP.HandPose.prototype,"getRotationQuat",{enumerable:!1})});var us=T(()=>{PP.HeadPose=class extends PP.BasePose{_getPose(t){return t.getViewerPose(this._myReferenceSpace)}}});var cs=T(()=>{PP.TrackedHandJointPose=class extends PP.BasePose{constructor(t,i,s=new PP.BasePoseParams){super(s),this._myInputSource=null,this._myHandedness=t,this._myTrackedHandJointType=i,this._myJointRadius=0}getTrackedHandJointType(){return this._myTrackedHandJointType}setTrackedHandJointType(t){this._myTrackedHandJointType=t}getJointRadius(){return this._myJointRadius}_isReadyToGetPose(){return this._myInputSource!=null}_getPose(t){return t.getJointPose(this._myInputSource.hand.get(this._myTrackedHandJointType),this._myReferenceSpace)}_updateHook(t,i){i!=null&&(this._myJointRadius=i.radius)}_onXRSessionStartHook(t,i){if(i.addEventListener("inputsourceschange",function(s){if(s.removed)for(let n of s.removed)n==this._myInputSource&&(this._myInputSource=null);if(s.added)for(let n of s.added)n.handedness==this._myHandedness&&PP.InputUtils.getInputSourceType(n)==PP.InputSourceType.TRACKED_HAND&&(this._myInputSource=n)}.bind(this)),t&&this._myInputSource==null&&i.inputSources)for(let s of i.inputSources)s.handedness==this._myHandedness&&PP.InputUtils.getInputSourceType(s)==PP.InputSourceType.TRACKED_HAND&&(this._myInputSource=s)}_onXRSessionEndHook(){this._myInputSource=null}}});var hs=T(()=>{PP.TrackedHandPoseParams=class extends PP.BasePoseParams{constructor(t=!0){if(super(),this.myTrackedHandJointTypeList=[],t)for(let i in PP.TrackedHandJointType)this.myTrackedHandJointTypeList.push([PP.TrackedHandJointType[i]])}};PP.TrackedHandPose=class{constructor(t,i=new PP.TrackedHandPoseParams){this._myHandedness=t,this._myFixForward=i.myFixForward,this._myForceEmulatedVelocities=i.myForceEmulatedVelocities,this._myReferenceObject=i.myReferenceObject,this._myTrackedHandJointPoseParams=new PP.BasePoseParams,this._myTrackedHandJointPoseParams.myFixForward=this._myFixForward,this._myTrackedHandJointPoseParams.myForceEmulatedVelocities=this._myForceEmulatedVelocities,this._myTrackedHandJointPoseParams.myReferenceObject=this._myReferenceObject,this._myTrackedHandJointPoseList=[];for(let s of i.myTrackedHandJointTypeList){let n=new PP.TrackedHandJointPose(this._myHandedness,s,this._myTrackedHandJointPoseParams);this._myTrackedHandJointPoseList[s]=n}}start(){for(let t in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[t].start()}update(t){for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].update(t)}getJointPose(t){return this._myTrackedHandJointPoseList[t]}getJointPoseByIndex(t){return this._myTrackedHandJointPoseList[PP.InputUtils.getJointTypeByIndex(t)]}addTrackedHandJointType(t){if(!this._myTrackedHandJointPoseList.pp_has(i=>i.getTrackedHandJointType()==t)){let i=new PP.TrackedHandJointPose(this._myHandedness,t,this._myTrackedHandJointPoseParams);this._myTrackedHandJointPoseList.push(i)}}removeTrackedHandJointType(t){this._myTrackedHandJointPoseList.pp_remove(i=>i.getTrackedHandJointType()==t)}setReferenceObject(t){this._myReferenceObject=t,this._myTrackedHandJointPoseParams.myReferenceObject=this._myReferenceObject;for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].setReferenceObject(t)}getReferenceObject(){return this._myReferenceObject}setFixForward(t){this._myFixForward=t,this._myTrackedHandJointPoseParams.myFixForward=this._myFixForward;for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].setFixForward(t)}isFixForward(){return this._myFixForward}setForceEmulatedVelocities(t){this._myForceEmulatedVelocities=t,this._myTrackedHandJointPoseParams.myForceEmulatedVelocities=this._myForceEmulatedVelocities;for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].setForceEmulatedVelocities(t)}isForceEmulatedVelocities(){return this._myForceEmulatedVelocities}}});var ps=T(()=>{WL.registerComponent("pp-set-player-height",{_myEyesHeight:{type:WL.Type.Float,default:1.65},_mySetOnlyOnStart:{type:WL.Type.Bool,default:!1}},{start(){let e=this.object.pp_getPositionLocal();this.object.pp_setPositionLocal([e[0],this._myEyesHeight,e[2]]),this._myHeightSetOnce=!1,WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))},_onXRSessionStart(){if(this.active&&(!this._mySetOnlyOnStart||!this._myHeightSetOnce)){let e=this.object.pp_getPositionLocal();PP.XRUtils.isReferenceSpaceLocalFloor()?this.object.pp_setPositionLocal([e[0],0,e[2]]):PP.XRUtils.isDeviceEmulated()?this.object.pp_setPositionLocal([e[0],0,e[2]]):this.object.pp_setPositionLocal([e[0],this._myEyesHeight,e[2]]),this._myHeightSetOnce=!0}},_onXRSessionEnd(){if(this.active&&!this._mySetOnlyOnStart){let e=this.object.pp_getPositionLocal();this.object.pp_setPositionLocal([e[0],this._myEyesHeight,e[2]])}}})});var ds=T(()=>{WL.registerComponent("pp-set-hand-local-transform",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){this._myHandPose=new PP.HandPose(PP.InputUtils.getHandednessByIndex(this._myHandedness)),this._myHandPose.setFixForward(this._myFixForward)},start:function(){this._myHandPose.start()},update:function(){let e=PP.quat2_create();return function(i){this._myHandPose.update(i),this.object.pp_setTransformLocalQuat(this._myHandPose.getTransformQuat(e))}}()})});var _s=T(()=>{WL.registerComponent("pp-set-head-local-transform",{_myNonVRCamera:{type:WL.Type.Object},_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){this._myHeadPose=new PP.HeadPose,this._myHeadPose.setFixForward(this._myFixForward)},start:function(){this._myHeadPose.start()},update:function(){let e=PP.quat2_create(),t=PP.quat_create(),i=PP.vec3_create(),s=PP.vec3_create();return function(o){this._myHeadPose.update(o),PP.XRUtils.isXRSessionActive()?this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(e)):(t=this._myNonVRCamera.pp_getRotationLocalQuat(t),this._myFixForward&&t.quat_rotateAxisRadians(Math.PI,t.quat_getUp(i),t),this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(s)),this.object.pp_setRotationLocalQuat(t))}}()})});var Ps=T(()=>{WL.registerComponent("pp-set-vr-head-local-transform",{_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){this._myHeadPose=new PP.HeadPose,this._myHeadPose.setFixForward(this._myFixForward)},start:function(){this._myHeadPose.start()},update:function(){let e=PP.quat2_create();return function(i){this._myHeadPose.update(i),this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(e))}}()})});var gs=T(()=>{WL.registerComponent("pp-set-non-vr-head-local-transform",{_myNonVRCamera:{type:WL.Type.Object},_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){},start:function(){},update:function(e){let t=PP.quat_create(),i=PP.vec3_create(),s=PP.vec3_create();return function(o){t=this._myNonVRCamera.pp_getRotationLocalQuat(t),this._myFixForward&&t.quat_rotateAxisRadians(Math.PI,t.quat_getUp(i),t),this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(s)),this.object.pp_setRotationLocalQuat(t)}}()})});var fs=T(()=>{WL.registerComponent("pp-set-tracked-hand-joint-local-transform",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_mySetLocalScaleAsJointRadius:{type:WL.Type.Bool,default:!1},_myJointType:{type:WL.Type.Enum,values:["Wrist","Thumb Metacarpal","Thumb Phalanx Proximal","Thumb Phalanx Distal","Thumb Tip","Index Metacarpal","Index Phalanx Proximal","Index Phalanx Intermediate","Index Phalanx Distal","Index Tip","Middle Metacarpal","Middle Phalanx Proximal","Middle Phalanx Intermediate","Middle Phalanx Distal","Middle Tip","Ring Metacarpal","Ring Phalanx Proximal","Ring Phalanx Intermediate","Ring Phalanx Distal","Ring Tip","Pinky Metacarpal","Pinky Phalanx Proximal","Pinky Phalanx Intermediate","Pinky Phalanx Distal","Pinky Tip"],default:"Wrist"}},{init:function(){this._myHandednessInternal=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myJointTypeInternal=PP.InputUtils.getJointTypeByIndex(this._myJointType),this._myTrackedHandJointPose=new PP.TrackedHandJointPose(this._myHandednessInternal,this._myJointTypeInternal),this._myTrackedHandJointPose.setFixForward(this._myFixForward)},start:function(){this._myTrackedHandJointPose.start()},update:function(e){this._myTrackedHandJointPose.update(e),this.object.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat()),this._mySetLocalScaleAsJointRadius&&this.object.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius())}})});var Ts=T(()=>{WL.registerComponent("pp-copy-hand-transform",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"}},{init:function(){this._myHandednessType=this._myHandedness==0?PP.Handedness.LEFT:PP.Handedness.RIGHT},update:function(e){let t=PP.myPlayerObjects.myHands[this._myHandednessType];this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var Cs=T(()=>{WL.registerComponent("pp-copy-head-transform",{},{update:function(e){let t=PP.myPlayerObjects.myHead;this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var bs=T(()=>{WL.registerComponent("pp-copy-player-transform",{},{update:function(e){let t=PP.myPlayerObjects.myPlayer;this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var Ss=T(()=>{WL.registerComponent("pp-copy-player-pivot-transform",{},{update:function(e){let t=PP.myPlayerObjects.myPlayerPivot;this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var vs=T(()=>{PP.ToolHandedness={NONE:null,LEFT:"left",RIGHT:"right"};PP.ToolInputSourceType={NONE:null,GAMEPAD:0,TRACKED_HAND:1}});var xs=T(()=>{WL.registerComponent("pp-tool-cursor",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myPulseOnHover:{type:WL.Type.Bool,default:!1},_myShowFingerCursor:{type:WL.Type.Bool,default:!1}},{init:function(){this._myHandednessString=["left","right"][this._myHandedness],this._myHandedness==0?this._myCursorPosition=[-.01,-.024,-.05]:this._myCursorPosition=[.01,-.024,-.05],this._myCursorRotation=[-.382,0,0,.924],this._myCursorRotation.quat_normalize(this._myCursorRotation),this._myCursorMeshScale=[.0025,.0025,.0025],this._myCursorColor=[255/255,255/255,255/255,1],this._myCursorTargetCollisionGroup=7},start:function(){this._myFixForwardObject=WL.scene.addObject(this.object),this._myFixForwardObject.pp_rotateObject([0,180,0]),this._myCursorObjectVR=WL.scene.addObject(this._myFixForwardObject),this._myCursorObjectVR.setTranslationLocal(this._myCursorPosition),this._myCursorObjectVR.rotateObject(this._myCursorRotation);{let i=WL.scene.addObject(this._myCursorObjectVR);i.pp_setScale(this._myCursorMeshScale);let s=i.addComponent("mesh");s.mesh=PP.myDefaultResources.myMeshes.mySphere,s.material=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),s.material.color=this._myCursorColor;let n=this._myCursorObjectVR.addComponent("cursor",{collisionGroup:this._myCursorTargetCollisionGroup,handedness:this._myHandedness+1,cursorObject:i});n.rayCastMode=0,this._myPulseOnHover&&n.globalTarget.addHoverFunction(this._pulseOnHover.bind(this))}this._myCursorObjectNonVR=WL.scene.addObject(null);{let i=this._myCursorObjectNonVR.addComponent("cursor",{collisionGroup:this._myCursorTargetCollisionGroup,handedness:this._myHandedness+1});i.rayCastMode=0,this._myPulseOnHover&&i.globalTarget.addHoverFunction(this._pulseOnHover.bind(this)),i.setViewComponent(PP.myPlayerObjects.myNonVRCamera.getComponent("view"))}let e=null,t=.0125;if(this._myShowFingerCursor){e=this.object.pp_addObject();let i=e.addComponent("mesh");i.mesh=PP.myDefaultResources.myMeshes.mySphere,i.material=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),i.material.color=this._myCursorColor,e.pp_setScale(t)}this._myFingerCursorObject=WL.scene.addObject(this.object),this._myFingerCursorComponent=this._myFingerCursorObject.addComponent("pp-finger-cursor",{_myHandedness:this._myHandedness,_myEnableMultipleClicks:!0,_myCollisionGroup:this._myCursorTargetCollisionGroup,_myCollisionSize:t,_myCursorObject:e}),this._myCursorObjectVR.pp_setActive(!1),this._myCursorObjectNonVR.pp_setActive(!1),this._myFingerCursorObject.pp_setActive(!1)},update:function(){let e=PP.quat2_create();return function(i){let s=this._isUsingHand();this._myFingerCursorObject.pp_setActive(s),s?(this._myCursorObjectNonVR.pp_setActive(!1),this._myCursorObjectVR.pp_setActive(!1)):PP.XRUtils.isXRSessionActive()?(this._myCursorObjectVR.pp_setActive(!s),this._myCursorObjectNonVR.pp_setActive(!1)):(this._myCursorObjectNonVR.pp_setActive(!s),this._myCursorObjectVR.pp_setActive(!1),this._myCursorObjectNonVR.pp_setTransformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getTransformQuat(e)))}}(),_isUsingHand:function(){let e=!1;if(WL.xrSession&&WL.xrSession.inputSources)for(let t=0;t{PP.ConsoleVRWidgetSetup=class{constructor(){this._initializeBuildSetup(),this._initializeRuntimeSetup()}_initializeBuildSetup(){this.myBackgroundColor=[46/255,46/255,46/255,1],this.myCursorTargetCollisionCollider=2,this.myCursorTargetCollisionGroup=7,this.myCursorTargetCollisionThickness=.001,this.myDefaultTextColor=[255/255,255/255,255/255,1],this.myTextAlignment=2,this.myTextJustification=2,this.myTextColor=this.myDefaultTextColor,this.myMessageTypeColors=[],this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG]=this.myDefaultTextColor,this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR]=[255/255,40/255,40/255,1],this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN]=[250/255,220/255,40/255,1],this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO]=[60/255,200/255,255/255,1],this.myMessagesPanelPosition=[0,.075,0],this.myMessagesBackgroundScale=[.34,.15,1];{let t=.03,i=t*this.myMessagesBackgroundScale[0]/this.myMessagesBackgroundScale[1]*.8,s=-this.myMessagesBackgroundScale[0]+this.myMessagesBackgroundScale[0]*t,n=this.myMessagesBackgroundScale[1]-this.myMessagesBackgroundScale[1]*i;this.myMessagesTextsPanelPosition=[s,n,.007]}this.myMessagesTextsPanelScale=[.1,.1,.1],this.myMessagesTextStartString=`. +Plane Triangles (Adjusted):`,this._myRealTrianglesAmount),console.log("Target Frame Rate:",this._myStableFrameRate,"- Threshold: ",this._myStableFrameRate-this._myTargetFrameRateThreshold),console.log("")),this._start())):this._update(e):this._mySessionStarted=WL.xrSession!=null},_computeAverageFrameRate(e){let t=0;this._myDTHistory.sort();let i=Math.floor(this._myDTHistory.length)*Math.min(.9,this._myDTHistoryToIgnorePercentage*(e?2:1));for(let n=0;n1&&s>1&&i*s>t&&(i-1)*s>=t;)i--;let o=new PP.MeshCreationParams;for(let l=0;l{Number.prototype.get=function(){return this.valueOf()};Object.defineProperty(Number.prototype,"get",{enumerable:!1});PP.NumberOverValue=class{constructor(t,i=null,s=0,n=0,o=PP.EasingFunction.linear,r=null){i==null&&(i=t),this._myStartNumber=t,this._myEndNumber=i,this._myStartInterpolationValue=s,this._myEndInterpolationValue=n,this._myEasingFunction=o,this._myRoundingFunction=r}get(t){let i=this._myEasingFunction(Math.pp_mapToRange(t,this._myStartInterpolationValue,this._myEndInterpolationValue,0,1)),s=Math.pp_lerp(this._myStartNumber,this._myEndNumber,i);return this._myRoundingFunction&&(s=this._myRoundingFunction(s,this._myStartNumber,this._myEndNumber)),s}getAverage(t){return this.get(t)}getRange(t){let i=this.get(t);return[i,i]}getMax(t){return this.get(t)}getMin(t){return this.get(t)}isInside(t,i){return this.get(i)==t}isInsideAngleRange(t,i){return this.isInsideAngleRangeDegrees(t,i)}isInsideAngleRangeDegrees(t,i){let s=this.get(i),n=Math.pp_angleClampDegrees(t),o=Math.pp_angleClampDegrees(s);return n==o}isInsideAngleRangeRadians(t,i){let s=this.get(i),n=Math.pp_angleClampRadians(t),o=Math.pp_angleClampRadians(s);return n==o}};PP.IntOverValue=class extends PP.NumberOverValue{constructor(t,i,s,n,o=PP.EasingFunction.linear,r=null){r==null&&(r=function(l,y,c){let a=null;return y<=c?a=Math.floor(l):a=Math.ceil(l),a}),super(t,i,s,n,o,r)}};PP.NumberRangeOverValue=class{constructor(t,i=null,s=0,n=0,o=PP.EasingFunction.linear,r=null){i==null&&(i=t),this._myStartNumberOverValue=new PP.NumberOverValue(t[0],i[0],s,n,o,r),this._myEndNumberOverValue=new PP.NumberOverValue(t[1],i[1],s,n,o,r),this._myRoundingFunction=r}get(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t),n=null;return this._myRoundingFunction?n=Math.pp_randomInt(i,s):n=Math.pp_random(i,s),n}getAverage(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t),n=(i+s)/2;return this._myRoundingFunction&&(n=this._myRoundingFunction(n,i,s)),n}getRange(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t);return[i,s]}getMax(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t);return Math.max(i,s)}getMin(t){let i=this._myStartNumberOverValue.get(t),s=this._myEndNumberOverValue.get(t);return Math.min(i,s)}isInside(t,i){let s=this._myStartNumberOverValue.get(i),n=this._myEndNumberOverValue.get(i),o=Math.min(s,n),r=Math.max(s,n);return t>=o&&t<=r}isInsideAngleRange(t,i){return this.isInsideAngleRangeDegrees(t,i)}isInsideAngleRangeDegrees(t,i){let s=this._myStartNumberOverValue.get(i),n=this._myEndNumberOverValue.get(i);return Math.pp_isInsideAngleRangeDegrees(t,s,n)}isInsideAngleRangeRadians(t,i){let s=this._myStartNumberOverValue.get(i),n=this._myEndNumberOverValue.get(i);return Math.pp_isInsideAngleRangeRadians(t,s,n)}};PP.IntRangeOverValue=class extends PP.NumberRangeOverValue{constructor(t,i,s,n,o=PP.EasingFunction.linear,r=null){r==null&&(r=function(l,y,c){let a=null;return y<=c?a=Math.floor(l):a=Math.ceil(l),a}),super(t,i,s,n,o,r)}}});var Ze=T(()=>{PP.ObjectPoolManager=class{constructor(){this._myPoolMap=new Map}addPool(t,i,s=new PP.ObjectPoolParams){if(this._myPoolMap.has(t))console.error("Pool already created with this ID");else{let n=new PP.ObjectPool(i,s);this._myPoolMap.set(t,n)}}increasePool(t,i){let s=this._myPoolMap.get(t);s&&s.increase(i)}increasePoolPercentage(t,i){let s=this._myPoolMap.get(t);s&&s.increasePercentage(i)}getPool(t){return this._myPoolMap.get(t)}hasPool(t){return this._myPoolMap.has(t)}getObject(t){return this._myPoolMap.has(t)?this._myPoolMap.get(t).get():null}releaseObject(t,i){this._myPoolMap.get(t).release(i)}};PP.ObjectPoolParams=class{constructor(){this.myInitialPoolSize=0,this.myAmountToAddWhenEmpty=1,this.myPercentageToAddWhenEmpty=.5,this.myCloneParams=void 0,this.myOptimizeObjectsAllocation=!0,this.myCloneCallback=void 0,this.mySetActiveCallback=void 0,this.myEqualCallback=void 0,this.myOptimizeObjectsAllocationCallback=void 0,this.myEnableDebugLog=!0}};PP.ObjectPool=class{constructor(t,i){this._myObjectPoolParams=i,this._myPrototype=this._clone(t),this._myAvailableObjects=[],this._myBusyObjects=[],this._addToPool(i.myInitialPoolSize,!1)}get(){let t=this._myAvailableObjects.shift();if(t==null){let i=Math.ceil(this._myBusyObjects.length*this._myObjectPoolParams.myPercentageToAddWhenEmpty);i+=this._myObjectPoolParams.myAmountToAddWhenEmpty,this._addToPool(i,this._myObjectPoolParams.myEnableDebugLog),t=this._myAvailableObjects.shift()}return t!=null&&this._myBusyObjects.push(t),t}release(t){let i=this._myBusyObjects.pp_remove(this._equals.bind(this,t));i&&(this._setActive(i,!1),this._myAvailableObjects.push(i))}increase(t){this._addToPool(t,!1)}increasePercentage(t){let i=Math.ceil(this.getSize()*t);this._addToPool(i,!1)}getSize(){return this._myBusyObjects.length+this._myAvailableObjects.length}getAvailableSize(){return this._myAvailableObjects.length}getBusySize(){return this._myAvailableObjects.length}_addToPool(t,i){if(!(t<=0)){this._myObjectPoolParams.myOptimizeObjectsAllocation&&(this._myObjectPoolParams.myOptimizeObjectsAllocationCallback?this._myObjectPoolParams.myOptimizeObjectsAllocationCallback(this._myPrototype,t):this._myPrototype.pp_reserveObjectsHierarchy!=null&&this._myPrototype.pp_reserveObjectsHierarchy(t));for(let s=0;s{PP.PhysXCollisionCollector=class{constructor(t,i=!1){this._myPhysX=t,this._myIsTrigger=i,this._myCollisions=[],this._myCollisionsStart=[],this._myCollisionsEnd=[],this._myUpdateActive=!1,this._myCollisionsStartToProcess=[],this._myCollisionsEndToProcess=[],this._myCollisionCallbackID=null,this._myIsActive=!1,this.setActive(!0),this._myDebugActive=!1,this._myTriggerDesyncFixDelay=new PP.Timer(.1),this._myCollisionCallbacks=new Map,this._myCollisionStartCallbacks=new Map,this._myCollisionEndCallbacks=new Map}getPhysX(){return this._myPhysX}getCollisions(){return this._myCollisions}getCollisionsStart(){return this._myCollisionsStart}getCollisionsEnd(){return this._myCollisionsEnd}setActive(t){this._myIsActive!=t&&(this._myIsActive=t,this._myCollisions=[],this._myCollisionsStart=[],this._myCollisionsEnd=[],this._myUpdateActive=!1,this._myCollisionsStartToProcess=[],this._myCollisionsEndToProcess=[],this._myIsActive?this._myCollisionCallbackID=this._myPhysX.onCollision(this._onCollision.bind(this)):this._myCollisionCallbackID!=null&&(this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID),this._myCollisionCallbackID=null))}setUpdateActive(t){this._myUpdateActive=t}update(t){!this._myIsActive||(this._myUpdateActive=!0,this._myCollisionsStart=this._myCollisionsStartToProcess,this._myCollisionsStartToProcess=[],this._myCollisionsEnd=this._myCollisionsEndToProcess,this._myCollisionsEndToProcess=[],this._myIsTrigger&&this._triggerDesyncFix(t))}destroy(){this._myCollisionCallbackID!=null&&(this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID),this._myCollisionCallbackID=null)}setDebugActive(t){this._myDebugActive=t}registerCollisionEventListener(t,i){this._myCollisionCallbacks.set(t,i)}unregisterCollisionEventListener(t){this._myCollisionCallbacks.delete(t)}registerCollisionStartEventListener(t,i){this._myCollisionStartCallbacks.set(t,i)}unregisterCollisionStartEventListener(t){this._myCollisionStartCallbacks.delete(t)}registerCollisionEndEventListener(t,i){this._myCollisionEndCallbacks.set(t,i)}unregisterCollisionEndEventListener(t){this._myCollisionEndCallbacks.delete(t)}_onCollision(t,i){t==WL.CollisionEventType.Touch||t==WL.CollisionEventType.TriggerTouch?this._onCollisionStart(i):(t==WL.CollisionEventType.TouchLost||t==WL.CollisionEventType.TriggerTouchLost)&&this._onCollisionEnd(i),this._myCollisionCallbacks.size>0&&this._myCollisionCallbacks.forEach(function(s){s(this._myPhysX,i,t)})}_onCollisionStart(t){if(this._myDebugActive){let i=!1;for(let s of this._myCollisions)if(s.pp_equals(t.object)){i=!0;break}i&&console.error("Collision Start on object already collected")}this._myCollisions.push(t.object),this._myUpdateActive&&(this._myCollisionsStartToProcess.push(t.object),this._myCollisionsEndToProcess.pp_removeAll(function(i){return i.pp_equals(t.object)})),this._myDebugActive&&console.log("Collision Start -",this._myCollisions.length),this._myCollisionStartCallbacks.size>0&&this._myCollisionStartCallbacks.forEach(function(i){i(this._myPhysX,t,type)})}_onCollisionEnd(t){if(this._myDebugActive){let i=!1;for(let s of this._myCollisions)if(s.pp_equals(t.object)){i=!0;break}i||console.error("Collision End on object not collected")}this._myCollisions.pp_removeAll(function(i){return i.pp_equals(t.object)}),this._myUpdateActive&&(this._myCollisionsEndToProcess.push(t.object),this._myCollisionsStartToProcess.pp_removeAll(function(i){return i.pp_equals(t.object)})),this._myDebugActive&&console.log("Collision End -",this._myCollisions.length),this._myCollisionEndCallbacks.size>0&&this._myCollisionEndCallbacks.forEach(function(i){i(this._myPhysX,t,type)})}_triggerDesyncFix(t){if(this._myTriggerDesyncFixDelay.update(t),this._myTriggerDesyncFixDelay.isDone()){this._myTriggerDesyncFixDelay.start();let i=this._myCollisions.pp_findAll(function(s){let n=s.pp_getComponent("physx");return n==null||!n.active});if(i.length>0)for(let s of i){let n=s.pp_getComponent("physx");n?this._onCollisionEnd(n):console.error("NO PHYSX, HOW?")}}}}});var ti=T(()=>{PP.SaveManager=class{constructor(){this._mySaveCache=new Map,this._myCommitSavesDelayTimer=new PP.Timer(0,!1),this._myDelaySavesCommit=!0,this._myIDsToCommit=[],this._myCacheDefaultValueOnFail=!0,WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this)),this._myClearCallbacks=new Map,this._myDeleteCallbacks=new Map,this._myDeleteIDCallbacks=new Map,this._mySaveCallbacks=new Map,this._mySaveValueChangedCallbacks=new Map,this._mySaveIDCallbacks=new Map,this._mySaveValueChangedIDCallbacks=new Map,this._myCommitSaveCallbacks=new Map,this._myCommitSaveIDCallbacks=new Map,this._myCommitSavesCallbacks=new Map,this._myLoadCallbacks=new Map,this._myLoadIDCallbacks=new Map}setCommitSavesDelay(t){this._myCommitSavesDelayTimer.start(t)}setDelaySavesCommit(t){this._myDelaySavesCommit=t}setCacheDefaultValueOnFail(t){this._myCacheDefaultValueOnFail=t}update(t){this._myCommitSavesDelayTimer.isRunning()&&(this._myCommitSavesDelayTimer.update(t),this._myCommitSavesDelayTimer.isDone()&&this.commitSaves())}save(t,i,s=null){let n=!1;if(this._mySaveCache.has(t)&&(n=this._mySaveCache.get(t)===i),!n)if(this._mySaveCache.set(t,i),this._myDelaySavesCommit&&s==null||s!=null&&s)this._myIDsToCommit.pp_pushUnique(t),this._myCommitSavesDelayTimer.isRunning()||this._myCommitSavesDelayTimer.start();else{let o=this._commitSave(t,!1);if(this._myCommitSavesCallbacks.size>0){let r=!1;this._myCommitSavesCallbacks.forEach(function(l){l(r,o)})}}if(this._mySaveCallbacks.size>0&&this._mySaveCallbacks.forEach(function(o){o(t,i)}),this._mySaveIDCallbacks.size>0){let o=this._mySaveIDCallbacks.get(t);o?.forEach(function(r){r(t,i)})}if(!n&&(this._mySaveValueChangedCallbacks.size>0&&this._mySaveValueChangedCallbacks.forEach(function(o){o(t,i)}),this._mySaveValueChangedIDCallbacks.size>0)){let o=this._mySaveValueChangedIDCallbacks.get(t);o?.forEach(function(r){r(t,i)})}}commitSaves(){if(this._myIDsToCommit.length>0){let t=!1;for(let i of this._myIDsToCommit)if(this._mySaveCache.has(i)){let s=this._commitSave(i,!0);t=t||s}if(this._myIDsToCommit=[],this._myCommitSavesCallbacks.size>0){let i=!0;this._myCommitSavesCallbacks.forEach(function(s){s(i,t)})}}}has(t){return this._mySaveCache.has(t)||PP.SaveUtils.has(t)}delete(t){if(this._mySaveCache.delete(t),PP.SaveUtils.delete(t),this._myDeleteCallbacks.size>0&&this._myDeleteCallbacks.forEach(function(i){i(t)}),this._myDeleteIDCallbacks.size>0){let i=this._myDeleteIDCallbacks.get(t);i?.forEach(function(s){s(t)})}}clear(){this._mySaveCache.clear(),PP.SaveUtils.clear(),this._myClearCallbacks.size>0&&this._myClearCallbacks.forEach(function(t){t()})}load(t,i=null){return this._load(t,i,"load")}loadString(t,i=null){return this._load(t,i,"loadString")}loadNumber(t,i=null){return this._load(t,i,"loadNumber")}loadBool(t,i=null){return this._load(t,i,"loadBool")}getCommitSavesDelay(){return this._myCommitSavesDelayTimer.getDuration()}isDelaySavesCommit(){return this._myDelaySavesCommit}isCacheDefaultValueOnFail(){return this._myCacheDefaultValueOnFail}_commitSave(t,i){let s=this._mySaveCache.get(t),n=!1;try{PP.SaveUtils.save(t,s)}catch{n=!0}if(this._myCommitSaveCallbacks.size>0&&this._myCommitSaveCallbacks.forEach(function(o){o(t,s,i,n)}),this._myCommitSaveIDCallbacks.size>0){let o=this._myCommitSaveIDCallbacks.get(t);o?.forEach(function(r){r(t,s,i,n)})}return n}_load(t,i,s){let n=null,o=!1,r=!1;if(this._mySaveCache.has(t))n=this._mySaveCache.get(t),n==null&&i!=null&&(n=i,this._myCacheDefaultValueOnFail&&this._mySaveCache.set(t,n)),r=!0;else{let l=null;try{l=PP.SaveUtils[s](t,null)}catch{l=null,o=!0}l==null?n=i:n=l,l!=null||this._myCacheDefaultValueOnFail?this._mySaveCache.set(t,n):this._mySaveCache.set(t,null)}if(this._myLoadCallbacks.size>0&&this._myLoadCallbacks.forEach(function(l){l(t,n,r,o)}),this._myLoadIDCallbacks.size>0){let l=this._myLoadIDCallbacks.get(t);l?.forEach(function(y){y(t,n,r,o)})}return n}_onXRSessionStart(t){t.addEventListener("visibilitychange",function(i){i.session.visibilityState!="visible"&&this._onXRSessionInterrupt()}.bind(this))}_onXRSessionEnd(){this._onXRSessionInterrupt()}_onXRSessionInterrupt(){this.commitSaves()}registerClearEventListener(t,i){this._myClearCallbacks.set(t,i)}unregisterClearEventListener(t){this._myClearCallbacks.delete(t)}registerDeleteEventListener(t,i){this._myDeleteCallbacks.set(t,i)}unregisterDeleteEventListener(t){this._myDeleteCallbacks.delete(t)}registerDeleteIDEventListener(t,i,s){let n=this._myDeleteIDCallbacks.get(t);n==null&&(this._myDeleteIDCallbacks.set(t,new Map),n=this._myDeleteIDCallbacks.get(t)),n.set(i,s)}unregisterDeleteIDEventListener(t,i){let s=this._myDeleteIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myDeleteIDCallbacks.delete(t))}registerSaveEventListener(t,i){this._mySaveCallbacks.set(t,i)}unregisterSaveEventListener(t){this._mySaveCallbacks.delete(t)}registerSaveIDEventListener(t,i,s){let n=this._mySaveIDCallbacks.get(t);n==null&&(this._mySaveIDCallbacks.set(t,new Map),n=this._mySaveIDCallbacks.get(t)),n.set(i,s)}unregisterSaveIDEventListener(t,i){let s=this._mySaveIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._mySaveIDCallbacks.delete(t))}registerSaveValueChangedEventListener(t,i){this._mySaveValueChangedCallbacks.set(t,i)}unregisterSaveValueChangedEventListener(t){this._mySaveValueChangedCallbacks.delete(t)}registerSaveValueChangedIDEventListener(t,i,s){let n=this._mySaveValueChangedIDCallbacks.get(t);n==null&&(this._mySaveValueChangedIDCallbacks.set(t,new Map),n=this._mySaveValueChangedIDCallbacks.get(t)),n.set(i,s)}unregisterSaveValueChangedIDEventListener(t,i){let s=this._mySaveValueChangedIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._mySaveValueChangedIDCallbacks.delete(t))}registerCommitSavesEventListener(t,i){this._myCommitSavesCallbacks.set(t,i)}unregisterCommitSavesEventListener(t){this._myCommitSavesCallbacks.delete(t)}registerCommitSaveEventListener(t,i){this._myCommitSaveCallbacks.set(t,i)}unregisterCommitSaveEventListener(t){this._myCommitSaveCallbacks.delete(t)}registerCommitSaveIDEventListener(t,i,s){let n=this._myCommitSaveIDCallbacks.get(t);n==null&&(this._myCommitSaveIDCallbacks.set(t,new Map),n=this._myCommitSaveIDCallbacks.get(t)),n.set(i,s)}unregisterCommitSaveIDEventListener(t,i){let s=this._myCommitSaveIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myCommitSaveIDCallbacks.delete(t))}registerLoadEventListener(t,i){this._myLoadCallbacks.set(t,i)}unregisterLoadEventListener(t){this._myLoadCallbacks.delete(t)}registerLoadIDEventListener(t,i,s){let n=this._myLoadIDCallbacks.get(t);n==null&&(this._myLoadIDCallbacks.set(t,new Map),n=this._myLoadIDCallbacks.get(t)),n.set(i,s)}unregisterLoadIDEventListener(t,i){let s=this._myLoadIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myLoadIDCallbacks.delete(t))}}});var ei=T(()=>{PP.Timer=class{constructor(t,i=!0){this._myDuration=t,this._myOnEndCallbacks=new Map,this._myDone=!1,this._myJustDone=!1,this._myStarted=!1,i?this.start():this.reset()}start(t=null){this.reset(t),this._myStarted=!0}end(){this._done()}reset(t=null){t!=null&&(this._myDuration=Math.max(0,t)),this._myTimer=this._myDuration,this._myDone=!1,this._myJustDone=!1,this._myStarted=!1}update(t){this._myJustDone=!1,this.isRunning()&&(this._myTimer=Math.max(0,this._myTimer-t),this._myTimer==0&&this._done())}isDone(){return this._myDone}isJustDone(){return this._myJustDone}isStarted(){return this._myStarted}isRunning(){return this.isStarted()&&!this.isDone()}getDuration(){return this._myDuration}setDuration(t){this._myDuration=Math.max(0,t)}getTimer(){return this._myTimer}getPercentage(){let t=1;return this._myTimer>0&&(t=(this._myDuration-this._myTimer)/this._myDuration),Math.pp_clamp(t,0,1)}onEnd(t,i=null){this._myOnEndCallbacks.set(i,t)}unregisterOnEnd(t=null){this._myOnEndCallbacks.delete(t)}_done(){if(this._myTimer=0,this._myDone=!0,this._myJustDone=!0,this._myOnEndCallbacks.size>0)for(let t of this._myOnEndCallbacks.values())t()}}});var ii=T(()=>{WL.registerComponent("pp-clear-console-on-xr-session-start",{},{init:function(){},start:function(){this._myFirstTime=!0,WL.onXRSessionStart.push(function(){this._myFirstTime&&(this._myFirstTime=!1,console.clear())}.bind(this))},update:function(e){}})});var si=T(()=>{WL.registerComponent("pp-set-active",{_myActive:{type:WL.Type.Bool,default:!0},_mySetActiveOn:{type:WL.Type.Enum,values:["self","children","descendants","hierarchy"],default:"hierarchy"},_mySetActiveWhen:{type:WL.Type.Enum,values:["init","start","first_update"],default:"init"}},{init:function(){this.active&&this._mySetActiveWhen==0&&this._setActive()},start:function(){this._mySetActiveWhen==1&&this._setActive(),this._myFirst=!0},update:function(e){this._mySetActiveWhen==2&&this._myFirst&&(this._myFirst=!1,this._setActive())},_setActive(){this._mySetActiveOn==0?this.object.pp_setActiveSelf(this._myActive):this._mySetActiveOn==1?this.object.pp_setActiveChildren(this._myActive):this._mySetActiveOn==2?this.object.pp_setActiveDescendants(this._myActive):this.object.pp_setActiveHierarchy(this._myActive)}})});var ni=T(()=>{WL.registerComponent("pp-adjust-hierarchy-physx-scale",{_myWhen:{type:WL.Type.Enum,values:["init","start","first_update"],default:"start"}},{init:function(){this.active&&this._myWhen==0&&this._adjustScale()},start:function(){this._myWhen==1&&this._adjustScale(),this._myFirst=!0},update:function(e){this._myWhen==2&&this._myFirst&&(this._myFirst=!1,this._adjustScale())},_adjustScale(){let e=this.object.pp_getScale(),t=this.object.pp_getComponentsHierarchy("physx");for(let i of t)i.extents[0]=i.extents[0]*e[0],i.extents[1]=i.extents[1]*e[1],i.extents[2]=i.extents[2]*e[2],i.active&&(i.active=!1,i.active=!0)}})});var oi=T(()=>{WL.registerComponent("pp-get-player-objects",{_myPlayer:{type:WL.Type.Object},_myPlayerPivot:{type:WL.Type.Object},_myNonVRCamera:{type:WL.Type.Object},_myEyeLeft:{type:WL.Type.Object},_myEyeRight:{type:WL.Type.Object},_myHead:{type:WL.Type.Object},_myNonVRHead:{type:WL.Type.Object},_myVRHead:{type:WL.Type.Object},_myHandLeft:{type:WL.Type.Object},_myHandRight:{type:WL.Type.Object}},{init:function(){PP.myPlayerObjects.myPlayer=this._myPlayer,PP.myPlayerObjects.myPlayerPivot=this._myPlayerPivot,PP.myPlayerObjects.myNonVRCamera=this._myNonVRCamera,PP.myPlayerObjects.myHead=this._myHead,PP.myPlayerObjects.myNonVRHead=this._myNonVRHead,PP.myPlayerObjects.myVRHead=this._myVRHead,PP.myPlayerObjects.myEyeLeft=this._myEyeLeft,PP.myPlayerObjects.myEyeRight=this._myEyeRight,PP.myPlayerObjects.myHandLeft=this._myHandLeft,PP.myPlayerObjects.myHandRight=this._myHandRight,PP.myPlayerObjects.myEyes=[],PP.myPlayerObjects.myEyes[PP.Handedness.LEFT]=this._myEyeLeft,PP.myPlayerObjects.myEyes[PP.Handedness.RIGHT]=this._myEyeRight,PP.myPlayerObjects.myHands=[],PP.myPlayerObjects.myHands[PP.Handedness.LEFT]=this._myHandLeft,PP.myPlayerObjects.myHands[PP.Handedness.RIGHT]=this._myHandRight,PP.myPlayerObjects.myPlayerPivot==null&&(PP.myPlayerObjects.myPlayerPivot=PP.myPlayerObjects.myPlayer)}});PP.myPlayerObjects={myPlayer:null,myPlayerPivot:null,myNonVRCamera:null,myNonVRHead:null,myVRHead:null,myHead:null,myEyeLeft:null,myEyeRight:null,myEyes:[],myHandLeft:null,myHandRight:null,myHands:[]}});var ai=T(()=>{WL.registerComponent("pp-get-default-resources",{_myPlane:{type:WL.Type.Mesh},_myCube:{type:WL.Type.Mesh},_mySphere:{type:WL.Type.Mesh},_myCone:{type:WL.Type.Mesh},_myCylinder:{type:WL.Type.Mesh},_myCircle:{type:WL.Type.Mesh},_myFlatOpaque:{type:WL.Type.Material},_myFlatTransparentNoDepth:{type:WL.Type.Material},_myPhongOpaque:{type:WL.Type.Material},_myText:{type:WL.Type.Material}},{init(){PP.myDefaultResources.myMeshes.myPlane=PP.MeshUtils.cloneMesh(this._myPlane),PP.myDefaultResources.myMeshes.myCube=PP.MeshUtils.cloneMesh(this._myCube),PP.myDefaultResources.myMeshes.mySphere=PP.MeshUtils.cloneMesh(this._mySphere),PP.myDefaultResources.myMeshes.myCone=PP.MeshUtils.cloneMesh(this._myCone),PP.myDefaultResources.myMeshes.myCylinder=PP.MeshUtils.cloneMesh(this._myCylinder),PP.myDefaultResources.myMeshes.myCircle=PP.MeshUtils.cloneMesh(this._myCircle),PP.myDefaultResources.myMeshes.myInvertedCube=PP.MeshUtils.invertMesh(this._myCube),PP.myDefaultResources.myMeshes.myInvertedSphere=PP.MeshUtils.invertMesh(this._mySphere),PP.myDefaultResources.myMeshes.myInvertedCone=PP.MeshUtils.invertMesh(this._myCone),PP.myDefaultResources.myMeshes.myInvertedCylinder=PP.MeshUtils.invertMesh(this._myCylinder),this._myFlatOpaque!=null&&(PP.myDefaultResources.myMaterials.myFlatOpaque=this._myFlatOpaque.clone()),this._myFlatTransparentNoDepth!=null&&(PP.myDefaultResources.myMaterials.myFlatTransparentNoDepth=this._myFlatTransparentNoDepth.clone()),this._myPhongOpaque!=null&&(PP.myDefaultResources.myMaterials.myPhongOpaque=this._myPhongOpaque.clone()),this._myText!=null&&(PP.myDefaultResources.myMaterials.myText=this._myText.clone())}});PP.myDefaultResources={myMeshes:{myPlane:null,myCube:null,mySphere:null,myCone:null,myCylinder:null,myCircle:null,myInvertedCube:null,myInvertedSphere:null,myInvertedCone:null,myInvertedCylinder:null},myMaterials:{myFlatOpaque:null,myFlatTransparentNoDepth:null,myPhongOpaque:null,myText:null}}});var ri=T(()=>{WL.registerComponent("pp-show-fps",{_myRefreshSeconds:{type:WL.Type.Float,default:.25},_myTextMaterial:{type:WL.Type.Material}},{init:function(){},start(){this._myTimer=new PP.Timer(this._myRefreshSeconds),this._myTotalDT=0,this._myFrames=0,this._myVisualFPSParent=this.object.pp_addObject();let e=new PP.VisualTextParams;e.myText="0",e.myTransform.mat4_setPositionRotationScale([-.115,-.115,.35],[0,180,0],[.3,.3,.3]),this._myTextMaterial!=null?e.myMaterial=this._myTextMaterial.clone():(e.myMaterial=PP.myDefaultResources.myMaterials.myText.clone(),e.myMaterial.color=[0,1,0,1]),e.myParent=this._myVisualFPSParent,this._myVisualFPS=new PP.VisualText(e),PP.myEasyTuneVariables.add(new PP.EasyTuneNumber("FPS X",-.25,.1,3)),PP.myEasyTuneVariables.add(new PP.EasyTuneNumber("FPS Y",-.13,.1,3)),PP.myEasyTuneVariables.add(new PP.EasyTuneNumber("FPS Z",.35,.1,3))},update:function(){let e=PP.quat2_create();return function(i){if(this._myTotalDT+=i,this._myFrames++,this._myTimer.update(i),this._myTimer.isDone()){this._myTimer.start();let s=Math.round(this._myFrames/this._myTotalDT),n=this._myVisualFPS.getParams();PP.XRUtils.isXRSessionActive()?n.myTransform.mat4_setPositionRotationScale([-.115,-.115,.35],[0,180,0],[.3,.3,.3]):n.myTransform.mat4_setPositionRotationScale([-.25,-.13,.35],[0,180,0],[.3,.3,.3]),n.myText=s.toFixed(0),this._myVisualFPS.paramsUpdated(),this._myTotalDT=0,this._myFrames=0}this._myVisualFPSParent.pp_setTransformQuat(PP.myPlayerObjects.myHead.pp_getTransformQuat(e))}}()})});var li=T(()=>{PP.StateData=class{constructor(t,i){this.myID=t,this.myObject=i}};PP.TransitionData=class{constructor(t,i,s,n,o){this.myID=t,this.myFromState=i,this.myToState=s,this.myObject=n,this.mySkipStateFunction=o}};PP.PendingPerform=class{constructor(t,...i){this.myID=t,this.myArgs=i}};PP.PerformType={IMMEDIATE:0,DELAYED:1};PP.PerformDelayedType={QUEUE:0,KEEP_FIRST:1,KEEP_LAST:2};PP.SkipStateFunction={NONE:0,END:1,START:2,BOTH:3};PP.FSM=class{constructor(t=PP.PerformType.IMMEDIATE,i=PP.PerformDelayedType.QUEUE){this._myCurrentStateData=null,this._myStateMap=new Map,this._myTransitionMap=new Map,this._myDebugLogActive=!1,this._myDebugShowDelayedInfo=!1,this._myDebugLogName="FSM",this._myPerformType=t,this._myPerformDelayedType=i,this._myPendingPerforms=[],this._myCurrentlyPerformedTransition=null,this._myInitCallbacks=new Map,this._myInitIDCallbacks=new Map,this._myTransitionCallbacks=new Map,this._myTransitionIDCallbacks=[]}addState(t,i=null){let s=null;!i||typeof i=="function"?(s={},typeof i=="function"?s.update=i:s.update=null,s.clone=function(){let o={};return o.update=this.update,o.clone=this.clone,o}):s=i;let n=new PP.StateData(t,s);this._myStateMap.set(t,n),this._myTransitionMap.set(t,new Map)}addTransition(t,i,s,n=null,o=PP.SkipStateFunction.NONE){let r=null;if(!n||typeof n=="function"?(r={},typeof n=="function"?r.perform=n:r.perform=null,r.clone=function(){let l={};return l.perform=this.perform,l.clone=this.clone,l}):r=n,this.hasState(t)&&this.hasState(i)){let l=this._getTransitionMapFromState(t),y=new PP.TransitionData(s,this.getState(t),this.getState(i),r,o);l.set(s,y)}else!this.hasState(t)&&!this.hasState(i)?console.error("Can't add transition:",s,"- from state not found:",t,"- to state not found:",i):this.hasState(t)?this.hasState(i)||console.error("Can't add transition:",s,"- to state not found:",i):console.error("Can't add transition:",s,"- from state not found:",t)}init(t,i=null,...s){let n=i;if(i&&typeof i=="function"&&(n={},n.performInit=i),this.hasState(t)){let o=this._myStateMap.get(t);if(this._myDebugLogActive&&console.log(this._myDebugLogName,"- Init:",t),n&&n.performInit?n.performInit(this,o,...s):o.myObject&&o.myObject.init&&o.myObject.init(this,o,...s),this._myCurrentStateData=o,this._myInitCallbacks.size>0&&this._myInitCallbacks.forEach(function(r){r(this,o,n,...s)}.bind(this)),this._myInitIDCallbacks.size>0){let r=this._myInitIDCallbacks.get(t);r?.forEach(function(l){l(this,o,n,...s)}.bind(this))}}else this._myDebugLogActive&&console.warn(this._myDebugLogName,"- Init state not found:",t)}update(t,...i){if(this._myPendingPerforms.length>0){for(let s=0;s=0}hasTransitionFromStateToState(t,i,s=null){let n=this.getTransitionsFromStateToState(t,i),o=!1;return s?o=n.findIndex(function(l){return l.myID==s})>=0:o=n.length>0,o}setPerformType(t){this._myPerformType=t}getPerformType(){return this._myPerformType}setPerformDelayedType(t){this._myPerformDelayedType=t}getPerformDelayedType(){return this._myPerformDelayedType}hasPendingPerforms(){return this._myPendingPerforms.length>0}getPendingPerforms(){return this._myPendingPerforms.slice(0)}clone(t=!1){if(!this.isCloneable(t))return null;let i=new PP.FSM;i._myDebugLogActive=this._myDebugLogActive,i._myDebugShowDelayedInfo=this._myDebugShowDelayedInfo,i._myDebugLogName=this._myDebugLogName.slice(0),i._myPerformType=this._myPerformType,i._myPerformDelayedType=this._myPerformDelayedType,i._myPendingPerforms=this._myPendingPerforms.slice(0);for(let s of this._myStateMap.entries()){let n=null;t?n=new PP.StateData(s[1].myID,s[1].myObject.clone()):n=new PP.StateData(s[1].myID,s[1].myObject),i._myStateMap.set(n.myID,n)}for(let s of this._myTransitionMap.entries()){let n=new Map;i._myTransitionMap.set(s[0],n);for(let o of s[1].entries()){let r=null,l=i.getState(o[1].myFromState.myID),y=i.getState(o[1].myToState.myID);t?r=new PP.TransitionData(o[1].myID,l,y,o[1].myObject.clone(),o[1].mySkipStateFunction):r=new PP.TransitionData(o[1].myID,l,y,o[1].myObject,o[1].mySkipStateFunction),n.set(r.myID,r)}}return this._myCurrentStateData&&(i._myCurrentStateData=i.getState(this._myCurrentStateData.myID)),i}isCloneable(t=!1){if(!t)return!0;let i=!0;for(let s of this._myStateMap.entries())i=i&&s[1].myObject.clone!=null;for(let s of this._myTransitionMap.entries())for(let n of s[1].entries())i=i&&n[1].myObject.clone!=null;return i}setDebugLogActive(t,i=null,s=!1){this._myDebugLogActive=t,this._myDebugShowDelayedInfo=s,i&&(this._myDebugLogName="FSM: ".concat(i))}registerInitEventListener(t,i){this._myInitCallbacks.set(t,i)}unregisterInitEventListener(t){this._myInitCallbacks.delete(t)}registerInitIDEventListener(t,i,s){let n=this._myInitIDCallbacks.get(t);n==null&&(this._myInitIDCallbacks.set(t,new Map),n=this._myInitIDCallbacks.get(t)),n.set(i,s)}unregisterInitIDEventListener(t,i){let s=this._myInitIDCallbacks.get(t);s!=null&&(s.delete(i),s.size<=0&&this._myInitIDCallbacks.delete(t))}registerTransitionEventListener(t,i){this._myTransitionCallbacks.set(t,i)}unregisterTransitionEventListener(t){this._myTransitionCallbacks.delete(t)}registerTransitionIDEventListener(t,i,s,n,o){let r=null;for(let l of this._myTransitionIDCallbacks)if(l[0]==t&&l[1]==i&&l[2]==s){r=l[3];break}if(r==null){let l=[];l[0]=t,l[1]=i,l[2]=s,l[3]=new Map,r=l[3],this._myTransitionIDCallbacks.push(l)}r.set(n,o)}unregisterTransitionIDEventListener(t,i,s,n){let o=null;for(let r of this._myTransitionIDCallbacks)if(r[0]==t&&r[1]==i&&r[2]==s){o=r[3];break}o!=null&&(o.delete(n),o.size<=0&&this._myTransitionIDCallbacks.pp_remove(r=>r[0]==t&&r[1]==i&&r[2]==s))}_perform(t,i,...s){if(this.isPerformingTransition()){let n=this.getCurrentlyPerformedTransition(),o=[this._myDebugLogName,"- Trying to perform:",t];return this._myDebugShowDelayedInfo&&o.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),o.push("- But another transition is currently being performed -",n.myID),console.warn(...o),!1}if(this._myCurrentStateData){if(this.canPerform(t)){let o=this._myTransitionMap.get(this._myCurrentStateData.myID).get(t);this._myCurrentlyPerformedTransition=o;let r=this._myCurrentStateData,l=this._myStateMap.get(o.myToState.myID);if(this._myDebugLogActive){let y=[this._myDebugLogName,"- From:",r.myID,"- To:",l.myID,"- With:",t];this._myDebugShowDelayedInfo&&y.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),console.log(...y)}if(o.mySkipStateFunction!=PP.SkipStateFunction.END&&o.mySkipStateFunction!=PP.SkipStateFunction.BOTH&&r.myObject&&r.myObject.end&&r.myObject.end(this,o,...s),o.myObject&&o.myObject.perform&&o.myObject.perform(this,o,...s),o.mySkipStateFunction!=PP.SkipStateFunction.START&&o.mySkipStateFunction!=PP.SkipStateFunction.BOTH&&l.myObject&&l.myObject.start&&l.myObject.start(this,o,...s),this._myCurrentStateData=o.myToState,this._myTransitionCallbacks.size>0&&this._myTransitionCallbacks.forEach(function(y){y(this,r,l,o,i,...s)}.bind(this)),this._myTransitionIDCallbacks.length>0){let y=[];for(let c of this._myTransitionIDCallbacks)(c[0]==null||c[0]==r.myID)&&(c[1]==null||c[1]==l.myID)&&(c[2]==null||c[2]==o.myID)&&y.push(c[3]);for(let c of this.transitionIDMaps)c.forEach(function(a){a(this,r,l,o,i,...s)}.bind(this))}return this._myCurrentlyPerformedTransition=null,!0}else if(this._myDebugLogActive){let n=[this._myDebugLogName,"- No Transition:",t,"- From:",this._myCurrentStateData.myID];this._myDebugShowDelayedInfo&&n.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),console.warn(...n)}}else if(this._myDebugLogActive){let n=[this._myDebugLogName,"- FSM not initialized yet"];this._myDebugShowDelayedInfo&&n.push(i==PP.PerformType.DELAYED?"- Delayed":"- Immediate"),console.warn(...n)}return!1}_getTransitionMapFromState(t){return this._myTransitionMap.get(t)}}});var mi=T(()=>{PP.State=class{update(t,i,...s){}init(t,i,...s){}start(t,i,...s){}end(t,i,...s){}}});var yi=T(()=>{PP.Transition=class{performInit(t,i,...s){}perform(t,i,...s){}}});var ui=T(()=>{PP.TimerState=class extends PP.State{constructor(t=0,i=null,...s){super(),this._myTransitionToPerformOnEnd=i,this._myTransitionArgs=s,this._myTimer=new PP.Timer(t,!1)}setDuration(t){this._myTimer.setDuration(t)}setTransitionToPerformOnEnd(t,...i){this._myTransitionToPerformOnEnd=t,this._myTransitionArgs=i}onEnd(t,i=null){this._myTimer.onEnd(t,i)}unregisterOnEnd(t=null){this._myTimer.unregisterOnEnd(t)}update(t,i){this._myTimer.update(t),this._myTimer.isDone()&&this._myTransitionToPerformOnEnd!=null&&i.perform(this._myTransitionToPerformOnEnd,...this._myTransitionArgs)}start(t,i,s=null,n=null,...o){this._myTimer.start(s),n!=null&&(this._myTransitionToPerformOnEnd=n,this._myTransitionArgs=o)}init(t,i,s=null,n=null,...o){this._myTimer.start(s),n!=null&&(this._myTransitionToPerformOnEnd=n,this._myTransitionArgs=o)}}});var ci=T(()=>{PP.CAUtils={_myDummyServer:null,_myUseDummyServerOnSDKMissing:!1,_myUseDummyServerOnError:!1,setUseDummyServerOnSDKMissing:function(e){PP.CAUtils._myUseDummyServerOnSDKMissing=e},setUseDummyServerOnError:function(e){PP.CAUtils._myUseDummyServerOnError=e},setDummyServer:function(e){PP.CAUtils._myDummyServer=e},isUseDummyServerOnSDKMissing:function(){return PP.CAUtils._myUseDummyServerOnSDKMissing},isUseDummyServerOnError:function(){return PP.CAUtils._myUseDummyServerOnError},getDummyServer:function(){return PP.CAUtils._myDummyServer},isSDKAvailable:function(){return"casdk"in window},getLeaderboard:function(e,t,i,s,n,o,r=null){if(PP.CAUtils.isSDKAvailable())i?PP.CAUtils.getUser(function(l){let y=l.displayName;casdk.getLeaderboard(e,t,i,s).then(function(c){if(c.leaderboard){let a=!1;for(let m of c.leaderboard)if(m.displayName==y&&m.score!=0){a=!0;break}if(a)n&&n(c.leaderboard);else if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let m={};m.reason="Searching for around player but the user has not submitted a score yet",m.type=PP.CAUtils.ErrorType.USER_HAS_NO_SCORE,o(m,c)}}else if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let a={};a.reason="Get leaderboard failed",a.type=PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED,o(a,c)}})},function(){if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let l={};l.reason="Searching for around player but the user can't be retrieved",l.type=PP.CAUtils.ErrorType.GET_USER_FAILED,o(l,result)}},!1):casdk.getLeaderboard(e,t,i,s).then(function(l){if(l.leaderboard)n&&n(l.leaderboard);else if(PP.CAUtils._myUseDummyServerOnError&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let y={};y.reason="Get leaderboard failed",y.type=PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED,o(y,l)}});else if(PP.CAUtils._myUseDummyServerOnSDKMissing&&r==null||r!=null&&r)PP.CAUtils.getLeaderboardDummy(e,t,i,s,n,o);else if(o){let l={};l.reason="Construct Arcade SDK missing",l.type=PP.CAUtils.ErrorType.CA_SDK_MISSING,o(l,null)}},getLeaderboardDummy(e,t,i,s,n,o){if(PP.CAUtils._myDummyServer)PP.CAUtils._myDummyServer.getLeaderboard(e,t,i,s,n,o);else if(o){let r={};r.reason="Dummy server not initialized",r.type=PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED,o(r)}},submitScore:function(e,t,i,s,n=null){if(PP.CAUtils.isSDKAvailable())casdk.submitScore(e,t).then(function(o){if(o.error){if(PP.CAUtils._myUseDummyServerOnError&&n==null||n!=null&&n)PP.CAUtils.submitScoreDummy(e,t,i,s);else if(s){let r={};r.reason="Submit score failed",r.type=PP.CAUtils.ErrorType.SUBMIT_SCORE_FAILED,s(r,o)}}else i()});else if(PP.CAUtils._myUseDummyServerOnSDKMissing&&n==null||n!=null&&n)PP.CAUtils.submitScoreDummy(e,t,i,s);else if(s){let o={};o.reason="Construct Arcade SDK missing",o.type=PP.CAUtils.ErrorType.CA_SDK_MISSING,s(o,null)}},submitScoreDummy(e,t,i,s){if(PP.CAUtils._myDummyServer)PP.CAUtils._myDummyServer.submitScore(e,t,i,s);else if(s){let n={};n.reason="Dummy server not initialized",n.type=PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED,s(n)}},getUser:function(e,t,i=null){if(PP.CAUtils.isSDKAvailable())casdk.getUser().then(function(s){if(s.user)e&&e(s.user);else if(PP.CAUtils._myUseDummyServerOnError&&i==null||i!=null&&i)PP.CAUtils.getUserDummy(e,t);else if(t){let n={};n.reason="Get user failed",n.type=PP.CAUtils.ErrorType.GET_USER_FAILED,t(n,s)}});else if(PP.CAUtils._myUseDummyServerOnSDKMissing&&i==null||i!=null&&i)PP.CAUtils.getUserDummy(e,t);else if(t){let s={};s.reason="Construct Arcade SDK missing",s.type=PP.CAUtils.ErrorType.CA_SDK_MISSING,t(s,null)}},getUserDummy(e,t){if(PP.CAUtils._myDummyServer)PP.CAUtils._myDummyServer.getUser(e,t);else if(t){let i={};i.reason="Dummy server not initialized",i.type=PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED,t(i)}},ErrorType:{DUMMY_NOT_INITIALIZED:0,CA_SDK_MISSING:1,SUBMIT_SCORE_FAILED:2,GET_LEADERBOARD_FAILED:3,GET_USER_FAILED:4,USER_HAS_NO_SCORE:5}};PP.CADummyServer=class{constructor(){}getLeaderboard(t,i,s,n,o,r){let l=null;for(s?l=[{rank:7,displayName:"Player 1",score:1e6},{rank:8,displayName:"Player 2",score:1e6},{rank:9,displayName:"Player 3",score:9e5},{rank:10,displayName:"Player 4",score:8e5},{rank:11111,displayName:"Player 5",score:7e7},{rank:22222,displayName:"VeryLongName_06",score:6e5},{rank:33333,displayName:"Player 7",score:5e5},{rank:44444,displayName:"Player 8",score:4e5},{rank:55555,displayName:"Player 9",score:3e5},{rank:66666,displayName:"Player 10",score:2e5}]:l=[{rank:0,displayName:"Player 1",score:1e6},{rank:1,displayName:"Player 2",score:1e6},{rank:2,displayName:"Player 3",score:9e5},{rank:3,displayName:"Player 4",score:8e5},{rank:4,displayName:"Player 5",score:7e5},{rank:5,displayName:"Player 6",score:6e5},{rank:6,displayName:"Player 7",score:5e5},{rank:7,displayName:"Player 8",score:4e5},{rank:8,displayName:"Player 9",score:3e5},{rank:9,displayName:"Player 10",score:2e5}];l.length>n;)l.pop();o&&o(l)}submitScore(t,i,s,n){s&&s()}getUser(t,i){let s={};s.displayName="Jonathan",t&&t(s)}}});var hi=T(()=>{PP.ColorUtils={rgbToHsv:function(e){let t=e.pp_clone(),i=e[0],s=e[1],n=e[2];var o=Math.max(i,s,n),r=Math.min(i,s,n),l=o-r,y,c=o===0?0:l/o,a=o;switch(o){case r:y=0;break;case i:y=s-n+l*(s{PP.MeshCreationVertexParams=class{constructor(){this.myPosition=null,this.myTextureCoordinates=null,this.myNormal=null,this.myColor=null}};PP.MeshCreationTriangleParams=class{constructor(){this.myIndexes=new Uint32Array(3)}};PP.MeshCreationParams=class{constructor(){this.myVertexes=[],this.myTriangles=[]}};PP.MeshUtils={createPlaneMesh:function(){let e=4,t=new PP.MeshCreationParams;for(let o=0;o>1)*2,r.myPosition[2]=0,r.myTextureCoordinates=new PP.vec2_create,r.myTextureCoordinates[0]=o&1,r.myTextureCoordinates[1]=(o&2)>>1,r.myNormal=new PP.vec3_create,r.myNormal[0]=0,r.myNormal[1]=0,r.myNormal[2]=1,t.myVertexes.push(r)}let i=new PP.MeshCreationTriangleParams;i.myIndexes[0]=0,i.myIndexes[1]=1,i.myIndexes[2]=2;let s=new PP.MeshCreationTriangleParams;return s.myIndexes[0]=2,s.myIndexes[1]=1,s.myIndexes[2]=3,t.myTriangles.push(i),t.myTriangles.push(s),PP.MeshUtils.createMesh(t)},createMesh:function(e){let t=[];for(let c of e.myTriangles)t.push(c.myIndexes[0]),t.push(c.myIndexes[1]),t.push(c.myIndexes[2]);let i=new Uint32Array(t.length);i.pp_copy(t);let s=e.myVertexes.length,n=new WL.Mesh({vertexCount:s,indexData:i,indexType:WL.MeshIndexType.UnsignedInt}),o=null,r=null,l=null,y=null;try{o=n.attribute(WL.MeshAttribute.Position)}catch{o=null}try{r=n.attribute(WL.MeshAttribute.TextureCoordinate)}catch{r=null}try{l=n.attribute(WL.MeshAttribute.Normal)}catch{l=null}try{y=n.attribute(WL.MeshAttribute.Color)}catch{y=null}for(let c=0;c{PP.SaveUtils={save:function(e,t){t!=null&&localStorage.setItem(e,t)},has:function(e){return PP.SaveUtils.loadString(e,null)!=null},delete:function(e){return localStorage.removeItem(e)},clear:function(){return localStorage.clear()},load:function(e,t=null){return PP.SaveUtils.loadString(e,t)},loadString:function(e,t=null){let i=localStorage.getItem(e);return i==null&&(i=t),i},loadNumber:function(e,t=null){let i=PP.SaveUtils.loadString(e);return i!=null?Number(i):t},loadBool:function(e,t=null){let i=PP.SaveUtils.loadString(e);return i=="true"?!0:i=="false"?!1:t}}});var _i=T(()=>{PP.TextUtils={setClonedMaterials:function(e){let t=e.pp_getComponentsHierarchy("text");for(let i of t)i.material=i.material.clone()}}});var Pi=T(()=>{PP.XRUtils={isDeviceEmulated:function(){return"CustomWebXRPolyfill"in window},isXRSessionActive:function(){return WL.xrSession!=null},isReferenceSpaceLocalFloor:function(){return!["local","viewer"].includes(WebXR.refSpace)}}});var gi=T(()=>{PP.PhysicsUtils={_myLayerFlagAmount:8,_myLayerFlagNames:["0","1","2","3","4","5","6","7"],setLayerFlagAmount:function(e){PP.PhysicsUtils._myLayerFlagAmount=e},setLayerFlagNames:function(e){PP.PhysicsUtils._myLayerFlagNames=e},getLayerFlagAmount:function(){return PP.PhysicsUtils._myLayerFlagAmount},getLayerFlagNames:function(){return PP.PhysicsUtils._myLayerFlagNames},raycast:function(){let e=(t,i)=>t.pp_equals(i);return function(i,s=new PP.RaycastResult){let n=WL.physics.rayCast(i.myOrigin,i.myDirection,i.myBlockLayerFlags.getMask(),i.myDistance);s.myRaycastSetup=i;let o=0,r=0;for(let l=0;l0?(a=s._myUnusedHits.pop(),s.myHits.push(a)):(a=new PP.RaycastHit,s.myHits.push(a)),a.myPosition.vec3_copy(n.locations[l]),a.myNormal.vec3_copy(n.normals[l]),a.myDistance=n.distances[l],a.myObject=n.objects[l],a.myIsInsideCollision=c,r++,o++}}if(s.myHits.length>r){s._myUnusedHits==null&&(s._myUnusedHits=[]);let l=s.myHits.length-r;for(let y=0;y{PP.RaycastSetup=class{constructor(){this.myOrigin=[0,0,0],this.myDirection=[0,0,0],this.myDistance=0,this.myBlockLayerFlags=new PP.PhysicsLayerFlags,this.myObjectsToIgnore=[],this.myIgnoreHitsInsideCollision=!1}copy(t){this.myOrigin.vec3_copy(t.myOrigin),this.myDirection.vec3_copy(t.myDirection),this.myDistance=t.myDistance,this.myBlockLayerFlags.copy(t.myBlockLayerFlags),this.myObjectsToIgnore.pp_copy(t.myObjectsToIgnore),this.myIgnoreHitsInsideCollision=t.myIgnoreHitsInsideCollision}};PP.RaycastResult=class{constructor(){this.myRaycastSetup=null,this.myHits=[],this._myUnusedHits=null}isColliding(t=!1){return t?this.getFirstHitOutsideCollision()!=null:this.myHits.length>0}getFirstHitInsideCollision(){let t=null;for(let i of this.myHits)if(i.myIsInsideCollision){t=i;break}return t}getFirstHitOutsideCollision(){let t=null;for(let i of this.myHits)if(!i.myIsInsideCollision){t=i;break}return t}getHitsInsideCollision(){let t=[];for(let i of this.myHits)i.myIsInsideCollision&&t.push(i);return t}getHitsOutsideCollision(){let t=[];for(let i of this.myHits)i.myIsInsideCollision||t.push(i);return t}removeHit(t){let i=this.myHits.pp_removeIndex(t);return i!=null&&(this._myUnusedHits==null&&(this._myUnusedHits=[]),this._myUnusedHits.push(i)),i}copy(t){}};PP.RaycastResult.prototype.copy=function(){let e=function(t,i){return t==null&&(t=new PP.RaycastHit),t.copy(i),t};return function(i){if(i.myRaycastSetup==null?this.myRaycastSetup=null:(this.myRaycastSetup==null&&(this.myRaycastSetup=new PP.RaycastSetup),this.myRaycastSetup.copy(i.myRaycastSetup)),this.myHits.length>i.myHits.length){this._myUnusedHits==null&&(this._myUnusedHits=[]);for(let s=0;s{PP.PhysicsLayerFlags=class{constructor(){this._myLayerMask=0}setFlagActive(t,i){let s=t;if(isNaN(t)&&(s=PP.PhysicsUtils.getLayerFlagNames().pp_findIndexEqual(t)),s>=0&&s=0&&i{PP.VisualManager=class{constructor(){this._myVisualElementTypeMap=new Map,this._myVisualElementLastID=0,this._myVisualElementsPool=new PP.ObjectPoolManager,this._myVisualElementsToShow=[],this._myActive=!0}setActive(t){this._myActive!=t&&(this._myActive=t,this._myActive||this.clearDraw())}isActive(){return this._myActive}start(){}update(t){this._updateDraw(t)}draw(t,i=0,s=null){if(!this._myActive)return 0;let n=null,o=!1;if(s!=null&&this._myVisualElementTypeMap.has(t.myType)){let y=this._myVisualElementTypeMap.get(t.myType);y.has(s)&&(n=y.get(s)[0],n.setParams(t),n.setVisible(!1),o=!0)}if(n==null&&(n=this._getVisualElement(t)),n==null)return console.error("Couldn't create the requested visual element"),null;this._myVisualElementTypeMap.has(t.myType)||this._myVisualElementTypeMap.set(t.myType,new Map);let r=this._myVisualElementTypeMap.get(t.myType),l=null;if(!o)l=this._myVisualElementLastID+1,this._myVisualElementLastID=l,r.set(l,[n,new PP.Timer(i,i!=null)]);else{l=s;let y=r.get(l);y[0]=n,y[1].reset(i),i!=null&&y[1].start()}return this._myVisualElementsToShow.push(n),l}getDraw(t){let i=null;for(let s of this._myVisualElementTypeMap.values())if(s.has(t)){i=s.get(t)[0];break}return i}clearDraw(t=null){if(t==null){for(let i of this._myVisualElementTypeMap.values())for(let s of i.values())this._myVisualElementsPool.releaseObject(s[0].getParams().myType,s[0]);this._myVisualElementsToShow=[],this._myVisualElementTypeMap=new Map,this._myVisualElementLastID=0}else for(let i of this._myVisualElementTypeMap.values())if(i.has(t)){let s=i.get(t);this._myVisualElementsPool.releaseObject(s[0].getParams().myType,s[0]),i.delete(t),this._myVisualElementsToShow.pp_removeEqual(s[0]);break}}allocateDraw(t,i){this._myVisualElementsPool.hasPool(t)||this._addVisualElementTypeToPool(t);let s=this._myVisualElementsPool.getPool(t),n=s.getAvailableSize()-i;n<0&&s.increase(-n)}_updateDraw(t){for(let i of this._myVisualElementsToShow)i.setVisible(!0);this._myVisualElementsToShow=[];for(let i of this._myVisualElementTypeMap.values()){let s=[];for(let n of i.entries()){let o=n[1];o[1].isDone()&&(this._myVisualElementsPool.releaseObject(o[0].getParams().myType,o[0]),s.push(n[0])),o[1].update(t)}for(let n of s)i.delete(n)}}_getVisualElement(t){let i=null;return this._myVisualElementsPool.hasPool(t.myType)||this._addVisualElementTypeToPool(t.myType),i=this._myVisualElementsPool.getObject(t.myType),i?.setParams(t),i}_addVisualElementTypeToPool(t){let i=new PP.ObjectPoolParams;i.myInitialPoolSize=10,i.myPercentageToAddWhenEmpty=1,i.myEnableDebugLog=!1,i.mySetActiveCallback=function(n,o){n.setVisible(o)};let s=null;switch(t){case PP.VisualElementType.LINE:s=new PP.VisualLine;break;case PP.VisualElementType.MESH:s=new PP.VisualMesh;break;case PP.VisualElementType.POINT:s=new PP.VisualPoint;break;case PP.VisualElementType.ARROW:s=new PP.VisualArrow;break;case PP.VisualElementType.TEXT:s=new PP.VisualText;break;case PP.VisualElementType.TRANSFORM:s=new PP.VisualTransform;break;case PP.VisualElementType.RAYCAST:s=new PP.VisualRaycast;break;case PP.VisualElementType.TORUS:s=new PP.VisualTorus;break}s.setVisible(!1),s.setAutoRefresh(!0),s!=null?this._myVisualElementsPool.addPool(t,s,i):console.error("Visual element type not supported")}}});var bi=T(()=>{PP.VisualElementType={MESH:0,LINE:1,POINT:2,TEXT:3,ARROW:4,TRANSFORM:5,RAYCAST:6,TORUS:7}});var Si=T(()=>{PP.VisualLineParams=class{constructor(){this.myStart=[0,0,0],this.myDirection=[0,0,1],this.myLength=0,this.myThickness=.005,this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.LINE}setStartEnd(t,i){return i.vec3_sub(t,this.myDirection),this.myLength=this.myDirection.vec3_length(),this.myDirection.vec3_normalize(this.myDirection),this.myStart.vec3_copy(t),this}};PP.VisualLine=class{constructor(t=new PP.VisualLineParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myLineRootObject=null,this._myLineObject=null,this._myLineMeshComponent=null,this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myLineRootObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_build(){this._myLineRootObject=WL.scene.addObject(null),this._myLineObject=WL.scene.addObject(this._myLineRootObject),this._myLineMeshComponent=this._myLineObject.addComponent("mesh"),this._myLineMeshComponent.mesh=PP.myDefaultResources.myMeshes.myCylinder}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualLineParams;t.myStart.vec3_copy(this._myParams.myStart),t.myDirection.vec3_copy(this._myParams.myDirection),t.myLength=this._myParams.myLength,t.myThickness=this._myParams.myThickness,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualLine(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}};PP.VisualLine.prototype._refresh=function(){let e=PP.vec3_create(),t=PP.vec3_create(),i=PP.vec3_create(0,0,1);return function(){this._myLineRootObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myLineRootObject.pp_setPositionLocal(this._myParams.myStart),this._myLineObject.pp_resetPositionLocal(),this._myLineObject.pp_resetScaleLocal(),e.vec3_set(this._myParams.myThickness/2,this._myParams.myLength/2,this._myParams.myThickness/2),this._myLineObject.pp_scaleObject(e),this._myLineObject.pp_setUpLocal(this._myParams.myDirection,i),t.vec3_set(0,this._myParams.myLength/2,0),this._myLineObject.pp_translateObject(t),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myLineMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:(this._myFlatOpaqueMaterial==null&&(this._myFlatOpaqueMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone()),this._myLineMeshComponent.material=this._myFlatOpaqueMaterial,this._myFlatOpaqueMaterial.color=this._myParams.myColor):this._myLineMeshComponent.material=this._myParams.myMaterial}}();Object.defineProperty(PP.VisualLine.prototype,"_refresh",{enumerable:!1})});var vi=T(()=>{PP.VisualMeshParams=class{constructor(){this.myTransform=PP.mat4_create(),this.myMesh=null,this.myMaterial=null,this.myParent=null,this.myType=PP.VisualElementType.MESH}};PP.VisualMesh=class{constructor(t=new PP.VisualMeshParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myMeshObject=null,this._myMeshComponent=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myMeshObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_refresh(){this._myMeshObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myMeshObject.pp_setTransformLocal(this._myParams.myTransform),this._myParams.myMesh==null?this._myMeshComponent.mesh=PP.myDefaultResources.myMeshes.mySphere:this._myMeshComponent.mesh=this._myParams.myMesh,this._myParams.myMaterial==null?this._myMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:this._myMeshComponent.material=this._myParams.myMaterial}_build(){this._myMeshObject=WL.scene.addObject(null),this._myMeshComponent=this._myMeshObject.addComponent("mesh")}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualMeshParams;t.myTransform.pp_copy(this._myParams.myTransform),this._myParams.myMesh!=null?t.myMesh=this._myParams.myMesh:t.myMesh=null,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,t.myParent=this._myParams.myParent;let i=new PP.VisualMesh(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}}});var xi=T(()=>{PP.VisualPointParams=class{constructor(){this.myPosition=[0,0,0],this.myRadius=.005,this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.POINT}};PP.VisualPoint=class{constructor(t=new PP.VisualPointParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myPointObject=null,this._myPointMeshComponent=null,this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myPointObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_refresh(){this._myPointObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myPointObject.pp_setPositionLocal(this._myParams.myPosition),this._myPointObject.pp_setScaleLocal(this._myParams.myRadius),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myPointMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:(this._myFlatOpaqueMaterial==null&&(this._myFlatOpaqueMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone()),this._myPointMeshComponent.material=this._myFlatOpaqueMaterial,this._myFlatOpaqueMaterial.color=this._myParams.myColor):this._myPointMeshComponent.material=this._myParams.myMaterial}_build(){this._myPointObject=WL.scene.addObject(null),this._myPointMeshComponent=this._myPointObject.addComponent("mesh"),this._myPointMeshComponent.mesh=PP.myDefaultResources.myMeshes.mySphere}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualPointParams;t.myPosition.vec3_copy(this._myParams.myPosition),t.myRadius=this._myParams.myRadius,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualPoint(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}}});var Mi=T(()=>{PP.VisualArrowParams=class extends PP.VisualLineParams{constructor(){super(),this.myType=PP.VisualElementType.ARROW}};PP.VisualArrow=class{constructor(t=new PP.VisualArrowParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myVisualLine=new PP.VisualLine,this._myVisualLine.setAutoRefresh(!1),this._myArrowRootObject=null,this._myArrowObject=null,this._myArrowMeshComponent=null,this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myVisualLine.setVisible(t),this._myArrowRootObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh(),this._myVisualLine.forceRefresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1),this._myVisualLine.update(t)}_build(){this._myArrowRootObject=WL.scene.addObject(null),this._myArrowObject=WL.scene.addObject(this._myArrowRootObject),this._myArrowMeshComponent=this._myArrowObject.addComponent("mesh"),this._myArrowMeshComponent.mesh=PP.myDefaultResources.myMeshes.myCone}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualArrowParams;t.myStart.vec3_copy(this._myParams.myStart),t.myDirection.vec3_copy(this._myParams.myDirection),t.myLength=this._myParams.myLength,t.myThickness=this._myParams.myThickness,this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualArrow(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}};PP.VisualArrow.prototype._refresh=function(){let e=PP.vec3_create(),t=PP.vec3_create(),i=PP.vec3_create(),s=PP.vec3_create(),n=PP.vec3_create(0,0,1);return function(){this._myArrowRootObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myParams.myDirection.vec3_scale(Math.max(.001,this._myParams.myLength-this._myParams.myThickness*4),e),e.vec3_add(this._myParams.myStart,e),this._myArrowRootObject.pp_setPositionLocal(e),this._myArrowRootObject.pp_setUpLocal(this._myParams.myDirection,n),t.vec3_set(0,this._myParams.myThickness*2-1e-5,0),this._myArrowRootObject.pp_translateObject(t),this._myArrowObject.pp_resetScaleLocal(),i.vec3_set(this._myParams.myThickness*1.25,this._myParams.myThickness*2,this._myParams.myThickness*1.25),this._myArrowObject.pp_scaleObject(i),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myArrowMeshComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial:(this._myFlatOpaqueMaterial==null&&(this._myFlatOpaqueMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone()),this._myArrowMeshComponent.material=this._myFlatOpaqueMaterial,this._myFlatOpaqueMaterial.color=this._myParams.myColor):this._myArrowMeshComponent.material=this._myParams.myMaterial,s=e.vec3_sub(this._myParams.myStart,s);let r=this._myVisualLine.getParams();r.myStart.vec3_copy(this._myParams.myStart),r.myDirection=s.vec3_normalize(r.myDirection),r.myLength=s.vec3_length(),r.myThickness=this._myParams.myThickness,r.myMaterial=this._myArrowMeshComponent.material,r.myParent=this._myParams.myParent,this._myVisualLine.paramsUpdated()}}();Object.defineProperty(PP.VisualArrow.prototype,"_refresh",{enumerable:!1})});var Bi=T(()=>{PP.VisualTextParams=class{constructor(){this.myText="",this.myAlignment=WL.Alignment.Center,this.myJustification=WL.Justification.Middle,this.myTransform=PP.mat4_create(),this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.TEXT}};PP.VisualText=class{constructor(t=new PP.VisualTextParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myTextObject=null,this._myTextComponent=null,this._myTextMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myTextObject.pp_setActive(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1)}_refresh(){this._myTextObject.pp_setParent(this._myParams.myParent==null?PP.myVisualData.myRootObject:this._myParams.myParent,!1),this._myTextObject.pp_setTransformLocal(this._myParams.myTransform),this._myParams.myMaterial==null?this._myParams.myColor==null?this._myTextComponent.material=PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial:(this._myTextMaterial==null&&(this._myTextMaterial=PP.myDefaultResources.myMaterials.myText.clone()),this._myTextComponent.material=this._myTextMaterial,this._myTextMaterial.color=this._myParams.myColor):this._myTextComponent.material=this._myParams.myMaterial,this._myTextComponent.text=this._myParams.myText,this._myTextComponent.alignment=this._myParams.myAlignment,this._myTextComponent.justification=this._myParams.myJustification,this._myDirty=!1}_build(){this._myTextObject=WL.scene.addObject(null),this._myTextComponent=this._myTextObject.addComponent("text")}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualTextParams;t.myText=this._myParams.myText,t.myAlignment=this._myParams.myAlignment,t.myJustification=this._myParams.myJustification,t.myTransform.mat4_copy(this._myParams.myTransform),this._myParams.myMaterial!=null?t.myMaterial=this._myParams.myMaterial.clone():t.myMaterial=null,this._myParams.myColor!=null?t.myColor.vec4_copy(this._myParams.myColor):t.myColor=null,t.myParent=this._myParams.myParent;let i=new PP.VisualText(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}}});var Li=T(()=>{PP.VisualTransformParams=class{constructor(){this.myTransform=PP.mat4_create(),this.myLength=.2,this.myThickness=.005,this.myForwardMaterial=null,this.myUpMaterial=null,this.myRightMaterial=null,this.myParent=null,this.myType=PP.VisualElementType.TRANSFORM}};PP.VisualTransform=class{constructor(t=new PP.VisualTransformParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myVisualRight=new PP.VisualArrow,this._myVisualUp=new PP.VisualArrow,this._myVisualForward=new PP.VisualArrow,this._myVisualRight.setAutoRefresh(!1),this._myVisualUp.setAutoRefresh(!1),this._myVisualForward.setAutoRefresh(!1),this.setVisible(!0)}setVisible(t){this._myVisible!=t&&(this._myVisible=t,this._myVisualRight.setVisible(t),this._myVisualUp.setVisible(t),this._myVisualForward.setVisible(t))}setAutoRefresh(t){this._myAutoRefresh=t}getParams(){return this._myParams}setParams(t){this._myParams=t,this._markDirty()}paramsUpdated(){this._markDirty()}refresh(){this.update(0)}forceRefresh(){this._refresh(),this._myVisualRight.forceRefresh(),this._myVisualUp.forceRefresh(),this._myVisualForward.forceRefresh()}update(t){this._myDirty&&(this._refresh(),this._myDirty=!1),this._myVisualRight.update(t),this._myVisualUp.update(t),this._myVisualForward.update(t)}_markDirty(){this._myDirty=!0,this._myAutoRefresh&&this.update(0)}clone(){let t=new PP.VisualTransformParams;t.myTransform.mat4_copy(this._myParams.myTransform),t.myLength=this._myParams.myLength,t.myThickness=this._myParams.myThickness,this._myParams.myRightMaterial!=null?t.myRightMaterial=this._myParams.myRightMaterial.clone():t.myRightMaterial=null,this._myParams.myUpMaterial!=null?t.myUpMaterial=this._myParams.myUpMaterial.clone():t.myUpMaterial=null,this._myParams.myForwardMaterial!=null?t.myForwardMaterial=this._myParams.myForwardMaterial.clone():t.myForwardMaterial=null,t.myParent=this._myParams.myParent;let i=new PP.VisualTransform(t);return i.setAutoRefresh(this._myAutoRefresh),i.setVisible(this._myVisible),i._myDirty=this._myDirty,i}};PP.VisualTransform.prototype._refresh=function(){let e=[PP.vec3_create(),PP.vec3_create(),PP.vec3_create()],t=PP.vec3_create(),i=PP.vec3_create();return function(){e=this._myParams.myTransform.mat4_getAxes(e),t=this._myParams.myTransform.mat4_getScale(t);let n=0;for(let o of t)n=Math.max(o,n);n==0?(t[0]=1,t[1]=1,t[2]=1):(t[0]=t[0]/n,t[1]=t[1]/n,t[2]=t[2]/n),i=this._myParams.myTransform.mat4_getPosition(i);{let o=this._myVisualRight.getParams();o.myStart.vec3_copy(i),o.myDirection=e[0].vec3_negate(o.myDirection).vec3_normalize(o.myDirection),o.myLength=Math.max(this._myParams.myLength*t[0],.001),o.myThickness=this._myParams.myThickness,this._myParams.myRightMaterial==null?o.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial:o.myMaterial=this._myParams.myRightMaterial,o.myParent=this._myParams.myParent,this._myVisualRight.paramsUpdated()}{let o=this._myVisualUp.getParams();o.myStart.vec3_copy(i),o.myDirection=e[1].vec3_normalize(o.myDirection),o.myLength=Math.max(this._myParams.myLength*t[1],.001),o.myThickness=this._myParams.myThickness,this._myParams.myUpMaterial==null?o.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial:o.myMaterial=this._myParams.myUpMaterial,o.myParent=this._myParams.myParent,this._myVisualUp.paramsUpdated()}{let o=this._myVisualForward.getParams();o.myStart.vec3_copy(i),o.myDirection=e[2].vec3_normalize(o.myDirection),o.myLength=Math.max(this._myParams.myLength*t[2],.001),o.myThickness=this._myParams.myThickness,this._myParams.myForwardMaterial==null?o.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial:o.myMaterial=this._myParams.myForwardMaterial,o.myParent=this._myParams.myParent,this._myVisualForward.paramsUpdated()}}}();Object.defineProperty(PP.VisualTransform.prototype,"_refresh",{enumerable:!1})});var Ai=T(()=>{PP.VisualRaycastParams=class{constructor(){this._myRaycastResult=new PP.RaycastResult,this.myHitNormalLength=.2,this.myThickness=.005,this.myShowOnlyFirstHit=!0,this.myRayMaterial=null,this.myHitNormalMaterial=null,this.myParent=null,this.myType=PP.VisualElementType.RAYCAST}get myRaycastResult(){return this._myRaycastResult}set myRaycastResult(t){this._myRaycastResult.copy(t)}};PP.VisualRaycast=class{constructor(t=new PP.VisualRaycastParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myVisualRaycast=new PP.VisualArrow,this._myVisualRaycast.setAutoRefresh(!1),this._myVisualRaycastHitList=[],this._addVisualRaycastHit(),this.setVisible(!0)}setVisible(t){if(this._myVisible!=t)if(this._myVisible=t,this._myVisible){if(this._myParams.myRaycastResult.myRaycastSetup!=null&&this._myVisualRaycast.setVisible(!0),this._myParams.myRaycastResult.myHits.length>0){let i=Math.min(this._myParams.myRaycastResult.myHits.length,this._myVisualRaycastHitList.length);for(let s=0;s0){let t=this._myParams.myShowOnlyFirstHit?this._myParams.myRaycastResult.myHits.pp_first().myDistance:this._myParams.myRaycastResult.myHits.pp_last().myDistance;{let s=this._myVisualRaycast.getParams();s.myStart.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myOrigin),s.myDirection.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myDirection),s.myLength=t,s.myThickness=this._myParams.myThickness,this._myParams.myRayMaterial==null?s.myMaterial=PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial:s.myMaterial=this._myParams.myRayMaterial,s.myParent=this._myParams.myParent,this._myVisualRaycast.paramsUpdated(),this._myVisualRaycast.setVisible(this._myVisible)}let i=this._myParams.myShowOnlyFirstHit?1:this._myParams.myRaycastResult.myHits.length;for(;i>this._myVisualRaycastHitList.length;)this._addVisualRaycastHit();for(let s=0;s{PP.VisualTorusParams=class{constructor(){this.myRadius=0,this.mySegmentAmount=12,this.mySegmentThickness=.05,this.myTransform=PP.mat4_create(),this.myMaterial=null,this.myColor=null,this.myParent=null,this.myType=PP.VisualElementType.TORUS}};PP.VisualTorus=class{constructor(t=new PP.VisualTorusParams){this._myParams=t,this._myVisible=!1,this._myAutoRefresh=!0,this._myDirty=!1,this._myTorusRootObject=null,this._myVisualSegmentList=[],this._myFlatOpaqueMaterial=null,this._build(),this.setVisible(!0)}setVisible(t){if(this._myVisible!=t)if(this._myVisible=t,this._myVisible){let i=Math.min(this._myParams.mySegmentAmount,this._myVisualSegmentList.length);for(let s=0;s{WL.registerComponent("pp-visual-manager",{},{init:function(){this.active&&(PP.myVisualData.myRootObject=WL.scene.addObject(null),PP.myVisualManager=new PP.VisualManager)},start(){PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial=PP.myDefaultResources.myMaterials.myText.clone(),PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial.color=[1,0,0,1],PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial.color=[0,1,0,1],PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial.color=[0,0,1,1],PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial.color=[0,1,0,1],PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial.color=[1,0,0,1],PP.myVisualManager.start()},update(e){PP.myVisualManager.update(e)}});PP.myVisualManager=null;PP.myVisualData={myRootObject:null,myDefaultMaterials:{myDefaultMeshMaterial:null,myDefaultTextMaterial:null,myDefaultRightMaterial:null,myDefaultUpMaterial:null,myDefaultForwardMaterial:null,myDefaultRayMaterial:null,myDefaultHitNormalMaterial:null}}});var Di=T(()=>{PP.DebugManager=class{constructor(){this._myDebugVisualManager=new PP.DebugVisualManager}getDebugVisualManager(){return this._myDebugVisualManager}start(){this._myDebugVisualManager.start()}update(t){this._myDebugVisualManager.update(t)}}});var Ii=T(()=>{PP.DebugVisualManager=class extends PP.VisualManager{drawLine(t,i,s,n,o=[0,1,0,1],r=.005){let l=new PP.VisualLineParams;l.myStart.vec3_copy(i),l.myDirection.vec3_copy(s),l.myLength=n,l.myThickness=r,l.myColor=PP.vec4_create(),l.myColor.vec4_copy(o),this.draw(l,t)}drawLineEnd(t,i,s,n=[0,1,0,1],o=.005){}drawArrow(t,i,s,n,o=[0,1,0,1],r=.005){let l=new PP.VisualArrowParams;l.myStart.vec3_copy(i),l.myDirection.vec3_copy(s),l.myLength=n,l.myThickness=r,l.myColor=PP.vec4_create(),l.myColor.vec4_copy(o),this.draw(l,t)}drawArrowEnd(t,i,s,n=[0,1,0,1],o=.005){}drawPoint(t,i,s=[0,1,0,1],n=.005){let o=new PP.VisualPointParams;o.myPosition.vec3_copy(i),o.myRadius=n,o.myColor=PP.vec4_create(),o.myColor.vec4_copy(s),this.draw(o,t)}drawText(t,i,s,n=[0,1,0,1],o=WL.Alignment.Center,r=WL.Justification.Middle){let l=new PP.VisualTextParams;l.myText=i,l.myAlignment=o,l.myJustification=r,l.myTransform.mat4_copy(s),l.myColor=PP.vec4_create(),l.myColor.vec4_copy(n),this.draw(l,t)}drawRaycast(t,i,s=!0,n=.2,o=.005){let r=new PP.VisualRaycastParams;r.myRaycastResult=i,r.myShowOnlyFirstHit=s,r.myHitNormalLength=n,r.myThickness=o,this.draw(r,t)}drawTransform(t,i,s=.2,n=.005){let o=new PP.VisualTransformParams;o.myTransform.mat4_copy(i),o.myLength=s,o.myThickness=n,this.draw(o,t)}};PP.DebugVisualManager.prototype.drawLineEnd=function(){let e=PP.vec3_create();return function(i,s,n,o=[0,1,0,1],r=.005){e=n.vec3_sub(s,e),length=e.vec3_length(),e.vec3_normalize(e),this.drawLine(i,s,e,length,o,r)}}();PP.DebugVisualManager.prototype.drawArrowEnd=function(){let e=PP.vec3_create();return function(i,s,n,o=[0,1,0,1],r=.005){e=n.vec3_sub(s,e),length=e.vec3_length(),e.vec3_normalize(e),this.drawArrow(i,s,e,length,o,r)}}();Object.defineProperty(PP.DebugVisualManager.prototype,"drawLineEnd",{enumerable:!1});Object.defineProperty(PP.DebugVisualManager.prototype,"drawArrowEnd",{enumerable:!1})});var Oi=T(()=>{WL.registerComponent("pp-debug-transform",{_myLength:{type:WL.Type.Float,default:.1},_myThickness:{type:WL.Type.Float,default:.005}},{init:function(){},start:function(){this._myDebugTransformParams=new PP.VisualTransformParams,this._myDebugTransformParams.myLength=this._myLength,this._myDebugTransformParams.myThickness=this._myThickness},update:function(e){this.object.pp_getTransform(this._myDebugTransformParams.myTransform),PP.myDebugVisualManager.draw(this._myDebugTransformParams)}})});var Ei=T(()=>{WL.registerComponent("pp-debug-manager",{},{init:function(){this.active&&(PP.myDebugManager=new PP.DebugManager,PP.myDebugVisualManager=PP.myDebugManager.getDebugVisualManager())},start(){PP.myDebugManager.start()},update(e){PP.myDebugManager.update(e)}});PP.myDebugManager=null;PP.myDebugVisualManager=null});var Wi=T(()=>{PP.Direction2DTo3DConverterParams=class{constructor(){this.myStartFlyingForward=!1,this.myStartFlyingRight=!1,this.myAutoUpdateFlyForward=!1,this.myAutoUpdateFlyRight=!1,this.myResetFlyForwardWhenZero=!1,this.myResetFlyRightWhenZero=!1,this.myMinAngleToFlyForwardUp=90,this.myMinAngleToFlyForwardDown=90,this.myMinAngleToFlyRightUp=90,this.myMinAngleToFlyRightDown=90}};PP.Direction2DTo3DConverter=class{constructor(t=new PP.Direction2DTo3DConverterParams){this._myParams=t,this._myIsFlyingForward=this._myParams.myStartFlyingForward,this._myIsFlyingRight=this._myParams.myStartFlyingRight,this._myLastValidFlatForward=PP.vec3_create(),this._myLastValidFlatRight=PP.vec3_create(),this._myMinAngleToBeValid=5}convert(t,i,s=null,n=PP.vec3_create()){}isFlying(){return this._myIsFlyingForward||this._myIsFlyingRight}isFlyingForward(){return this._myIsFlyingForward}isFlyingRight(){return this._myIsFlyingRight}startFlying(){this._myIsFlyingForward=!0,this._myIsFlyingRight=!0}startFlyingForward(){this._myIsFlyingForward=!0}startFlyingRight(){this._myIsFlyingRight=!0}stopFlying(){this._myIsFlyingForward=!1,this._myIsFlyingRight=!1}stopFlyingForward(){this._myIsFlyingForward=!1}stopFlyingRight(){this._myIsFlyingRight=!1}resetFly(){this.resetFlyForward(),this.resetFlyRight()}resetFlyForward(){this._myParams.myStartFlyingForward?this.startFlyingForward():this.stopFlyingForward(),this._myLastValidFlatForward.vec3_zero()}resetFlyRight(){this._myParams.myStartFlyingRight?this.startFlyingRight():this.stopFlyingRight(),this._myLastValidFlatRight.vec3_zero()}};PP.Direction2DTo3DConverter.prototype.convert=function(){let e=PP.vec3_create(),t=PP.vec3_create(),i=PP.vec3_create(),s=PP.vec3_create(),n=PP.vec3_create();return function(r,l,y=null,c=PP.vec3_create()){if(r.vec2_isZero())return this._myParams.myAutoUpdateFlyForward&&this._myParams.myResetFlyForwardWhenZero&&this.resetFlyForward(),this._myParams.myAutoUpdateFlyRight&&this._myParams.myResetFlyRightWhenZero&&this.resetFlyRight(),[0,0,0];if(r[0]==0&&this._myLastValidFlatRight.vec3_zero(),r[1]==0&&this._myLastValidFlatForward.vec3_zero(),e=l.quat2_getForward(e),t=l.quat2_getRight(t),y!=null){if(i=y.vec3_negate(i),this._myParams.myAutoUpdateFlyForward){let a=e.vec3_angle(y);this._myIsFlyingForward=this._myIsFlyingForward||a<90-this._myParams.myMinAngleToFlyForwardUp||a>90+this._myParams.myMinAngleToFlyForwardDown}if(this._myParams.myAutoUpdateFlyRight){let a=t.vec3_angle(y);this._myIsFlyingRight=this._myIsFlyingRight||a<90-this._myParams.myMinAngleToFlyRightUp||a>90+this._myParams.myMinAngleToFlyRightDown}this._myIsFlyingForward||(!this._myLastValidFlatForward.vec3_isZero(1e-6)&&(e.vec3_angle(y)this._myMinAngleToBeValid&&e.vec3_angle(i)>this._myMinAngleToBeValid||r[1]!=0&&this._myLastValidFlatForward.vec3_isZero(1e-6))&&(this._myLastValidFlatForward=e.vec3_removeComponentAlongAxis(y,this._myLastValidFlatForward),this._myLastValidFlatForward.vec3_normalize(this._myLastValidFlatForward)),(t.vec3_angle(y)>this._myMinAngleToBeValid&&t.vec3_angle(i)>this._myMinAngleToBeValid||r[0]!=0&&this._myLastValidFlatRight.vec3_isZero(1e-6))&&(this._myLastValidFlatRight=t.vec3_removeComponentAlongAxis(y,this._myLastValidFlatRight),this._myLastValidFlatRight.vec3_normalize(this._myLastValidFlatRight))}return c=t.vec3_scale(r[0],n).vec3_add(e.vec3_scale(r[1],s),c),y!=null&&!this._myIsFlyingForward&&!this._myIsFlyingRight&&(c=c.vec3_removeComponentAlongAxis(y,c)),c.vec3_normalize(c),c}}()});var ki=T(()=>{WL.registerComponent("pp-grabbable",{_myThrowLinearVelocityMultiplier:{type:WL.Type.Float,default:1},_myThrowAngularVelocityMultiplier:{type:WL.Type.Float,default:1},_myKinematicValueOnRelease:{type:WL.Type.Enum,values:["true","false","keep"],default:"false"}},{init:function(){this._myIsGrabbed=!1,this._myGrabber=null,this._myGrabCallbacks=new Map,this._myThrowCallbacks=new Map,this._myReleaseCallbacks=new Map},start:function(){this._myOldParent=this.object.parent,this._myPhysX=this.object.pp_getComponent("physx"),this._myOldKinematicValue=null},onDeactivate:function(){this.release()},grab:function(e){this.isGrabbed()||(this._myOldKinematicValue=this._myPhysX.kinematic),this.release(),this._myPhysX.kinematic=!0,this._myOldParent=this.object.parent,this.object.pp_setParent(e),this._myIsGrabbed=!0,this._myGrabCallbacks.forEach(function(t){t(e,this)}.bind(this))},throw:function(e,t){if(this._myIsGrabbed){let i=this._myGrabber;this._release(),this._myPhysX.linearVelocity=e.vec3_scale(this._myThrowLinearVelocityMultiplier),this._myPhysX.angularVelocity=t.vec3_scale(this._myThrowAngularVelocityMultiplier),this._myThrowCallbacks.forEach(function(s){s(i,this)}.bind(this)),this._myReleaseCallbacks.forEach(function(s){s(i,this,!0)}.bind(this))}},release(){if(this._myIsGrabbed){let e=this._myGrabber;this._release(),this._myReleaseCallbacks.forEach(function(t){t(e,this,!1)}.bind(this))}},getLinearVelocity(){let e=PP.vec3_create();return this._myPhysX.linearVelocity.vec3_clone(e),e},getAngularVelocity(){return this.getAngularVelocityDegrees()},getAngularVelocityDegrees(){let e=PP.vec3_create();return this._myPhysX.angularVelocity.vec3_toDegrees(e),e},getAngularVelocityRadians(){let e=PP.vec3_create();return this._myPhysX.angularVelocity.vec3_clone(e),e},isGrabbed(){return this._myIsGrabbed},getGrabber(){return this._myGrabber},registerGrabEventListener(e,t){this._myGrabCallbacks.set(e,t)},unregisterGrabEventListener(e){this._myGrabCallbacks.delete(e)},registerThrowEventListener(e,t){this._myThrowCallbacks.set(e,t)},unregisterThrowEventListener(e){this._myThrowCallbacks.delete(e)},registerReleaseEventListener(e,t){this._myReleaseCallbacks.set(e,t)},unregisterReleaseEventListener(e){this._myReleaseCallbacks.delete(e)},_release(){this.object.pp_setParent(this._myOldParent),this._myIsGrabbed=!1,this._myGrabber=null,this._myKinematicValueOnRelease==0?this._myPhysX.kinematic=!0:this._myKinematicValueOnRelease==1?this._myPhysX.kinematic=!1:this._myOldKinematicValue!=null&&(this._myPhysX.kinematic=this._myOldKinematicValue),this._myPhysX.kinematic&&(this._myPhysX.linearVelocity=[0,0,0],this._myPhysX.angularVelocity=[0,0,0])}})});var ji=T(()=>{WL.registerComponent("pp-grabber-hand",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myGrabButton:{type:WL.Type.Enum,values:["select","squeeze","both","both_exclusive"],default:"squeeze"},_mySnapOnPivot:{type:WL.Type.Bool,default:!1},_myMaxNumberOfObjects:{type:WL.Type.Int,default:1},_myThrowVelocitySource:{type:WL.Type.Enum,values:["hand","grabbable"],default:"hand"},_myThrowLinearVelocityMultiplier:{type:WL.Type.Float,default:1},_myThrowMaxLinearSpeed:{type:WL.Type.Float,default:15},_myThrowAngularVelocityMultiplier:{type:WL.Type.Float,default:.5},_myThrowMaxAngularSpeed:{type:WL.Type.Float,default:1080},_myThrowLinearVelocityBoost:{type:WL.Type.Float,default:1.75},_myThrowLinearVelocityBoostMinSpeedThreshold:{type:WL.Type.Float,default:.6},_myThrowLinearVelocityBoostMaxSpeedThreshold:{type:WL.Type.Float,default:2.5}},{init:function(){this._myGrabbables=[],this._myGamepad=null,this._myActiveGrabButton=null,this._myLinearVelocityHistorySize=5,this._myLinearVelocityHistorySpeedAverageSamplesFromStart=1,this._myLinearVelocityHistoryDirectionAverageSamplesFromStart=3,this._myLinearVelocityHistoryDirectionAverageSkipFromStart=0,this._myHandLinearVelocityHistory=new Array(this._myLinearVelocityHistorySize),this._myHandLinearVelocityHistory.fill([0,0,0]),this._myAngularVelocityHistorySize=1,this._myHandAngularVelocityHistory=new Array(this._myAngularVelocityHistorySize),this._myHandAngularVelocityHistory.fill([0,0,0]),this._myThrowMaxAngularSpeedRadians=Math.pp_toRadians(this._myThrowMaxAngularSpeed),this._myGrabCallbacks=new Map,this._myThrowCallbacks=new Map,this._myDebugActive=!1},start:function(){this._myHandedness==PP.HandednessIndex.LEFT?this._myGamepad=PP.myLeftGamepad:this._myGamepad=PP.myRightGamepad,this._myPhysX=this.object.pp_getComponent("physx"),this._myCollisionsCollector=new PP.PhysXCollisionCollector(this._myPhysX,!0)},update:function(e){this._myCollisionsCollector.update(e),this._myGrabbables.length>0&&(this._updateLinearVelocityHistory(),this._updateAngularVelocityHistory())},grab:function(e=null){this._grab(e)},throw:function(e=null){this._throw(e)},registerGrabEventListener(e,t){this._myGrabCallbacks.set(e,t)},unregisterGrabEventListener(e){this._myGrabCallbacks.delete(e)},registerThrowEventListener(e,t){this._myThrowCallbacks.set(e,t)},unregisterThrowEventListener(e){this._myThrowCallbacks.delete(e)},onActivate(){this._myGamepad!=null&&(this._myGrabButton==0?(this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SELECT)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SELECT))):this._myGrabButton==1?(this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SQUEEZE)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SQUEEZE))):(this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SQUEEZE)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SQUEEZE)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this,this._grab.bind(this,PP.ButtonType.SELECT)),this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this,this._throw.bind(this,PP.ButtonType.SELECT))))},onDeactivate(){this._myGamepad!=null&&(this._myGrabButton==0?(this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this)):this._myGrabButton==1?(this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this)):(this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.PRESS_END,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_START,this),this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.PRESS_END,this)))},_grab:function(e){if(!(this._myGrabbables.length>=this._myMaxNumberOfObjects)&&(this._myGrabButton==2||this._myActiveGrabButton==null||this._myActiveGrabButton==e||e==null)){let t=[],i=this._myCollisionsCollector.getCollisions();for(let n=0;n=this._myMaxNumberOfObjects)break}this._myGrabbables.length>0&&this._myActiveGrabButton==null&&(this._myActiveGrabButton=e)}},_throw:function(e){if(this._myGrabButton==2||this._myActiveGrabButton==null||this._myActiveGrabButton==e||e==null){if(this._myGrabbables.length>0){let t=null,i=null;this._myThrowVelocitySource==0&&(t=this._computeReleaseLinearVelocity(this._myHandLinearVelocityHistory),i=this._computeReleaseAngularVelocity(this._myHandAngularVelocityHistory));for(let s of this._myGrabbables){let n=s.getGrabbable();n.unregisterReleaseEventListener(this),this._myThrowVelocitySource==1&&(t=this._computeReleaseLinearVelocity(s.getLinearVelocityHistory()),i=this._computeReleaseAngularVelocity(s.getAngularVelocityHistory())),n.throw(t,i),this._myThrowCallbacks.forEach(function(o){o(this,n)}.bind(this))}this._myGrabbables=[]}this._myActiveGrabButton=null}},_onRelease(e,t){t.unregisterReleaseEventListener(this),this._myGrabbables.pp_remove(i=>i.getGrabbable()==t),this._myGrabbables.length<=0&&(this._myActiveGrabButton=null)},_updateLinearVelocityHistory(){let e=this._myGamepad.getHandPose();this._myHandLinearVelocityHistory.unshift(e.getLinearVelocity().pp_clone()),this._myHandLinearVelocityHistory.pop();for(let t of this._myGrabbables)t.updateLinearVelocityHistory()},_updateAngularVelocityHistory(){let e=this._myGamepad.getHandPose();this._myHandAngularVelocityHistory.unshift(e.getAngularVelocityRadians().pp_clone()),this._myHandAngularVelocityHistory.pop();for(let t of this._myGrabbables)t.updateAngularVelocityHistory()},_computeReleaseLinearVelocity(e){let t=e[0].vec3_length();for(let l=1;lthis._myLinearVelocityHistoryDirectionAverageSkipFromStart;t--){let i=t-this._myLinearVelocityHistoryDirectionAverageSkipFromStart,s=t-this._myLinearVelocityHistoryDirectionAverageSkipFromStart,n=[0,0,0];for(let r=this._myLinearVelocityHistoryDirectionAverageSkipFromStart;ri.getGrabbable()==e)!=null}});PP.GrabberHandGrabbableData=class{constructor(t,i,s,n){this._myGrabbable=t,this._myUseGrabbableAsVelocitySource=i,this._myUseGrabbableAsVelocitySource&&(this._myLinearVelocityHistory=new Array(s),this._myLinearVelocityHistory.fill([0,0,0]),this._myAngularVelocityHistory=new Array(n),this._myAngularVelocityHistory.fill([0,0,0]))}getGrabbable(){return this._myGrabbable}getLinearVelocityHistory(){return this._myLinearVelocityHistory}getAngularVelocityHistory(){return this._myAngularVelocityHistory}updateLinearVelocityHistory(){this._myUseGrabbableAsVelocitySource&&(this._myLinearVelocityHistory.unshift(this._myGrabbable.getLinearVelocity()),this._myLinearVelocityHistory.pop())}updateAngularVelocityHistory(){this._myUseGrabbableAsVelocitySource&&(this._myAngularVelocityHistory.unshift(this._myGrabbable.getAngularVelocityRadians()),this._myAngularVelocityHistory.pop())}}});var Fi=T(()=>{WL.registerComponent("pp-finger-cursor",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myEnableMultipleClicks:{type:WL.Type.Bool,default:!0},_myCollisionGroup:{type:WL.Type.Int,default:1},_myCollisionSize:{type:WL.Type.Float,default:.0125},_myCursorObject:{type:WL.Type.Object,default:null}},{init:function(){this._myLastTarget=null,this._myReferenceSpace=null,this._myHandInputSource=null,this._myHandednessString=["left","right"][this._myHandedness],this._myDoubleClickTimer=0,this._myTripleClickTimer=0,this._myMultipleClickObject=null,this._myMultipleClickDelay=.3},start:function(){this._myCursorObjectRoot=WL.scene.addObject(null),this._myCursorObject==null?this._myCursorObject=this._myCursorObjectRoot.pp_addObject():this._myCursorObject.pp_setParent(this._myCursorObjectRoot),this._myCollisionComponent=this._myCursorObject.addComponent("collision"),this._myCollisionComponent.collider=WL.Collider.Sphere,this._myCollisionComponent.group=1<0&&(this._myDoubleClickTimer-=e),this._myTripleClickTimer>0&&(this._myTripleClickTimer-=e),this._myCursorObjectRoot.pp_setTransformQuat(PP.myPlayerObjects.myPlayerPivot.pp_getTransformQuat()),this._updateHand(),this._myHandInputSource){let t=this._myCollisionComponent.queryOverlaps(),i=null;for(let s=0;s0&&this._myMultipleClickObject&&this._myMultipleClickObject.equals(this._myLastTarget.object)?(this._myLastTarget.onTripleClick(this._myLastTarget.object,this),this._myTripleClickTimer=0):this._myEnableMultipleClicks&&this._myDoubleClickTimer>0&&this._myMultipleClickObject&&this._myMultipleClickObject.equals(this._myLastTarget.object)?(this._myLastTarget.onDoubleClick(this._myLastTarget.object,this),this._myTripleClickTimer=this._myMultipleClickDelay,this._myDoubleClickTimer=0):(this._myLastTarget.onClick(this._myLastTarget.object,this),this._myTripleClickTimer=0,this._myDoubleClickTimer=this._myMultipleClickDelay,this._myMultipleClickObject=this._myLastTarget.object),this._myLastTarget.onUp(this._myLastTarget.object,this),this._myLastTarget.onUnhover(this._myLastTarget.object,this),this._myLastTarget=null)},onActivate:function(){this._myCursorObjectRoot.pp_setActive(!0)},onDeactivate:function(){this._myCursorObjectRoot.pp_setActive(!1)},_updateHand(){if(this._myHandInputSource=PP.InputUtils.getInputSource(this._myHandednessString,PP.InputSourceType.TRACKED_HAND),this._myHandInputSource){let e=Module.webxr_frame.getJointPose(this._myHandInputSource.hand.get("index-finger-tip"),this._myReferenceSpace);e&&(this._myCursorObject.pp_setRotationLocalQuat([e.transform.orientation.x,e.transform.orientation.y,e.transform.orientation.z,e.transform.orientation.w]),this._myCursorObject.pp_setPositionLocal([e.transform.position.x,e.transform.position.y,e.transform.position.z]))}},_onXRSessionStart:function(e){e.requestReferenceSpace(WebXR.refSpace).then(function(t){this._myReferenceSpace=t}.bind(this))},_onXRSessionEnd:function(e){this._myReferenceSpace=null}})});var wi=T(()=>{PP.Handedness={LEFT:"left",RIGHT:"right"};PP.HandednessIndex={LEFT:0,RIGHT:1};PP.InputSourceType={GAMEPAD:0,TRACKED_HAND:1};PP.TrackedHandJointType={WRIST:"wrist",THUMB_METACARPAL:"thumb-metacarpal",THUMB_PHALANX_PROXIMAL:"thumb-phalanx-proximal",THUMB_PHALANX_DISTAL:"thumb-phalanx-distal",THUMB_TIP:"thumb-tip",INDEX_FINGER_METACARPAL:"index-finger-metacarpal",INDEX_FINGER_PHALANX_PROXIMAL:"index-finger-phalanx-proximal",INDEX_FINGER_PHALANX_INTERMEDIATE:"index-finger-phalanx-intermediate",INDEX_FINGER_PHALANX_DISTAL:"index-finger-phalanx-distal",INDEX_FINGER_TIP:"index-finger-tip",MIDDLE_FINGER_METACARPAL:"middle-finger-metacarpal",MIDDLE_FINGER_PHALANX_PROXIMAL:"middle-finger-phalanx-proximal",MIDDLE_FINGER_PHALANX_INTERMEDIATE:"middle-finger-phalanx-intermediate",MIDDLE_FINGER_PHALANX_DISTAL:"middle-finger-phalanx-distal",MIDDLE_FINGER_TIP:"middle-finger-tip",RING_FINGER_METACARPAL:"ring-finger-metacarpal",RING_FINGER_PHALANX_PROXIMAL:"ring-finger-phalanx-proximal",RING_FINGER_PHALANX_INTERMEDIATE:"ring-finger-phalanx-intermediate",RING_FINGER_PHALANX_DISTAL:"ring-finger-phalanx-distal",RING_FINGER_TIP:"ring-finger-tip",PINKY_FINGER_METACARPAL:"pinky-finger-metacarpal",PINKY_FINGER_PHALANX_PROXIMAL:"pinky-finger-phalanx-proximal",PINKY_FINGER_PHALANX_INTERMEDIATE:"pinky-finger-phalanx-intermediate",PINKY_FINGER_PHALANX_DISTAL:"pinky-finger-phalanx-distal",PINKY_FINGER_TIP:"pinky-finger-tip"};PP.TrackedHandJointTypeIndex={WRIST:0,THUMB_METACARPAL:1,THUMB_PHALANX_PROXIMAL:2,THUMB_PHALANX_DISTAL:3,THUMB_TIP:4,INDEX_FINGER_METACARPAL:5,INDEX_FINGER_PHALANX_PROXIMAL:6,INDEX_FINGER_PHALANX_INTERMEDIATE:7,INDEX_FINGER_PHALANX_DISTAL:8,INDEX_FINGER_TIP:9,MIDDLE_FINGER_METACARPAL:10,MIDDLE_FINGER_PHALANX_PROXIMAL:11,MIDDLE_FINGER_PHALANX_INTERMEDIATE:12,MIDDLE_FINGER_PHALANX_DISTAL:13,MIDDLE_FINGER_TIP:14,RING_FINGER_METACARPAL:15,RING_FINGER_PHALANX_PROXIMAL:16,RING_FINGER_PHALANX_INTERMEDIATE:17,RING_FINGER_PHALANX_DISTAL:18,RING_FINGER_TIP:19,PINKY_FINGER_METACARPAL:20,PINKY_FINGER_PHALANX_PROXIMAL:21,PINKY_FINGER_PHALANX_INTERMEDIATE:22,PINKY_FINGER_PHALANX_DISTAL:23,PINKY_FINGER_TIP:24}});var Hi=T(()=>{PP.InputUtils={getHandednessByIndex:function(e){let t=null;switch(e){case PP.HandednessIndex.LEFT:t=PP.Handedness.LEFT;break;case PP.HandednessIndex.RIGHT:t=PP.Handedness.RIGHT;break}return t},getInputSource:function(e,t){let i=null;if(WL.xrSession&&WL.xrSession.inputSources)for(let s=0;s{PP.KeyType={_0:"0",_1:"1",_2:"2",_3:"3",_4:"4",_5:"5",_6:"6",_7:"7",_8:"8",_9:"9",A:"A",B:"B",C:"C",D:"D",E:"E",F:"F",G:"G",H:"H",I:"I",J:"J",K:"K",L:"L",M:"M",N:"N",O:"O",P:"P",Q:"Q",R:"R",S:"S",T:"T",U:"U",V:"V",W:"W",X:"X",Y:"Y",Z:"Z",a:"a",b:"b",c:"c",d:"d",e:"e",f:"f",g:"g",h:"h",i:"i",j:"j",k:"k",l:"l",m:"m",n:"n",o:"o",p:"p",q:"q",r:"r",s:"s",t:"t",u:"u",v:"v",w:"w",x:"x",y:"y",z:"z",UP:"ArrowUp",DOWN:"ArrowDown",LEFT:"ArrowLeft",RIGHT:"ArrowRight",SPACE:" ",ENTER:"Enter",BACKSPACE:"Backspace",ESC:"Escape",SHIFT_LEFT:"ShiftLeft",SHIFT_RIGHT:"ShiftRight",CONTROL_LEFT:"ControlLeft",CONTROL_RIGHT:"ControlRight",ALT_LEFT:"AltLeft",ALT_RIGHT:"AltRight"};PP.Keyboard=class{constructor(){this._myKeyInfos=new Map;for(let t in PP.KeyType)this.addKey(PP.KeyType[t])}isKeyPressed(t){let i=!1;return this._myKeyInfos.has(t)&&(i=this._myKeyInfos.get(t).myIsPressed),i}isKeyPressStart(t){let i=!1;return this._myKeyInfos.has(t)&&(i=this._myKeyInfos.get(t).myIsPressStart),i}isKeyPressEnd(t){let i=!1;return this._myKeyInfos.has(t)&&(i=this._myKeyInfos.get(t).myIsPressEnd),i}addKey(t){this._myKeyInfos.set(t,{myIsPressed:!1,myIsPressStart:!1,myIsPressStartToProcess:!1,myIsPressEnd:!1,myIsPressEndToProcess:!1})}start(){window.addEventListener("keydown",this._keyDown.bind(this)),window.addEventListener("keyup",this._keyUp.bind(this))}update(t){if(!document.hasFocus())for(let i of this._myKeyInfos.values())i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0);for(let i of this._myKeyInfos.values())i.myIsPressStart=i.myIsPressStartToProcess,i.myIsPressEnd=i.myIsPressEndToProcess,i.myIsPressStartToProcess=!1,i.myIsPressEndToProcess=!1}_keyDown(t){this._keyPressedChanged(t.key,!0),t.key!=t.code&&this._keyPressedChanged(t.code,!0)}_keyUp(t){this._keyPressedChanged(t.key,!1),t.key!=t.code&&this._keyPressedChanged(t.code,!1)}_keyPressedChanged(t,i){if(this._myKeyInfos.has(t)){let s=this._myKeyInfos.get(t);i?(s.myIsPressed=!0,s.myIsPressStartToProcess=!0):(s.myIsPressed=!1,s.myIsPressEndToProcess=!0)}}}});var qi=T(()=>{PP.MouseButtonType={LEFT:0,MIDDLE:1,RIGHT:2};PP.Mouse=class{constructor(){this._myButtonInfos=new Map;for(let t in PP.MouseButtonType)this._myButtonInfos.set(PP.MouseButtonType[t],{myIsPressed:!1,myIsPressStart:!1,myIsPressStartToProcess:!1,myIsPressEnd:!1,myIsPressEndToProcess:!1});this._myPreventContextMenuCallback=this._preventContextMenu.bind(this),this._myPreventMiddleButtonScrollCallback=this._preventMiddleButtonScroll.bind(this),this._myInternalMousePosition=PP.vec2_create(),this._myScreenSize=PP.vec2_create(),this._myResetMovingDelay=.15,this._myResetMovingTimer=new PP.Timer(this._myResetMovingDelay,!1),this._myIsMoving=!1,this._myIsInsideView=!0,this._myContextMenuActive=!0,this._myMiddleButtonScrollActive=!0,this._myProjectionMatrixInverse=PP.mat4_create(),this._myRotationQuat=PP.quat_create(),this._myOriginWorld=PP.vec3_create(),this._myDirectionWorld=PP.vec3_create()}start(){this._myOnMouseMoveCallback=this._onMouseMove.bind(this),WL.canvas.addEventListener("mousemove",this._myOnMouseMoveCallback),this._myOnMouseDownCallback=this._onMouseDown.bind(this),WL.canvas.addEventListener("mousedown",this._myOnMouseDownCallback),this._myOnMouseUpCallback=this._onMouseUp.bind(this),WL.canvas.addEventListener("mouseup",this._myOnMouseUpCallback),this._myOnMouseLeaveCallback=this._onMouseLeave.bind(this),WL.canvas.addEventListener("mouseleave",this._myOnMouseLeaveCallback),this._myOnMouseEnterCallback=this._onMouseEnter.bind(this),WL.canvas.addEventListener("mouseenter",this._myOnMouseEnterCallback)}update(t){this._myResetMovingTimer.isRunning()&&(this._myResetMovingTimer.update(t),this._myResetMovingTimer.isDone()&&(this._myResetMovingTimer.reset(),this._myIsMoving=!1));for(let i of this._myButtonInfos.values())i.myIsPressStart=i.myIsPressStartToProcess,i.myIsPressEnd=i.myIsPressEndToProcess,i.myIsPressStartToProcess=!1,i.myIsPressEndToProcess=!1}destroy(){WL.canvas.removeEventListener("mousemove",this._myOnMouseMoveCallback),WL.canvas.removeEventListener("mousedown",this._myOnMouseDownCallback),WL.canvas.removeEventListener("mouseup",this._myOnMouseUpCallback),WL.canvas.removeEventListener("mouseleave",this._myOnMouseLeaveCallback),WL.canvas.removeEventListener("contextmenu",this._myPreventContextMenuCallback),WL.canvas.removeEventListener("mousedown",this._myPreventMiddleButtonScrollCallback)}isButtonPressed(t){let i=!1;return this._myButtonInfos.has(t)&&(i=this._myButtonInfos.get(t).myIsPressed),i}isButtonPressStart(t){let i=!1;return this._myButtonInfos.has(t)&&(i=this._myButtonInfos.get(t).myIsPressStart),i}isButtonPressEnd(t=null){let i=!1;return this._myButtonInfos.has(t)&&(i=this._myButtonInfos.get(t).myIsPressEnd),i}isMoving(){return this._myIsMoving}isInsideView(){return this._myIsInsideView}setContextMenuActive(t){this._myContextMenuActive!=t&&(t?WL.canvas.removeEventListener("contextmenu",this._myPreventContextMenuCallback):WL.canvas.addEventListener("contextmenu",this._myPreventContextMenuCallback,!1),this._myContextMenuActive=t)}setMiddleButtonScrollActive(t){this._myMiddleButtonScrollActive!=t&&(t?WL.canvas.removeEventListener("mousedown",this._myPreventMiddleButtonScrollCallback):WL.canvas.addEventListener("mousedown",this._myPreventMiddleButtonScrollCallback,!1),this._myMiddleButtonScrollActive=t)}getPositionScreen(t=PP.vec2_create()){let i=t;return i[0]=this._myInternalMousePosition[0],i[1]=this._myScreenSize[1]-1-this._myInternalMousePosition[1],i}getScreenSize(){return this._myScreenSize}getPositionWorld(t,i=PP.vec3_create()){let s=this.getOriginWorld(this._myOriginWorld),n=this.getDirectionWorld(this._myDirectionWorld);return i=s.vec3_add(n.vec3_scale(t,i),i),i}getOriginWorld(t=PP.vec3_create()){return PP.XRUtils.isXRSessionActive()?PP.myPlayerObjects.myEyeLeft.pp_getPosition(t):PP.myPlayerObjects.myNonVRCamera.pp_getPosition(t),t}getDirectionWorld(t=PP.vec3_create()){let i=this._myInternalMousePosition[0]/this._myScreenSize[0],s=this._myInternalMousePosition[1]/this._myScreenSize[1],n=t;n.vec3_set(i*2-1,-s*2+1,-1);let o=this._myProjectionMatrixInverse;PP.XRUtils.isXRSessionActive()?o=PP.myPlayerObjects.myEyeLeft.pp_getComponentHierarchy("view").projectionMatrix.mat4_invert(o):o=PP.myPlayerObjects.myNonVRCamera.pp_getComponentHierarchy("view").projectionMatrix.mat4_invert(o),n.vec3_transformMat4(o,n),n.vec3_normalize(n);let r=n;return PP.XRUtils.isXRSessionActive()?r=n.vec3_transformQuat(PP.myPlayerObjects.myEyeLeft.pp_getRotationQuat(this._myRotationQuat),n):r=n.vec3_transformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getRotationQuat(this._myRotationQuat),n),r.vec3_normalize(r),t}raycastWorld(t,i=new PP.RaycastResult){return this.getOriginWorld(t.myOrigin),this.getDirectionWorld(t.myDirection),i=PP.PhysicsUtils.raycast(t,i),i}setResetMovingDelay(t){this._myResetMovingDelay=t}getResetMovingDelay(){return this._myResetMovingDelay}_updatePositionAndView(t){let i=t.target.getBoundingClientRect();this._myScreenSize[0]=i.width,this._myScreenSize[1]=i.height,this._myInternalMousePosition[0]=t.clientX,this._myInternalMousePosition[1]=t.clientY}_onMouseMove(t){this._myResetMovingTimer.start(this._myResetMovingDelay),this._myIsMoving=!0,this._updatePositionAndView(t)}_onMouseDown(t){let i=this._myButtonInfos.get(t.button);i.myIsPressed||(i.myIsPressed=!0,i.myIsPressStartToProcess=!0),this._updatePositionAndView(t)}_onMouseUp(t){let i=this._myButtonInfos.get(t.button);i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0),this._updatePositionAndView(t)}_onMouseLeave(t){this._myIsInsideView=!1;for(let i of this._myButtonInfos.values())i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0)}_onMouseEnter(t){this._myIsInsideView=!0;for(let i of this._myButtonInfos.values())i.myIsPressed&&(i.myIsPressed=!1,i.myIsPressEndToProcess=!0)}_preventContextMenu(t){t.preventDefault()}_preventMiddleButtonScroll(t){if(t.button==1)return t.preventDefault(),!1}}});var Ui=T(()=>{PP.InputManager=class{constructor(){this._myMouse=new PP.Mouse,this._myKeyboard=new PP.Keyboard,this._myGamepadManager=new PP.GamepadManager}start(){this._myMouse.start(),this._myKeyboard.start(),this._myGamepadManager.start()}update(t){this._myMouse.update(t),this._myKeyboard.update(t),this._myGamepadManager.update(t)}getMouse(){return this._myMouse}getKeyboard(){return this._myKeyboard}getGamepadManager(){return this._myGamepadManager}}});var Gi=T(()=>{WL.registerComponent("pp-input-manager",{_myGamepadFixForward:{type:WL.Type.Bool,default:!0},_myMousePreventContextMenu:{type:WL.Type.Bool,default:!0},_myMousePreventMiddleButtonScroll:{type:WL.Type.Bool,default:!0}},{init(){this._myInputManager=new PP.InputManager,PP.myInputManager=this._myInputManager,PP.myMouse=this._myInputManager.getMouse(),PP.myKeyboard=this._myInputManager.getKeyboard(),PP.myGamepadManager=this._myInputManager.getGamepadManager(),PP.myGamepads=PP.myGamepadManager.getGamepads(),PP.myLeftGamepad=PP.myGamepadManager.getLeftGamepad(),PP.myRightGamepad=PP.myGamepadManager.getRightGamepad()},start(){this._myInputManager.start(),this._setupMousePrevent(),this._addGamepadCores()},update(e){this._myInputManager.update(e)},_setupMousePrevent(){this._myMousePreventContextMenu&&PP.myMouse.setContextMenuActive(!1),this._myMousePreventMiddleButtonScroll&&PP.myMouse.setMiddleButtonScrollActive(!1)},_addGamepadCores(){let e=new PP.HandPoseParams;e.myReferenceObject=PP.myPlayerObjects.myPlayerPivot,e.myFixForward=this._myFixForward,e.myForceEmulatedVelocities=!1;let t=new PP.XRGamepadCore(PP.Handedness.LEFT,e),i=new PP.XRGamepadCore(PP.Handedness.RIGHT,e);PP.myLeftGamepad.addGamepadCore("left_xr_gamepad",t),PP.myRightGamepad.addGamepadCore("right_xr_gamepad",i);let s=new PP.KeyboardGamepadCore(PP.Handedness.LEFT,t.getHandPose()),n=new PP.KeyboardGamepadCore(PP.Handedness.RIGHT,i.getHandPose());PP.myLeftGamepad.addGamepadCore("left_keyboard_gamepad",s),PP.myRightGamepad.addGamepadCore("right_keyboard_gamepad",n)}});PP.myInputManager=null;PP.myMouse=null;PP.myKeyboard=null;PP.myGamepadManager=null;PP.myGamepads=null;PP.myLeftGamepad=null;PP.myRightGamepad=null});var zi=T(()=>{WL.registerComponent("pp-switch-hand-object",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myGamepad:{type:WL.Type.Object},_myTrackedHand:{type:WL.Type.Object}},{init:function(){},start:function(){this._myHandednessType=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myFirstUpdate=!0,this._myCurrentInputSourceType=null},onActivate(){this._myFirstUpdate=!0},update:function(e){this._myFirstUpdate&&(this._myFirstUpdate=!1,this._start());let t=PP.InputUtils.getInputSourceTypeByHandedness(this._myHandednessType);t!=null&&this._myCurrentInputSourceType!=t&&(this._myCurrentInputSourceType=t,t==PP.InputSourceType.TRACKED_HAND?(this._myGamepad.pp_setActive(!1),this._myTrackedHand.pp_setActive(!0)):t==PP.InputSourceType.GAMEPAD&&(this._myTrackedHand.pp_setActive(!1),this._myGamepad.pp_setActive(!0)))},_start(){this._myGamepad.pp_setActive(!1),this._myTrackedHand.pp_setActive(!1),this._myCurrentInputSourceType=null}})});var Qi=T(()=>{WL.registerComponent("pp-tracked-hand-draw-joint",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_myJointType:{type:WL.Type.Enum,values:["Wrist","Thumb Metacarpal","Thumb Phalanx Proximal","Thumb Phalanx Distal","Thumb Tip","Index Metacarpal","Index Phalanx Proximal","Index Phalanx Intermediate","Index Phalanx Distal","Index Tip","Middle Metacarpal","Middle Phalanx Proximal","Middle Phalanx Intermediate","Middle Phalanx Distal","Middle Tip","Ring Metacarpal","Ring Phalanx Proximal","Ring Phalanx Intermediate","Ring Phalanx Distal","Ring Tip","Pinky Metacarpal","Pinky Phalanx Proximal","Pinky Phalanx Intermediate","Pinky Phalanx Distal","Pinky Tip"],default:"Wrist"},_myJointMesh:{type:WL.Type.Mesh},_myJointMaterial:{type:WL.Type.Material}},{init:function(){this._myHandednessInternal=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myJointTypeInternal=PP.InputUtils.getJointTypeByIndex(this._myJointType),this._myTrackedHandJointPose=new PP.TrackedHandJointPose(this._myHandednessInternal,this._myJointTypeInternal),this._myTrackedHandJointPose.setFixForward(this._myFixForward)},start:function(){this._myTrackedHandJointPose.start(),this._buildTrackedHandHierarchy()},update:function(e){this._myTrackedHandJointPose.update(e),this._myJointMeshObject.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat()),this._myJointMeshObject.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius())},_buildTrackedHandHierarchy(){this._myJointMeshObject=this.object.pp_addObject();let e=this._myJointMeshObject.pp_addComponent("mesh");e.mesh=this._myJointMesh,e.material=this._myJointMaterial,this._myJointMeshObject.pp_setScaleLocal(0)}})});var Xi=T(()=>{WL.registerComponent("pp-tracked-hand-draw-all-joints",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_myHideMetacarpals:{type:WL.Type.Bool,default:!0},_myJointMesh:{type:WL.Type.Mesh},_myJointMaterial:{type:WL.Type.Material}},{init:function(){},start:function(){this._buildTrackedHandHierarchy()},update:function(e){},_buildTrackedHandHierarchy(){this._myTrackedHandMeshObject=this.object.pp_addObject(),this._myJointMeshObjectList=[];for(let e in PP.TrackedHandJointType){let t=PP.TrackedHandJointType[e];if(!this._myHideMetacarpals||t!=PP.TrackedHandJointType.THUMB_METACARPAL&&t!=PP.TrackedHandJointType.INDEX_FINGER_METACARPAL&&t!=PP.TrackedHandJointType.MIDDLE_FINGER_METACARPAL&&t!=PP.TrackedHandJointType.RING_FINGER_METACARPAL&&t!=PP.TrackedHandJointType.PINKY_FINGER_METACARPAL){let i=this._myTrackedHandMeshObject.pp_addObject();this._myJointMeshObjectList[t]=i,i.pp_addComponent("pp-tracked-hand-draw-joint",{_myHandedness:this._myHandedness,_myFixForward:this._myFixForward,_myJointType:PP.TrackedHandJointTypeIndex[e],_myJointMesh:this._myJointMesh,_myJointMaterial:this._myJointMaterial})}}}})});var Ki=T(()=>{WL.registerComponent("pp-tracked-hand-draw-skin",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_myHandSkin:{type:WL.Type.Skin,default:null}},{init:function(){this._myHandednessInternal=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myTrackedHandPose=new PP.TrackedHandPose(this._myHandednessInternal),this._myTrackedHandPose.setFixForward(this._myFixForward)},start:function(){this._myTrackedHandPose.start(),this._prepareJoints()},update:function(t){this._myTrackedHandPose.update(t);for(let i=0;i{PP.ButtonType={SELECT:0,SQUEEZE:1,TOUCHPAD:2,THUMBSTICK:3,BOTTOM_BUTTON:4,TOP_BUTTON:5,THUMB_REST:6};PP.ButtonEvent={PRESS_START:0,PRESS_END:1,PRESSED:2,NOT_PRESSED:3,TOUCH_START:4,TOUCH_END:5,TOUCHED:6,NOT_TOUCHED:7,VALUE_CHANGED:8,ALWAYS:9};PP.AxesEvent={X_CHANGED:0,Y_CHANGED:1,AXES_CHANGED:2,ALWAYS:3};PP.ButtonInfo=class Ji{constructor(t,i){this.myType=t,this.myHandedness=i,this.myIsPressed=!1,this.myPrevIsPressed=!1,this.myIsTouched=!1,this.myPrevIsTouched=!1,this.myValue=0,this.myPrevValue=0,this.myTimePressed=0,this.myPrevTimePressed=0,this.myTimeNotPressed=0,this.myPrevTimeNotPressed=0,this.myTimeTouched=0,this.myPrevTimeTouched=0,this.myTimeNotTouched=0,this.myPrevTimeNotTouched=0,this.myMultiplePressStartCount=0,this.myPrevMultiplePressStartCount=0,this.myMultiplePressEndCount=0,this.myPrevMultiplePressEndCount=0,this.myMultipleTouchStartCount=0,this.myPrevMultipleTouchStartCount=0,this.myMultipleTouchEndCount=0,this.myPrevMultipleTouchEndCount=0}getType(){return this.myType}getHandedness(){return this.myHandedness}getValue(){return this.myValue}isPressed(){return this.myIsPressed}isTouched(){return this.myIsTouched}isPressStart(t=null){return this.myIsPressed&&!this.myPrevIsPressed&&(t==null||this.myMultiplePressStartCount==t)}isPressEnd(t=null){return!this.myIsPressed&&this.myPrevIsPressed&&(t==null||this.myMultiplePressEndCount==t)}isTouchStart(t=null){return this.myIsTouched&&!this.myPrevIsTouched&&(t==null||this.myMultipleTouchStartCount==t)}isTouchEnd(t=null){return!this.myIsTouched&&this.myPrevIsTouched&&(t==null||this.myMultipleTouchEndCount==t)}clone(){let t=new Ji(this.myType,this.myHandedness);return t.myIsPressed=this.myIsPressed,t.myPrevIsPressed=this.myPrevIsPressed,t.myIsTouched=this.myIsTouched,t.myPrevIsTouched=this.myPrevIsTouched,t.myValue=this.myValue,t.myPrevValue=this.myPrevValue,t.myTimePressed=this.myTimePressed,t.myPrevTimePressed=this.myPrevTimePressed,t.myTimeNotPressed=this.myTimeNotPressed,t.myPrevTimeNotPressed=this.myPrevTimeNotPressed,t.myTimeTouched=this.myTimeTouched,t.myPrevTimeTouched=this.myPrevTimeTouched,t.myTimeNotTouched=this.myTimeNotTouched,t.myPrevTimeNotTouched=this.myPrevTimeNotTouched,t.myMultiplePressStartCount=this.myMultiplePressStartCount,t.myPrevMultiplePressStartCount=this.myPrevMultiplePressStartCount,t.myMultiplePressEndCount=this.myMultiplePressEndCount,t.myPrevMultiplePressEndCount=this.myPrevMultiplePressEndCount,t.myMultipleTouchStartCount=this.myMultipleTouchStartCount,t.myPrevMultipleTouchStartCount=this.myPrevMultipleTouchStartCount,t.myMultipleTouchEndCount=this.myMultipleTouchEndCount,t.myPrevMultipleTouchEndCount=this.myPrevMultipleTouchEndCount,t}};PP.AxesInfo=class Yi{constructor(t){this.myHandedness=t,this.myAxes=new Float32Array(2),this.myAxes.fill(0),this.myPrevAxes=new Float32Array(2),this.myPrevAxes.fill(0)}getAxes(){return this.myAxes}getHandedness(){return this.myHandedness}clone(){let t=new Yi(this.myHandedness);return t.myAxes=this.myAxes,t.myPrevAxes=this.myPrevAxes,t}};PP.PulseInfo=class Zi{constructor(){this.myIntensity=0,this.myDuration=0,this.myIsDevicePulsing=!1}clone(){let t=new Zi;return t.myIntensity=this.myIntensity,t.myDuration=this.myDuration,t.myIsDevicePulsing=this.myIsDevicePulsing,t}}});var ts=T(()=>{PP.BaseGamepad=class{constructor(t){this._myHandedness=t,this._myButtonInfos=[];for(let i in PP.ButtonType)this._myButtonInfos[PP.ButtonType[i]]=new PP.ButtonInfo(PP.ButtonType[i],this._myHandedness);this._myAxesInfo=new PP.AxesInfo(this._myHandedness),this._myButtonCallbacks=[];for(let i in PP.ButtonType){this._myButtonCallbacks[PP.ButtonType[i]]=[];for(let s in PP.ButtonEvent)this._myButtonCallbacks[PP.ButtonType[i]][PP.ButtonEvent[s]]=new Map}this._myAxesCallbacks=[];for(let i in PP.AxesEvent)this._myAxesCallbacks[PP.AxesEvent[i]]=new Map;this._myPulseInfo=new PP.PulseInfo,this._myMultiplePressMaxDelay=.3,this._myMultipleTouchMaxDelay=.3}getHandedness(){return this._myHandedness}getButtonInfo(t){return this._myButtonInfos[t]}registerButtonEventListener(t,i,s,n){this._myButtonCallbacks[t][i].set(s,n)}unregisterButtonEventListener(t,i,s){this._myButtonCallbacks[t][i].delete(s)}getAxesInfo(){return this._myAxesInfo}registerAxesEventListener(t,i,s){this._myAxesCallbacks[t].set(i,s)}unregisterAxesEventListener(t,i){this._myAxesCallbacks[t].delete(i)}pulse(t,i=0){this._myPulseInfo.myIntensity=Math.min(Math.max(t,0),1),this._myPulseInfo.myDuration=Math.max(i,0)}stopPulse(){this._myPulseInfo.myIntensity=0,this._myPulseInfo.myDuration=0}isPulsing(){return this._myPulseInfo.myIntensity>0||this._myPulseInfo.myDuration>0}getPulseInfo(){return this._myPulseInfo}getMultiplePressMaxDelay(){return this._myMultiplePressMaxDelay}setMultiplePressMaxDelay(t){this._myMultiplePressMaxDelay=t}getMultipleTouchMaxDelay(){return this._myMultipleTouchMaxDelay}setMultipleTouchMaxDelay(t){this._myMultipleTouchMaxDelay=t}getHandPose(){return null}isGamepadActive(){return!0}_start(){}_preUpdate(t){}_postUpdate(t){}_getButtonData(t){return{myIsPressed:!1,myIsTouched:!1,myValue:0}}_getAxesData(){return[0,0]}_getHapticActuators(){return[]}start(){this._start()}update(t){this._preUpdate(t),this._preUpdateButtonInfos(),this._updateButtonInfos(),this._postUpdateButtonInfos(t),this._preUpdateAxesInfos(),this._updateAxesInfos(),this._postUpdateAxesInfos(),this._updatePulse(t),this._postUpdate(t)}_preUpdateButtonInfos(){this._myButtonInfos.forEach(function(t){t.myPrevIsPressed=t.myIsPressed,t.myPrevIsTouched=t.myIsTouched,t.myPrevValue=t.myValue})}_updateButtonInfos(){this._updateSingleButtonInfo(PP.ButtonType.SELECT),this._updateSingleButtonInfo(PP.ButtonType.SQUEEZE),this._updateSingleButtonInfo(PP.ButtonType.TOUCHPAD),this._updateSingleButtonInfo(PP.ButtonType.THUMBSTICK),this._updateSingleButtonInfo(PP.ButtonType.BOTTOM_BUTTON),this._updateSingleButtonInfo(PP.ButtonType.TOP_BUTTON),this._updateSingleButtonInfo(PP.ButtonType.THUMB_REST)}_updateSingleButtonInfo(t){let i=this._myButtonInfos[t],s=this._getButtonData(t);i.myIsPressed=s.myIsPressed,i.myIsTouched=s.myIsTouched,i.myValue=s.myValue}_postUpdateButtonInfos(t){this._myButtonInfos.forEach(function(i){i.myIsPressed?(i.myTimePressed+=t,i.myPrevIsPressed||(i.myMultiplePressStartCount+=1,i.myPrevTimeNotPressed=i.myTimeNotPressed,i.myTimeNotPressed=0),i.myPrevTimeNotPressed+i.myTimePressed>this._myMultiplePressMaxDelay&&i.myMultiplePressEndCount>0&&(i.myPrevMultiplePressEndCount=i.myMultiplePressEndCount,i.myMultiplePressEndCount=0),i.myTimePressed>this._myMultiplePressMaxDelay&&i.myMultiplePressStartCount>0&&(i.myPrevMultiplePressStartCount=i.myMultiplePressStartCount,i.myMultiplePressStartCount=0)):(i.myTimeNotPressed+=t,i.myPrevIsPressed&&(i.myMultiplePressEndCount+=1,i.myPrevTimePressed=i.myTimePressed,i.myTimePressed=0),i.myPrevTimePressed+i.myTimeNotPressed>this._myMultiplePressMaxDelay&&i.myMultiplePressStartCount>0&&(i.myPrevMultiplePressStartCount=i.myMultiplePressStartCount,i.myMultiplePressStartCount=0),i.myTimeNotPressed>this._myMultiplePressMaxDelay&&i.myMultiplePressEndCount>0&&(i.myPrevMultiplePressEndCount=i.myMultiplePressEndCount,i.myMultiplePressEndCount=0)),i.myIsTouched?(i.myTimeTouched+=t,i.myPrevIsTouched||(i.myMultipleTouchStartCount+=1,i.myPrevTimeNotTouched=i.myTimeNotTouched,i.myTimeNotTouched=0),i.myPrevTimeNotTouched+i.myTimeTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchEndCount>0&&(i.myPrevMultipleTouchEndCount=i.myMultipleTouchEndCount,i.myMultipleTouchEndCount=0),i.myTimeTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchStartCount>0&&(i.myPrevMultipleTouchStartCount=i.myMultipleTouchStartCount,i.myMultipleTouchStartCount=0)):(i.myTimeNotTouched+=t,i.myPrevIsTouched&&(i.myMultipleTouchEndCount+=1,i.myPrevTimeTouched=i.myTimeTouched,i.myTimeTouched=0),i.myPrevTimeTouched+i.myTimeNotTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchStartCount>0&&(i.myPrevMultipleTouchStartCount=i.myMultipleTouchStartCount,i.myMultipleTouchStartCount=0),i.myTimeNotTouched>this._myMultipleTouchMaxDelay&&i.myMultipleTouchEndCount>0&&(i.myPrevMultipleTouchEndCount=i.myMultipleTouchEndCount,i.myMultipleTouchEndCount=0))}.bind(this));for(let i in PP.ButtonType){let s=this._myButtonInfos[PP.ButtonType[i]],n=this._myButtonCallbacks[PP.ButtonType[i]];if(s.myIsPressed&&!s.myPrevIsPressed){let r=n[PP.ButtonEvent.PRESS_START];this._triggerCallbacks(r,s)}if(!s.myIsPressed&&s.myPrevIsPressed){let r=n[PP.ButtonEvent.PRESS_END];this._triggerCallbacks(r,s)}if(s.myIsPressed){let r=n[PP.ButtonEvent.PRESSED];this._triggerCallbacks(r,s)}else{let r=n[PP.ButtonEvent.NOT_PRESSED];this._triggerCallbacks(r,s)}if(s.myIsTouched&&!s.myPrevIsTouched){let r=n[PP.ButtonEvent.TOUCH_START];this._triggerCallbacks(r,s)}if(!s.myIsTouched&&s.myPrevIsTouched){let r=n[PP.ButtonEvent.TOUCH_END];this._triggerCallbacks(r,s)}if(s.myIsTouched){let r=n[PP.ButtonEvent.TOUCHED];this._triggerCallbacks(r,s)}else{let r=n[PP.ButtonEvent.NOT_TOUCHED];this._triggerCallbacks(r,s)}if(s.myValue!=s.myPrevValue){let r=n[PP.ButtonEvent.VALUE_CHANGED];this._triggerCallbacks(r,s)}let o=n[PP.ButtonEvent.ALWAYS];this._triggerCallbacks(o,s)}this._mySelectStart=!1,this._mySelectEnd=!1,this._mySqueezeStart=!1,this._mySqueezeEnd=!1}_preUpdateAxesInfos(){this._myAxesInfo.myPrevAxes=this._myAxesInfo.myAxes}_updateAxesInfos(){this._myAxesInfo.myAxes=this._getAxesData()}_postUpdateAxesInfos(){if(this._myAxesInfo.myAxes[0]!=this._myAxesInfo.myPrevAxes[0]){let i=this._myAxesCallbacks[PP.AxesEvent.X_CHANGED];this._triggerCallbacks(i,this._myAxesInfo)}if(this._myAxesInfo.myAxes[1]!=this._myAxesInfo.myPrevAxes[1]){let i=this._myAxesCallbacks[PP.AxesEvent.Y_CHANGED];this._triggerCallbacks(i,this._myAxesInfo)}if(this._myAxesInfo.myAxes[0]!=this._myAxesInfo.myPrevAxes[0]||this._myAxesInfo.myAxes[1]!=this._myAxesInfo.myPrevAxes[1]){let i=this._myAxesCallbacks[PP.AxesEvent.AXES_CHANGED];this._triggerCallbacks(i,this._myAxesInfo)}let t=this._myAxesCallbacks[PP.AxesEvent.ALWAYS];this._triggerCallbacks(t,this._myAxesInfo)}_updatePulse(t){if(this._myPulseInfo.myIsDevicePulsing||this._myPulseInfo.myIntensity>0){let i=this._getHapticActuators();if(i.length>0){if(this._myPulseInfo.myIntensity>0){for(let s of i)s.pulse(this._myPulseInfo.myIntensity,1e3);this._myPulseInfo.myIsDevicePulsing=!0}else if(this._myPulseInfo.myIsDevicePulsing){for(let s of i)s.reset();this._myPulseInfo.myIsDevicePulsing=!1}}else this._myPulseInfo.myIsDevicePulsing=!1}this._myPulseInfo.myDuration-=t,this._myPulseInfo.myDuration<=0&&(this._myPulseInfo.myIntensity=0,this._myPulseInfo.myDuration=0)}_triggerCallbacks(t,i){for(let s of t.values())s(i,this)}}});var es=T(()=>{PP.UniversalGamepad=class extends PP.BaseGamepad{constructor(t){super(t),this._myGamepadCores=new Map,this._myStarted=!1}addGamepadCore(t,i){i.getHandedness()==this.getHandedness()&&(this._myGamepadCores.set(t,i),this._myStarted&&i.start())}getGamepadCore(t){this._myGamepadCores.get(t)}removeGamepadCore(t){this._myGamepadCores.get(t)&&this._myGamepadCores.delete(t)}removeAllGamepadCores(){for(let t of this._myGamepadCores.keys())this.removeGamepadCore(t)}getHandPose(){let t=null;for(let i of this._myGamepadCores.values())if(i.isGamepadCoreActive()&&(t=i.getHandPose()),t!=null)break;return t}isGamepadActive(){let t=!1;for(let i of this._myGamepadCores.values())if(i.isGamepadCoreActive()){t=!0;break}return t}_start(){for(let t of this._myGamepadCores.values())t.start();this._myStarted=!0}_preUpdate(t){for(let i of this._myGamepadCores.values())i.preUpdate(t)}_postUpdate(t){for(let i of this._myGamepadCores.values())i.postUpdate(t)}_getButtonData(t){let i={myIsPressed:!1,myIsTouched:!1,myValue:0};for(let s of this._myGamepadCores.values())if(s.isGamepadCoreActive()){let n=s.getButtonData(t);i.myIsPressed=i.myIsPressed||n.myIsPressed,i.myIsTouched=i.myIsTouched||n.myIsTouched,Math.abs(n.myValue)>Math.abs(i.myValue)&&(i.myValue=n.myValue)}return i}_getAxesData(){let t=[0,0];for(let i of this._myGamepadCores.values())if(i.isGamepadCoreActive()){let s=i.getAxesData();Math.abs(s[0])>Math.abs(t[0])&&(t[0]=s[0]),Math.abs(s[1])>Math.abs(t[1])&&(t[1]=s[1])}return t}_getHapticActuators(){let t=[];for(let i of this._myGamepadCores.values())i.isGamepadCoreActive()&&t.push(...i.getHapticActuators());return t}}});var is=T(()=>{PP.GamepadCore=class{constructor(t){this._myHandedness=t}getHandedness(){return this._myHandedness}getHandPose(){return null}isGamepadCoreActive(){return!0}start(){}preUpdate(t){}postUpdate(t){}getButtonData(t){return{pressed:!1,touched:!1,value:0}}getAxesData(){return[0,0]}getHapticActuators(){return[]}}});var ss=T(()=>{PP.XRGamepadCore=class extends PP.GamepadCore{constructor(t,i=new PP.HandPoseParams){super(t),this._myHandPose=new PP.HandPose(this._myHandedness,i),this._mySelectPressed=!1,this._mySqueezePressed=!1,this._myIsXRSessionActive=!1,this._myInputSource=null,this._myGamepad=null}getHandedness(){return this._myHandedness}getHandPose(){return this._myHandPose}isGamepadCoreActive(){return this._myIsXRSessionActive&&this._myGamepad!=null&&(this._myGamepad.connected==null||this._myGamepad.connected)}start(){this._myHandPose.start(),WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))}preUpdate(t){this._updateHandPose(t)}getButtonData(t){let i={myIsPressed:!1,myIsTouched:!1,myValue:0};if(this.isGamepadCoreActive()){if(t=3){let s=this._myGamepad.buttons[2];i.myIsPressed=s.pressed,i.myIsTouched=s.touched,i.myValue=s.value}}return i}getAxesData(){let t=[0,0];if(this.isGamepadCoreActive()){let i=this._myGamepad.axes;i.length==4?(Math.abs(i[0])>Math.abs(i[2])?t[0]=i[0]:t[0]=i[2],Math.abs(i[1])>Math.abs(i[3])?t[1]=i[1]:t[1]=i[3]):i.length==2&&(t[0]=i[0],t[1]=i[1]),t[1]=-t[1]}return t}getHapticActuators(){let t=[];return this.isGamepadCoreActive()&&(this._myGamepad.hapticActuators&&this._myGamepad.hapticActuators.length>0?t=this._myGamepad.hapticActuators:this._myGamepad.vibrationActuator&&t.push(this._myGamepad.vibrationActuator)),t}_updateHandPose(t){this._myHandPose.update(t),this._myInputSource=this._myHandPose.getInputSource(),this._myInputSource!=null?this._myGamepad=this._myInputSource.gamepad:this._myGamepad=null}_getSpecialButtonPressed(t){let i=!1;return this.isGamepadCoreActive()&&(t==PP.ButtonType.SELECT?i=this._mySelectPressed:t==PP.ButtonType.SQUEEZE&&(i=this._mySqueezePressed)),i}_onXRSessionStart(t){t.addEventListener("selectstart",this._selectStart.bind(this)),t.addEventListener("selectend",this._selectEnd.bind(this)),t.addEventListener("squeezestart",this._squeezeStart.bind(this)),t.addEventListener("squeezeend",this._squeezeEnd.bind(this)),this._myIsXRSessionActive=!0}_onXRSessionEnd(t){this._myIsXRSessionActive=!1}_selectStart(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySelectPressed=!0)}_selectEnd(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySelectPressed=!1)}_squeezeStart(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySqueezePressed=!0)}_squeezeEnd(t){this._myInputSource!=null&&this._myInputSource==t.inputSource&&(this._mySqueezePressed=!1)}}});var ns=T(()=>{PP.KeyboardGamepadCore=class extends PP.GamepadCore{constructor(t,i){super(t),this._myHandPose=i,this._myHandPoseUpdateActive=!1}getHandedness(){return this._myHandedness}getHandPose(){return this._myHandPose}setHandPoseUpdateActive(t){this._myHandPoseUpdateActive=t}isHandPoseUpdateActive(){return this._myHandPoseUpdateActive}isGamepadCoreActive(){return!0}start(){this._myHandPose&&this._myHandPoseUpdateActive&&this._myHandPose.start()}preUpdate(t){this._myHandPose&&this._myHandPoseUpdateActive&&this._myHandPose.update(t)}getButtonData(t){let i={myIsPressed:!1,myIsTouched:!1,myValue:0};if(this.isGamepadCoreActive())if(this.getHandedness()==PP.Handedness.LEFT)switch(t){case PP.ButtonType.SELECT:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.C)||PP.myKeyboard.isKeyPressed(PP.KeyType.c);break;case PP.ButtonType.SQUEEZE:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.F)||PP.myKeyboard.isKeyPressed(PP.KeyType.f);break;case PP.ButtonType.TOUCHPAD:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.X)||PP.myKeyboard.isKeyPressed(PP.KeyType.x);break;case PP.ButtonType.THUMBSTICK:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.R)||PP.myKeyboard.isKeyPressed(PP.KeyType.r);break;case PP.ButtonType.BOTTOM_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.Q)||PP.myKeyboard.isKeyPressed(PP.KeyType.q);break;case PP.ButtonType.TOP_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.E)||PP.myKeyboard.isKeyPressed(PP.KeyType.e);break;case PP.ButtonType.THUMB_REST:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.V)||PP.myKeyboard.isKeyPressed(PP.KeyType.v);break}else switch(t){case PP.ButtonType.SELECT:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.N)||PP.myKeyboard.isKeyPressed(PP.KeyType.n);break;case PP.ButtonType.SQUEEZE:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.H)||PP.myKeyboard.isKeyPressed(PP.KeyType.h);break;case PP.ButtonType.TOUCHPAD:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.M)||PP.myKeyboard.isKeyPressed(PP.KeyType.m);break;case PP.ButtonType.THUMBSTICK:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.Y)||PP.myKeyboard.isKeyPressed(PP.KeyType.y);break;case PP.ButtonType.BOTTOM_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.O)||PP.myKeyboard.isKeyPressed(PP.KeyType.o);break;case PP.ButtonType.TOP_BUTTON:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.U)||PP.myKeyboard.isKeyPressed(PP.KeyType.u);break;case PP.ButtonType.THUMB_REST:i.myIsPressed=PP.myKeyboard.isKeyPressed(PP.KeyType.B)||PP.myKeyboard.isKeyPressed(PP.KeyType.b);break}return i.myIsPressed&&(i.myIsTouched=!0,i.myValue=1),i}getAxesData(){let t=[0,0];return this.isGamepadCoreActive()&&(this.getHandedness()==PP.Handedness.LEFT?((PP.myKeyboard.isKeyPressed(PP.KeyType.W)||PP.myKeyboard.isKeyPressed(PP.KeyType.w))&&(t[1]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.S)||PP.myKeyboard.isKeyPressed(PP.KeyType.s))&&(t[1]+=-1),(PP.myKeyboard.isKeyPressed(PP.KeyType.D)||PP.myKeyboard.isKeyPressed(PP.KeyType.d))&&(t[0]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.A)||PP.myKeyboard.isKeyPressed(PP.KeyType.a))&&(t[0]+=-1)):((PP.myKeyboard.isKeyPressed(PP.KeyType.I)||PP.myKeyboard.isKeyPressed(PP.KeyType.i)||PP.myKeyboard.isKeyPressed(PP.KeyType.UP))&&(t[1]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.K)||PP.myKeyboard.isKeyPressed(PP.KeyType.k)||PP.myKeyboard.isKeyPressed(PP.KeyType.DOWN))&&(t[1]+=-1),(PP.myKeyboard.isKeyPressed(PP.KeyType.L)||PP.myKeyboard.isKeyPressed(PP.KeyType.l)||PP.myKeyboard.isKeyPressed(PP.KeyType.RIGHT))&&(t[0]+=1),(PP.myKeyboard.isKeyPressed(PP.KeyType.J)||PP.myKeyboard.isKeyPressed(PP.KeyType.j)||PP.myKeyboard.isKeyPressed(PP.KeyType.LEFT))&&(t[0]+=-1))),t}getHapticActuators(){return[]}}});var os=T(()=>{WL.registerComponent("pp-gamepad-mesh-animator",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_mySelect:{type:WL.Type.Object,default:null},_mySqueeze:{type:WL.Type.Object,default:null},_myThumbstick:{type:WL.Type.Object,default:null},_myTopButton:{type:WL.Type.Object,default:null},_myBottomButton:{type:WL.Type.Object,default:null},_mySelectRotateAngle:{type:WL.Type.Float,default:15},_mySqueezeRotateAngle:{type:WL.Type.Float,default:11},_myThumbstickRotateAngle:{type:WL.Type.Float,default:15},_myThumbstickPressOffset:{type:WL.Type.Float,default:625e-6},_myTopButtonPressOffset:{type:WL.Type.Float,default:.0015},_myBottomButtonPressOffset:{type:WL.Type.Float,default:.0015},_myUsePressForSqueeze:{type:WL.Type.Bool,default:!1},_mySqueezePressOffset:{type:WL.Type.Float,default:.0015}},{start:function(){let e=null;this._myHandedness==0?e=PP.myLeftGamepad:e=PP.myRightGamepad,this._mySelect!=null&&(this._mySelectOriginalRotation=this._mySelect.pp_getRotationLocalQuat(),this._mySelectOriginalLeft=this._mySelect.pp_getLeftLocal()),this._mySqueeze!=null&&(this._mySqueezeOriginalPosition=this._mySqueeze.pp_getPositionLocal(),this._mySqueezeOriginalRotation=this._mySqueeze.pp_getRotationLocalQuat(),this._mySqueezeOriginalLeft=this._mySqueeze.pp_getLeftLocal(),this._mySqueezeOriginalForward=this._mySqueeze.pp_getForwardLocal()),this._myThumbstick!=null&&(this._myThumbstickOriginalPosition=this._myThumbstick.pp_getPositionLocal(),this._myThumbstickOriginalRotation=this._myThumbstick.pp_getRotationLocalQuat(),this._myThumbstickOriginalLeft=this._myThumbstick.pp_getLeftLocal(),this._myThumbstickOriginalUp=this._myThumbstick.pp_getUpLocal(),this._myThumbstickOriginalForward=this._myThumbstick.pp_getForwardLocal()),this._myTopButton!=null&&(this._myTopButtonOriginalPosition=this._myTopButton.pp_getPositionLocal(),this._myTopButtonOriginalUp=this._myTopButton.pp_getUpLocal()),this._myBottomButton!=null&&(this._myBottomButtonOriginalPosition=this._myBottomButton.pp_getPositionLocal(),this._myBottomButtonOriginalUp=this._myBottomButton.pp_getUpLocal()),this._myThumbstick!=null&&(e.registerButtonEventListener(PP.ButtonType.THUMBSTICK,PP.ButtonEvent.PRESS_START,this,this._thumbstickPressedStart.bind(this)),e.registerButtonEventListener(PP.ButtonType.THUMBSTICK,PP.ButtonEvent.PRESS_END,this,this._thumbstickPressedEnd.bind(this))),this._myTopButton!=null&&(e.registerButtonEventListener(PP.ButtonType.TOP_BUTTON,PP.ButtonEvent.PRESS_START,this,this._topButtonPressedStart.bind(this)),e.registerButtonEventListener(PP.ButtonType.TOP_BUTTON,PP.ButtonEvent.PRESS_END,this,this._topButtonPressedEnd.bind(this))),this._myBottomButton!=null&&(e.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON,PP.ButtonEvent.PRESS_START,this,this._bottomButtonPressedStart.bind(this)),e.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON,PP.ButtonEvent.PRESS_END,this,this._bottomButtonPressedEnd.bind(this))),this._mySelect!=null&&e.registerButtonEventListener(PP.ButtonType.SELECT,PP.ButtonEvent.VALUE_CHANGED,this,this._selectValueChanged.bind(this)),this._mySqueeze!=null&&e.registerButtonEventListener(PP.ButtonType.SQUEEZE,PP.ButtonEvent.VALUE_CHANGED,this,this._squeezeValueChanged.bind(this)),this._myThumbstick!=null&&e.registerAxesEventListener(PP.AxesEvent.AXES_CHANGED,this,this._thumbstickValueChanged.bind(this))},_thumbstickPressedStart:function(){let e=PP.vec3_create();return function(i,s){this._myThumbstickOriginalUp.vec3_scale(-this._myThumbstickPressOffset,e),this._myThumbstick.pp_translateLocal(e)}}(),_thumbstickPressedEnd:function(t,i){this._myThumbstick.pp_setPositionLocal(this._myThumbstickOriginalPosition)},_topButtonPressedStart:function(e,t){this._myTopButton.pp_translateAxisLocal(-this._myTopButtonPressOffset,this._myTopButtonOriginalUp)},_topButtonPressedEnd:function(e,t){this._myTopButton.pp_setPositionLocal(this._myTopButtonOriginalPosition)},_bottomButtonPressedStart:function(e,t){this._myBottomButton.pp_translateAxisLocal(-this._myBottomButtonPressOffset,this._myBottomButtonOriginalUp)},_bottomButtonPressedEnd:function(e,t){this._myBottomButton.pp_setPositionLocal(this._myBottomButtonOriginalPosition)},_selectValueChanged:function(e,t){this._mySelect.pp_setRotationLocalQuat(this._mySelectOriginalRotation),e.myValue>1e-5&&this._mySelect.pp_rotateAxisLocal(this._mySelectRotateAngle*e.myValue,this._mySelectOriginalLeft)},_squeezeValueChanged:function(e,t){if(this._mySqueeze.pp_setPositionLocal(this._mySqueezeOriginalPosition),this._mySqueeze.pp_setRotationLocalQuat(this._mySqueezeOriginalRotation),e.myValue>1e-5)if(this._myUsePressForSqueeze){let i=this._mySqueezePressOffset;this._myHandedness==1&&(i*=-1),this._mySqueeze.pp_translateAxisLocal(i*e.myValue,this._mySqueezeOriginalLeft)}else{let i=-this._mySqueezeRotateAngle;this._myHandedness==1&&(i*=-1),this._mySqueeze.pp_rotateAxisLocal(i*e.myValue,this._mySqueezeOriginalForward)}},_thumbstickValueChanged:function(e,t){this._myThumbstick.pp_setRotationLocalQuat(this._myThumbstickOriginalRotation);let i=this._myThumbstickRotateAngle*e.myAxes[1],s=this._myThumbstickRotateAngle*e.myAxes[0];Math.abs(i)>1e-4&&this._myThumbstick.pp_rotateAxisLocal(i,this._myThumbstickOriginalLeft),Math.abs(s)>1e-4&&this._myThumbstick.pp_rotateAxisLocal(s,this._myThumbstickOriginalForward)}})});var as=T(()=>{PP.GamepadManager=class{constructor(){this._myLeftGamepad=new PP.UniversalGamepad(PP.Handedness.LEFT),this._myRightGamepad=new PP.UniversalGamepad(PP.Handedness.RIGHT)}start(){this._myLeftGamepad.start(),this._myRightGamepad.start()}update(t){this._myLeftGamepad.update(t),this._myRightGamepad.update(t)}getLeftGamepad(){return this._myLeftGamepad}getRightGamepad(){return this._myRightGamepad}getGamepad(t){let i=null;switch(t){case PP.Handedness.LEFT:i=this._myLeftGamepad;break;case PP.Handedness.RIGHT:i=this._myRightGamepad;break;default:i=null}return i}getGamepads(){let t=[];return t[PP.Handedness.LEFT]=this._myLeftGamepad,t[PP.Handedness.RIGHT]=this._myRightGamepad,t}}});var rs=T(()=>{PP.GamepadUtils={_mySimultaneousPressMaxDelay:.15,_mySimultaneousTouchMaxDelay:.15,setSimultaneousPressMaxDelay:function(e){PP.GamepadUtils._mySimultaneousPressMaxDelay=e},setSimultaneousTouchMaxDelay:function(e){PP.GamepadUtils._mySimultaneousTouchMaxDelay=e},getSimultaneousPressMaxDelay:function(){return PP.GamepadUtils._mySimultaneousPressMaxDelay},getSimultaneousTouchMaxDelay:function(){return PP.GamepadUtils._mySimultaneousTouchMaxDelay},isAnyButtonPressStart:function(...e){let t=null,i=e;isNaN(e[0])||(t=e[0],i=e.slice(1));for(let n of i)if(n.length==1)for(let o in PP.ButtonType)n.push(PP.ButtonType[o]);let s=!1;for(let n of i){let o=n[0];for(let r=1;r{WL.registerComponent("pp-gamepad-control-scheme",{_myShowOnStart:{type:WL.Type.Bool,default:!0},_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_mySelectText:{type:WL.Type.String,default:""},_mySqueezeText:{type:WL.Type.String,default:""},_myThumbstickText:{type:WL.Type.String,default:""},_myBottomButtonText:{type:WL.Type.String,default:""},_myTopButtonText:{type:WL.Type.String,default:""},_mySelect:{type:WL.Type.Object,default:null},_mySqueeze:{type:WL.Type.Object,default:null},_myThumbstick:{type:WL.Type.Object,default:null},_myBottomButton:{type:WL.Type.Object,default:null},_myTopButton:{type:WL.Type.Object,default:null},_myTextScaleMultiplier:{type:WL.Type.Float,default:1},_myTextOffsetMultiplier:{type:WL.Type.Float,default:1},_myLineLengthMultiplier:{type:WL.Type.Float,default:1},_myLineThicknessMultiplier:{type:WL.Type.Float,default:1},_myDistanceFromButtonsMultiplier:{type:WL.Type.Float,default:1},_myTextMaterial:{type:WL.Type.Material},_myLineMaterial:{type:WL.Type.Material}},{init:function(){},start:function(){this._myTextMaterialFinal=this._myTextMaterial!=null?this._myTextMaterial:PP.myDefaultResources.myMaterials.myText.clone(),this._myLineMaterialFinal=this._myLineMaterial!=null?this._myLineMaterial:PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),this._myHandednessType=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myControlSchemeDirection=this._myHandednessType==PP.Handedness.LEFT?1:-1,this._myVisible=!1,this._mySetVisibleNextUpdate=!1,this._createControlScheme(),this.setVisible(this._myShowOnStart),this._myVisibleBackup=this._myVisible},update:function(e){this._mySetVisibleNextUpdate&&(this._mySetVisibleNextUpdate=!1,this.setVisible(!1),this.setVisible(this._myVisibleBackup))},onActivate(){this._mySetVisibleNextUpdate=!0},onDeactivate(){this._myVisibleBackup=this._myVisible,this.setVisible(!1)},isVisible(){return this._myVisible},setVisible(e){this._myVisible=e,this._myRootObject!=null&&(this._myRootObject.pp_setActive(this._myVisible),this._myVisible&&this._hideEmptySchemes())},setSelectText(e){this._mySelectText=e,this._mySelectTextComponent.text=this._mySelectText,this.setVisible(this._myVisible)},setSqueezeText(e){this._mySqueezeText=e,this._mySqueezeTextComponent.text=this._mySqueezeText,this.setVisible(this._myVisible)},setThumbstickText(e){this._myThumbstickText=e,this._myThumbstickTextComponent.text=this._myThumbstickText,this.setVisible(this._myVisible)},setBottomButtonText(e){this._myBottomButtonText=e,this._myBottomButtonTextComponent.text=this._myBottomButtonText,this.setVisible(this._myVisible)},setTopButtonText(e){this._myTopButtonText=e,this._myTopButtonTextComponent.text=this._myTopButtonText,this.setVisible(this._myVisible)},_createControlScheme(){this._myRootObject=this.object.pp_addObject();let e=.02*this._myDistanceFromButtonsMultiplier,t=.0935*this._myLineLengthMultiplier,i=this._myThumbstick;this._mySelectObject=this._myRootObject.pp_addObject(),this._mySelectTextComponent=this._addScheme(this._mySelect,i,[0,0,e],[t*this._myControlSchemeDirection,0,0],this._mySelectObject),this._mySelectTextComponent.text=this._mySelectText,this._mySqueezeObject=this._myRootObject.pp_addObject(),this._mySqueezeTextComponent=this._addScheme(this._mySqueeze,i,[e*this._myControlSchemeDirection,0,0],[t*this._myControlSchemeDirection,0,0],this._mySqueezeObject),this._mySqueezeTextComponent.text=this._mySqueezeText,this._myThumbstickObject=this._myRootObject.pp_addObject(),this._myThumbstickTextComponent=this._addScheme(this._myThumbstick,i,[0,e,0],[-t*this._myControlSchemeDirection,0,0],this._myThumbstickObject),this._myThumbstickTextComponent.text=this._myThumbstickText;let s=this._myThumbstick.pp_getPositionLocal(),n=this._myThumbstick.pp_getUpLocal();{let l=this._myBottomButton.pp_getPositionLocal().vec3_sub(s).vec3_valueAlongAxis(n);this._myBottomButtonObject=this._myRootObject.pp_addObject(),this._myBottomButtonTextComponent=this._addScheme(this._myBottomButton,i,[0,e-l,0],[0,0,-t],this._myBottomButtonObject),this._myBottomButtonTextComponent.text=this._myBottomButtonText}{let l=this._myTopButton.pp_getPositionLocal().vec3_sub(s).vec3_valueAlongAxis(n);this._myTopButtonObject=this._myRootObject.pp_addObject(),this._myTopButtonTextComponent=this._addScheme(this._myTopButton,i,[0,e-l,0],[-t*this._myControlSchemeDirection,0,0].vec3_rotateAxis(-45*this._myControlSchemeDirection,[0,1,0]),this._myTopButtonObject),this._myTopButtonTextComponent.text=this._myTopButtonText}},_addScheme(e,t,i,s,n){let o=e.pp_getPositionLocal(),r=t.pp_getForwardLocal(),l=t.pp_getRightLocal(),y=t.pp_getUpLocal(),c=o.vec3_add(l.vec3_scale(i[0]));c.vec3_add(y.vec3_scale(i[1]),c),c.vec3_add(r.vec3_scale(i[2]),c);let a=c.vec3_add(l.vec3_scale(s[0]));a.vec3_add(y.vec3_scale(s[1]),a),a.vec3_add(r.vec3_scale(s[2]),a);let m=.01*this._myTextOffsetMultiplier,u=a.vec3_add(r.vec3_scale(-m));return this._addLine(c,a,n),this._addText(u,r,y,n)},_addLine(e,t,i){let s=t.vec3_sub(e),n=s.vec3_length();s.vec3_normalize(s),lineRootObject=i.pp_addObject(),lineObject=lineRootObject.pp_addObject();let o=lineObject.addComponent("mesh");o.mesh=PP.myDefaultResources.myMeshes.myCylinder,o.material=this._myLineMaterialFinal,lineRootObject.pp_setPositionLocal(e);let r=.001*this._myLineThicknessMultiplier;lineObject.pp_scaleObject([r/2,n/2,r/2]),lineObject.pp_setUpLocal(s),lineObject.pp_translateObject([0,n/2,0])},_addText(e,t,i,s){let n=s.pp_addObject();n.pp_setPositionLocal(e),n.pp_lookToLocal(i,t),n.pp_scaleObject(.0935*this._myTextScaleMultiplier);let o=n.pp_addComponent("text");return o.alignment=WL.Alignment.Center,o.justification=WL.Justification.Top,o.material=this._myTextMaterialFinal,o},_hideEmptySchemes(){this._mySelectText.length==0&&this._mySelectObject.pp_setActive(!1),this._mySqueezeText.length==0&&this._mySqueezeObject.pp_setActive(!1),this._myThumbstickText.length==0&&this._myThumbstickObject.pp_setActive(!1),this._myBottomButtonText.length==0&&this._myBottomButtonObject.pp_setActive(!1),this._myTopButtonText.length==0&&this._myTopButtonObject.pp_setActive(!1)}})});var ms=T(()=>{PP.BasePoseParams=class{constructor(){this.myReferenceObject=null,this.myFixForward=!0,this.myForceEmulatedVelocities=!1}};PP.BasePose=class{constructor(t=new PP.BasePoseParams){this._myFixForward=t.myFixForward,this._myForceEmulatedVelocities=t.myForceEmulatedVelocities,this._myReferenceSpace=null,this._myReferenceObject=t.myReferenceObject,this._myPosition=[0,0,0],this._myRotation=[0,0,0,1],this._myPrevPosition=[0,0,0],this._myPrevRotation=[0,0,0,1],this._myLinearVelocity=[0,0,0],this._myAngularVelocity=[0,0,0],this._myIsValid=!1,this._myIsLinearVelocityEmulated=!0,this._myIsAngularVelocityEmulated=!0}setReferenceObject(t){this._myReferenceObject=t}getReferenceObject(){return this._myReferenceObject}setFixForward(t){this._myFixForward=t}isFixForward(){return this._myFixForward}setForceEmulatedVelocities(t){this._myForceEmulatedVelocities=t}isForceEmulatedVelocities(){return this._myForceEmulatedVelocities}getReferenceSpace(){return this._myReferenceSpace}getInputSource(){return this._myInputSource}getPosition(){}getRotation(){return this.getRotationDegrees()}getRotationDegrees(){return this.getRotationQuat().quat_toDegrees()}getRotationRadians(){return this.getRotationQuat().quat_toRadians()}getRotationQuat(){}getTransform(){return this.getTransformMatrix()}getTransformMatrix(){}getTransformQuat(){}getLinearVelocity(){}getAngularVelocity(){return this.getAngularVelocityDegrees()}getAngularVelocityDegrees(){}getAngularVelocityRadians(){}isValid(){return this._myIsValid}isLinearVelocityEmulated(){return this._myIsLinearVelocityEmulated}isAngularVelocityEmulated(){return this._myIsAngularVelocityEmulated}start(){WL.xrSession&&this._onXRSessionStart(!0,WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this,!1)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))}update(t){this._myPrevPosition.vec3_copy(this._myPosition),this._myPrevRotation.quat_copy(this._myRotation);let i=Module.webxr_frame;if(i&&this._isReadyToGetPose()){let s=null;try{s=this._getPose(i)}catch{}s?(this._myPosition[0]=s.transform.position.x,this._myPosition[1]=s.transform.position.y,this._myPosition[2]=s.transform.position.z,this._myRotation[0]=s.transform.orientation.x,this._myRotation[1]=s.transform.orientation.y,this._myRotation[2]=s.transform.orientation.z,this._myRotation[3]=s.transform.orientation.w,s.linearVelocity&&!this._myForceEmulatedVelocities?(this._myLinearVelocity[0]=s.linearVelocity.x,this._myLinearVelocity[1]=s.linearVelocity.y,this._myLinearVelocity[2]=s.linearVelocity.z,this._myIsLinearVelocityEmulated=!1):(this._computeEmulatedLinearVelocity(t),this._myIsLinearVelocityEmulated=!0),s.angularVelocity&&!this._myForceEmulatedVelocities?(this._myAngularVelocity[0]=s.angularVelocity.x,this._myAngularVelocity[1]=s.angularVelocity.y,this._myAngularVelocity[2]=s.angularVelocity.z,this._myIsAngularVelocityEmulated=!1):(this._computeEmulatedAngularVelocity(t),this._myIsAngularVelocityEmulated=!0),this._myIsValid=!0):(this._myLinearVelocity[0]=0,this._myLinearVelocity[1]=0,this._myLinearVelocity[2]=0,this._myAngularVelocity[0]=0,this._myAngularVelocity[1]=0,this._myAngularVelocity[2]=0,this._myIsValid=!1,this._myIsLinearVelocityEmulated=!0,this._myIsAngularVelocityEmulated=!0),this._updateHook(t,s)}else this._myLinearVelocity[0]=0,this._myLinearVelocity[1]=0,this._myLinearVelocity[2]=0,this._myAngularVelocity[0]=0,this._myAngularVelocity[1]=0,this._myAngularVelocity[2]=0,this._myIsValid=!1,this._myIsLinearVelocityEmulated=!0,this._myIsAngularVelocityEmulated=!0,this._updateHook(t,null)}_isReadyToGetPose(){return!0}_getPose(t){return null}_updateHook(t,i){}_onXRSessionStartHook(t,i){}_onXRSessionEndHook(){}_computeEmulatedLinearVelocity(t){t>0?(this._myPosition.vec3_sub(this._myPrevPosition,this._myLinearVelocity),this._myLinearVelocity.vec3_scale(1/t,this._myLinearVelocity)):(this._myLinearVelocity[0]=0,this._myLinearVelocity[1]=0,this._myLinearVelocity[2]=0)}_onXRSessionStart(t,i){i.requestReferenceSpace(WebXR.refSpace).then(function(s){this._myReferenceSpace=s}.bind(this)),this._onXRSessionStartHook(t,i)}_onXRSessionEnd(){this._onXRSessionEndHook(),this._myReferenceSpace=null}};PP.BasePose.prototype.getPosition=function(){let e=PP.vec3_create(),t=PP.mat4_create();return function(){return this._myReferenceObject==null?this._myPosition:this._myPosition.vec3_convertPositionToWorld(this._myReferenceObject.pp_getTransform(t),e)}}();PP.BasePose.prototype.getRotationQuat=function(){let e=PP.quat_create(),t=PP.quat_create(),i=PP.vec3_create();return function(){return e.quat_copy(this._myRotation),this._myFixForward&&e.quat_rotateAxisRadians(Math.PI,e.quat_getUp(i),e),this._myReferenceObject==null?e:e.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(t),e)}}();PP.BasePose.prototype.getTransformMatrix=function(){let e=PP.mat4_create();return function(){return this.getTransformQuat().quat2_toMatrix(e)}}();PP.BasePose.prototype.getTransformQuat=function(){let e=PP.quat2_create(),t=PP.quat2_create();return function(){return e.quat2_setPositionRotationQuat(this._myPosition,this.getRotationQuat()),this._myReferenceObject==null?e:e.quat_toWorld(this._myReferenceObject.pp_getTransformQuat(t),e)}}();PP.BasePose.prototype.getLinearVelocity=function(){let e=PP.vec3_create(),t=PP.mat4_create();return function(){return this._myReferenceObject==null?this._myLinearVelocity:this._myLinearVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(t),e)}}();PP.BasePose.prototype.getAngularVelocityDegrees=function(){let e=PP.vec3_create();return function(){this.getAngularVelocityRadians().vec3_toDegrees(e)}}();PP.BasePose.prototype.getAngularVelocityRadians=function(){let e=PP.vec3_create(),t=PP.mat4_create();return function(){return this._myReferenceObject==null?this._myAngularVelocity:this._myAngularVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(t),e)}}();PP.BasePose.prototype._computeEmulatedAngularVelocity=function(){let e=PP.vec3_create(),t=PP.vec3_create();return function(s){s>0?(e=this._myRotation.quat_toRadians(e),t=this._myPrevRotation.quat_toRadians(t),e.vec3_sub(t,this._myAngularVelocity),this._myAngularVelocity.vec3_scale(1/s,this._myAngularVelocity)):(this._myAngularVelocity[0]=0,this._myAngularVelocity[1]=0,this._myAngularVelocity[2]=0)}}();Object.defineProperty(PP.BasePose.prototype,"getPosition",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getRotationQuat",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getTransformMatrix",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getTransformQuat",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getLinearVelocity",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getAngularVelocityDegrees",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"getAngularVelocityRadians",{enumerable:!1});Object.defineProperty(PP.BasePose.prototype,"_computeEmulatedAngularVelocity",{enumerable:!1})});var ys=T(()=>{PP.HandPoseParams=class extends PP.BasePoseParams{constructor(){super(),this.myFixTrackedHandRotation=!0}};PP.HandPose=class extends PP.BasePose{constructor(t,i=new PP.HandPoseParams){super(i),this._myInputSource=null,this._myHandedness=t,this._myFixTrackedHandRotation=i.myFixTrackedHandRotation,this._myIsTrackedHand=!1}getInputSourceType(){return this._myInputSource==null?null:PP.InputUtils.getInputSourceType(this._myInputSource)}isFixTrackedHandRotation(){return this._myFixTrackedHandRotation}setFixTrackedHandRotation(t){this.myFixTrackedHandRotation=t}_isReadyToGetPose(){return this._myInputSource!=null}_getPose(t){return t.getPose(this._myInputSource.gripSpace,this._myReferenceSpace)}_onXRSessionStartHook(t,i){if(i.addEventListener("inputsourceschange",function(s){if(s.removed)for(let n of s.removed)n==this._myInputSource&&(this._myInputSource=null);if(s.added)for(let n of s.added)n.handedness==this._myHandedness&&(this._myInputSource=n,this._myIsTrackedHand=PP.InputUtils.getInputSourceType(this._myInputSource)==PP.InputSourceType.TRACKED_HAND)}.bind(this)),t&&this._myInputSource==null&&i.inputSources)for(let s of i.inputSources)s.handedness==this._myHandedness&&(this._myInputSource=s,this._myIsTrackedHand=PP.InputUtils.getInputSourceType(this._myInputSource)==PP.InputSourceType.TRACKED_HAND)}_onXRSessionEndHook(){this._myInputSource=null}};PP.HandPose.prototype.getRotationQuat=function(){let e=PP.quat_create(),t=PP.quat_create(),i=PP.vec3_create(),s=PP.vec3_create(),n=PP.vec3_create();return function(){if(e.quat_copy(this._myRotation),this._myFixForward&&e.quat_rotateAxisRadians(Math.PI,e.quat_getUp(i),e),this._myFixTrackedHandRotation&&this._myIsTrackedHand){e.quat_rotateAxis(-60,e.quat_getRight(s),e);let r=20;r=this._myHandedness==PP.Handedness.LEFT?r:-r,e.quat_rotateAxis(r,e.quat_getForward(n),e)}return this._myReferenceObject==null?e:e.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(t),e)}}();Object.defineProperty(PP.HandPose.prototype,"getRotationQuat",{enumerable:!1})});var us=T(()=>{PP.HeadPose=class extends PP.BasePose{_getPose(t){return t.getViewerPose(this._myReferenceSpace)}}});var cs=T(()=>{PP.TrackedHandJointPose=class extends PP.BasePose{constructor(t,i,s=new PP.BasePoseParams){super(s),this._myInputSource=null,this._myHandedness=t,this._myTrackedHandJointType=i,this._myJointRadius=0}getTrackedHandJointType(){return this._myTrackedHandJointType}setTrackedHandJointType(t){this._myTrackedHandJointType=t}getJointRadius(){return this._myJointRadius}_isReadyToGetPose(){return this._myInputSource!=null}_getPose(t){return t.getJointPose(this._myInputSource.hand.get(this._myTrackedHandJointType),this._myReferenceSpace)}_updateHook(t,i){i!=null&&(this._myJointRadius=i.radius)}_onXRSessionStartHook(t,i){if(i.addEventListener("inputsourceschange",function(s){if(s.removed)for(let n of s.removed)n==this._myInputSource&&(this._myInputSource=null);if(s.added)for(let n of s.added)n.handedness==this._myHandedness&&PP.InputUtils.getInputSourceType(n)==PP.InputSourceType.TRACKED_HAND&&(this._myInputSource=n)}.bind(this)),t&&this._myInputSource==null&&i.inputSources)for(let s of i.inputSources)s.handedness==this._myHandedness&&PP.InputUtils.getInputSourceType(s)==PP.InputSourceType.TRACKED_HAND&&(this._myInputSource=s)}_onXRSessionEndHook(){this._myInputSource=null}}});var hs=T(()=>{PP.TrackedHandPoseParams=class extends PP.BasePoseParams{constructor(t=!0){if(super(),this.myTrackedHandJointTypeList=[],t)for(let i in PP.TrackedHandJointType)this.myTrackedHandJointTypeList.push([PP.TrackedHandJointType[i]])}};PP.TrackedHandPose=class{constructor(t,i=new PP.TrackedHandPoseParams){this._myHandedness=t,this._myFixForward=i.myFixForward,this._myForceEmulatedVelocities=i.myForceEmulatedVelocities,this._myReferenceObject=i.myReferenceObject,this._myTrackedHandJointPoseParams=new PP.BasePoseParams,this._myTrackedHandJointPoseParams.myFixForward=this._myFixForward,this._myTrackedHandJointPoseParams.myForceEmulatedVelocities=this._myForceEmulatedVelocities,this._myTrackedHandJointPoseParams.myReferenceObject=this._myReferenceObject,this._myTrackedHandJointPoseList=[];for(let s of i.myTrackedHandJointTypeList){let n=new PP.TrackedHandJointPose(this._myHandedness,s,this._myTrackedHandJointPoseParams);this._myTrackedHandJointPoseList[s]=n}}start(){for(let t in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[t].start()}update(t){for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].update(t)}getJointPose(t){return this._myTrackedHandJointPoseList[t]}getJointPoseByIndex(t){return this._myTrackedHandJointPoseList[PP.InputUtils.getJointTypeByIndex(t)]}addTrackedHandJointType(t){if(!this._myTrackedHandJointPoseList.pp_has(i=>i.getTrackedHandJointType()==t)){let i=new PP.TrackedHandJointPose(this._myHandedness,t,this._myTrackedHandJointPoseParams);this._myTrackedHandJointPoseList.push(i)}}removeTrackedHandJointType(t){this._myTrackedHandJointPoseList.pp_remove(i=>i.getTrackedHandJointType()==t)}setReferenceObject(t){this._myReferenceObject=t,this._myTrackedHandJointPoseParams.myReferenceObject=this._myReferenceObject;for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].setReferenceObject(t)}getReferenceObject(){return this._myReferenceObject}setFixForward(t){this._myFixForward=t,this._myTrackedHandJointPoseParams.myFixForward=this._myFixForward;for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].setFixForward(t)}isFixForward(){return this._myFixForward}setForceEmulatedVelocities(t){this._myForceEmulatedVelocities=t,this._myTrackedHandJointPoseParams.myForceEmulatedVelocities=this._myForceEmulatedVelocities;for(let i in this._myTrackedHandJointPoseList)this._myTrackedHandJointPoseList[i].setForceEmulatedVelocities(t)}isForceEmulatedVelocities(){return this._myForceEmulatedVelocities}}});var ps=T(()=>{WL.registerComponent("pp-set-player-height",{_myEyesHeight:{type:WL.Type.Float,default:1.65},_mySetOnlyOnStart:{type:WL.Type.Bool,default:!1}},{start(){let e=this.object.pp_getPositionLocal();this.object.pp_setPositionLocal([e[0],this._myEyesHeight,e[2]]),this._myHeightSetOnce=!1,WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))},_onXRSessionStart(){if(this.active&&(!this._mySetOnlyOnStart||!this._myHeightSetOnce)){let e=this.object.pp_getPositionLocal();PP.XRUtils.isReferenceSpaceLocalFloor()?this.object.pp_setPositionLocal([e[0],0,e[2]]):PP.XRUtils.isDeviceEmulated()?this.object.pp_setPositionLocal([e[0],0,e[2]]):this.object.pp_setPositionLocal([e[0],this._myEyesHeight,e[2]]),this._myHeightSetOnce=!0}},_onXRSessionEnd(){if(this.active&&!this._mySetOnlyOnStart){let e=this.object.pp_getPositionLocal();this.object.pp_setPositionLocal([e[0],this._myEyesHeight,e[2]])}}})});var ds=T(()=>{WL.registerComponent("pp-set-hand-local-transform",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){this._myHandPose=new PP.HandPose(PP.InputUtils.getHandednessByIndex(this._myHandedness)),this._myHandPose.setFixForward(this._myFixForward)},start:function(){this._myHandPose.start()},update:function(){let e=PP.quat2_create();return function(i){this._myHandPose.update(i),this.object.pp_setTransformLocalQuat(this._myHandPose.getTransformQuat(e))}}()})});var _s=T(()=>{WL.registerComponent("pp-set-head-local-transform",{_myNonVRCamera:{type:WL.Type.Object},_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){this._myHeadPose=new PP.HeadPose,this._myHeadPose.setFixForward(this._myFixForward)},start:function(){this._myHeadPose.start()},update:function(){let e=PP.quat2_create(),t=PP.quat_create(),i=PP.vec3_create(),s=PP.vec3_create();return function(o){this._myHeadPose.update(o),PP.XRUtils.isXRSessionActive()?this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(e)):(t=this._myNonVRCamera.pp_getRotationLocalQuat(t),this._myFixForward&&t.quat_rotateAxisRadians(Math.PI,t.quat_getUp(i),t),this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(s)),this.object.pp_setRotationLocalQuat(t))}}()})});var Ps=T(()=>{WL.registerComponent("pp-set-vr-head-local-transform",{_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){this._myHeadPose=new PP.HeadPose,this._myHeadPose.setFixForward(this._myFixForward)},start:function(){this._myHeadPose.start()},update:function(){let e=PP.quat2_create();return function(i){this._myHeadPose.update(i),this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(e))}}()})});var gs=T(()=>{WL.registerComponent("pp-set-non-vr-head-local-transform",{_myNonVRCamera:{type:WL.Type.Object},_myFixForward:{type:WL.Type.Bool,default:!0}},{init:function(){},start:function(){},update:function(e){let t=PP.quat_create(),i=PP.vec3_create(),s=PP.vec3_create();return function(o){t=this._myNonVRCamera.pp_getRotationLocalQuat(t),this._myFixForward&&t.quat_rotateAxisRadians(Math.PI,t.quat_getUp(i),t),this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(s)),this.object.pp_setRotationLocalQuat(t)}}()})});var fs=T(()=>{WL.registerComponent("pp-set-tracked-hand-joint-local-transform",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myFixForward:{type:WL.Type.Bool,default:!0},_mySetLocalScaleAsJointRadius:{type:WL.Type.Bool,default:!1},_myJointType:{type:WL.Type.Enum,values:["Wrist","Thumb Metacarpal","Thumb Phalanx Proximal","Thumb Phalanx Distal","Thumb Tip","Index Metacarpal","Index Phalanx Proximal","Index Phalanx Intermediate","Index Phalanx Distal","Index Tip","Middle Metacarpal","Middle Phalanx Proximal","Middle Phalanx Intermediate","Middle Phalanx Distal","Middle Tip","Ring Metacarpal","Ring Phalanx Proximal","Ring Phalanx Intermediate","Ring Phalanx Distal","Ring Tip","Pinky Metacarpal","Pinky Phalanx Proximal","Pinky Phalanx Intermediate","Pinky Phalanx Distal","Pinky Tip"],default:"Wrist"}},{init:function(){this._myHandednessInternal=PP.InputUtils.getHandednessByIndex(this._myHandedness),this._myJointTypeInternal=PP.InputUtils.getJointTypeByIndex(this._myJointType),this._myTrackedHandJointPose=new PP.TrackedHandJointPose(this._myHandednessInternal,this._myJointTypeInternal),this._myTrackedHandJointPose.setFixForward(this._myFixForward)},start:function(){this._myTrackedHandJointPose.start()},update:function(e){this._myTrackedHandJointPose.update(e),this.object.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat()),this._mySetLocalScaleAsJointRadius&&this.object.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius())}})});var Ts=T(()=>{WL.registerComponent("pp-copy-hand-transform",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"}},{init:function(){this._myHandednessType=this._myHandedness==0?PP.Handedness.LEFT:PP.Handedness.RIGHT},update:function(e){let t=PP.myPlayerObjects.myHands[this._myHandednessType];this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var Cs=T(()=>{WL.registerComponent("pp-copy-head-transform",{},{update:function(e){let t=PP.myPlayerObjects.myHead;this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var bs=T(()=>{WL.registerComponent("pp-copy-player-transform",{},{update:function(e){let t=PP.myPlayerObjects.myPlayer;this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var Ss=T(()=>{WL.registerComponent("pp-copy-player-pivot-transform",{},{update:function(e){let t=PP.myPlayerObjects.myPlayerPivot;this.object.pp_setTransformQuat(t.pp_getTransformQuat()),this.object.pp_setScale(t.pp_getScale())}})});var vs=T(()=>{PP.ToolHandedness={NONE:null,LEFT:"left",RIGHT:"right"};PP.ToolInputSourceType={NONE:null,GAMEPAD:0,TRACKED_HAND:1}});var xs=T(()=>{WL.registerComponent("pp-tool-cursor",{_myHandedness:{type:WL.Type.Enum,values:["left","right"],default:"left"},_myPulseOnHover:{type:WL.Type.Bool,default:!1},_myShowFingerCursor:{type:WL.Type.Bool,default:!1}},{init:function(){this._myHandednessString=["left","right"][this._myHandedness],this._myCursorPosition=[0,-.035,-.05],this._myCursorRotation=[-30,0,0],this._myCursorMeshScale=[.0025,.0025,.0025],this._myCursorColor=[255/255,255/255,255/255,1],this._myCursorTargetCollisionGroup=7},start:function(){this._myFixForwardObject=WL.scene.addObject(this.object),this._myFixForwardObject.pp_rotateObject([0,180,0]),this._myCursorObjectVR=WL.scene.addObject(this._myFixForwardObject),this._myCursorObjectVR.pp_setPositionLocal(this._myCursorPosition),this._myCursorObjectVR.pp_rotateObject(this._myCursorRotation);{let i=WL.scene.addObject(this._myCursorObjectVR);i.pp_setScale(this._myCursorMeshScale);let s=i.addComponent("mesh");s.mesh=PP.myDefaultResources.myMeshes.mySphere,s.material=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),s.material.color=this._myCursorColor;let n=this._myCursorObjectVR.addComponent("cursor",{collisionGroup:this._myCursorTargetCollisionGroup,handedness:this._myHandedness+1,cursorObject:i});n.rayCastMode=0,this._myPulseOnHover&&n.globalTarget.addHoverFunction(this._pulseOnHover.bind(this))}this._myCursorObjectNonVR=WL.scene.addObject(null);{let i=this._myCursorObjectNonVR.addComponent("cursor",{collisionGroup:this._myCursorTargetCollisionGroup,handedness:this._myHandedness+1});i.rayCastMode=0,this._myPulseOnHover&&i.globalTarget.addHoverFunction(this._pulseOnHover.bind(this)),i.setViewComponent(PP.myPlayerObjects.myNonVRCamera.getComponent("view"))}let e=null,t=.0125;if(this._myShowFingerCursor){e=this.object.pp_addObject();let i=e.addComponent("mesh");i.mesh=PP.myDefaultResources.myMeshes.mySphere,i.material=PP.myDefaultResources.myMaterials.myFlatOpaque.clone(),i.material.color=this._myCursorColor,e.pp_setScale(t)}this._myFingerCursorObject=WL.scene.addObject(this.object),this._myFingerCursorComponent=this._myFingerCursorObject.addComponent("pp-finger-cursor",{_myHandedness:this._myHandedness,_myEnableMultipleClicks:!0,_myCollisionGroup:this._myCursorTargetCollisionGroup,_myCollisionSize:t,_myCursorObject:e}),this._myCursorObjectVR.pp_setActive(!1),this._myCursorObjectNonVR.pp_setActive(!1),this._myFingerCursorObject.pp_setActive(!1)},update:function(){let e=PP.quat2_create();return function(i){let s=this._isUsingHand();this._myFingerCursorObject.pp_setActive(s),s?(this._myCursorObjectNonVR.pp_setActive(!1),this._myCursorObjectVR.pp_setActive(!1)):PP.XRUtils.isXRSessionActive()?(this._myCursorObjectVR.pp_setActive(!s),this._myCursorObjectNonVR.pp_setActive(!1)):(this._myCursorObjectNonVR.pp_setActive(!s),this._myCursorObjectVR.pp_setActive(!1),this._myCursorObjectNonVR.pp_setTransformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getTransformQuat(e)))}}(),_isUsingHand:function(){let e=!1;if(WL.xrSession&&WL.xrSession.inputSources)for(let t=0;t{PP.ConsoleVRWidgetSetup=class{constructor(){this._initializeBuildSetup(),this._initializeRuntimeSetup()}_initializeBuildSetup(){this.myBackgroundColor=[46/255,46/255,46/255,1],this.myCursorTargetCollisionCollider=2,this.myCursorTargetCollisionGroup=7,this.myCursorTargetCollisionThickness=.001,this.myDefaultTextColor=[255/255,255/255,255/255,1],this.myTextAlignment=2,this.myTextJustification=2,this.myTextColor=this.myDefaultTextColor,this.myMessageTypeColors=[],this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG]=this.myDefaultTextColor,this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR]=[255/255,40/255,40/255,1],this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN]=[250/255,220/255,40/255,1],this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO]=[60/255,200/255,255/255,1],this.myMessagesPanelPosition=[0,.075,0],this.myMessagesBackgroundScale=[.34,.15,1];{let t=.03,i=t*this.myMessagesBackgroundScale[0]/this.myMessagesBackgroundScale[1]*.8,s=-this.myMessagesBackgroundScale[0]+this.myMessagesBackgroundScale[0]*t,n=this.myMessagesBackgroundScale[1]-this.myMessagesBackgroundScale[1]*i;this.myMessagesTextsPanelPosition=[s,n,.007]}this.myMessagesTextsPanelScale=[.1,.1,.1],this.myMessagesTextStartString=`. `,this.myMessagesTextAlignment=1,this.myMessagesTextJustification=3,this.myMessagesTextPositions=[],this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.LOG]=[0,0,1e-5],this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.ERROR]=[0,0,0],this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.WARN]=[0,0,0],this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.INFO]=[0,0,0],this.myMessagesTextColors=[],this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.LOG]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG],this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.ERROR]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR],this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.WARN]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN],this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.INFO]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO],this.myButtonsPanelPosition=[0,-.11,.015],this.myButtonBackgroundScale=[.04,.02,1],this.myButtonTextPosition=[0,0,.0065],this.myButtonTextScale=[.18,.18,.18],this.myButtonCursorTargetPosition=[0,0,0],this.myButtonCursorTargetPosition[2]=this.myButtonTextPosition[2],this.myButtonsCollisionCollider=this.myCursorTargetCollisionCollider,this.myButtonsCollisionGroup=this.myCursorTargetCollisionGroup,this.myButtonsCollisionExtents=this.myButtonBackgroundScale.slice(0),this.myButtonsCollisionExtents[2]=this.myCursorTargetCollisionThickness,this.myClearButtonTextLabel="clear",this.myUpButtonTextLabel="up",this.myDownButtonTextLabel="down",this.myFilterButtonsTextColors=[],this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.LOG]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG],this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.ERROR]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR],this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.WARN]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN],this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.INFO]=this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO],this.myFilterButtonsTextLabel=[],this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.LOG]="log",this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.ERROR]="error",this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.WARN]="warn",this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.INFO]="info";{let t=7,i=Math.max(.68,this.myButtonBackgroundScale[0]*t),s=2+3+4+4+1+2,n=Math.max((i-t*this.myButtonBackgroundScale[0]*2)/s,0),o=this.myButtonBackgroundScale[0],r=-i/2;this.myFilterButtonsPositions=[],this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.LOG]=[r+n*2+o,0,0],this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.ERROR]=[this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.LOG][0]+o+n+o,0,0],this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.WARN]=[this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.ERROR][0]+o+n+o,0,0],this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.INFO]=[this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.WARN][0]+o+n+o,0,0],this.myClearButtonPosition=[this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.INFO][0]+o+n*4+o,0,0],this.myUpButtonPosition=[this.myClearButtonPosition[0]+o+n*4+o,0,0],this.myDownButtonPosition=[this.myUpButtonPosition[0]+o+n+o,0,0]}this.myNotifyIconBackgroundScale=[.01,.01,1],this.myNotifyIconPanelPositions=[],this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE]=[0,0,0],this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][0]=-this.myMessagesBackgroundScale[0]+this.myNotifyIconBackgroundScale[0]+.01,this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][1]=-this.myMessagesBackgroundScale[1]+this.myNotifyIconBackgroundScale[1]+.01,this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][2]=this.myMessagesTextsPanelPosition[2]-1e-5,this.myNotifyIconPanelPositions[PP.ToolHandedness.LEFT]=this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE],this.myNotifyIconPanelPositions[PP.ToolHandedness.RIGHT]=this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE],this.myNotifyIconCursorTargetPosition=[0,0,0],this.myNotifyIconCursorTargetPosition[2]=this.myButtonsPanelPosition[2]+this.myButtonTextPosition[2]-this.myMessagesTextsPanelPosition[2],this.myNotifyIconCollisionExtents=this.myNotifyIconBackgroundScale.slice(0),this.myNotifyIconCollisionExtents[2]=this.myCursorTargetCollisionThickness,this.myNotifyIconColor=[210/255,210/255,210/255,1],this.myPointerCollisionCollider=this.myCursorTargetCollisionCollider,this.myPointerCollisionGroup=this.myCursorTargetCollisionGroup;{let t=Math.abs(this.myMessagesPanelPosition[1]-this.myMessagesBackgroundScale[1]-(this.myButtonsPanelPosition[1]+this.myButtonBackgroundScale[1])),i=this.myMessagesBackgroundScale[1]+this.myButtonBackgroundScale[1]+t/2;this.myPointerCollisionExtents=[this.myMessagesBackgroundScale[0],i,this.myCursorTargetCollisionThickness]}this.myPointerCursorTargetPosition=[0,0,0],this.myPointerCursorTargetPosition[1]=this.myMessagesPanelPosition[1]+this.myMessagesBackgroundScale[1]-this.myPointerCollisionExtents[1],this.myPointerCursorTargetPosition[2]=this.myButtonsPanelPosition[2]+this.myButtonTextPosition[2]-1e-4}_initializeRuntimeSetup(){this.myTabString=" ",this.myAssertStartString="Assertion failed:",this.myMaxCharactersPerLine=100,this.myMaxLineSplits=50,this.myMaxLines=22,this.myMaxMessages=2e3,this.myMaxMessagesDeletePad=2e3,this.myLinesBetweenMessages=1,this.myButtonHoverColor=[150/255,150/255,150/255,1],this.myButtonDisabledTextColor=this.myBackgroundColor,this.myButtonDisabledBackgroundColor=[110/255,110/255,110/255,1],this.myFilterButtonDisabledTextColor=this.myButtonDisabledTextColor,this.myFilterButtonDisabledBackgroundColor=this.myButtonDisabledBackgroundColor,this.myScrollDelay=.1,this.myScrollAmount=1,this.myScrollThumbstickHandedness=PP.ToolHandedness.RIGHT,this.myScrollThumbstickDelay=.1,this.myScrollThumbstickMinThreshold=.2,this.myScrollThumbstickAmount=3,this.myPulseDelay=5,this.myPulseIntensity=.3,this.myPulseDuration=.085,this.myClearBrowserConsoleWhenClearPressed=!0,this.myGamepadScrollOnlyOnHover=!0}}});var Bs=T(()=>{PP.ConsoleVRWidgetUI=class{build(t,i,s){this._myParentObject=t,this._mySetup=i,this._myAdditionalSetup=s,this._myPlaneMesh=PP.MeshUtils.createPlaneMesh(),this._createSkeleton(),this._setTransforms(),this._addComponents(),this._setTransformForNonVR(),WL.xrSession&&this._onXRSessionStart(WL.xrSession),WL.onXRSessionStart.push(this._onXRSessionStart.bind(this)),WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this))}setVisible(t){this.myPivotObject.pp_setActiveHierarchy(t)}_createSkeleton(){this.myPivotObject=WL.scene.addObject(this._myParentObject),this._createMessagesSkeleton(),this._createButtonsSkeleton(),this._createPointerSkeleton()}_createMessagesSkeleton(){this.myMessagesPanel=WL.scene.addObject(this.myPivotObject),this.myMessagesBackground=WL.scene.addObject(this.myMessagesPanel),this.myMessagesTextsPanel=WL.scene.addObject(this.myMessagesPanel),this.myMessagesTexts=[];for(let t in PP.ConsoleVRWidget.MessageType)this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[t]]=WL.scene.addObject(this.myMessagesTextsPanel);this.myNotifyIconPanel=WL.scene.addObject(this.myMessagesPanel),this.myNotifyIconBackground=WL.scene.addObject(this.myNotifyIconPanel),this.myNotifyIconCursorTarget=WL.scene.addObject(this.myNotifyIconPanel)}_createButtonsSkeleton(){this.myButtonsPanel=WL.scene.addObject(this.myPivotObject),this.myFilterButtonsPanels=[],this.myFilterButtonsBackgrounds=[],this.myFilterButtonsTexts=[],this.myFilterButtonsCursorTargets=[];for(let t in PP.ConsoleVRWidget.MessageType)this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[t]]=WL.scene.addObject(this.myButtonsPanel),this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[t]]=WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[t]]),this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[t]]=WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[t]]),this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[t]]=WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[t]]);this.myClearButtonPanel=WL.scene.addObject(this.myButtonsPanel),this.myClearButtonBackground=WL.scene.addObject(this.myClearButtonPanel),this.myClearButtonText=WL.scene.addObject(this.myClearButtonPanel),this.myClearButtonCursorTarget=WL.scene.addObject(this.myClearButtonPanel),this.myUpButtonPanel=WL.scene.addObject(this.myButtonsPanel),this.myUpButtonBackground=WL.scene.addObject(this.myUpButtonPanel),this.myUpButtonText=WL.scene.addObject(this.myUpButtonPanel),this.myUpButtonCursorTarget=WL.scene.addObject(this.myUpButtonPanel),this.myDownButtonPanel=WL.scene.addObject(this.myButtonsPanel),this.myDownButtonBackground=WL.scene.addObject(this.myDownButtonPanel),this.myDownButtonText=WL.scene.addObject(this.myDownButtonPanel),this.myDownButtonCursorTarget=WL.scene.addObject(this.myDownButtonPanel)}_createPointerSkeleton(){this.myPointerCursorTarget=WL.scene.addObject(this.myPivotObject)}_setTransforms(){this.myPivotObject.setDirty(),this._setMessagesTransforms(),this._setButtonsTransforms(),this._setPointerTransform()}_setMessagesTransforms(){this.myMessagesPanel.setTranslationLocal(this._mySetup.myMessagesPanelPosition),this.myMessagesBackground.scale(this._mySetup.myMessagesBackgroundScale),this.myMessagesTextsPanel.setTranslationLocal(this._mySetup.myMessagesTextsPanelPosition),this.myMessagesTextsPanel.scale(this._mySetup.myMessagesTextsPanelScale);for(let t in PP.ConsoleVRWidget.MessageType)this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[t]].setTranslationLocal(this._mySetup.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType[t]]);this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[this._myAdditionalSetup.myHandedness]),this.myNotifyIconBackground.scale(this._mySetup.myNotifyIconBackgroundScale),this.myNotifyIconCursorTarget.setTranslationLocal(this._mySetup.myNotifyIconCursorTargetPosition)}_setButtonsTransforms(){this.myButtonsPanel.setTranslationLocal(this._mySetup.myButtonsPanelPosition);for(let t in PP.ConsoleVRWidget.MessageType)this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[t]].setTranslationLocal(this._mySetup.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType[t]]),this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[t]].scale(this._mySetup.myButtonBackgroundScale),this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[t]].setTranslationLocal(this._mySetup.myButtonTextPosition),this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[t]].scale(this._mySetup.myButtonTextScale),this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[t]].setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);this.myClearButtonPanel.setTranslationLocal(this._mySetup.myClearButtonPosition),this.myClearButtonBackground.scale(this._mySetup.myButtonBackgroundScale),this.myClearButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition),this.myClearButtonText.scale(this._mySetup.myButtonTextScale),this.myClearButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition),this.myUpButtonPanel.setTranslationLocal(this._mySetup.myUpButtonPosition),this.myUpButtonBackground.scale(this._mySetup.myButtonBackgroundScale),this.myUpButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition),this.myUpButtonText.scale(this._mySetup.myButtonTextScale),this.myUpButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition),this.myDownButtonPanel.setTranslationLocal(this._mySetup.myDownButtonPosition),this.myDownButtonBackground.scale(this._mySetup.myButtonBackgroundScale),this.myDownButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition),this.myDownButtonText.scale(this._mySetup.myButtonTextScale),this.myDownButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition)}_setPointerTransform(){this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition)}_addComponents(){this._addMessagesComponents(),this._addButtonsComponents(),this._addPointerComponents()}_addMessagesComponents(){let t=this.myMessagesBackground.addComponent("mesh");t.mesh=this._myPlaneMesh,t.material=this._myAdditionalSetup.myPlaneMaterial.clone(),t.material.color=this._mySetup.myBackgroundColor,this.myMessagesTextComponents=[];for(let i in PP.ConsoleVRWidget.MessageType){let s=this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[i]].addComponent("text");s.alignment=this._mySetup.myMessagesTextAlignment,s.justification=this._mySetup.myMessagesTextJustification,s.material=this._myAdditionalSetup.myTextMaterial.clone(),s.material.color=this._mySetup.myMessagesTextColors[PP.ConsoleVRWidget.MessageType[i]],s.lineSpacing=1.2,s.text=this._mySetup.myMessagesTextStartString,this.myMessagesTextComponents[PP.ConsoleVRWidget.MessageType[i]]=s}this.myNotifyIconBackgroundComponent=this.myNotifyIconBackground.addComponent("mesh"),this.myNotifyIconBackgroundComponent.mesh=this._myPlaneMesh,this.myNotifyIconBackgroundComponent.material=this._myAdditionalSetup.myPlaneMaterial.clone(),this.myNotifyIconBackgroundComponent.material.color=this._mySetup.myNotifyIconColor,this.myNotifyIconCursorTargetComponent=this.myNotifyIconCursorTarget.addComponent("cursor-target"),this.myNotifyIconCollisionComponent=this.myNotifyIconCursorTarget.addComponent("collision"),this.myNotifyIconCollisionComponent.collider=this._mySetup.myCursorTargetCollisionCollider,this.myNotifyIconCollisionComponent.group=1<{PP.ConsoleVRWidget=class{constructor(){this._myWidgetFrame=new PP.WidgetFrame("C",0),this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this,this._widgetVisibleChanged.bind(this)),this._mySetup=new PP.ConsoleVRWidgetSetup,this._myAdditionalSetup=null,this._myUI=new PP.ConsoleVRWidgetUI,this._myMessages=[],this._myOldBrowserConsole=[],this._myOldConsoleVR=[],this._myTypeFilters=[];for(let t in PP.ConsoleVRWidget.MessageType)this._myTypeFilters[PP.ConsoleVRWidget.MessageType[t]]=!1;this._myScrollUp=!1,this._myScrollDown=!1,this._myScrollOffset=0,this._myScrollTimer=0,this._myScrollThumbstickTimer=0,this._myPulseTimer=0,this._myGamepadScrollActive=!0,this._mySetup.myGamepadScrollOnlyOnHover&&(this._myGamepadScrollActive=!1)}setVisible(t){this._myWidgetFrame.setVisible(t)}isVisible(){return this._myWidgetFrame.isVisible()}start(t,i){this._myLeftGamepad=PP.myLeftGamepad,this._myRightGamepad=PP.myRightGamepad,this._myAdditionalSetup=i,this._myWidgetFrame.start(t,i),this._myUI.build(this._myWidgetFrame.getWidgetObject(),this._mySetup,i),this._myUI.setVisible(this._myWidgetFrame.myIsWidgetVisible),this._setNotifyIconActive(!1),this._addListeners(),this._overrideConsolesFunctions()}_overrideConsolesFunctions(){this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.LOG]=console.log,this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.ERROR]=console.error,this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.WARN]=console.warn,this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.INFO]=console.info,this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.DEBUG]=console.debug,this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.ASSERT]=console.assert,this._myOldBrowserConsoleClear=console.clear,this._myAdditionalSetup.myOverrideBrowserConsole&&(console.log=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.LOG,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),console.error=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.ERROR,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),console.warn=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.WARN,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),console.info=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.INFO,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),console.debug=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.DEBUG,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),console.assert=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.ASSERT,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),console.clear=this._clearConsole.bind(this,!0,PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE),window.addEventListener("error",function(t){this._consolePrint(PP.ConsoleVRWidget.ConsoleFunction.ERROR,PP.ConsoleVRWidget.Sender.WINDOW,"Uncaught",t.error.stack)}.bind(this)),window.addEventListener("unhandledrejection",function(t){this._consolePrint(PP.ConsoleVRWidget.ConsoleFunction.ERROR,PP.ConsoleVRWidget.Sender.WINDOW,"Uncaught (in promise)",t.reason)}.bind(this))),this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.LOG]=PP.ConsoleVR.log,this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.ERROR]=PP.ConsoleVR.error,this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.WARN]=PP.ConsoleVR.warn,this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.INFO]=PP.ConsoleVR.info,this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.DEBUG]=PP.ConsoleVR.debug,this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.ASSERT]=PP.ConsoleVR.assert,this._myOldConsoleVRClear=PP.ConsoleVR.clear,PP.ConsoleVR.log=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.LOG,PP.ConsoleVRWidget.Sender.CONSOLE_VR),PP.ConsoleVR.error=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.ERROR,PP.ConsoleVRWidget.Sender.CONSOLE_VR),PP.ConsoleVR.warn=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.WARN,PP.ConsoleVRWidget.Sender.CONSOLE_VR),PP.ConsoleVR.info=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.INFO,PP.ConsoleVRWidget.Sender.CONSOLE_VR),PP.ConsoleVR.debug=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.DEBUG,PP.ConsoleVRWidget.Sender.CONSOLE_VR),PP.ConsoleVR.assert=this._consolePrint.bind(this,PP.ConsoleVRWidget.ConsoleFunction.ASSERT,PP.ConsoleVRWidget.Sender.CONSOLE_VR),PP.ConsoleVR.clear=this._clearConsole.bind(this,!0,PP.ConsoleVRWidget.Sender.CONSOLE_VR)}update(t){this._myWidgetFrame.update(t),this._myWidgetFrame.myIsWidgetVisible&&this._updateScroll(t),this._updateGamepadsExtraActions(t)}_updateText(t){let i="";if(!this._myTypeFilters[t]){let s=0,n=this._myMessages.length-1,o=Math.round(this._myScrollOffset);for(;n>=0&&s0){let a=0;n!=this._myMessages.length-1&&(a=this._mySetup.myLinesBetweenMessages),o>=l+a?(o-=l+a,y=l+a):(y=o,o=0)}if(n!=this._myMessages.length-1){let a=this._mySetup.myLinesBetweenMessages-Math.max(this._mySetup.myLinesBetweenMessages-y,0),m=this._mySetup.myLinesBetweenMessages-a;s+m>this._mySetup.myMaxLines&&(m=this._myMaxLines-s);for(let u=0;uthis._mySetup.myMaxLines&&(c=this._mySetup.myMaxLines-s),c>0)if(r.myType==t)i=r.myLines.slice(l-c-y,l-y).join(` `).concat(` diff --git a/wle_pp/wle_pp_bundle.js.map b/wle_pp/wle_pp_bundle.js.map index d09238e..34a8706 100644 --- a/wle_pp/wle_pp_bundle.js.map +++ b/wle_pp/wle_pp_bundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../js/pp/pp.js", "../js/pp/plugin/component_mods/clone_component_mod.js", "../node_modules/gl-matrix/esm/common.js", "../node_modules/gl-matrix/esm/mat3.js", "../node_modules/gl-matrix/esm/mat4.js", "../node_modules/gl-matrix/esm/vec3.js", "../node_modules/gl-matrix/esm/vec4.js", "../node_modules/gl-matrix/esm/quat.js", "../node_modules/gl-matrix/esm/quat2.js", "../node_modules/gl-matrix/esm/vec2.js", "../node_modules/gl-matrix/esm/index.js", "../js/pp/plugin/component_mods/cursor_component_mod.js", "../js/pp/plugin/component_mods/cursor_target_component_mod.js", "../js/pp/plugin/component_mods/mouse_look_component_mod.js", "../js/pp/plugin/extensions/array_extension.js", "../js/pp/plugin/extensions/object_extension.js", "../js/pp/plugin/extensions/math_extension.js", "../node_modules/howler/dist/howler.js", "../js/pp/audio/spatial_audio_listener.js", "../js/pp/audio/audio_manager_component.js", "../js/pp/audio/audio_manager.js", "../js/pp/audio/audio_player.js", "../js/pp/audio/audio_setup.js", "../js/pp/audio/mute_everything.js", "../js/pp/cauldron/benchmarks/max_physx.js", "../js/pp/cauldron/benchmarks/max_visible_triangles.js", "../js/pp/cauldron/cauldron/number_over_value.js", "../js/pp/cauldron/cauldron/object_pool_manager.js", "../js/pp/cauldron/cauldron/physx_collision_collector.js", "../js/pp/cauldron/cauldron/save_manager.js", "../js/pp/cauldron/cauldron/timer.js", "../js/pp/cauldron/components/clear_console_on_xr_session_start.js", "../js/pp/cauldron/components/set_active.js", "../js/pp/cauldron/components/adjust_hierarchy_physx_scale.js", "../js/pp/cauldron/components/get_player_objects.js", "../js/pp/cauldron/components/get_default_resources.js", "../js/pp/cauldron/components/show_fps.js", "../js/pp/cauldron/fsm/fsm.js", "../js/pp/cauldron/fsm/state.js", "../js/pp/cauldron/fsm/transition.js", "../js/pp/cauldron/fsm/states/timer_state.js", "../js/pp/cauldron/utils/ca_utils.js", "../js/pp/cauldron/utils/color_utils.js", "../js/pp/cauldron/utils/mesh_utils.js", "../js/pp/cauldron/utils/save_utils.js", "../js/pp/cauldron/utils/text_utils.js", "../js/pp/cauldron/utils/xr_utils.js", "../js/pp/cauldron/physics/physics_utils.js", "../js/pp/cauldron/physics/physics_raycast_data.js", "../js/pp/cauldron/physics/physics_layer_flags.js", "../js/pp/cauldron/visual/visual_manager.js", "../js/pp/cauldron/visual/elements/visual_element_types.js", "../js/pp/cauldron/visual/elements/visual_line.js", "../js/pp/cauldron/visual/elements/visual_mesh.js", "../js/pp/cauldron/visual/elements/visual_point.js", "../js/pp/cauldron/visual/elements/visual_arrow.js", "../js/pp/cauldron/visual/elements/visual_text.js", "../js/pp/cauldron/visual/elements/visual_transform.js", "../js/pp/cauldron/visual/elements/visual_raycast.js", "../js/pp/cauldron/visual/elements/visual_torus.js", "../js/pp/cauldron/visual/components/visual_manager_component.js", "../js/pp/debug/debug_manager.js", "../js/pp/debug/debug_visual_manager.js", "../js/pp/debug/components/debug_transform_component.js", "../js/pp/debug/components/debug_manager_component.js", "../js/pp/gameplay/cauldron/direction_2D_to_3D_converter.js", "../js/pp/gameplay/grab_throw/grabbable.js", "../js/pp/gameplay/grab_throw/grabber_hand.js", "../js/pp/input/cauldron/finger_cursor.js", "../js/pp/input/cauldron/input_types.js", "../js/pp/input/cauldron/input_utils.js", "../js/pp/input/cauldron/keyboard.js", "../js/pp/input/cauldron/mouse.js", "../js/pp/input/cauldron/input_manager.js", "../js/pp/input/cauldron/input_manager_component.js", "../js/pp/input/cauldron/switch_hand_object.js", "../js/pp/input/cauldron/tracked_hand_draw_joint.js", "../js/pp/input/cauldron/tracked_hand_draw_all_joints.js", "../js/pp/input/cauldron/tracked_hand_draw_skin.js", "../js/pp/input/gamepad/gamepad_buttons.js", "../js/pp/input/gamepad/base_gamepad.js", "../js/pp/input/gamepad/universal_gamepad.js", "../js/pp/input/gamepad/gamepad_cores/gamepad_core.js", "../js/pp/input/gamepad/gamepad_cores/xr_gamepad_core.js", "../js/pp/input/gamepad/gamepad_cores/keyboard_gamepad_core.js", "../js/pp/input/gamepad/cauldron/gamepad_mesh_animator.js", "../js/pp/input/gamepad/cauldron/gamepad_manager.js", "../js/pp/input/gamepad/cauldron/gamepad_utils.js", "../js/pp/input/gamepad/cauldron/gamepad_control_scheme.js", "../js/pp/input/pose/base_pose.js", "../js/pp/input/pose/hand_pose.js", "../js/pp/input/pose/head_pose.js", "../js/pp/input/pose/tracked_hand_joint_pose.js", "../js/pp/input/pose/tracked_hand_pose.js", "../js/pp/input/pose/components/set_player_height.js", "../js/pp/input/pose/components/set_hand_local_transform.js", "../js/pp/input/pose/components/set_head_local_transform.js", "../js/pp/input/pose/components/set_vr_head_local_transform.js", "../js/pp/input/pose/components/set_non_vr_head_local_transform.js", "../js/pp/input/pose/components/set_tracked_hand_joint_local_transform.js", "../js/pp/input/pose/components/copy_hand_transform.js", "../js/pp/input/pose/components/copy_head_transform.js", "../js/pp/input/pose/components/copy_player_transform.js", "../js/pp/input/pose/components/copy_player_pivot_transform.js", "../js/pp/tool/cauldron/cauldron/tool_types.js", "../js/pp/tool/cauldron/components/tool_cursor.js", "../js/pp/tool/console_vr/console_vr_widget_setup.js", "../js/pp/tool/console_vr/console_vr_widget_ui.js", "../js/pp/tool/console_vr/console_vr_widget.js", "../js/pp/tool/console_vr/console_vr.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_object_tuner.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_light_attenuation.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_light_color.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_mesh_color.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_scale.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_set_tune_target_child_number.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_set_tune_target_grab.js", "../js/pp/tool/easy_tune/easy_object_tuners/easy_transform.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget_ui.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget_setup.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget_ui.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget_setup.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget_ui.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget_setup.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget_ui.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget_setup.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget.js", "../js/pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget_setup.js", "../js/pp/tool/easy_tune/easy_tune_variables.js", "../js/pp/tool/easy_tune/easy_tune.js", "../js/pp/tool/widget_frame/widget_frame_setup.js", "../js/pp/tool/widget_frame/widget_frame_ui.js", "../js/pp/tool/widget_frame/widget_frame.js", "../js/bundle.js"], - "sourcesContent": ["PP = {};", "if (WL && WL.Object) {\r\n\r\n WL.MeshComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type);\r\n clonedComponent.active = this.active;\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(\"mesh\", \"material\")) {\r\n clonedComponent.material = this.material.clone();\r\n } else {\r\n clonedComponent.material = this.material;\r\n }\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(\"mesh\", \"mesh\")) {\r\n clonedComponent.mesh = PP.MeshUtils.cloneMesh(this.mesh);\r\n } else {\r\n clonedComponent.mesh = this.mesh;\r\n }\r\n\r\n clonedComponent.skin = this.skin;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n WL.CollisionComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type);\r\n clonedComponent.active = this.active;\r\n\r\n clonedComponent.collider = this.collider;\r\n clonedComponent.extents = this.extents.slice(0);\r\n clonedComponent.group = this.group;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n WL.TextComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type);\r\n clonedComponent.active = this.active;\r\n\r\n if (deepCloneParams.isDeepCloneComponent(\"text\")) {\r\n clonedComponent.text = this.text.slice(0);\r\n } else {\r\n clonedComponent.text = this.text;\r\n }\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(\"text\", \"material\")) {\r\n clonedComponent.material = this.material.clone();\r\n } else {\r\n clonedComponent.material = this.material;\r\n }\r\n\r\n clonedComponent.alignment = this.alignment;\r\n clonedComponent.justification = this.justification;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n // #TODO not completed, missing flags like gravity or groups\r\n WL.PhysXComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type, {\r\n \"angularDamping\": this.angularDamping,\r\n \"angularVelocity\": this.angularVelocity,\r\n \"dynamicFriction\": this.dynamicFriction,\r\n \"extents\": this.extents,\r\n \"kinematic\": this.kinematic,\r\n \"linearDamping\": this.linearDamping,\r\n \"linearVelocity\": this.linearVelocity,\r\n \"mass\": this.mass,\r\n \"restituition\": this.restituition,\r\n \"shape\": this.shape,\r\n \"shapeData\": this.shapeData,\r\n \"static\": this.static,\r\n \"staticFriction\": this.staticFriction,\r\n });\r\n\r\n clonedComponent.active = this.active;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n\r\n\r\n Object.defineProperty(WL.MeshComponent.prototype, \"pp_clone\", { enumerable: false });\r\n Object.defineProperty(WL.CollisionComponent.prototype, \"pp_clone\", { enumerable: false });\r\n Object.defineProperty(WL.TextComponent.prototype, \"pp_clone\", { enumerable: false });\r\n Object.defineProperty(WL.PhysXComponent.prototype, \"pp_clone\", { enumerable: false });\r\n\r\n}", "/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};", "import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;", "import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;", "import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();", "import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();", "import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();", "import * as glMatrix from \"./common.js\";\nimport * as quat from \"./quat.js\";\nimport * as mat4 from \"./mat4.js\";\n/**\n * Dual Quaternion
\n * Format: [real, dual]
\n * Quaternion format: XYZW
\n * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
\n * @module quat2\n */\n\n/**\n * Creates a new identity dual quat\n *\n * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]\n */\n\nexport function create() {\n var dq = new glMatrix.ARRAY_TYPE(8);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n dq[0] = 0;\n dq[1] = 0;\n dq[2] = 0;\n dq[4] = 0;\n dq[5] = 0;\n dq[6] = 0;\n dq[7] = 0;\n }\n\n dq[3] = 1;\n return dq;\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat2} a dual quaternion to clone\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nexport function clone(a) {\n var dq = new glMatrix.ARRAY_TYPE(8);\n dq[0] = a[0];\n dq[1] = a[1];\n dq[2] = a[2];\n dq[3] = a[3];\n dq[4] = a[4];\n dq[5] = a[5];\n dq[6] = a[6];\n dq[7] = a[7];\n return dq;\n}\n/**\n * Creates a new dual quat initialized with the given values\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nexport function fromValues(x1, y1, z1, w1, x2, y2, z2, w2) {\n var dq = new glMatrix.ARRAY_TYPE(8);\n dq[0] = x1;\n dq[1] = y1;\n dq[2] = z1;\n dq[3] = w1;\n dq[4] = x2;\n dq[5] = y2;\n dq[6] = z2;\n dq[7] = w2;\n return dq;\n}\n/**\n * Creates a new dual quat from the given values (quat and translation)\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component (translation)\n * @param {Number} y2 Y component (translation)\n * @param {Number} z2 Z component (translation)\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nexport function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {\n var dq = new glMatrix.ARRAY_TYPE(8);\n dq[0] = x1;\n dq[1] = y1;\n dq[2] = z1;\n dq[3] = w1;\n var ax = x2 * 0.5,\n ay = y2 * 0.5,\n az = z2 * 0.5;\n dq[4] = ax * w1 + ay * z1 - az * y1;\n dq[5] = ay * w1 + az * x1 - ax * z1;\n dq[6] = az * w1 + ax * y1 - ay * x1;\n dq[7] = -ax * x1 - ay * y1 - az * z1;\n return dq;\n}\n/**\n * Creates a dual quat from a quaternion and a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q a normalized quaternion\n * @param {ReadonlyVec3} t tranlation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nexport function fromRotationTranslation(out, q, t) {\n var ax = t[0] * 0.5,\n ay = t[1] * 0.5,\n az = t[2] * 0.5,\n bx = q[0],\n by = q[1],\n bz = q[2],\n bw = q[3];\n out[0] = bx;\n out[1] = by;\n out[2] = bz;\n out[3] = bw;\n out[4] = ax * bw + ay * bz - az * by;\n out[5] = ay * bw + az * bx - ax * bz;\n out[6] = az * bw + ax * by - ay * bx;\n out[7] = -ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Creates a dual quat from a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyVec3} t translation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nexport function fromTranslation(out, t) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = t[0] * 0.5;\n out[5] = t[1] * 0.5;\n out[6] = t[2] * 0.5;\n out[7] = 0;\n return out;\n}\n/**\n * Creates a dual quat from a quaternion\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q the quaternion\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nexport function fromRotation(out, q) {\n out[0] = q[0];\n out[1] = q[1];\n out[2] = q[2];\n out[3] = q[3];\n out[4] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n return out;\n}\n/**\n * Creates a new dual quat from a matrix (4x4)\n *\n * @param {quat2} out the dual quaternion\n * @param {ReadonlyMat4} a the matrix\n * @returns {quat2} dual quat receiving operation result\n * @function\n */\n\nexport function fromMat4(out, a) {\n //TODO Optimize this\n var outer = quat.create();\n mat4.getRotation(outer, a);\n var t = new glMatrix.ARRAY_TYPE(3);\n mat4.getTranslation(t, a);\n fromRotationTranslation(out, outer, t);\n return out;\n}\n/**\n * Copy the values from one dual quat to another\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the source dual quaternion\n * @returns {quat2} out\n * @function\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n return out;\n}\n/**\n * Set a dual quat to the identity dual quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @returns {quat2} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n return out;\n}\n/**\n * Set the components of a dual quat to the given values\n *\n * @param {quat2} out the receiving quaternion\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} out\n * @function\n */\n\nexport function set(out, x1, y1, z1, w1, x2, y2, z2, w2) {\n out[0] = x1;\n out[1] = y1;\n out[2] = z1;\n out[3] = w1;\n out[4] = x2;\n out[5] = y2;\n out[6] = z2;\n out[7] = w2;\n return out;\n}\n/**\n * Gets the real part of a dual quat\n * @param {quat} out real part\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} real part\n */\n\nexport var getReal = quat.copy;\n/**\n * Gets the dual part of a dual quat\n * @param {quat} out dual part\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} dual part\n */\n\nexport function getDual(out, a) {\n out[0] = a[4];\n out[1] = a[5];\n out[2] = a[6];\n out[3] = a[7];\n return out;\n}\n/**\n * Set the real component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the real part\n * @returns {quat2} out\n * @function\n */\n\nexport var setReal = quat.copy;\n/**\n * Set the dual component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the dual part\n * @returns {quat2} out\n * @function\n */\n\nexport function setDual(out, q) {\n out[4] = q[0];\n out[5] = q[1];\n out[6] = q[2];\n out[7] = q[3];\n return out;\n}\n/**\n * Gets the translation of a normalized dual quat\n * @param {vec3} out translation\n * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed\n * @return {vec3} translation\n */\n\nexport function getTranslation(out, a) {\n var ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3];\n out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n return out;\n}\n/**\n * Translates a dual quat by the given vector\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {quat2} out\n */\n\nexport function translate(out, a, v) {\n var ax1 = a[0],\n ay1 = a[1],\n az1 = a[2],\n aw1 = a[3],\n bx1 = v[0] * 0.5,\n by1 = v[1] * 0.5,\n bz1 = v[2] * 0.5,\n ax2 = a[4],\n ay2 = a[5],\n az2 = a[6],\n aw2 = a[7];\n out[0] = ax1;\n out[1] = ay1;\n out[2] = az1;\n out[3] = aw1;\n out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;\n out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;\n out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;\n out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;\n return out;\n}\n/**\n * Rotates a dual quat around the X axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nexport function rotateX(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n quat.rotateX(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat around the Y axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nexport function rotateY(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n quat.rotateY(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat around the Z axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nexport function rotateZ(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n quat.rotateZ(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (a * q)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @returns {quat2} out\n */\n\nexport function rotateByQuatAppend(out, a, q) {\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n out[0] = ax * qw + aw * qx + ay * qz - az * qy;\n out[1] = ay * qw + aw * qy + az * qx - ax * qz;\n out[2] = az * qw + aw * qz + ax * qy - ay * qx;\n out[3] = aw * qw - ax * qx - ay * qy - az * qz;\n ax = a[4];\n ay = a[5];\n az = a[6];\n aw = a[7];\n out[4] = ax * qw + aw * qx + ay * qz - az * qy;\n out[5] = ay * qw + aw * qy + az * qx - ax * qz;\n out[6] = az * qw + aw * qz + ax * qy - ay * qx;\n out[7] = aw * qw - ax * qx - ay * qy - az * qz;\n return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (q * a)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @returns {quat2} out\n */\n\nexport function rotateByQuatPrepend(out, q, a) {\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n bx = a[0],\n by = a[1],\n bz = a[2],\n bw = a[3];\n out[0] = qx * bw + qw * bx + qy * bz - qz * by;\n out[1] = qy * bw + qw * by + qz * bx - qx * bz;\n out[2] = qz * bw + qw * bz + qx * by - qy * bx;\n out[3] = qw * bw - qx * bx - qy * by - qz * bz;\n bx = a[4];\n by = a[5];\n bz = a[6];\n bw = a[7];\n out[4] = qx * bw + qw * bx + qy * bz - qz * by;\n out[5] = qy * bw + qw * by + qz * bx - qx * bz;\n out[6] = qz * bw + qw * bz + qx * by - qy * bx;\n out[7] = qw * bw - qx * bx - qy * by - qz * bz;\n return out;\n}\n/**\n * Rotates a dual quat around a given axis. Does the normalisation automatically\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @param {Number} rad how far the rotation should be\n * @returns {quat2} out\n */\n\nexport function rotateAroundAxis(out, a, axis, rad) {\n //Special case for rad = 0\n if (Math.abs(rad) < glMatrix.EPSILON) {\n return copy(out, a);\n }\n\n var axisLength = Math.hypot(axis[0], axis[1], axis[2]);\n rad = rad * 0.5;\n var s = Math.sin(rad);\n var bx = s * axis[0] / axisLength;\n var by = s * axis[1] / axisLength;\n var bz = s * axis[2] / axisLength;\n var bw = Math.cos(rad);\n var ax1 = a[0],\n ay1 = a[1],\n az1 = a[2],\n aw1 = a[3];\n out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n var ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n out[4] = ax * bw + aw * bx + ay * bz - az * by;\n out[5] = ay * bw + aw * by + az * bx - ax * bz;\n out[6] = az * bw + aw * bz + ax * by - ay * bx;\n out[7] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Adds two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n * @function\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n return out;\n}\n/**\n * Multiplies two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n */\n\nexport function multiply(out, a, b) {\n var ax0 = a[0],\n ay0 = a[1],\n az0 = a[2],\n aw0 = a[3],\n bx1 = b[4],\n by1 = b[5],\n bz1 = b[6],\n bw1 = b[7],\n ax1 = a[4],\n ay1 = a[5],\n az1 = a[6],\n aw1 = a[7],\n bx0 = b[0],\n by0 = b[1],\n bz0 = b[2],\n bw0 = b[3];\n out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;\n out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;\n out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;\n out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;\n out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;\n out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;\n out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;\n out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;\n return out;\n}\n/**\n * Alias for {@link quat2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a dual quat by a scalar number\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the dual quat to scale\n * @param {Number} b amount to scale the dual quat by\n * @returns {quat2} out\n * @function\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n return out;\n}\n/**\n * Calculates the dot product of two dual quat's (The dot product of the real parts)\n *\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = quat.dot;\n/**\n * Performs a linear interpolation between two dual quats's\n * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat2} out\n */\n\nexport function lerp(out, a, b, t) {\n var mt = 1 - t;\n if (dot(a, b) < 0) t = -t;\n out[0] = a[0] * mt + b[0] * t;\n out[1] = a[1] * mt + b[1] * t;\n out[2] = a[2] * mt + b[2] * t;\n out[3] = a[3] * mt + b[3] * t;\n out[4] = a[4] * mt + b[4] * t;\n out[5] = a[5] * mt + b[5] * t;\n out[6] = a[6] * mt + b[6] * t;\n out[7] = a[7] * mt + b[7] * t;\n return out;\n}\n/**\n * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quat to calculate inverse of\n * @returns {quat2} out\n */\n\nexport function invert(out, a) {\n var sqlen = squaredLength(a);\n out[0] = -a[0] / sqlen;\n out[1] = -a[1] / sqlen;\n out[2] = -a[2] / sqlen;\n out[3] = a[3] / sqlen;\n out[4] = -a[4] / sqlen;\n out[5] = -a[5] / sqlen;\n out[6] = -a[6] / sqlen;\n out[7] = a[7] / sqlen;\n return out;\n}\n/**\n * Calculates the conjugate of a dual quat\n * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat2} a quat to calculate conjugate of\n * @returns {quat2} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n out[4] = -a[4];\n out[5] = -a[5];\n out[6] = -a[6];\n out[7] = a[7];\n return out;\n}\n/**\n * Calculates the length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate length of\n * @returns {Number} length of a\n * @function\n */\n\nexport var length = quat.length;\n/**\n * Alias for {@link quat2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = quat.squaredLength;\n/**\n * Alias for {@link quat2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a dual quat\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quaternion to normalize\n * @returns {quat2} out\n * @function\n */\n\nexport function normalize(out, a) {\n var magnitude = squaredLength(a);\n\n if (magnitude > 0) {\n magnitude = Math.sqrt(magnitude);\n var a0 = a[0] / magnitude;\n var a1 = a[1] / magnitude;\n var a2 = a[2] / magnitude;\n var a3 = a[3] / magnitude;\n var b0 = a[4];\n var b1 = a[5];\n var b2 = a[6];\n var b3 = a[7];\n var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;\n out[0] = a0;\n out[1] = a1;\n out[2] = a2;\n out[3] = a3;\n out[4] = (b0 - a0 * a_dot_b) / magnitude;\n out[5] = (b1 - a1 * a_dot_b) / magnitude;\n out[6] = (b2 - a2 * a_dot_b) / magnitude;\n out[7] = (b3 - a3 * a_dot_b) / magnitude;\n }\n\n return out;\n}\n/**\n * Returns a string representation of a dual quatenion\n *\n * @param {ReadonlyQuat2} a dual quaternion to represent as a string\n * @returns {String} string representation of the dual quat\n */\n\nexport function str(a) {\n return \"quat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \")\";\n}\n/**\n * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat2} a the first dual quaternion.\n * @param {ReadonlyQuat2} b the second dual quaternion.\n * @returns {Boolean} true if the dual quaternions are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7];\n}\n/**\n * Returns whether or not the dual quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat2} a the first dual quat.\n * @param {ReadonlyQuat2} b the second dual quat.\n * @returns {Boolean} true if the dual quats are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7));\n}", "import * as glMatrix from \"./common.js\";\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();", "import * as glMatrix from \"./common.js\";\nimport * as mat2 from \"./mat2.js\";\nimport * as mat2d from \"./mat2d.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as mat4 from \"./mat4.js\";\nimport * as quat from \"./quat.js\";\nimport * as quat2 from \"./quat2.js\";\nimport * as vec2 from \"./vec2.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\nexport { glMatrix, mat2, mat2d, mat3, mat4, quat, quat2, vec2, vec3, vec4 };", "import { vec3, mat4 } from 'gl-matrix';\r\n\r\nif (_WL && _WL._componentTypes && _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]]) {\r\n\r\n // Modified Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.init = function () {\r\n /* VR session cache, in case in VR */\r\n this.session = null;\r\n this.collisionMask = (1 << this.collisionGroup);\r\n this.maxDistance = 100;\r\n\r\n this.doubleClickTimer = 0;\r\n this.tripleClickTimer = 0;\r\n this.multipleClickObject = null;\r\n this.multipleClickDelay = 0.3;\r\n\r\n this.visible = false;\r\n\r\n const sceneLoaded = this.onDestroy.bind(this);\r\n WL.onSceneLoaded.push(sceneLoaded);\r\n this.onDestroyCallbacks = [() => {\r\n const index = WL.onSceneLoaded.indexOf(sceneLoaded);\r\n if (index >= 0) WL.onSceneLoaded.splice(index, 1);\r\n }];\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.start = function () {\r\n if (this.handedness == 0) {\r\n const inputComp = this.object.getComponent('input');\r\n if (!inputComp) {\r\n console.warn('cursor component on object', this.object.name,\r\n 'was configured with handedness \"input component\", ' +\r\n 'but object has no input component.');\r\n } else {\r\n this.handedness = inputComp.handedness;\r\n this.input = inputComp;\r\n }\r\n } else {\r\n this.handedness = ['left', 'right'][this.handedness - 1];\r\n }\r\n\r\n this.globalTarget = this.object.addComponent('cursor-target');\r\n\r\n this.origin = new Float32Array(3);\r\n this.cursorObjScale = new Float32Array(3);\r\n this.direction = [0, 0, 0];\r\n this.tempQuat = new Float32Array(4);\r\n this.setViewComponent(this.object.getComponent(\"view\"));\r\n this.isHovering = false;\r\n this.visible = true;\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n this.isUpWithNoDown = false;\r\n this.isRealDown = false;\r\n\r\n this.cursorPos = new Float32Array(3);\r\n this.hoveringObject = null;\r\n\r\n const onXRSessionStart = this.setupVREvents.bind(this);\r\n WL.onXRSessionStart.push(onXRSessionStart);\r\n\r\n this.onDestroyCallbacks.push(() => {\r\n const index = WL.onXRSessionStart.indexOf(onXRSessionStart);\r\n if (index >= 0) WL.onXRSessionStart.splice(index, 1);\r\n });\r\n\r\n this.showRay = true;\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(true);\r\n this.showRay = false;\r\n this.cursorRayOrigin = new Float32Array(3);\r\n this.cursorRayScale = new Float32Array(3);\r\n this.cursorRayScale.set(this.cursorRayObject.scalingLocal);\r\n\r\n /* Set ray to a good default distance of the cursor of 1m */\r\n this._setCursorRayTransform(null);\r\n }\r\n\r\n this._setCursorVisibility(false);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.setViewComponent = function (viewComponent) {\r\n this.viewComponent = viewComponent;\r\n /* If this object also has a view component, we will enable inverse-projected mouse clicks,\r\n * otherwise just use the objects transformation */\r\n if (this.viewComponent != null) {\r\n const onClick = this.onClick.bind(this);\r\n WL.canvas.addEventListener(\"click\", onClick);\r\n const onPointerMove = this.onPointerMove.bind(this);\r\n WL.canvas.addEventListener(\"pointermove\", onPointerMove);\r\n const onPointerDown = this.onPointerDown.bind(this);\r\n WL.canvas.addEventListener(\"pointerdown\", onPointerDown);\r\n const onPointerUp = this.onPointerUp.bind(this);\r\n WL.canvas.addEventListener(\"pointerup\", onPointerUp);\r\n\r\n this.projectionMatrix = new Float32Array(16);\r\n mat4.invert(this.projectionMatrix, this.viewComponent.projectionMatrix);\r\n const onViewportResize = this.onViewportResize.bind(this);\r\n window.addEventListener(\"resize\", onViewportResize);\r\n\r\n this.onDestroyCallbacks.push(() => {\r\n WL.canvas.removeEventListener(\"click\", onClick);\r\n WL.canvas.removeEventListener(\"pointermove\", onPointerMove);\r\n WL.canvas.removeEventListener(\"pointerdown\", onPointerDown);\r\n WL.canvas.removeEventListener(\"pointerup\", onPointerUp);\r\n window.removeEventListener(\"resize\", onViewportResize);\r\n });\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onViewportResize = function () {\r\n if (!this.viewComponent) return;\r\n /* Projection matrix will change if the viewport is resized, which will affect the\r\n * projection matrix because of the aspect ratio. */\r\n mat4.invert(this.projectionMatrix, this.viewComponent.projectionMatrix);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto._setCursorRayTransform = function (hitPosition) {\r\n if (!this.cursorRayObject) return;\r\n if (this.cursorRayScalingAxis != 4) {\r\n this.cursorRayObject.resetScaling();\r\n\r\n if (hitPosition != null) {\r\n this.cursorRayObject.getTranslationWorld(this.cursorRayOrigin);\r\n let dist = vec3.dist(this.cursorRayOrigin, hitPosition);\r\n this.cursorRayScale[this.cursorRayScalingAxis] = dist;\r\n this.cursorRayObject.scale(this.cursorRayScale);\r\n }\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto._setCursorVisibility = function (visible) {\r\n this.visible = visible;\r\n if (!this.cursorObject) return;\r\n\r\n this.cursorObject.pp_setActive(visible);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.update = function (dt) {\r\n if (this.doubleClickTimer > 0) {\r\n this.doubleClickTimer -= dt;\r\n }\r\n\r\n if (this.tripleClickTimer > 0) {\r\n this.tripleClickTimer -= dt;\r\n }\r\n\r\n this.doUpdate(false);\r\n\r\n this.isUpWithNoDown = false;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.doUpdate = function (doClick) {\r\n /* If in VR, set the cursor ray based on object transform */\r\n if (this.session) {\r\n /* Since Google Cardboard tap is registered as arTouchDown without a gamepad, we need to check for gamepad presence */\r\n if (this.arTouchDown && this.input && WL.xrSession.inputSources[0].handedness === 'none' && WL.xrSession.inputSources[0].gamepad) {\r\n const p = WL.xrSession.inputSources[0].gamepad.axes;\r\n /* Screenspace Y is inverted */\r\n this.direction = [p[0], -p[1], -1.0];\r\n this.updateDirection();\r\n } else {\r\n this.object.getTranslationWorld(this.origin);\r\n this.object.getForward(this.direction);\r\n }\r\n const rayHit = this.rayHit = (this.rayCastMode == 0) ?\r\n WL.scene.rayCast(this.origin, this.direction, this.collisionMask) :\r\n WL.physics.rayCast(this.origin, this.direction, this.collisionMask, this.maxDistance);\r\n\r\n if (rayHit.hitCount > 0) {\r\n this.cursorPos.set(rayHit.locations[0]);\r\n } else {\r\n this.cursorPos.fill(0);\r\n }\r\n\r\n this.hoverBehaviour(rayHit, doClick);\r\n }\r\n\r\n if (this.cursorObject) {\r\n if (this.hoveringObject && (this.cursorPos[0] != 0 || this.cursorPos[1] != 0 || this.cursorPos[2] != 0)) {\r\n this._setCursorVisibility(true);\r\n this.cursorObject.setTranslationWorld(this.cursorPos);\r\n this._setCursorRayTransform(this.cursorPos);\r\n } else {\r\n if (this.visible && this.cursorRayObject) {\r\n this._setCursorRayTransform(null);\r\n }\r\n\r\n this._setCursorVisibility(false);\r\n }\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(true);\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.hoverBehaviour = function (rayHit, doClick) {\r\n if (rayHit.hitCount > 0) {\r\n if (!this.hoveringObject || !this.hoveringObject.equals(rayHit.objects[0])) {\r\n /* Unhover previous, if exists */\r\n if (this.hoveringObject) {\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n if (cursorTarget) cursorTarget.onUnhover(this.hoveringObject, this);\r\n this.globalTarget.onUnhover(this.hoveringObject, this);\r\n }\r\n\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n\r\n /* Hover new object */\r\n this.hoveringObject = rayHit.objects[0];\r\n if (this.styleCursor) WL.canvas.style.cursor = \"pointer\";\r\n\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n if (cursorTarget) {\r\n this.hoveringObjectTarget = cursorTarget;\r\n cursorTarget.onHover(this.hoveringObject, this);\r\n }\r\n this.globalTarget.onHover(this.hoveringObject, this);\r\n\r\n if (this.isRealDown) {\r\n if (cursorTarget) cursorTarget.onDownOnHover(this.hoveringObject, this);\r\n this.globalTarget.onDownOnHover(this.hoveringObject, this);\r\n }\r\n }\r\n\r\n if (this.hoveringObjectTarget) {\r\n this.hoveringObjectTarget.onMove(this.hoveringObject, this);\r\n }\r\n\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n\r\n /* Cursor down */\r\n if (this.isDown !== this.lastIsDown && this.isDown) {\r\n if (cursorTarget) cursorTarget.onDown(this.hoveringObject, this);\r\n this.globalTarget.onDown(this.hoveringObject, this);\r\n }\r\n\r\n /* Click */\r\n if (this.isDown !== this.lastIsDown && !this.isDown) {\r\n if (this.tripleClickTimer > 0 && this.multipleClickObject && this.multipleClickObject.equals(this.hoveringObject)) {\r\n if (cursorTarget) cursorTarget.onTripleClick(this.hoveringObject, this);\r\n this.globalTarget.onTripleClick(this.hoveringObject, this);\r\n\r\n this.tripleClickTimer = 0;\r\n } else if (this.doubleClickTimer > 0 && this.multipleClickObject && this.multipleClickObject.equals(this.hoveringObject)) {\r\n if (cursorTarget) cursorTarget.onDoubleClick(this.hoveringObject, this);\r\n this.globalTarget.onDoubleClick(this.hoveringObject, this);\r\n\r\n this.tripleClickTimer = this.multipleClickDelay;\r\n this.doubleClickTimer = 0;\r\n } else {\r\n if (cursorTarget) cursorTarget.onClick(this.hoveringObject, this);\r\n this.globalTarget.onClick(this.hoveringObject, this);\r\n\r\n this.tripleClickTimer = 0;\r\n this.doubleClickTimer = this.multipleClickDelay;\r\n this.multipleClickObject = this.hoveringObject;\r\n }\r\n }\r\n\r\n /* Cursor up */\r\n if (this.isDown !== this.lastIsDown && !this.isDown) {\r\n if (cursorTarget) cursorTarget.onUp(this.hoveringObject, this);\r\n this.globalTarget.onUp(this.hoveringObject, this);\r\n } else if (this.isUpWithNoDown) {\r\n if (cursorTarget) cursorTarget.onUpWithNoDown(this.hoveringObject, this);\r\n this.globalTarget.onUpWithNoDown(this.hoveringObject, this);\r\n }\r\n } else if (this.hoveringObject && rayHit.hitCount == 0) {\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n if (cursorTarget) cursorTarget.onUnhover(this.hoveringObject, this);\r\n this.globalTarget.onUnhover(this.hoveringObject, this);\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n if (this.styleCursor) WL.canvas.style.cursor = \"default\";\r\n }\r\n\r\n if (this.hoveringObject) {\r\n this.lastIsDown = this.isDown;\r\n } else {\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.setupVREvents = function (s) {\r\n /* If in VR, one-time bind the listener */\r\n this.session = s;\r\n const onSessionEnd = function (e) {\r\n /* Reset cache once the session ends to rebind select etc, in case\r\n * it starts again */\r\n this.session = null;\r\n }.bind(this);\r\n s.addEventListener('end', onSessionEnd);\r\n\r\n const onSelect = this.onSelect.bind(this);\r\n s.addEventListener('select', onSelect);\r\n const onSelectStart = this.onSelectStart.bind(this);\r\n s.addEventListener('selectstart', onSelectStart);\r\n const onSelectEnd = this.onSelectEnd.bind(this);\r\n s.addEventListener('selectend', onSelectEnd);\r\n\r\n this.onDestroyCallbacks.push(() => {\r\n if (!this.session) return;\r\n s.removeEventListener('end', onSessionEnd);\r\n s.removeEventListener('select', onSelect);\r\n s.removeEventListener('selectstart', onSelectStart);\r\n s.removeEventListener('selectend', onSelectEnd);\r\n });\r\n\r\n /* After AR session was entered, the projection matrix changed */\r\n this.onViewportResize();\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onSelect = function (e) {\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onSelectStart = function (e) {\r\n if (this.active) {\r\n this.arTouchDown = true;\r\n if (e.inputSource.handedness == this.handedness) {\r\n this.isDown = true;\r\n }\r\n }\r\n this.isRealDown = true;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onSelectEnd = function (e) {\r\n if (this.active) {\r\n this.arTouchDown = false;\r\n if (e.inputSource.handedness == this.handedness) {\r\n if (!this.isDown) {\r\n this.isUpWithNoDown = true;\r\n }\r\n this.isDown = false;\r\n }\r\n }\r\n this.isRealDown = false;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onPointerMove = function (e) {\r\n /* Don't care about secondary pointers */\r\n if (!e.isPrimary) return;\r\n const bounds = e.target.getBoundingClientRect();\r\n const rayHit = this.updateMousePos(e.clientX, e.clientY, bounds.width, bounds.height);\r\n\r\n this.hoverBehaviour(rayHit, false);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onClick = function (e) {\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onPointerDown = function (e) {\r\n if (this.active) {\r\n /* Don't care about secondary pointers or non-left clicks */\r\n if (!e.isPrimary || e.button !== 0) return;\r\n const bounds = e.target.getBoundingClientRect();\r\n const rayHit = this.updateMousePos(e.clientX, e.clientY, bounds.width, bounds.height);\r\n\r\n this.hoverBehaviour(rayHit, false); //simulate a move before the click, to clean previous hover/unhover\r\n\r\n this.isDown = true;\r\n this.isRealDown = true;\r\n\r\n this.hoverBehaviour(rayHit, false);\r\n } else {\r\n this.isRealDown = true;\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onPointerUp = function (e) {\r\n if (this.active) {\r\n /* Don't care about secondary pointers or non-left clicks */\r\n if (!e.isPrimary || e.button !== 0) return;\r\n const bounds = e.target.getBoundingClientRect();\r\n const rayHit = this.updateMousePos(e.clientX, e.clientY, bounds.width, bounds.height);\r\n\r\n this.hoverBehaviour(rayHit, false); //simulate a move before the click, to clean previous hover/unhover\r\n\r\n if (!this.isDown) {\r\n this.isUpWithNoDown = true;\r\n }\r\n\r\n this.isDown = false;\r\n this.isRealDown = false;\r\n\r\n this.hoverBehaviour(rayHit, false);\r\n } else {\r\n this.isRealDown = false;\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.updateMousePos = function (clientX, clientY, w, h) {\r\n /* Get direction in normalized device coordinate space from mouse position */\r\n const left = clientX / w;\r\n const top = clientY / h;\r\n this.direction = [left * 2 - 1, -top * 2 + 1, -1.0];\r\n return this.updateDirection();\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.updateDirection = function () {\r\n this.object.getTranslationWorld(this.origin);\r\n\r\n /* Reverse-project the direction into view space */\r\n vec3.transformMat4(this.direction, this.direction, this.projectionMatrix);\r\n vec3.normalize(this.direction, this.direction);\r\n vec3.transformQuat(this.direction, this.direction, this.object.transformWorld);\r\n const rayHit = this.rayHit = (this.rayCastMode == 0) ?\r\n WL.scene.rayCast(this.origin, this.direction, this.collisionMask) :\r\n WL.physics.rayCast(this.origin, this.direction, this.collisionMask, this.maxDistance);\r\n\r\n if (rayHit.hitCount > 0) {\r\n this.cursorPos.set(rayHit.locations[0]);\r\n } else {\r\n this.cursorPos.fill(0);\r\n }\r\n\r\n return rayHit;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onDeactivate = function () {\r\n if (this.hoveringObject) {\r\n const cursorTarget = this.hoveringObject.getComponent('cursor-target');\r\n if (cursorTarget) cursorTarget.onUnhover(this.hoveringObject, this);\r\n this.globalTarget.onUnhover(this.hoveringObject, this);\r\n }\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n if (this.styleCursor) WL.canvas.style.cursor = \"default\";\r\n\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n this.isUpWithNoDown = false;\r\n\r\n this._setCursorVisibility(false);\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(false);\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onActivate = function () {\r\n this.showRay = true;\r\n\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n this.isUpWithNoDown = false;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onDestroy = function () {\r\n for (const f of this.onDestroyCallbacks) f();\r\n };\r\n\r\n} else {\r\n console.error(\"Wonderland Engine \\\"cursor\\\" component not found.\\n Add the component to your project to avoid any issue with the PP bundle.\");\r\n}", "if (_WL && _WL._componentTypes && _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]]) {\r\n\r\n // Modified Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.init = function () {\r\n this.hoverFunctions = [];\r\n this.unHoverFunctions = [];\r\n this.clickFunctions = [];\r\n this.doubleClickFunctions = [];\r\n this.tripleClickFunctions = [];\r\n this.moveFunctions = [];\r\n this.downFunctions = [];\r\n this.upFunctions = [];\r\n this.downOnHoverFunctions = [];\r\n this.upWithNoDownFunctions = [];\r\n\r\n this.isSurface = false; // just a way to specify if this target is just used as a surface between buttons\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onHover = function (object, cursor) {\r\n for (let f of this.hoverFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onUnhover = function (object, cursor) {\r\n for (let f of this.unHoverFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onClick = function (object, cursor) {\r\n for (let f of this.clickFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onMove = function (object, cursor) {\r\n for (let f of this.moveFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDown = function (object, cursor) {\r\n for (let f of this.downFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onUp = function (object, cursor) {\r\n for (let f of this.upFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this.hoverFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.hoverFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addUnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this.unHoverFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeUnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.unHoverFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this.clickFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.clickFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addMoveFunction = function (f) {\r\n this._validateCallback(f);\r\n this.moveFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeMoveFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.moveFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this.downFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.downFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addUpFunction = function (f) {\r\n this._validateCallback(f);\r\n this.upFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeUpFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.upFunctions, f);\r\n };\r\n\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto._removeItemOnce = function (arr, value) {\r\n var index = arr.indexOf(value);\r\n if (index > -1) arr.splice(index, 1);\r\n return arr;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto._validateCallback = function (f) {\r\n if (typeof f !== \"function\") {\r\n throw new TypeError(this.object.name + \".cursor-target: Argument needs to be a function\");\r\n }\r\n };\r\n\r\n // New Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDoubleClick = function (object, cursor) {\r\n for (let f of this.doubleClickFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addDoubleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this.doubleClickFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeDoubleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.doubleClickFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onTripleClick = function (object, cursor) {\r\n for (let f of this.tripleClickFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addTripleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this.tripleClickFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeTripleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.tripleClickFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDownOnHover = function (object, cursor) {\r\n for (let f of this.downOnHoverFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addDownOnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this.downOnHoverFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeDownOnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.downOnHoverFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onUpWithNoDown = function (object, cursor) {\r\n for (let f of this.upWithNoDownFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addUpWithNoDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this.upWithNoDownFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeUpWithNoDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.upWithNoDownFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.start = function () { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.update = function (dt) { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onActivate = function () { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDeactivate = function () { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDestroy = function () { };\r\n\r\n} else {\r\n console.error(\"Wonderland Engine \\\"cursor-target\\\" component not found.\\n Add the component to your project to avoid any issue with the PP bundle.\");\r\n}", "if (_WL && _WL._componentTypes && _WL._componentTypes[_WL._componentTypeIndices[\"mouse-look\"]]) {\r\n\r\n // Modified Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"mouse-look\"]].proto.init = function () {\r\n document.addEventListener('mousemove', function () {\r\n let viewForward = PP.vec3_create();\r\n let viewUp = PP.vec3_create();\r\n\r\n let referenceUp = PP.vec3_create();\r\n let referenceUpNegate = PP.vec3_create();\r\n let referenceRight = PP.vec3_create();\r\n\r\n let newUp = PP.vec3_create();\r\n return function (e) {\r\n if (this.active && (this.mouseDown || !this.requireMouseDown)) {\r\n\r\n viewForward = this.object.pp_getBackward(viewForward); // the view \"real\" forward is actually the backward\r\n viewUp = this.object.pp_getUp(viewUp);\r\n\r\n referenceUp.vec3_set(0, 1, 0);\r\n if (this.object.pp_getParent() != null) {\r\n referenceUp = this.object.pp_getParent().pp_getUp(referenceUp);\r\n }\r\n\r\n referenceRight = viewForward.vec3_cross(referenceUp, referenceRight);\r\n\r\n let minAngle = 1;\r\n if (viewForward.vec3_angle(referenceUp) < minAngle) {\r\n referenceRight = viewUp.vec3_negate(referenceRight).vec3_cross(referenceUp, referenceRight);\r\n } else if (viewForward.vec3_angle(referenceUp.vec3_negate(referenceUpNegate)) < minAngle) {\r\n referenceRight = viewUp.vec3_cross(referenceUp, referenceRight);\r\n } else if (!viewUp.vec3_isConcordant(referenceUp)) {\r\n referenceRight.vec3_negate(referenceRight);\r\n }\r\n referenceRight.vec3_normalize(referenceRight);\r\n\r\n this.rotationX = -this.sensitity * e.movementX;\r\n this.rotationY = -this.sensitity * e.movementY;\r\n\r\n this.object.pp_rotateAxis(this.rotationY, referenceRight);\r\n\r\n let maxVerticalAngle = 90 - 0.001;\r\n newUp = this.object.pp_getUp(newUp);\r\n let angleWithUp = Math.pp_angleClamp(newUp.vec3_angleSigned(referenceUp, referenceRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n let fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n this.object.pp_rotateAxis(fixAngle, referenceRight);\r\n }\r\n\r\n this.object.pp_rotateAxis(this.rotationX, referenceUp);\r\n }\r\n };\r\n }().bind(this));\r\n\r\n if (this.requireMouseDown) {\r\n if (this.mouseButtonIndex == 2) {\r\n WL.canvas.addEventListener(\"contextmenu\", function (e) {\r\n e.preventDefault();\r\n }, false);\r\n }\r\n WL.canvas.addEventListener('mousedown', function (e) {\r\n if (e.button == this.mouseButtonIndex) {\r\n this.mouseDown = true;\r\n document.body.style.cursor = \"grabbing\";\r\n if (e.button == 1) {\r\n e.preventDefault();\r\n /* Prevent scrolling */\r\n return false;\r\n }\r\n }\r\n }.bind(this));\r\n WL.canvas.addEventListener('mouseup', function (e) {\r\n if (e.button == this.mouseButtonIndex) {\r\n this.mouseDown = false;\r\n document.body.style.cursor = \"initial\";\r\n }\r\n }.bind(this));\r\n WL.canvas.addEventListener('mouseleave', function (e) {\r\n this.mouseDown = false;\r\n document.body.style.cursor = \"initial\";\r\n }.bind(this));\r\n\r\n WL.canvas.addEventListener('touchstart', function (e) {\r\n this.mouseDown = true;\r\n document.body.style.cursor = \"grabbing\";\r\n }.bind(this));\r\n WL.canvas.addEventListener('touchend', function (e) {\r\n this.mouseDown = false;\r\n document.body.style.cursor = \"initial\";\r\n }.bind(this));\r\n }\r\n };\r\n} else {\r\n console.error(\"Wonderland Engine \\\"mouse-look\\\" component not found.\\n Add the component to your project to avoid any issue with the PP bundle.\");\r\n}", "/*\r\n How to use\r\n\r\n Warning: The extension is a WIP so not all the functions are available for all kinds of vector.\r\n\r\n By default rotations are in Degrees and transforms are Matrix 4 (and not Quat 2) \r\n For functions that work with rotations, Matrix means Matrix 3 and Quat means Quat\r\n For functions that work with transforms, Matrix means Matrix 4 and Quat means Quat 2\r\n \r\n For rotations u can add a suffix like Degrees/Radians/Quat/Matrix to use a specific version, example:\r\n - vec3_rotateAroundRadians\r\n - vec3_degreesAddRotationDegrees\r\n \r\n For transform u can add a suffix like Quat/Matrix to use a specific version, example:\r\n - vec3_convertPositionToWorldMatrix\r\n - vec3_convertDirectionToWorldQuat\r\n\r\n Some vec3 functions let u add a prefix to specify if the vec3 represent a rotation in degrees or radians, where degrees is the default:\r\n - vec3_toQuat\r\n - vec3_degreesToQuat\r\n - vec3_radiansToQuat\r\n - vec3_degreesAddRotation\r\n\r\n Rotation operations return a rotation of the same kind of the starting variable:\r\n - vec3_degreesAddRotationQuat -> returns a rotation in degrees\r\n - quat_addRotationDegrees -> returns a rotation in quat\r\n\r\n The functions leave u the choice of forwarding an out parameter or just get the return value, example:\r\n - let quat = this.vec3_toQuat()\r\n - this.vec3_toQuat(quat)\r\n - the out parameter is always the last one\r\n\r\n List of functions:\r\n Notes:\r\n - If a group of functions starts with \u25CB it means it modifies the variable itself\r\n - The suffixes (like Matrix or Radians) or prefixes (like degrees) are omitted \r\n\r\n CREATION (u can call these functions without any object):\r\n - PP.vec2_create\r\n\r\n - PP.vec3_create\r\n\r\n - PP.vec4_create\r\n\r\n - PP.quat_create\r\n\r\n - PP.quat2_create\r\n - PP.quat2_fromPositionRotation\r\n\r\n - PP.mat4_create\r\n - PP.mat4_fromPositionRotation / PP.mat4_fromPositionRotationScale\r\n\r\n ARRAY:\r\n - pp_first / pp_last\r\n - pp_has / pp_hasEqual\r\n - pp_find / pp_findIndex / pp_findAll / pp_findAllIndexes / pp_findEqual / pp_findAllEqual / pp_findIndexEqual / pp_findAllIndexesEqual\r\n \u25CB pp_remove / pp_removeIndex / pp_removeAll / pp_removeEqual / pp_removeAllEqual\r\n \u25CB pp_pushUnique / pp_unshiftUnique\r\n \u25CB pp_copy \r\n - pp_clone \r\n - pp_equals \r\n \u25CB pp_clear \r\n\r\n GENERIC VECTOR (array with only numbers):\r\n - vec_scale\r\n - vec_round / vec_floor / vec_ceil / vec_clamp\r\n - vec_log / vec_error / vec_warn \r\n - vec_equals \r\n\r\n VECTOR 2:\r\n \u25CB vec2_set\r\n - vec2_length\r\n - vec2_isZero\r\n\r\n VECTOR 3:\r\n \u25CB vec3_set / vec3_copy / vec3_zero\r\n - vec3_clone \r\n - vec3_normalize / vec3_negate\r\n - vec3_isNormalized / vec3_isZero\r\n - vec3_length / vec3_lengthSigned\r\n - vec3_distance\r\n - vec3_add / vec3_sub / vec3_mul / vec3_div / vec3_scale\r\n - vec3_transformQuat / vec3_transformMat4\r\n - vec3_componentAlongAxis / vec3_removeComponentAlongAxis / vec3_copyComponentAlongAxis / vec3_valueAlongAxis \r\n - vec3_isConcordant\r\n - vec3_isFurtherAlongAxis\r\n - vec3_isToTheRight\r\n - vec3_isOnAxis\r\n - vec3_isOnPlane\r\n - vec3_signTo\r\n - vec3_projectOnAxis / vec3_projectOnAxisAlongAxis\r\n - vec3_projectOnPlane / vec3_projectOnPlaneAlongAxis\r\n - vec3_convertPositionToWorld / vec3_convertPositionToLocal \r\n - vec3_convertDirectionToWorld / vec3_convertDirectionToLocal \r\n - vec3_angle\r\n - vec3_rotate / vec3_rotateAxis / vec3_rotateAround / vec3_rotateAroundAxis\r\n - vec3_rotationTo / vec3_rotationToPivoted\r\n - vec3_toRadians / vec3_toDegrees / vec3_toQuat / vec3_toMatrix\r\n - vec3_addRotation\r\n - vec3_log / vec3_error / vec3_warn \r\n - vec3_lerp / vec3_interpolate \r\n \r\n VECTOR 4:\r\n \u25CB vec4_set / vec4_copy\r\n\r\n QUAT:\r\n \u25CB quat_set / quat_copy / quat_identity\r\n - quat_clone \r\n - quat_normalize / quat_invert\r\n - quat_isNormalized\r\n - quat_length\r\n - quat_mul\r\n - quat_getAxis / quat_getAngle\r\n - quat_getAxes / quat_getRight / quat_getUp / quat_getForward / quat_getLeft / quat_getDown / quat_getBackward\r\n \u25CB quat_setAxes / quat_setRight / quat_setUp / quat_setForward / quat_setLeft / quat_setDown / quat_setBackward\r\n - quat_toWorld / quat_toLocal\r\n - quat_rotate / quat_rotateAxis \r\n - quat_rotationTo \r\n \u25CB quat_fromRadians / quat_fromDegrees / quat_fromAxis / quat_fromAxes\r\n - quat_toRadians / quat_toDegrees / quat_toMatrix\r\n - quat_addRotation / quat_subRotation\r\n - quat_lerp / quat_interpolate / quat_slerp / quat_sinterpolate\r\n\r\n QUAT 2:\r\n \u25CB quat2_copy / quat2_identity\r\n - quat2_normalize\r\n - quat2_getPosition / quat2_getRotation\r\n \u25CB quat2_setPositionRotation\r\n - quat2_getAxes / quat2_getRight / quat2_getUp / quat2_getForward / quat2_getLeft / quat2_getDown / quat2_getBackward\r\n - quat2_toWorld / quat2_toLocal\r\n - quat2_toMatrix\r\n \u25CB quat2_fromMatrix\r\n - quat2_lerp / quat2_interpolate\r\n\r\n MATRIX 3:\r\n - mat3_toDegrees / mat3_toRadians / mat3_toQuat\r\n - mat3_fromAxes\r\n\r\n MATRIX 4:\r\n \u25CB mat4_copy / mat4_identity\r\n - mat4_clone\r\n - mat4_invert\r\n - mat4_getPosition / mat4_getRotation / mat4_getScale\r\n \u25CB mat4_setPosition / mat4_setRotation / mat4_setScale\r\n \u25CB mat4_setPositionRotation / mat4_setPositionRotationScale\r\n - mat4_getAxes / mat4_getRight / mat4_getUp / mat4_getForward / mat4_getLeft / mat4_getDown / mat4_getBackward\r\n - mat4_toWorld / mat4_toLocal\r\n - mat4_hasUniformScale\r\n - mat4_toQuat\r\n \u25CB mat4_fromQuat\r\n*/\r\n\r\nimport * as glMatrix from 'gl-matrix';\r\n\r\n//ARRAY\r\n\r\n//New Functions\r\n\r\nArray.prototype.pp_first = function () {\r\n return this.length > 0 ? this[0] : undefined;\r\n};\r\n\r\nArray.prototype.pp_last = function () {\r\n return this.length > 0 ? this[this.length - 1] : undefined;\r\n};\r\n\r\nArray.prototype.pp_has = function (callback) {\r\n return this.pp_find(callback) != undefined;\r\n};\r\n\r\nArray.prototype.pp_hasEqual = function (elementToFind, elementsEqualCallback = null) {\r\n return this.pp_findEqual(elementToFind, elementsEqualCallback) != undefined;\r\n};\r\n\r\nArray.prototype.pp_find = function (callback) {\r\n let elementFound = undefined;\r\n\r\n let index = this.findIndex(callback);\r\n if (index >= 0) {\r\n elementFound = this[index];\r\n }\r\n\r\n return elementFound;\r\n};\r\n\r\nArray.prototype.pp_findIndex = function (callback) {\r\n return this.findIndex(callback);\r\n};\r\n\r\nArray.prototype.pp_findAll = function (callback) {\r\n let elementsFound = this.filter(callback);\r\n\r\n return elementsFound;\r\n};\r\n\r\nArray.prototype.pp_findAllIndexes = function (callback) {\r\n let indexes = [];\r\n for (let i = 0; i < this.length; i++) {\r\n let element = this[i];\r\n if (callback(element)) {\r\n indexes.push(i);\r\n }\r\n }\r\n return indexes;\r\n};\r\n\r\nArray.prototype.pp_findEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_find(element => element === elementToFind);\r\n }\r\n return this.pp_find(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_findAllEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_findAll(element => element === elementToFind);\r\n }\r\n return this.pp_findAll(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_findIndexEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.findIndex(element => element === elementToFind);\r\n }\r\n return this.findIndex(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_findAllIndexesEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_findAllIndexes(element => element === elementToFind);\r\n }\r\n return this.pp_findAllIndexes(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_removeIndex = function (index) {\r\n let elementRemoved = undefined;\r\n\r\n if (index >= 0 && index < this.length) {\r\n let arrayRemoved = this.splice(index, 1);\r\n if (arrayRemoved.length == 1) {\r\n elementRemoved = arrayRemoved[0];\r\n }\r\n }\r\n\r\n return elementRemoved;\r\n};\r\n\r\nArray.prototype.pp_remove = function (callback) {\r\n let elementRemoved = undefined;\r\n\r\n let index = this.findIndex(callback);\r\n if (index >= 0) {\r\n elementRemoved = this.pp_removeIndex(index);\r\n }\r\n\r\n return elementRemoved;\r\n};\r\n\r\nArray.prototype.pp_removeAll = function (callback) {\r\n let elementsRemoved = [];\r\n\r\n let currentElement = undefined;\r\n do {\r\n currentElement = this.pp_remove(callback);\r\n if (currentElement !== undefined) {\r\n elementsRemoved.push(currentElement);\r\n }\r\n } while (currentElement !== undefined);\r\n\r\n return elementsRemoved;\r\n};\r\n\r\nArray.prototype.pp_removeEqual = function (elementToRemove, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_remove(element => element === elementToFind);\r\n }\r\n return this.pp_remove(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_removeAllEqual = function (elementToRemove, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_removeAll(element => element === elementToFind);\r\n }\r\n return this.pp_removeAll(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_pushUnique = function (element, elementsEqualCallback = null) {\r\n let length = this.length;\r\n\r\n let hasElement = this.pp_hasEqual(element, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = this.push(element);\r\n }\r\n\r\n return length;\r\n};\r\n\r\nArray.prototype.pp_unshiftUnique = function (element, elementsEqualCallback = null) {\r\n let length = this.length;\r\n\r\n let hasElement = this.pp_hasEqual(element, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = this.unshift(element);\r\n }\r\n\r\n return length;\r\n};\r\n\r\nArray.prototype.pp_copy = function (array, copyCallback = null) {\r\n while (this.length > array.length) {\r\n this.pop();\r\n }\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n if (copyCallback == null) {\r\n this[i] = array[i];\r\n } else {\r\n this[i] = copyCallback(this[i], array[i]);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\nArray.prototype.pp_clone = function (cloneCallback = null) {\r\n if (cloneCallback == null) {\r\n return this.slice(0);\r\n }\r\n\r\n let clone = null;\r\n switch (this.constructor.name) {\r\n case \"Array\":\r\n clone = new Array(this.length);\r\n break;\r\n case \"Uint32Array\":\r\n clone = new Uint32Array(this.length);\r\n break;\r\n case \"Int32Array\":\r\n clone = new Int32Array(this.length);\r\n break;\r\n case \"Float32Array\":\r\n clone = new Float32Array(this.length);\r\n break;\r\n case \"Float64Array\":\r\n clone = new Float64Array(this.length);\r\n break;\r\n default:\r\n clone = new Array(this.length);\r\n console.error(\"Cloned array type not supported!\");\r\n break;\r\n }\r\n\r\n for (let i = 0; i < this.length; i++) {\r\n clone[i] = cloneCallback(this[i]);\r\n }\r\n\r\n return clone;\r\n};\r\n\r\nArray.prototype.pp_equals = function (array, elementsEqualCallback = null) {\r\n let equals = true;\r\n\r\n if (array != null && this.length == array.length) {\r\n for (let i = 0; i < this.length; i++) {\r\n if ((elementsEqualCallback != null && !elementsEqualCallback(this[i], array[i])) ||\r\n (elementsEqualCallback == null && this[i] != array[i])) {\r\n equals = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n equals = false;\r\n }\r\n\r\n return equals;\r\n};\r\n\r\nArray.prototype.pp_clear = function () {\r\n this.length = 0;\r\n\r\n return this;\r\n};\r\n\r\n// GENERIC VECTOR\r\n\r\n//New Functions\r\n\r\nArray.prototype.vec_toString = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n return message;\r\n};\r\n\r\nArray.prototype.vec_log = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n console.log(message);\r\n};\r\n\r\nArray.prototype.vec_error = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n console.error(message);\r\n};\r\n\r\nArray.prototype.vec_warn = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n console.warn(message);\r\n};\r\n\r\nArray.prototype.vec_scale = function (value, out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = out[i] * value;\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_round = function (out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.round(out[i]);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_floor = function (out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.floor(out[i]);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_ceil = function (out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.ceil(out[i]);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_clamp = function (start, end, out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n let fixedStart = (start != null) ? start : -Number.MAX_VALUE;\r\n let fixedEnd = (end != null) ? end : Number.MAX_VALUE;\r\n let min = Math.min(fixedStart, fixedEnd);\r\n let max = Math.max(fixedStart, fixedEnd);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.min(Math.max(out[i], min), max);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_equals = function (vector, epsilon = 0) {\r\n let equals = this.length == vector.length;\r\n\r\n for (let i = 0; i < this.length && equals; i++) {\r\n equals = equals && (Math.abs(this[i] - vector[i]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n};\r\n\r\n// VECTOR 2\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.vec2_set = function (x, y = null) {\r\n if (y == null) {\r\n glMatrix.vec2.set(this, x, x);\r\n } else {\r\n glMatrix.vec2.set(this, x, y);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.vec2_length = function () {\r\n return glMatrix.vec2.length(this);\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.vec2_isZero = function () {\r\n return this.vec2_length() == 0;\r\n};\r\n\r\n// VECTOR 3\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.vec3_normalize = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.normalize(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_copy = function (vector) {\r\n glMatrix.vec3.copy(this, vector);\r\n return this;\r\n};\r\n\r\nArray.prototype.vec3_clone = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_set = function (x, y = null, z = null) {\r\n if (y == null) {\r\n glMatrix.vec3.set(this, x, x, x);\r\n } else {\r\n glMatrix.vec3.set(this, x, y, z);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.vec3_zero = function () {\r\n glMatrix.vec3.zero(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.vec3_angle = function (vector) {\r\n return this.vec3_angleDegrees(vector);\r\n};\r\n\r\nArray.prototype.vec3_angleDegrees = function (vector) {\r\n return this.vec3_angleRadians(vector) * (180 / Math.PI);\r\n};\r\n\r\nArray.prototype.vec3_angleRadians = function (vector) {\r\n return (this.vec3_isZero() || vector.vec3_isZero()) ? 0 : glMatrix.vec3.angle(this, vector);\r\n};\r\n\r\nArray.prototype.vec3_length = function () {\r\n return glMatrix.vec3.length(this);\r\n};\r\n\r\nArray.prototype.vec3_distance = function (vector) {\r\n return glMatrix.vec3.dist(this, vector);\r\n};\r\n\r\nArray.prototype.vec3_add = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.add(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_sub = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.sub(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_mul = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.mul(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_div = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.div(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_scale = function (value, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.scale(out, this, value);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_negate = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.negate(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_cross = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.cross(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_transformQuat = function (quat, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.transformQuat(out, this, quat);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_transformMat4 = function (mat4, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.transformMat4(out, this, mat4);\r\n return out;\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.vec3_lengthSigned = function (positiveDirection) {\r\n let signedLength = glMatrix.vec3.length(this);\r\n if (!this.vec3_isConcordant(positiveDirection)) {\r\n signedLength *= -1;\r\n }\r\n\r\n return signedLength;\r\n};\r\n\r\nArray.prototype.vec3_angleSigned = function (vector, upAxis) {\r\n return this.vec3_angleSignedDegrees(vector, upAxis);\r\n};\r\n\r\nArray.prototype.vec3_angleSignedDegrees = function (vector, upAxis) {\r\n return this.vec3_angleSignedRadians(vector, upAxis) * (180 / Math.PI);\r\n};\r\n\r\nArray.prototype.vec3_angleSignedRadians = function () {\r\n let crossAxis = glMatrix.vec3.create();\r\n return function vec3_angleSignedRadians(vector, upAxis) {\r\n this.vec3_cross(vector, crossAxis);\r\n let angle = this.vec3_angleRadians(vector);\r\n if (!crossAxis.vec3_isConcordant(upAxis)) {\r\n angle = -angle;\r\n }\r\n\r\n return angle;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_toRadians = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, glMatrix.glMatrix.toRadian(this[0]), glMatrix.glMatrix.toRadian(this[1]), glMatrix.glMatrix.toRadian(this[2]));\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_toDegrees = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[0] * (180 / Math.PI), this[1] * (180 / Math.PI), this[2] * (180 / Math.PI));\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_toQuat = function (out) {\r\n return this.vec3_degreesToQuat(out);\r\n};\r\n\r\nArray.prototype.vec3_radiansToQuat = function (out = glMatrix.quat.create()) {\r\n out.quat_fromRadians(this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_degreesToQuat = function (out = glMatrix.quat.create()) {\r\n out.quat_fromDegrees(this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_isNormalized = function () {\r\n return Math.abs(glMatrix.vec3.length(this) - 1) < this._pp_epsilon;\r\n};\r\n\r\nArray.prototype.vec3_isZero = function (epsilon = 0) {\r\n return this.vec3_length() <= epsilon;\r\n};\r\n\r\nArray.prototype.vec3_componentAlongAxis = function (axis, out = glMatrix.vec3.create()) {\r\n let angle = glMatrix.vec3.angle(this, axis);\r\n let length = Math.cos(angle) * glMatrix.vec3.length(this);\r\n\r\n glMatrix.vec3.copy(out, axis);\r\n glMatrix.vec3.scale(out, out, length);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_valueAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_valueAlongAxis(axis) {\r\n this.vec3_componentAlongAxis(axis, componentAlong);\r\n let value = componentAlong.vec3_length();\r\n if (!componentAlong.vec3_isConcordant(axis)) {\r\n value = -value;\r\n }\r\n return value;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_removeComponentAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_removeComponentAlongAxis(axis, out = glMatrix.vec3.create()) {\r\n this.vec3_componentAlongAxis(axis, componentAlong);\r\n glMatrix.vec3.sub(out, this, componentAlong);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_copyComponentAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_copyComponentAlongAxis(vector, axis, out = glMatrix.vec3.create()) {\r\n this.vec3_removeComponentAlongAxis(axis, out);\r\n vector.vec3_componentAlongAxis(axis, componentAlong);\r\n out.vec3_add(componentAlong, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_isConcordant = function (vector) {\r\n return glMatrix.vec3.angle(this, vector) <= Math.PI / 2;\r\n};\r\n\r\nArray.prototype.vec3_isFurtherAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_isFurtherAlongAxis(vector, axis) {\r\n let thisAxisLength = this.vec3_componentAlongAxis(axis, componentAlong).vec3_length();\r\n let thisAxisLengthSigned = this.vec3_isConcordant(axis) ? thisAxisLength : -thisAxisLength;\r\n\r\n let vectorAxisLength = vector.vec3_componentAlongAxis(axis, componentAlong).vec3_length();\r\n let vectorAxisLengthSigned = vector.vec3_isConcordant(axis) ? vectorAxisLength : -vectorAxisLength;\r\n\r\n return thisAxisLengthSigned > vectorAxisLengthSigned;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_isToTheRight = function (vector, upAxis) {\r\n return this.vec3_signTo(vector, upAxis) >= 0;\r\n};\r\n\r\nArray.prototype.vec3_signTo = function () {\r\n let componentAlongThis = glMatrix.vec3.create();\r\n let componentAlongVector = glMatrix.vec3.create();\r\n return function vec3_signTo(vector, upAxis, zeroSign = 1) {\r\n this.vec3_removeComponentAlongAxis(upAxis, componentAlongThis);\r\n vector.vec3_removeComponentAlongAxis(upAxis, componentAlongVector);\r\n\r\n let angleSigned = this.vec3_angleSigned(vector, upAxis);\r\n return angleSigned > 0 ? 1 : (angleSigned == 0 ? zeroSign : -1);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_projectOnAxis = function (axis, out = glMatrix.vec3.create()) {\r\n this.vec3_componentAlongAxis(axis, out);\r\n return out;\r\n};\r\n\r\n// the result can easily be not 100% exact due to precision errors\r\nArray.prototype.vec3_projectOnAxisAlongAxis = function () {\r\n let up = glMatrix.vec3.create();\r\n\r\n let thisToAxis = glMatrix.vec3.create();\r\n\r\n let fixedProjectAlongAxis = glMatrix.vec3.create();\r\n return function vec3_projectOnAxisAlongAxis(axis, projectAlongAxis, out = glMatrix.vec3.create()) {\r\n\r\n if (this.vec3_isOnAxis(axis) || projectAlongAxis.vec3_isOnAxis(axis)) {\r\n out.vec3_copy(this);\r\n } else {\r\n projectAlongAxis.vec3_cross(axis, up);\r\n up.vec3_normalize(up);\r\n\r\n this.vec3_removeComponentAlongAxis(up, out);\r\n if (!out.vec3_isOnAxis(axis)) {\r\n out.vec3_projectOnAxis(axis, thisToAxis);\r\n thisToAxis.vec3_sub(out, thisToAxis);\r\n\r\n if (thisToAxis.vec3_isConcordant(projectAlongAxis)) {\r\n fixedProjectAlongAxis.vec3_copy(projectAlongAxis);\r\n } else {\r\n projectAlongAxis.vec3_negate(fixedProjectAlongAxis);\r\n }\r\n\r\n let angleWithAlongAxis = fixedProjectAlongAxis.vec3_angleRadians(thisToAxis);\r\n let lengthToRemove = thisToAxis.vec3_length() / Math.cos(angleWithAlongAxis);\r\n\r\n fixedProjectAlongAxis.vec3_normalize(fixedProjectAlongAxis);\r\n fixedProjectAlongAxis.vec3_scale(lengthToRemove, fixedProjectAlongAxis);\r\n out.vec3_add(fixedProjectAlongAxis, out);\r\n\r\n out.vec3_projectOnAxis(axis, out); // snap on the axis, due to float precision error\r\n }\r\n }\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_projectOnPlane = function (planeNormal, out = glMatrix.vec3.create()) {\r\n this.vec3_removeComponentAlongAxis(planeNormal, out);\r\n return out;\r\n};\r\n\r\n// the result can easily be not 100% exact due to precision errors\r\nArray.prototype.vec3_projectOnPlaneAlongAxis = function () {\r\n let thisToPlane = glMatrix.vec3.create();\r\n\r\n let fixedProjectAlongAxis = glMatrix.vec3.create();\r\n return function vec3_projectOnPlaneAlongAxis(planeNormal, projectAlongAxis, out = glMatrix.vec3.create()) {\r\n if (this.vec3_isOnPlane(planeNormal) || projectAlongAxis.vec3_isOnPlane(planeNormal)) {\r\n out.vec3_copy(this);\r\n } else {\r\n out.vec3_copy(this);\r\n\r\n out.vec3_projectOnPlane(planeNormal, thisToPlane);\r\n thisToPlane.vec3_sub(out, thisToPlane);\r\n\r\n if (thisToPlane.vec3_isConcordant(projectAlongAxis)) {\r\n fixedProjectAlongAxis.vec3_copy(projectAlongAxis);\r\n } else {\r\n projectAlongAxis.vec3_negate(fixedProjectAlongAxis);\r\n }\r\n\r\n let angleWithAlongAxis = fixedProjectAlongAxis.vec3_angleRadians(thisToPlane);\r\n let lengthToRemove = thisToPlane.vec3_length() / Math.cos(angleWithAlongAxis);\r\n\r\n fixedProjectAlongAxis.vec3_normalize(fixedProjectAlongAxis);\r\n fixedProjectAlongAxis.vec3_scale(lengthToRemove, fixedProjectAlongAxis);\r\n out.vec3_add(fixedProjectAlongAxis, out);\r\n\r\n out.vec3_projectOnPlane(planeNormal, out); // snap on the axis, due to float precision error\r\n }\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_isOnAxis = function (axis) {\r\n let angle = this.vec3_angle(axis);\r\n return Math.abs(angle) < this._pp_degreesEpsilon || Math.abs(angle - 180) < this._pp_degreesEpsilon;\r\n};\r\n\r\nArray.prototype.vec3_isOnPlane = function (planeNormal) {\r\n let angle = this.vec3_angle(planeNormal);\r\n return Math.abs(angle - 90) < this._pp_degreesEpsilon;\r\n};\r\n\r\nArray.prototype.vec3_rotate = function (rotation, out) {\r\n return this.vec3_rotateDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateDegrees = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateDegrees(rotation, out) {\r\n return this.vec3_rotateAroundDegrees(rotation, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateRadians = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateRadians(rotation, out) {\r\n return this.vec3_rotateAroundRadians(rotation, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateQuat = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateQuat(rotation, out) {\r\n return this.vec3_rotateAroundQuat(rotation, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAxis = function (angle, axis, out) {\r\n return this.vec3_rotateAxisDegrees(angle, axis, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAxisDegrees = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateAxisDegrees(angle, axis, out) {\r\n return this.vec3_rotateAroundAxisDegrees(angle, axis, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAxisRadians = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateAxisRadians(angle, axis, out) {\r\n return this.vec3_rotateAroundAxisRadians(angle, axis, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAround = function (rotation, origin, out) {\r\n return this.vec3_rotateAroundDegrees(rotation, origin, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_rotateAroundDegrees(rotation, origin, out = glMatrix.vec3.create()) {\r\n rotation.vec3_degreesToQuat(quat);\r\n return this.vec3_rotateAroundQuat(quat, origin, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAroundRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_rotateAroundRadians(rotation, origin, out = glMatrix.vec3.create()) {\r\n rotation.vec3_radiansToQuat(quat);\r\n return this.vec3_rotateAroundQuat(quat, origin, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAroundQuat = function (rotation, origin, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.sub(out, this, origin);\r\n glMatrix.vec3.transformQuat(out, out, rotation);\r\n glMatrix.vec3.add(out, out, origin);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundAxis = function (angle, axis, origin, out) {\r\n return this.vec3_rotateAroundAxisDegrees(angle, axis, origin, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundAxisDegrees = function (angle, axis, origin, out) {\r\n return this.vec3_rotateAroundAxisRadians(glMatrix.glMatrix.toRadian(angle), axis, origin, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundAxisRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_rotateAroundAxisRadians(angle, axis, origin, out = glMatrix.vec3.create()) {\r\n glMatrix.quat.setAxisAngle(quat, axis, angle);\r\n return this.vec3_rotateAroundQuat(quat, origin, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertPositionToWorld = function (parentTransform, out) {\r\n return this.vec3_convertPositionToWorldMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertPositionToLocal = function (parentTransform, out) {\r\n return this.vec3_convertPositionToLocalMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertPositionToWorldMatrix = function (parentTransform, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.transformMat4(out, this, parentTransform);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_convertPositionToLocalMatrix = function () {\r\n let inverse = glMatrix.mat4.create();\r\n return function vec3_convertPositionToLocalMatrix(parentTransform, out = glMatrix.vec3.create()) {\r\n glMatrix.mat4.invert(inverse, parentTransform);\r\n glMatrix.vec3.transformMat4(out, this, inverse);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertPositionToWorldQuat = function () {\r\n let parentTransformMatrix = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function vec3_convertPositionToWorldQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getPosition(position);\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n parentTransformMatrix.mat4_setPositionRotationQuatScale(position, rotation, one);\r\n return this.vec3_convertPositionToWorldMatrix(parentTransformMatrix, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertPositionToLocalQuat = function () {\r\n let parentTransformMatrix = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function vec3_convertPositionToLocalQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getPosition(position);\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n parentTransformMatrix.mat4_setPositionRotationQuatScale(position, rotation, one);\r\n return this.vec3_convertPositionToLocalMatrix(parentTransformMatrix, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertDirectionToWorld = function (parentTransform, out) {\r\n return this.vec3_convertDirectionToWorldMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertDirectionToLocal = function (parentTransform, out) {\r\n return this.vec3_convertDirectionToLocalMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertDirectionToWorldMatrix = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToWorldMatrix(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.mat4_getRotationQuat(rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertDirectionToLocalMatrix = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToLocalMatrix(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.mat4_getRotationQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\n\r\nArray.prototype.vec3_convertDirectionToWorldQuat = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToWorldQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertDirectionToLocalQuat = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToLocalQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_log = function (decimalPlaces = 4) {\r\n this.vec_log(decimalPlaces);\r\n};\r\n\r\nArray.prototype.vec3_error = function (decimalPlaces = 4) {\r\n this.vec_error(decimalPlaces);\r\n};\r\n\r\nArray.prototype.vec3_warn = function (decimalPlaces = 4) {\r\n this.vec_warn(decimalPlaces);\r\n};\r\n\r\nArray.prototype.vec3_addRotation = function (rotation, out) {\r\n return this.vec3_degreesAddRotation(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_addRotationDegrees = function (rotation, out) {\r\n return quat.vec3_degreesAddRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_addRotationRadians = function (rotation, out) {\r\n return quat.vec3_degreesAddRotationRadians(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_addRotationQuat = function (rotation, out) {\r\n return quat.vec3_degreesAddRotationQuat(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_degreesAddRotation = function (rotation, out) {\r\n return this.vec3_degreesAddRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_degreesAddRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesAddRotationDegrees(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_addRotationDegrees(rotation, quat).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_degreesAddRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesAddRotationRadians(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_addRotationRadians(rotation, quat).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_degreesAddRotationQuat = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesAddRotationQuat(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_addRotationQuat(rotation, quat).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansAddRotation = function (rotation, out) {\r\n return this.vec3_radiansAddRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_radiansAddRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansAddRotationDegrees(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_addRotationDegrees(rotation, quat).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansAddRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansAddRotationRadians(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_addRotationRadians(rotation, quat).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansAddRotationQuat = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansAddRotationQuat(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_addRotationQuat(rotation, quat).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_toMatrix = function (out = glMatrix.mat3.create()) {\r\n return this.vec3_degreesToMatrix(out);\r\n};\r\n\r\nArray.prototype.vec3_degreesToMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesToMatrix(out = glMatrix.mat3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_toMatrix(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansToMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansToMatrix(out = glMatrix.mat3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_toMatrix(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationTo = function (direction, out) {\r\n return this.vec3_rotationToDegrees(direction, out);\r\n};\r\n\r\nArray.prototype.vec3_rotationToDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToDegrees(direction, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToQuat(direction, rotationQuat);\r\n rotationQuat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToRadians(direction, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToQuat(direction, rotationQuat);\r\n rotationQuat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToQuat = function () {\r\n let rotationAxis = glMatrix.vec3.create();\r\n return function vec3_rotationToQuat(direction, out = glMatrix.quat.create()) {\r\n this.vec3_cross(direction, rotationAxis);\r\n rotationAxis.vec3_normalize(rotationAxis);\r\n let signedAngle = this.vec3_angleSigned(direction, rotationAxis);\r\n out.quat_fromAxis(signedAngle, rotationAxis);\r\n out.quat_normalize(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToPivoted = function (direction, pivotAxis, out) {\r\n return this.vec3_rotationToPivotedDegrees(direction, pivotAxis, out);\r\n};\r\n\r\nArray.prototype.vec3_rotationToPivotedDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToPivotedDegrees(direction, pivotAxis, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToPivotedQuat(direction, pivotAxis, rotationQuat);\r\n rotationQuat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToPivotedRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToPivotedRadians(direction, pivotAxis, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToPivotedQuat(direction, pivotAxis, rotationQuat);\r\n rotationQuat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToPivotedQuat = function () {\r\n let thisFlat = glMatrix.vec3.create();\r\n let directionFlat = glMatrix.vec3.create();\r\n let rotationAxis = glMatrix.vec3.create();\r\n return function vec3_rotationToPivotedQuat(direction, pivotAxis, out = glMatrix.quat.create()) {\r\n this.vec3_removeComponentAlongAxis(pivotAxis, thisFlat);\r\n direction.vec3_removeComponentAlongAxis(pivotAxis, directionFlat);\r\n\r\n thisFlat.vec3_cross(directionFlat, rotationAxis);\r\n rotationAxis.vec3_normalize(rotationAxis);\r\n let signedAngle = thisFlat.vec3_angleSigned(directionFlat, rotationAxis);\r\n out.quat_fromAxis(signedAngle, rotationAxis);\r\n out.quat_normalize(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_lerp = function (to, interpolationValue, out = glMatrix.vec3.create()) {\r\n if (interpolationValue <= 0) {\r\n out.vec3_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.vec3_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.vec3.lerp(out, this, to, interpolationValue);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_interpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.vec3.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.vec3_lerp(to, lerpValue, out);\r\n};\r\n\r\n// VECTOR 4\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.vec4_set = function (x, y = null, z = null, w = null) {\r\n if (y == null) {\r\n glMatrix.vec4.set(this, x, x, x, x);\r\n } else {\r\n glMatrix.vec4.set(this, x, y, z, w);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.vec4_copy = function (vector) {\r\n glMatrix.vec4.copy(this, vector);\r\n return this;\r\n};\r\n\r\n//QUAT\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.quat_normalize = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.normalize(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_copy = function (quat) {\r\n glMatrix.quat.copy(this, quat);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_clone = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_set = function (x, y = null, z = null, w = null) {\r\n if (y == null) {\r\n glMatrix.quat.set(this, x, x, x, x);\r\n } else {\r\n glMatrix.quat.set(this, x, y, z, w);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_identity = function () {\r\n glMatrix.quat.identity(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_length = function () {\r\n return glMatrix.quat.length(this);\r\n};\r\n\r\nArray.prototype.quat_invert = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.invert(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_mul = function (rotation, out = glMatrix.quat.create()) {\r\n glMatrix.quat.mul(out, this, rotation);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getAxis = function (out = glMatrix.vec3.create()) {\r\n glMatrix.quat.getAxisAngle(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getAngle = function () {\r\n return this.quat_getAngleDegrees();\r\n};\r\n\r\n\r\nArray.prototype.quat_getAngleDegrees = function () {\r\n let angle = this.quat_getAngleRadians();\r\n return angle * (180 / Math.PI);\r\n};\r\n\r\nArray.prototype.quat_getAngleRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function quat_getAngleRadians() {\r\n let angle = glMatrix.quat.getAxisAngle(vector, this);\r\n return angle;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getAxes = function (out = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.quat_getLeft(out[0]);\r\n this.quat_getUp(out[1]);\r\n this.quat_getForward(out[2]);\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getForward = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat_getForward(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getBackward = function (out) {\r\n out = this.quat_getForward(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getLeft = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat_getLeft(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getRight = function (out) {\r\n out = this.quat_getLeft(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getUp = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat_getUp(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getDown = function (out) {\r\n out = this.quat_getUp(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_setAxes = function (left, up, forward) {\r\n if (forward != null) {\r\n return this.quat_setForward(forward, up, left);\r\n } else if (up != null) {\r\n return this.quat_setUp(up, forward, left);\r\n } else {\r\n return this.quat_setLeft(left, up, forward);\r\n }\r\n};\r\n\r\nArray.prototype.quat_setForward = function (forward, up = null, left = null) {\r\n return this._quat_setAxes([left, up, forward], [2, 1, 0]);\r\n};\r\n\r\nArray.prototype.quat_setBackward = function () {\r\n let forward = glMatrix.vec3.create();\r\n return function quat_setBackward(backward, up = null, left = null) {\r\n backward.vec3_negate(forward);\r\n return this._quat_setAxes([left, up, forward], [2, 1, 0]);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_setUp = function (up, forward = null, left = null) {\r\n return this._quat_setAxes([left, up, forward], [1, 2, 0]);\r\n};\r\n\r\nArray.prototype.quat_setDown = function () {\r\n let up = glMatrix.vec3.create();\r\n return function quat_setDown(down, forward = null, left = null) {\r\n down.vec3_negate(up);\r\n return this._quat_setAxes([left, up, forward], [1, 2, 0]);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_setLeft = function (left, up = null, forward = null) {\r\n return this._quat_setAxes([left, up, forward], [0, 1, 2]);\r\n};\r\n\r\nArray.prototype.quat_setRight = function () {\r\n let left = glMatrix.vec3.create();\r\n return function quat_setRight(right, up = null, forward = null) {\r\n right.vec3_negate(left);\r\n return this._quat_setAxes([left, up, forward], [0, 1, 2]);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_toWorld = function (parentQuat, out = glMatrix.quat.create()) {\r\n glMatrix.quat.mul(out, parentQuat, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_toLocal = function () {\r\n let invertQuat = glMatrix.quat.create();\r\n return function quat_toLocal(parentQuat, out = glMatrix.quat.create()) {\r\n glMatrix.quat.conjugate(invertQuat, parentQuat);\r\n glMatrix.quat.mul(out, invertQuat, this);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_fromAxis = function (angle, axis) {\r\n return this.quat_fromAxisDegrees(angle, axis);\r\n};\r\n\r\nArray.prototype.quat_fromAxisDegrees = function (angle, axis) {\r\n glMatrix.quat.setAxisAngle(this, axis, glMatrix.glMatrix.toRadian(angle));\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_fromAxisRadians = function (angle, axis) {\r\n glMatrix.quat.setAxisAngle(this, axis, angle);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_fromAxes = function () {\r\n let mat3 = glMatrix.mat3.create();\r\n return function quat_fromAxes(leftAxis, upAxis, forwardAxis) {\r\n mat3.mat3_fromAxes(leftAxis, upAxis, forwardAxis);\r\n return mat3.mat3_toQuat(this);\r\n };\r\n}();\r\n\r\n// New Functions\r\n\r\nArray.prototype.quat_fromRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function quat_fromRadians(radiansRotation) {\r\n radiansRotation.vec3_toDegrees(vector);\r\n return this.quat_fromDegrees(vector);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_fromDegrees = function (degreesRotation) {\r\n glMatrix.quat.fromEuler(this, degreesRotation[0], degreesRotation[1], degreesRotation[2]);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_toRadians = function () {\r\n let mat3 = glMatrix.mat3.create();\r\n return function quat_toRadians(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(mat3, this);\r\n\r\n //Rotation order is ZYX \r\n out[1] = Math.asin(-this._pp_clamp(mat3[2], -1, 1));\r\n\r\n if (Math.abs(mat3[2]) < (1 - this._pp_epsilon)) {\r\n out[0] = Math.atan2(mat3[5], mat3[8]);\r\n out[2] = Math.atan2(mat3[1], mat3[0]);\r\n } else {\r\n out[0] = 0;\r\n out[2] = Math.atan2(-mat3[3], mat3[4]);\r\n }\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_toDegrees = function (out = glMatrix.vec3.create()) {\r\n this.quat_toRadians(out);\r\n out.vec3_toDegrees(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_isNormalized = function () {\r\n return Math.abs(glMatrix.quat.length(this) - 1) < this._pp_epsilon;\r\n};\r\n\r\nArray.prototype.quat_addRotation = function (rotation, out) {\r\n return this.quat_addRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_addRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_addRotationDegrees(rotation, out) {\r\n rotation.vec3_degreesToQuat(quat);\r\n return this.quat_addRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_addRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_addRotationRadians(rotation, out) {\r\n rotation.vec3_radiansToQuat(quat);\r\n return this.quat_addRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_addRotationQuat = function (rotation, out = glMatrix.quat.create()) {\r\n rotation.quat_mul(this, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_subRotation = function (rotation, out) {\r\n return this.quat_subRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_subRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_subRotationDegrees(rotation, out) {\r\n rotation.vec3_degreesToQuat(quat);\r\n return this.quat_subRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_subRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_subRotationRadians(rotation, out) {\r\n rotation.vec3_radiansToQuat(quat);\r\n return this.quat_subRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_subRotationQuat = function () {\r\n let inverse = glMatrix.quat.create();\r\n return function quat_subRotationQuat(rotation, out = glMatrix.quat.create()) {\r\n rotation.quat_invert(inverse);\r\n this.quat_mul(inverse, out);\r\n out.quat_normalize(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotationTo = function (quat, out) {\r\n return this.quat_rotationToDegrees(quat, out);\r\n};\r\n\r\nArray.prototype.quat_rotationToDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotationToDegrees(quat, out) {\r\n this.quat_rotationToQuat(quat, rotationQuat);\r\n return rotationQuat.quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotationToRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotationToRadians(quat, out) {\r\n this.quat_rotationToQuat(quat, rotationQuat);\r\n return rotationQuat.quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotationToQuat = function (quat, out) {\r\n return quat.quat_subRotationQuat(this, out);\r\n};\r\n\r\nArray.prototype.quat_toMatrix = function (out = glMatrix.mat3.create()) {\r\n glMatrix.mat3.fromQuat(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_rotate = function (rotation, out) {\r\n return this.quat_rotateDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateDegrees = function (rotation, out) {\r\n return this.quat_addRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateRadians = function (rotation, out) {\r\n return this.quat_addRotationRadians(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateQuat = function (rotation, out) {\r\n return this.quat_addRotationQuat(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateAxis = function (angle, axis, out) {\r\n return this.quat_rotateAxisDegrees(angle, axis, out);\r\n};\r\n\r\nArray.prototype.quat_rotateAxisDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotateAxisDegrees(angle, axis, out) {\r\n rotationQuat.quat_fromAxisDegrees(angle, axis);\r\n return this.quat_rotateQuat(rotationQuat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotateAxisRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotateAxisRadians(angle, axis, out) {\r\n rotationQuat.quat_fromAxisRadians(angle, axis);\r\n return this.quat_rotateQuat(rotationQuat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_lerp = function (to, interpolationValue, out = glMatrix.quat.create()) {\r\n if (interpolationValue <= 0) {\r\n out.quat_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.quat_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.quat.lerp(out, this, to, interpolationValue);\r\n out.quat_normalize(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_interpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.quat.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.quat_lerp(to, lerpValue, out);\r\n};\r\n\r\nArray.prototype.quat_slerp = function (to, interpolationValue, out = glMatrix.quat.create()) {\r\n if (interpolationValue <= 0) {\r\n out.quat_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.quat_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.quat.slerp(out, this, to, interpolationValue);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_sinterpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.quat.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.quat_slerp(to, lerpValue, out);\r\n};\r\n\r\n//QUAT 2\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.quat2_normalize = function (out = glMatrix.quat2.create()) {\r\n glMatrix.quat2.normalize(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_copy = function (quat2) {\r\n glMatrix.quat2.copy(this, quat2);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat2_identity = function () {\r\n glMatrix.quat2.identity(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat2_getPosition = function (out = glMatrix.vec3.create()) {\r\n glMatrix.quat2.getTranslation(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getRotation = function (out) {\r\n return this.quat2_getRotationDegrees(out);\r\n};\r\nArray.prototype.quat2_getRotationDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_getRotationDegrees(out = glMatrix.vec3.create()) {\r\n this.quat2_getRotationQuat(rotationQuat).quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getRotationRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_getRotationRadians(out = glMatrix.vec3.create()) {\r\n this.quat2_getRotationQuat(rotationQuat).quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getRotationQuat = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_setPositionRotation = function (position, rotation) {\r\n return this.quat2_setPositionRotationDegrees(position, rotation);\r\n};\r\n\r\nArray.prototype.quat2_setPositionRotationDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_setPositionRotationDegrees(position, rotation) {\r\n rotation.vec3_degreesToQuat(rotationQuat);\r\n glMatrix.quat2.fromRotationTranslation(this, rotationQuat, position);\r\n\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_setPositionRotationRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_setPositionRotationRadians(position, rotation) {\r\n rotation.vec3_radiansToQuat(rotationQuat);\r\n glMatrix.quat2.fromRotationTranslation(this, rotationQuat, position);\r\n\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_setPositionRotationQuat = function (position, rotation) {\r\n glMatrix.quat2.fromRotationTranslation(this, rotation, position);\r\n return this;\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.quat2_getAxes = function (out = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.quat2_getLeft(out[0]);\r\n this.quat2_getUp(out[1]);\r\n this.quat2_getForward(out[2]);\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getForward = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat2_getForward(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getBackward = function (out) {\r\n out = this.quat2_getForward(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getLeft = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat2_getLeft(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getRight = function (out) {\r\n out = this.quat2_getLeft(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getUp = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat2_getUp(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getDown = function (out) {\r\n out = this.quat2_getUp(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_toWorld = function (parentTransformQuat, out = glMatrix.quat2.create()) {\r\n glMatrix.quat2.mul(out, parentTransformQuat, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_toLocal = function () {\r\n let invertQuat = glMatrix.quat2.create();\r\n return function quat2_toLocal(parentTransformQuat, out = glMatrix.quat2.create()) {\r\n glMatrix.quat2.conjugate(invertQuat, parentTransformQuat);\r\n glMatrix.quat2.mul(out, invertQuat, this);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_toMatrix = function (out = glMatrix.mat4.create()) {\r\n glMatrix.mat4.fromQuat2(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_fromMatrix = function (transformMatrix) {\r\n transformMatrix.mat4_toQuat(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat2_lerp = function (to, interpolationValue, out = glMatrix.quat2.create()) {\r\n if (interpolationValue <= 0) {\r\n out.quat2_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.quat2_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.quat2.lerp(out, this, to, interpolationValue);\r\n out.quat2_normalize(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_interpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.quat2.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.quat2_lerp(to, lerpValue, out);\r\n};\r\n\r\n//MATRIX 3\r\n\r\n// glMatrix Bridge\r\n\r\n// New Functions\r\n\r\nArray.prototype.mat3_toDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat3_toDegrees(out = glMatrix.vec3.create()) {\r\n this.mat3_toQuat(quat);\r\n quat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat3_toRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat3_toRadians(out = glMatrix.vec3.create()) {\r\n this.mat3_toQuat(quat);\r\n quat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat3_toQuat = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.fromMat3(out, this);\r\n out.quat_normalize(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat3_fromAxes = function (leftAxis, upAxis, forwardAxis) {\r\n glMatrix.mat3.set(this,\r\n leftAxis[0], leftAxis[1], leftAxis[2],\r\n upAxis[0], upAxis[1], upAxis[2],\r\n forwardAxis[0], forwardAxis[1], forwardAxis[2]);\r\n return this;\r\n};\r\n\r\n//MATRIX 4\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.mat4_copy = function (mat4) {\r\n glMatrix.mat4.copy(this, mat4);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_identity = function () {\r\n glMatrix.mat4.identity(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_invert = function (out = glMatrix.mat4.create()) {\r\n glMatrix.mat4.invert(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_clone = function (out = glMatrix.mat4.create()) {\r\n glMatrix.mat4.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getPosition = function (out = glMatrix.vec3.create()) {\r\n glMatrix.mat4.getTranslation(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getRotation = function (out = glMatrix.vec3.create()) {\r\n return this.mat4_getRotationDegrees(out);\r\n};\r\n\r\nArray.prototype.mat4_getRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_getRotationDegrees(out = glMatrix.vec3.create()) {\r\n this.mat4_getRotationQuat(quat);\r\n quat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_getRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_getRotationRadians(out = glMatrix.vec3.create()) {\r\n this.mat4_getRotationQuat(quat);\r\n quat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_getRotationQuat = function () {\r\n let scale = glMatrix.vec3.create();\r\n let transformMatrixNoScale = glMatrix.mat4.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function mat4_getRotationQuat(out = glMatrix.quat.create()) {\r\n glMatrix.mat4.getScaling(scale, this);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(transformMatrixNoScale, this, inverseScale);\r\n glMatrix.mat4.getRotation(out, transformMatrixNoScale);\r\n glMatrix.quat.normalize(out, out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_getScale = function (out = glMatrix.vec3.create()) {\r\n glMatrix.mat4.getScaling(out, this);\r\n return out;\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.mat4_setPosition = function (position) {\r\n this[12] = position[0];\r\n this[13] = position[1];\r\n this[14] = position[2];\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setRotation = function (rotation) {\r\n this.mat4_setRotationDegrees(rotation);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_setRotationDegrees(rotation) {\r\n this.mat4_setRotationQuat(rotation.vec3_degreesToQuat(quat));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setRotationRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function mat4_setRotationRadians(rotation) {\r\n this.mat4_setRotationDegrees(rotation.vec3_toDegrees(vector));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setRotationQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n return function mat4_setRotationQuat(rotation) {\r\n this.mat4_getPosition(position);\r\n this.mat4_getScale(scale);\r\n this.mat4_setPositionRotationQuatScale(position, rotation, scale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setScale = function () {\r\n let tempScale = glMatrix.vec3.create();\r\n return function mat4_setScale(scale) {\r\n glMatrix.mat4.getScaling(tempScale, this);\r\n glMatrix.vec3.divide(tempScale, scale, tempScale);\r\n glMatrix.mat4.scale(this, this, tempScale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationScale = function (position, rotation, scale) {\r\n this.mat4_setPositionRotationDegreesScale(position, rotation, scale);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setPositionRotationDegreesScale = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_setPositionRotationDegreesScale(position, rotation, scale) {\r\n this.mat4_setPositionRotationQuatScale(position, rotation.vec3_degreesToQuat(quat), scale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationRadiansScale = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function mat4_setPositionRotationRadiansScale(position, rotation, scale) {\r\n this.mat4_setPositionRotationDegreesScale(position, rotation.vec3_toDegrees(vector), scale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationQuatScale = function (position, rotation, scale) {\r\n glMatrix.mat4.fromRotationTranslationScale(this, rotation, position, scale);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setPositionRotation = function (position, rotation) {\r\n this.mat4_setPositionRotationDegrees(position, rotation);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setPositionRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_setPositionRotationDegrees(position, rotation) {\r\n this.mat4_setPositionRotationQuat(position, rotation.vec3_degreesToQuat(quat));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function mat4_setPositionRotationRadians(position, rotation) {\r\n this.mat4_setPositionRotationDegrees(position, rotation.vec3_toDegrees(vector));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationQuat = function (position, rotation) {\r\n glMatrix.mat4.fromRotationTranslation(this, rotation, position);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_getAxes = function (out = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.mat4_getLeft(out[0]);\r\n this.mat4_getUp(out[1]);\r\n this.mat4_getForward(out[2]);\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getForward = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[8], this[9], this[10]);\r\n glMatrix.vec3.normalize(out, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getBackward = function (out) {\r\n out = this.mat4_getForward(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getLeft = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[0], this[1], this[2]);\r\n glMatrix.vec3.normalize(out, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getRight = function (out) {\r\n out = this.mat4_getLeft(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getUp = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[4], this[5], this[6]);\r\n glMatrix.vec3.normalize(out, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getDown = function (out) {\r\n out = this.mat4_getUp(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_toWorld = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function mat4_toWorld(parentTransformMatrix, out = glMatrix.mat4.create()) {\r\n if (parentTransformMatrix.mat4_hasUniformScale()) {\r\n glMatrix.mat4.mul(out, parentTransformMatrix, this);\r\n } else {\r\n glMatrix.vec3.set(position, this[12], this[13], this[14]);\r\n position.vec3_convertPositionToWorldMatrix(parentTransformMatrix, position);\r\n\r\n glMatrix.mat4.getScaling(scale, parentTransformMatrix);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, parentTransformMatrix, inverseScale);\r\n\r\n glMatrix.mat4.mul(out, convertTransform, this);\r\n glMatrix.mat4.scale(out, out, scale);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_toLocal = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function mat4_toLocal(parentTransformMatrix, out = glMatrix.mat4.create()) {\r\n if (parentTransformMatrix.mat4_hasUniformScale()) {\r\n glMatrix.mat4.invert(convertTransform, parentTransformMatrix);\r\n glMatrix.mat4.mul(out, convertTransform, this);\r\n } else {\r\n glMatrix.vec3.set(position, this[12], this[13], this[14]);\r\n position.vec3_convertPositionToLocalMatrix(parentTransformMatrix, position);\r\n\r\n glMatrix.mat4.getScaling(scale, parentTransformMatrix);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, parentTransformMatrix, inverseScale);\r\n\r\n glMatrix.mat4.invert(convertTransform, convertTransform);\r\n glMatrix.mat4.mul(out, convertTransform, this);\r\n glMatrix.mat4.scale(out, out, inverseScale);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_hasUniformScale = function () {\r\n let scale = glMatrix.vec3.create();\r\n return function mat4_hasUniformScale() {\r\n glMatrix.mat4.getScaling(scale, this);\r\n return Math.abs(scale[0] - scale[1]) < this._pp_epsilon && Math.abs(scale[1] - scale[2]) < this._pp_epsilon && Math.abs(scale[0] - scale[2]) < this._pp_epsilon;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_toQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n return function mat4_toQuat(out = glMatrix.quat2.create()) {\r\n glMatrix.mat4.getTranslation(position, this);\r\n this.mat4_getRotationQuat(rotation);\r\n glMatrix.quat2.fromRotationTranslation(out, rotation, position);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_fromQuat = function (transformQuat) {\r\n transformQuat.quat2_toMatrix(this);\r\n return this;\r\n};\r\n\r\n//CREATION\r\n\r\nPP.vec2_create = function (x = null, y = null) {\r\n let out = glMatrix.vec2.create();\r\n if (x != null) {\r\n out.vec2_set(x, y);\r\n }\r\n return out;\r\n};\r\n\r\nPP.vec3_create = function (x = null, y = null, z = null) {\r\n let out = glMatrix.vec3.create();\r\n if (x != null) {\r\n out.vec3_set(x, y, z);\r\n }\r\n return out;\r\n};\r\n\r\nPP.vec4_create = function (x = null, y = null, z = null, w = null) {\r\n let out = glMatrix.vec4.create();\r\n if (x != null) {\r\n out.vec4_set(x, y, z, w);\r\n }\r\n return out;\r\n};\r\n\r\nPP.quat_create = function (x = null, y = null, z = null, w = null) {\r\n let out = glMatrix.quat.create();\r\n if (x != null) {\r\n out.quat_set(x, y, z, w);\r\n }\r\n return out;\r\n};\r\n\r\nPP.quat2_create = function () {\r\n let out = glMatrix.quat2.create();\r\n return out;\r\n};\r\n\r\nPP.quat2_fromPositionRotation = function (position, rotation) {\r\n return quat2_fromPositionRotationDegrees(position, rotation);\r\n};\r\n\r\nPP.quat2_fromPositionRotationDegrees = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.quat2_setPositionRotationDegrees(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.quat2_fromPositionRotationRadians = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.quat2_setPositionRotationRadians(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.quat2_fromPositionRotationQuat = function (position, rotation) {\r\n let out = glMatrix.quat2.create();\r\n out.quat2_setPositionRotationQuat(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_create = function () {\r\n let out = glMatrix.mat4.create();\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotation = function (position, rotation) {\r\n return mat4_fromPositionRotationDegrees(position, rotation);\r\n};\r\n\r\nPP.mat4_fromPositionRotationDegrees = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationDegrees(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationRadians = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationRadians(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationQuat = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationQuat(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationScale = function (position, rotation, scale) {\r\n return mat4_fromPositionRotationDegreesScale(position, rotation, scale);\r\n};\r\n\r\nPP.mat4_fromPositionRotationDegreesScale = function (position, rotation, scale) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationDegreesScale(position, rotation, scale);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationRadiansScale = function (position, rotation, scale) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationRadiansScale(position, rotation, scale);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationQuatScale = function (position, rotation, scale) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationQuatScale(position, rotation, scale);\r\n return out;\r\n};\r\n\r\n//UTILS\r\n\r\nArray.prototype._pp_epsilon = 0.000001;\r\nArray.prototype._pp_degreesEpsilon = 0.00001;\r\n\r\nArray.prototype._pp_clamp = function (value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n};\r\n\r\nArray.prototype._vec_buildConsoleMessage = function (decimalPlaces) {\r\n let message = \"[\";\r\n\r\n for (let i = 0; i < this.length; i++) {\r\n if (i != 0) {\r\n message = message.concat(\", \");\r\n }\r\n\r\n message = message.concat(this[i].toFixed(decimalPlaces));\r\n }\r\n\r\n message = message.concat(\"]\");\r\n return message;\r\n};\r\n\r\nArray.prototype._vec_prepareOut = function (out) {\r\n if (out == null) {\r\n out = this.pp_clone();\r\n } else if (out != this) {\r\n out.pp_copy(this);\r\n }\r\n\r\n return out;\r\n};\r\n\r\n\r\nArray.prototype._quat_setAxes = function () {\r\n let fixedAxes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()];\r\n\r\n let fixedAxesFixSignMap = [\r\n [1, -1, 1],\r\n [1, 1, -1],\r\n [-1, 1, -1]\r\n ];\r\n\r\n let fixedLeft = glMatrix.vec3.create();\r\n let fixedUp = glMatrix.vec3.create();\r\n let fixedForward = glMatrix.vec3.create();\r\n\r\n let currentAxis = glMatrix.vec3.create();\r\n\r\n let rotationAxis = glMatrix.vec3.create();\r\n let rotationMat = glMatrix.mat3.create();\r\n let rotationQuat = glMatrix.quat.create();\r\n return function _quat_setAxes(axes, priority) {\r\n let firstAxis = axes[priority[0]];\r\n let secondAxis = axes[priority[1]];\r\n let thirdAxis = axes[priority[2]];\r\n\r\n if (firstAxis == null) {\r\n return this;\r\n }\r\n\r\n let secondAxisValid = false;\r\n if (secondAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, secondAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n secondAxisValid = true;\r\n }\r\n }\r\n\r\n let thirdAxisValid = false;\r\n if (thirdAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, thirdAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n thirdAxisValid = true;\r\n }\r\n }\r\n\r\n if (secondAxisValid || thirdAxisValid) {\r\n\r\n let crossAxis = null;\r\n let secondAxisIndex = null;\r\n let thirdAxisIndex = null;\r\n if (secondAxisValid) {\r\n crossAxis = secondAxis;\r\n secondAxisIndex = 1;\r\n thirdAxisIndex = 2;\r\n } else {\r\n crossAxis = thirdAxis;\r\n secondAxisIndex = 2;\r\n thirdAxisIndex = 1;\r\n }\r\n\r\n let fixSignMap = fixedAxesFixSignMap[priority[0]];\r\n\r\n glMatrix.vec3.cross(fixedAxes[thirdAxisIndex], firstAxis, crossAxis);\r\n glMatrix.vec3.scale(fixedAxes[thirdAxisIndex], fixedAxes[thirdAxisIndex], fixSignMap[priority[thirdAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[secondAxisIndex], firstAxis, fixedAxes[thirdAxisIndex]);\r\n glMatrix.vec3.scale(fixedAxes[secondAxisIndex], fixedAxes[secondAxisIndex], fixSignMap[priority[secondAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[0], fixedAxes[1], fixedAxes[2]);\r\n glMatrix.vec3.scale(fixedAxes[0], fixedAxes[0], fixSignMap[priority[0]]);\r\n\r\n glMatrix.vec3.normalize(fixedLeft, fixedAxes[priority.pp_findIndexEqual(0)]);\r\n glMatrix.vec3.normalize(fixedUp, fixedAxes[priority.pp_findIndexEqual(1)]);\r\n glMatrix.vec3.normalize(fixedForward, fixedAxes[priority.pp_findIndexEqual(2)]);\r\n\r\n glMatrix.mat3.set(rotationMat,\r\n fixedLeft[0], fixedLeft[1], fixedLeft[2],\r\n fixedUp[0], fixedUp[1], fixedUp[2],\r\n fixedForward[0], fixedForward[1], fixedForward[2]\r\n );\r\n\r\n glMatrix.quat.fromMat3(rotationQuat, rotationMat);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n\r\n this.quat_copy(rotationQuat);\r\n } else {\r\n if (priority[0] == 0) {\r\n this.quat_getLeft(currentAxis);\r\n } else if (priority[0] == 1) {\r\n this.quat_getUp(currentAxis);\r\n } else {\r\n this.quat_getForward(currentAxis);\r\n }\r\n\r\n let angle = glMatrix.vec3.angle(firstAxis, currentAxis);\r\n if (angle != 0) {\r\n glMatrix.vec3.cross(rotationAxis, currentAxis, firstAxis);\r\n glMatrix.vec3.normalize(rotationAxis, rotationAxis);\r\n glMatrix.quat.setAxisAngle(rotationQuat, rotationAxis, angle);\r\n\r\n this.quat_rotateQuat(rotationQuat, this);\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n}();\r\n\r\n\r\n\r\n\r\nfor (let key in Array.prototype) {\r\n let prefixes = [\"pp_\", \"vec_\", \"vec2_\", \"vec3_\", \"vec4_\", \"quat_\", \"quat2_\", \"mat3_\", \"mat4_\", \"_pp_\", \"_vec_\", \"_quat_\",];\r\n\r\n let found = false;\r\n for (let prefix of prefixes) {\r\n if (key.startsWith(prefix)) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n Object.defineProperty(Array.prototype, key, { enumerable: false });\r\n\r\n Uint8ClampedArray.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint8ClampedArray.prototype, key, { enumerable: false });\r\n\r\n Uint8ClampedArray.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint8ClampedArray.prototype, key, { enumerable: false });\r\n\r\n Uint8Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint8Array.prototype, key, { enumerable: false });\r\n\r\n Uint16Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint16Array.prototype, key, { enumerable: false });\r\n\r\n Uint32Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint32Array.prototype, key, { enumerable: false });\r\n\r\n Int8Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Int8Array.prototype, key, { enumerable: false });\r\n\r\n Int16Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Int16Array.prototype, key, { enumerable: false });\r\n\r\n Int32Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Int32Array.prototype, key, { enumerable: false });\r\n\r\n Float32Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Float32Array.prototype, key, { enumerable: false });\r\n\r\n Float64Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Float64Array.prototype, key, { enumerable: false });\r\n }\r\n}", "/*\r\n How to use\r\n\r\n By default the functions work on World space, rotations are in Degrees and transforms are Matrix (and not Quat 2) \r\n For functions that work with rotations, Matrix means Matrix 3 and Quat means Quat\r\n For functions that work with transforms, Matrix means Matrix 4 and Quat means Quat 2\r\n\r\n You can add a suffix like World/Local/Object at the end of some functions to specify the space, example:\r\n - pp_getPositionLocal to get the position in local space (parent space)\r\n - pp_translateObject to translate in object space\r\n\r\n For rotations u can add a suffix like Degrees/Radians/Quat/Matrix to use a specific version, example:\r\n - pp_getRotationDegrees\r\n - pp_setRotationLocalMatrix\r\n - pp_rotateWorldQuat\r\n \r\n For transform u can add a suffix like Quat/Matrix to use a specific version, example:\r\n - pp_getTransformQuat\r\n - pp_setTransformWorldMatrix\r\n \r\n Some functions let you specify if u want them to work on the Hierarchy/Descendants/Children where:\r\n - Children: direct children of the object\r\n - Descendants: all the children of the object, including child of child and so on \r\n - Hierarchy: Descendants plus the current object\r\n By default the functions work on the current object alone:\r\n - pp_getComponent\r\n - pp_getComponentHierarchy\r\n - pp_getComponentAmountMapDescendants\r\n - pp_setActiveChildren\r\n\r\n The functions leave u the choice of forwarding an out parameter or just get the return value, example:\r\n - let position = this.object.pp_getPosition()\r\n - this.object.pp_getPosition(position)\r\n - the out parameter is always the last one\r\n\r\n List of functions:\r\n Notes:\r\n - The suffixes (like World or Radians) are omitted \r\n\r\n - pp_getPosition / pp_setPosition / pp_resetPosition\r\n - pp_getRotation / pp_setRotation / pp_resetRotation\r\n - pp_getScale / pp_setScale (u can specify a single number instead of a vector to uniform scale easily) / pp_resetScale \r\n - pp_getTransform / pp_setTransform / pp_resetTransform\r\n\r\n - pp_getAxes / pp_setAxes\r\n - pp_getLeft / pp_getRight / pp_setLeft / pp_setRight\r\n - pp_getUp / pp_getDown / pp_setUp / pp_setDown\r\n - pp_getForward / pp_getBackward / pp_setForward / pp_setBackward\r\n\r\n - pp_translate / pp_translateAxis\r\n - pp_rotate / pp_rotateAxis / pp_rotateAround / pp_rotateAroundAxis\r\n - pp_scaleObject (for now scale only have this variant) (u can specify a single number instead of a vector to uniform scale easily)\r\n\r\n - pp_lookAt / pp_lookTo (u can avoid to specify up and the function will pickup the object up by default)\r\n\r\n - pp_getParent / pp_setParent (let u specify if u want to keep the transform or not)\r\n\r\n - pp_convertPositionObjectToWorld (you can use all the combinations between Object/Local/World)\r\n - pp_convertDirectionObjectToWorld (you can use all the combinations between Object/Local/World)\r\n - pp_convertTransformObjectToWorld (you can use all the combinations between Object/Local/World) (u also have Quat and Matrix version)\r\n\r\n - pp_hasUniformScale\r\n\r\n - pp_addComponent / pp_getComponent / pp_getComponentHierarchy / pp_getComponentDescendants / pp_getComponentChildren\r\n - pp_getComponents / pp_getComponentsHierarchy / pp_getComponentsDescendants / pp_getComponentsChildren\r\n\r\n - pp_setActive / pp_setActiveSelf / pp_setActiveHierarchy / pp_setActiveDescendants / pp_setActiveChildren\r\n\r\n - pp_clone / pp_isCloneable\r\n \r\n - pp_toString / pp_toStringCompact / pp_toStringExtended\r\n\r\n - pp_addObject\r\n - pp_getName / pp_setName\r\n - pp_getID\r\n - pp_getHierarchy / pp_getDescendants / pp_getChildren\r\n - pp_reserveObjects / pp_reserveObjectsHierarchy / pp_reserveObjectsDescendants / pp_reserveObjectsChildren\r\n - pp_getComponentAmountMap / pp_getComponentAmountMapHierarchy / pp_getComponentAmountMapDescendants / pp_getComponentAmountMapChildren\r\n - pp_markDirty\r\n - pp_equals\r\n - pp_destroy\r\n*/\r\n\r\nimport * as glMatrix from 'gl-matrix';\r\n\r\nif (WL && WL.Object) {\r\n\r\n //GETTER\r\n\r\n //Position\r\n\r\n WL.Object.prototype.pp_getPosition = function (position) {\r\n return this.pp_getPositionWorld(position);\r\n };\r\n\r\n WL.Object.prototype.pp_getPositionWorld = function (position = glMatrix.vec3.create()) {\r\n this.getTranslationWorld(position);\r\n return position;\r\n };\r\n\r\n WL.Object.prototype.pp_getPositionLocal = function (position = glMatrix.vec3.create()) {\r\n this.getTranslationLocal(position);\r\n return position;\r\n };\r\n\r\n //Rotation\r\n\r\n WL.Object.prototype.pp_getRotation = function (rotation) {\r\n return this.pp_getRotationWorld(rotation);\r\n };\r\n WL.Object.prototype.pp_getRotationDegrees = function (rotation) {\r\n return this.pp_getRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationRadians = function (rotation) {\r\n return this.pp_getRotationWorldRadians(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationMatrix = function (rotation) {\r\n return this.pp_getRotationWorldMatrix(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationQuat = function (rotation) {\r\n return this.pp_getRotationWorldQuat(rotation);\r\n };\r\n\r\n //Rotation World\r\n\r\n WL.Object.prototype.pp_getRotationWorld = function (rotation) {\r\n return this.pp_getRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationWorldDegrees = function (rotation) {\r\n rotation = this.pp_getRotationWorldRadians(rotation);\r\n rotation.forEach(function (value, index, array) {\r\n array[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n return rotation;\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationWorldRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationWorldRadians(rotation = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldQuat(quat);\r\n this._pp_quaternionToRadians(quat, rotation);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationWorldMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationWorldMatrix(rotation = glMatrix.mat3.create()) {\r\n this.pp_getRotationWorldQuat(quat);\r\n glMatrix.mat3.fromQuat(rotation, quat);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationWorldQuat = function (rotation = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(rotation, this.rotationWorld);\r\n return rotation;\r\n };\r\n\r\n //Rotation Local\r\n\r\n WL.Object.prototype.pp_getRotationLocal = function (rotation) {\r\n return this.pp_getRotationLocalDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationLocalDegrees = function (rotation) {\r\n rotation = this.pp_getRotationLocalRadians(rotation);\r\n rotation.forEach(function (value, index, array) {\r\n array[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n return rotation;\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationLocalRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationLocalRadians(rotation = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalQuat(quat);\r\n this._pp_quaternionToRadians(quat, rotation);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationLocalMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationLocalMatrix(rotation = glMatrix.mat3.create()) {\r\n this.pp_getRotationLocalQuat(quat);\r\n glMatrix.mat3.fromQuat(rotation, quat);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationLocalQuat = function (rotation = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(rotation, this.rotationLocal);\r\n return rotation;\r\n };\r\n\r\n //Scale\r\n\r\n WL.Object.prototype.pp_getScale = function (scale) {\r\n return this.pp_getScaleWorld(scale);\r\n };\r\n\r\n WL.Object.prototype.pp_getScaleWorld = function (scale = glMatrix.vec3.create()) {\r\n glMatrix.vec3.copy(scale, this.scalingWorld);\r\n return scale;\r\n };\r\n\r\n WL.Object.prototype.pp_getScaleLocal = function (scale = glMatrix.vec3.create()) {\r\n glMatrix.vec3.copy(scale, this.scalingLocal);\r\n return scale;\r\n };\r\n\r\n //Transform\r\n\r\n WL.Object.prototype.pp_getTransform = function (transform) {\r\n return this.pp_getTransformWorld(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformMatrix = function (transform) {\r\n return this.pp_getTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformQuat = function (transform) {\r\n return this.pp_getTransformWorldQuat(transform);\r\n };\r\n\r\n //Transform World\r\n\r\n WL.Object.prototype.pp_getTransformWorld = function (transform) {\r\n return this.pp_getTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformWorldMatrix = function () {\r\n let transformQuat = glMatrix.quat2.create();\r\n let scale = glMatrix.vec3.create();\r\n return function pp_getTransformWorldMatrix(transform = glMatrix.mat4.create()) {\r\n this.pp_getTransformWorldQuat(transformQuat);\r\n this.pp_getScaleWorld(scale);\r\n glMatrix.mat4.fromQuat2(transform, transformQuat);\r\n glMatrix.mat4.scale(transform, transform, scale);\r\n return transform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getTransformWorldQuat = function (transform = glMatrix.quat2.create()) {\r\n glMatrix.quat2.copy(transform, this.transformWorld);\r\n return transform;\r\n };\r\n\r\n //Transform Local\r\n\r\n WL.Object.prototype.pp_getTransformLocal = function (transform) {\r\n return this.pp_getTransformLocalMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformLocalMatrix = function () {\r\n let transformQuat = glMatrix.quat2.create();\r\n let scale = glMatrix.vec3.create();\r\n return function pp_getTransformLocal(transform = glMatrix.mat4.create()) {\r\n this.pp_getTransformLocalQuat(transformQuat);\r\n this.pp_getScaleLocal(scale);\r\n glMatrix.mat4.fromQuat2(transform, transformQuat);\r\n glMatrix.mat4.scale(transform, transform, scale);\r\n return transform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getTransformLocalQuat = function (transform = glMatrix.quat2.create()) {\r\n glMatrix.quat2.copy(transform, this.transformLocal);\r\n return transform;\r\n };\r\n\r\n //Axes\r\n\r\n WL.Object.prototype.pp_getAxes = function (axes) {\r\n return this.pp_getAxesWorld(axes);\r\n };\r\n\r\n WL.Object.prototype.pp_getAxesWorld = function (axes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.pp_getLeftWorld(axes[0]);\r\n this.pp_getUpWorld(axes[1]);\r\n this.pp_getForwardWorld(axes[2]);\r\n return axes;\r\n };\r\n\r\n WL.Object.prototype.pp_getAxesLocal = function (axes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.pp_getLeftLocal(axes[0]);\r\n this.pp_getUpLocal(axes[1]);\r\n this.pp_getForwardLocal(axes[2]);\r\n return axes;\r\n };\r\n\r\n //Forward\r\n\r\n WL.Object.prototype.pp_getForward = function (forward) {\r\n return this.pp_getForwardWorld(forward);\r\n };\r\n\r\n WL.Object.prototype.pp_getForwardWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getForwardWorld(forward = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n forward[0] = rotation[6];\r\n forward[1] = rotation[7];\r\n forward[2] = rotation[8];\r\n return forward;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getForwardLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getForwardLocal(forward = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n forward[0] = rotation[6];\r\n forward[1] = rotation[7];\r\n forward[2] = rotation[8];\r\n return forward;\r\n };\r\n }();\r\n\r\n //Backward\r\n\r\n WL.Object.prototype.pp_getBackward = function (backward) {\r\n return this.pp_getBackwardWorld(backward);\r\n };\r\n\r\n WL.Object.prototype.pp_getBackwardWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getBackwardWorld(backward = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n backward[0] = -rotation[6];\r\n backward[1] = -rotation[7];\r\n backward[2] = -rotation[8];\r\n return backward;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getBackwardLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getBackwardLocal(backward = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n backward[0] = -rotation[6];\r\n backward[1] = -rotation[7];\r\n backward[2] = -rotation[8];\r\n return backward;\r\n };\r\n }();\r\n\r\n //Up\r\n\r\n WL.Object.prototype.pp_getUp = function (up) {\r\n return this.pp_getUpWorld(up);\r\n };\r\n\r\n WL.Object.prototype.pp_getUpWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getUpWorld(up = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n up[0] = rotation[3];\r\n up[1] = rotation[4];\r\n up[2] = rotation[5];\r\n return up;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getUpLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getUpLocal(up = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n up[0] = rotation[3];\r\n up[1] = rotation[4];\r\n up[2] = rotation[5];\r\n return up;\r\n };\r\n }();\r\n\r\n //Down\r\n\r\n WL.Object.prototype.pp_getDown = function (down) {\r\n return this.pp_getDownWorld(down);\r\n };\r\n\r\n WL.Object.prototype.pp_getDownWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getDownWorld(down = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n down[0] = -rotation[3];\r\n down[1] = -rotation[4];\r\n down[2] = -rotation[5];\r\n return down;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getDownLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getDownLocal(down = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n down[0] = -rotation[3];\r\n down[1] = -rotation[4];\r\n down[2] = -rotation[5];\r\n return down;\r\n };\r\n }();\r\n\r\n //Left\r\n\r\n WL.Object.prototype.pp_getLeft = function (left) {\r\n return this.pp_getLeftWorld(left);\r\n };\r\n\r\n WL.Object.prototype.pp_getLeftWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getLeftWorld(left = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n left[0] = rotation[0];\r\n left[1] = rotation[1];\r\n left[2] = rotation[2];\r\n return left;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getLeftLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getLeftLocal(left = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n left[0] = rotation[0];\r\n left[1] = rotation[1];\r\n left[2] = rotation[2];\r\n return left;\r\n };\r\n }();\r\n\r\n //Right\r\n\r\n WL.Object.prototype.pp_getRight = function (right) {\r\n return this.pp_getRightWorld(right);\r\n };\r\n\r\n WL.Object.prototype.pp_getRightWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getRightWorld(right = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n right[0] = -rotation[0];\r\n right[1] = -rotation[1];\r\n right[2] = -rotation[2];\r\n return right;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRightLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getRightLocal(right = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n right[0] = -rotation[0];\r\n right[1] = -rotation[1];\r\n right[2] = -rotation[2];\r\n return right;\r\n };\r\n }();\r\n\r\n //SETTER\r\n\r\n //Position\r\n\r\n WL.Object.prototype.pp_setPosition = function (position) {\r\n this.pp_setPositionWorld(position);\r\n };\r\n\r\n WL.Object.prototype.pp_setPositionWorld = function (position) {\r\n this.setTranslationWorld(position);\r\n };\r\n\r\n WL.Object.prototype.pp_setPositionLocal = function (position) {\r\n this.setTranslationLocal(position);\r\n };\r\n\r\n //Rotation\r\n\r\n WL.Object.prototype.pp_setRotation = function (rotation) {\r\n this.pp_setRotationWorld(rotation);\r\n };\r\n WL.Object.prototype.pp_setRotationDegrees = function (rotation) {\r\n this.pp_setRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationRadians = function (rotation) {\r\n this.pp_setRotationWorldRadians(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationMatrix = function (rotation) {\r\n this.pp_setRotationWorldMatrix(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationQuat = function (rotation) {\r\n this.pp_setRotationWorldQuat(rotation);\r\n };\r\n\r\n //Rotation World\r\n\r\n WL.Object.prototype.pp_setRotationWorld = function (rotation) {\r\n this.pp_setRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationWorldDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationWorldDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, quat);\r\n this.pp_setRotationWorldQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationWorldRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_setRotationWorldRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_setRotationWorldDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationWorldMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationWorldMatrix(rotation) {\r\n glMatrix.quat.fromMat3(quat, rotation);\r\n this.pp_setRotationWorldQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationWorldQuat = function (rotation) {\r\n this.rotationWorld = rotation;\r\n };\r\n\r\n //Rotation Local\r\n\r\n WL.Object.prototype.pp_setRotationLocal = function (rotation) {\r\n this.pp_setRotationLocalDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationLocalDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationLocalDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, quat);\r\n this.pp_setRotationLocalQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationLocalRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_setRotationLocalRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_setRotationLocalDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationLocalMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationLocalMatrix(rotation) {\r\n glMatrix.quat.fromMat3(quat, rotation);\r\n this.pp_setRotationLocalQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationLocalQuat = function (rotation) {\r\n this.rotationLocal = rotation;\r\n };\r\n\r\n //Scale\r\n\r\n WL.Object.prototype.pp_setScale = function (scale) {\r\n this.pp_setScaleWorld(scale);\r\n };\r\n\r\n WL.Object.prototype.pp_setScaleWorld = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function pp_setScaleWorld(scale) {\r\n if (isNaN(scale)) {\r\n this.scalingWorld = scale;\r\n } else {\r\n glMatrix.vec3.set(vector, scale, scale, scale);\r\n this.scalingWorld = vector;\r\n }\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setScaleLocal = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function pp_setScaleLocal(scale) {\r\n if (isNaN(scale)) {\r\n this.scalingLocal = scale;\r\n } else {\r\n glMatrix.vec3.set(vector, scale, scale, scale);\r\n this.scalingLocal = vector;\r\n }\r\n };\r\n }();\r\n\r\n //Axes \r\n\r\n WL.Object.prototype.pp_setAxes = function (left, up, forward) {\r\n this.pp_setAxesWorld(left, up, forward);\r\n };\r\n\r\n WL.Object.prototype.pp_setAxesWorld = function (left, up, forward) {\r\n if (forward != null) {\r\n this.pp_setForwardWorld(forward, up, left);\r\n } else if (up != null) {\r\n this.pp_setUpWorld(up, forward, left);\r\n } else {\r\n this.pp_setLeftWorld(left, up, forward);\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_setAxesLocal = function (left, up, forward) {\r\n if (forward != null) {\r\n this.pp_setForwardLocal(forward, up, left);\r\n } else if (up != null) {\r\n this.pp_setUpLocal(up, forward, left);\r\n } else {\r\n this.pp_setLeftLocal(left, up, forward);\r\n }\r\n };\r\n\r\n //Forward\r\n\r\n WL.Object.prototype.pp_setForward = function (forward, up, left) {\r\n this.pp_setForwardWorld(forward, up, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setForwardWorld = function (forward, up = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], false);\r\n };\r\n\r\n WL.Object.prototype.pp_setForwardLocal = function (forward, up = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], true);\r\n };\r\n\r\n //Backward\r\n\r\n WL.Object.prototype.pp_setBackward = function (backward, up, left) {\r\n this.pp_setBackwardWorld(backward, up, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setBackwardWorld = function () {\r\n let forward = glMatrix.vec3.create();\r\n return function pp_setBackwardWorld(backward, up = null, left = null) {\r\n glMatrix.vec3.negate(forward, backward);\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], false);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setBackwardLocal = function () {\r\n let forward = glMatrix.vec3.create();\r\n return function pp_setBackwardLocal(backward, up = null, left = null) {\r\n glMatrix.vec3.negate(forward, backward);\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], true);\r\n };\r\n }();\r\n\r\n //Up\r\n\r\n WL.Object.prototype.pp_setUp = function (up, forward, left) {\r\n this.pp_setUpWorld(up, forward, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setUpWorld = function (up, forward = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], false);\r\n };\r\n\r\n WL.Object.prototype.pp_setUpLocal = function (up, forward = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], true);\r\n };\r\n\r\n //Down\r\n\r\n WL.Object.prototype.pp_setDown = function (down, forward, left) {\r\n this.pp_setDownWorld(down, forward, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setDownWorld = function () {\r\n let up = glMatrix.vec3.create();\r\n return function pp_setDownWorld(down, forward = null, left = null) {\r\n glMatrix.vec3.negate(up, down);\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], false);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setDownLocal = function () {\r\n let up = glMatrix.vec3.create();\r\n return function pp_setDownLocal(down, forward = null, left = null) {\r\n glMatrix.vec3.negate(up, down);\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], true);\r\n };\r\n }();\r\n\r\n //Left\r\n\r\n WL.Object.prototype.pp_setLeft = function (left, up, forward) {\r\n this.pp_setLeftWorld(left, up, forward);\r\n };\r\n\r\n WL.Object.prototype.pp_setLeftWorld = function (left, up = null, forward = null) {\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], false);\r\n };\r\n\r\n WL.Object.prototype.pp_setLeftLocal = function (left, up = null, forward = null) {\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], true);\r\n };\r\n\r\n //Right\r\n\r\n WL.Object.prototype.pp_setRight = function (right, up, forward) {\r\n this.pp_setRightWorld(right, up, forward);\r\n };\r\n\r\n WL.Object.prototype.pp_setRightWorld = function () {\r\n let left = glMatrix.vec3.create();\r\n return function pp_setRightWorld(right, up = null, forward = null) {\r\n glMatrix.vec3.negate(left, right);\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], false);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRightLocal = function () {\r\n let left = glMatrix.vec3.create();\r\n return function pp_setRightLocal(right, up = null, forward = null) {\r\n glMatrix.vec3.negate(left, right);\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], true);\r\n };\r\n }();\r\n\r\n //Transform\r\n\r\n WL.Object.prototype.pp_setTransform = function (transform) {\r\n this.pp_setTransformWorld(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformMatrix = function (transform) {\r\n this.pp_setTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformQuat = function (transform) {\r\n this.pp_setTransformWorldQuat(transform);\r\n };\r\n\r\n //Transform World\r\n\r\n WL.Object.prototype.pp_setTransformWorld = function (transform) {\r\n return this.pp_setTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformWorldMatrix = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let scale = glMatrix.vec3.create();\r\n let transformMatrixNoScale = glMatrix.mat4.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_setTransformWorldMatrix(transform) {\r\n glMatrix.mat4.getTranslation(position, transform);\r\n glMatrix.mat4.getScaling(scale, transform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(transformMatrixNoScale, transform, inverseScale);\r\n glMatrix.mat4.getRotation(rotation, transformMatrixNoScale);\r\n glMatrix.quat.normalize(rotation, rotation);\r\n this.pp_setScaleWorld(scale);\r\n this.pp_setRotationWorldQuat(rotation);\r\n this.pp_setPositionWorld(position);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setTransformWorldQuat = function (transform) {\r\n this.transformWorld = transform;\r\n };\r\n\r\n //Transform Local\r\n\r\n WL.Object.prototype.pp_setTransformLocal = function (transform) {\r\n return this.pp_setTransformLocalMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformLocalMatrix = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let scale = glMatrix.vec3.create();\r\n let transformMatrixNoScale = glMatrix.mat4.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_setTransformLocalMatrix(transform) {\r\n glMatrix.mat4.getTranslation(position, transform);\r\n glMatrix.mat4.getScaling(scale, transform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(transformMatrixNoScale, transform, inverseScale);\r\n glMatrix.mat4.getRotation(rotation, transformMatrixNoScale);\r\n glMatrix.quat.normalize(rotation, rotation);\r\n this.pp_setScaleLocal(scale);\r\n this.pp_setRotationLocalQuat(rotation);\r\n this.pp_setPositionLocal(position);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setTransformLocalQuat = function (transform) {\r\n this.transformLocal = transform;\r\n };\r\n\r\n //RESET\r\n\r\n //Position\r\n\r\n WL.Object.prototype.pp_resetPosition = function () {\r\n this.pp_resetPositionWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetPositionWorld = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function pp_resetPositionWorld() {\r\n this.pp_setPositionWorld(zero);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_resetPositionLocal = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function pp_resetPositionLocal() {\r\n this.pp_setPositionLocal(zero);\r\n };\r\n }();\r\n\r\n //Rotation\r\n\r\n WL.Object.prototype.pp_resetRotation = function () {\r\n this.pp_resetRotationWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetRotationWorld = function () {\r\n let identity = glMatrix.quat.create();\r\n return function pp_resetRotationWorld() {\r\n this.pp_setRotationWorldQuat(identity);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_resetRotationLocal = function () {\r\n let identity = glMatrix.quat.create();\r\n return function pp_resetRotationLocal() {\r\n this.pp_setRotationLocalQuat(identity);\r\n };\r\n }();\r\n\r\n //Scale\r\n\r\n WL.Object.prototype.pp_resetScale = function () {\r\n this.pp_resetScaleWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetScaleWorld = function () {\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_resetScaleWorld() {\r\n this.pp_setScaleWorld(one);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_resetScaleLocal = function () {\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_resetScaleLocal() {\r\n this.pp_setScaleLocal(one);\r\n };\r\n }();\r\n\r\n //Transform\r\n\r\n WL.Object.prototype.pp_resetTransform = function () {\r\n this.pp_resetTransformWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetTransformWorld = function () {\r\n this.pp_resetScaleWorld();\r\n this.pp_resetRotationWorld();\r\n this.pp_resetPositionWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetTransformLocal = function () {\r\n this.pp_resetScaleLocal();\r\n this.pp_resetRotationLocal();\r\n this.pp_resetPositionLocal();\r\n };\r\n\r\n //TRANSFORMATIONS\r\n\r\n //Translate\r\n\r\n WL.Object.prototype.pp_translate = function (translation) {\r\n this.pp_translateWorld(translation);\r\n };\r\n\r\n WL.Object.prototype.pp_translateWorld = function (translation) {\r\n this.translateWorld(translation);\r\n };\r\n\r\n WL.Object.prototype.pp_translateLocal = function (translation) {\r\n this.translate(translation);\r\n };\r\n\r\n WL.Object.prototype.pp_translateObject = function (translation) {\r\n this.translateObject(translation);\r\n };\r\n\r\n //Translate Axis\r\n\r\n WL.Object.prototype.pp_translateAxis = function (amount, direction) {\r\n this.pp_translateAxisWorld(amount, direction);\r\n };\r\n\r\n WL.Object.prototype.pp_translateAxisWorld = function () {\r\n let translation = glMatrix.vec3.create();\r\n return function pp_translateAxisWorld(amount, direction) {\r\n glMatrix.vec3.scale(translation, direction, amount);\r\n this.pp_translateWorld(translation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_translateAxisLocal = function () {\r\n let translation = glMatrix.vec3.create();\r\n return function pp_translateAxisLocal(amount, direction) {\r\n glMatrix.vec3.scale(translation, direction, amount);\r\n this.pp_translateLocal(translation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_translateAxisObject = function () {\r\n let translation = glMatrix.vec3.create();\r\n return function pp_translateAxisObject(amount, direction) {\r\n glMatrix.vec3.scale(translation, direction, amount);\r\n this.pp_translateObject(translation);\r\n };\r\n }();\r\n\r\n //Rotate\r\n\r\n WL.Object.prototype.pp_rotate = function (rotation) {\r\n this.pp_rotateWorld(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateDegrees = function (rotation) {\r\n this.pp_rotateWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateRadians = function (rotation) {\r\n this.pp_rotateWorldRadians(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateMatrix = function (rotation) {\r\n this.pp_rotateWorldMatrix(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateQuat = function (rotation) {\r\n this.pp_rotateWorldQuat(rotation);\r\n };\r\n\r\n //Rotate World\r\n\r\n WL.Object.prototype.pp_rotateWorld = function (rotation) {\r\n this.pp_rotateWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateWorldDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateWorldDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateWorldQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateWorldRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateWorldRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateWorldDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateWorldMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateWorldMatrix(rotation) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateWorldQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateWorldQuat = function () {\r\n let currentRotationQuat = glMatrix.quat.create();\r\n return function pp_rotateWorldQuat(rotation) {\r\n this.pp_getRotationWorldQuat(currentRotationQuat);\r\n glMatrix.quat.mul(currentRotationQuat, rotation, currentRotationQuat);\r\n glMatrix.quat.normalize(currentRotationQuat, currentRotationQuat);\r\n this.pp_setRotationWorldQuat(currentRotationQuat);\r\n };\r\n }();\r\n\r\n //Rotate Local\r\n\r\n WL.Object.prototype.pp_rotateLocal = function (rotation) {\r\n this.pp_rotateLocalDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateLocalDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateLocalDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateLocalQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateLocalRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateLocalRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateLocalDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateLocalMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateLocalMatrix(rotation) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateLocalQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateLocalQuat = function () {\r\n let currentRotationQuat = glMatrix.quat.create();\r\n return function pp_rotateLocalQuat(rotation) {\r\n this.pp_getRotationLocalQuat(currentRotationQuat);\r\n glMatrix.quat.mul(currentRotationQuat, rotation, currentRotationQuat);\r\n glMatrix.quat.normalize(currentRotationQuat, currentRotationQuat);\r\n this.pp_setRotationLocalQuat(currentRotationQuat);\r\n };\r\n }();\r\n\r\n //Rotate Object\r\n\r\n WL.Object.prototype.pp_rotateObject = function (rotation) {\r\n this.pp_rotateObjectDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateObjectDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateObjectDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateObjectQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateObjectRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateObjectRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateObjectDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateObjectMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateObjectMatrix(rotation) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateObjectQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateObjectQuat = function (rotation) {\r\n this.rotateObject(rotation);\r\n };\r\n\r\n //Rotate Axis\r\n\r\n WL.Object.prototype.pp_rotateAxis = function (angle, axis) {\r\n this.pp_rotateAxisWorld(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisDegrees = function (angle, axis) {\r\n this.pp_rotateAxisWorldDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisRadians = function (angle, axis) {\r\n this.pp_rotateAxisWorldRadians(angle, axis);\r\n };\r\n\r\n //Rotate Axis World\r\n\r\n WL.Object.prototype.pp_rotateAxisWorld = function (angle, axis) {\r\n this.pp_rotateAxisWorldDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisWorldDegrees = function (angle, axis) {\r\n this.pp_rotateAxisWorldRadians(glMatrix.glMatrix.toRadian(angle), axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisWorldRadians = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_rotateAxisWorldRadians(angle, axis) {\r\n glMatrix.quat.setAxisAngle(rotation, axis, angle);\r\n this.pp_rotateWorldQuat(rotation);\r\n };\r\n }();\r\n\r\n //Rotate Axis Local\r\n\r\n WL.Object.prototype.pp_rotateAxisLocal = function (angle, axis) {\r\n this.pp_rotateAxisLocalDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisLocalDegrees = function (angle, axis) {\r\n this.pp_rotateAxisLocalRadians(glMatrix.glMatrix.toRadian(angle), axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisLocalRadians = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_rotateAxisLocalRadians(angle, axis) {\r\n glMatrix.quat.setAxisAngle(rotation, axis, angle);\r\n this.pp_rotateLocalQuat(rotation);\r\n };\r\n }();\r\n\r\n //Rotate Axis Object\r\n\r\n WL.Object.prototype.pp_rotateAxisObject = function (angle, axis) {\r\n this.pp_rotateAxisObjectDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisObjectDegrees = function (angle, axis) {\r\n this.pp_rotateAxisObjectRadians(glMatrix.glMatrix.toRadian(angle), axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisObjectRadians = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_rotateAxisObjectRadians(angle, axis) {\r\n glMatrix.quat.setAxisAngle(rotation, axis, angle);\r\n this.pp_rotateObjectQuat(rotation);\r\n };\r\n }();\r\n\r\n //Rotate Around\r\n\r\n WL.Object.prototype.pp_rotateAround = function (rotation, origin) {\r\n this.pp_rotateAroundWorld(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundDegrees = function (rotation, origin) {\r\n this.pp_rotateAroundWorldDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundRadians = function (rotation, origin) {\r\n this.pp_rotateAroundWorldRadians(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundMatrix = function (rotation, origin) {\r\n this.pp_rotateAroundWorldMatrix(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundQuat = function (rotation, origin) {\r\n this.pp_rotateAroundWorldQuat(rotation, origin);\r\n };\r\n\r\n //Rotate Around World\r\n\r\n WL.Object.prototype.pp_rotateAroundWorld = function (rotation, origin) {\r\n this.pp_rotateAroundWorldDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundWorldDegrees(rotation, origin) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateAroundWorldQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateAroundWorldRadians(rotation, origin) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateAroundWorldDegrees(degreesRotation, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundWorldMatrix(rotation, origin) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateAroundWorldQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldQuat = function () {\r\n let axis = glMatrix.vec3.create();\r\n return function pp_rotateAroundWorldQuat(rotation, origin) {\r\n let angle = glMatrix.quat.getAxisAngle(axis, rotation);\r\n this.pp_rotateAroundAxisWorldRadians(angle, axis, origin);\r\n };\r\n }();\r\n\r\n //Rotate Around Local\r\n\r\n WL.Object.prototype.pp_rotateAroundLocal = function (rotation, origin) {\r\n this.pp_rotateAroundLocalDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundLocalDegrees(rotation, origin) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateAroundLocalQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateAroundLocalRadians(rotation, origin) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateAroundLocalDegrees(degreesRotation, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundLocalMatrix(rotation, origin) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateAroundLocalQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalQuat = function () {\r\n let axis = glMatrix.vec3.create();\r\n return function pp_rotateAroundLocalQuat(rotation, origin) {\r\n let angle = glMatrix.quat.getAxisAngle(axis, rotation);\r\n this.pp_rotateAroundAxisLocalRadians(angle, axis, origin);\r\n };\r\n }();\r\n\r\n //Rotate Around Object\r\n\r\n WL.Object.prototype.pp_rotateAroundObject = function (rotation, origin) {\r\n this.pp_rotateAroundObjectDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundObjectDegrees(rotation, origin) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateAroundObjectQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateAroundObjectRadians(rotation, origin) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateAroundObjectDegrees(degreesRotation, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundObjectMatrix(rotation, origin) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateAroundObjectQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectQuat = function () {\r\n let axis = glMatrix.vec3.create();\r\n return function pp_rotateAroundObjectQuat(rotation, origin) {\r\n let angle = glMatrix.quat.getAxisAngle(axis, rotation);\r\n this.pp_rotateAroundAxisObjectRadians(angle, axis, origin);\r\n };\r\n }();\r\n\r\n //Rotate Around Axis\r\n\r\n WL.Object.prototype.pp_rotateAroundAxis = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorld(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisRadians = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldRadians(angle, axis, origin);\r\n };\r\n\r\n //Rotate Around Axis World\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisWorld = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisWorldDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldRadians(glMatrix.glMatrix.toRadian(angle), axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisWorldRadians = function () {\r\n let transformToRotate = glMatrix.quat2.create();\r\n let transformToRotateConjugate = glMatrix.quat2.create();\r\n let transformQuat = glMatrix.quat2.create();\r\n let defaultQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundAxisWorldRadians(angle, axis, origin) {\r\n glMatrix.quat2.fromRotationTranslation(transformToRotate, defaultQuat, origin);\r\n this.pp_getTransformWorldQuat(transformQuat);\r\n glMatrix.quat2.conjugate(transformToRotateConjugate, transformToRotate);\r\n glMatrix.quat2.mul(transformQuat, transformToRotateConjugate, transformQuat);\r\n glMatrix.quat2.rotateAroundAxis(transformToRotate, transformToRotate, axis, angle);\r\n glMatrix.quat2.mul(transformQuat, transformToRotate, transformQuat);\r\n this.pp_setTransformWorldQuat(transformQuat);\r\n };\r\n }();\r\n\r\n //Rotate Around Axis Local\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisLocal = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisLocalDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisLocalDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisLocalRadians(glMatrix.glMatrix.toRadian(angle), axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisLocalRadians = function () {\r\n let convertedPosition = glMatrix.vec3.create();\r\n let convertedAxis = glMatrix.vec3.create();\r\n return function pp_rotateAroundAxisLocalRadians(angle, axis, origin) {\r\n this.pp_convertPositionLocalToWorld(origin, convertedPosition);\r\n this.pp_convertDirectionLocalToWorld(axis, convertedAxis);\r\n this.pp_rotateAroundAxisWorldRadians(angle, convertedAxis, convertedPosition);\r\n };\r\n }();\r\n\r\n //Rotate Around Axis Object\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisObject = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisObjectDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisObjectDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisObjectRadians(glMatrix.glMatrix.toRadian(angle), axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisObjectRadians = function () {\r\n let convertedPosition = glMatrix.vec3.create();\r\n let convertedAxis = glMatrix.vec3.create();\r\n return function pp_rotateAroundAxisObjectRadians(angle, axis, origin) {\r\n this.pp_convertPositionObjectToWorld(origin, convertedPosition);\r\n this.pp_convertDirectionObjectToWorld(axis, convertedAxis);\r\n this.pp_rotateAroundAxisWorldRadians(angle, convertedAxis, convertedPosition);\r\n };\r\n }();\r\n\r\n //Scale\r\n\r\n //For now it does not really make sense in wle to scale in world space or parent space\r\n //so there is no pp_scale default function\r\n\r\n WL.Object.prototype.pp_scaleObject = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function pp_scaleObject(scale) {\r\n if (isNaN(scale)) {\r\n this.scale(scale);\r\n } else {\r\n glMatrix.vec3.set(vector, scale, scale, scale);\r\n this.scale(vector);\r\n }\r\n };\r\n }();\r\n\r\n //Look At\r\n\r\n WL.Object.prototype.pp_lookAt = function (position, up) {\r\n this.pp_lookAtWorld(position, up);\r\n };\r\n\r\n WL.Object.prototype.pp_lookAtWorld = function () {\r\n let direction = glMatrix.vec3.create();\r\n return function pp_lookAtWorld(position, up) {\r\n this.pp_getPositionWorld(direction);\r\n glMatrix.vec3.sub(direction, position, direction);\r\n this.pp_lookToWorld(direction, up);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_lookAtLocal = function () {\r\n let direction = glMatrix.vec3.create();\r\n return function pp_lookAtLocal(position, up) {\r\n this.pp_getPositionLocal(direction);\r\n glMatrix.vec3.sub(direction, position, direction);\r\n this.pp_lookToLocal(direction, up);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_lookTo = function (direction, up) {\r\n this.pp_lookToWorld(direction, up);\r\n };\r\n\r\n WL.Object.prototype.pp_lookToWorld = function () {\r\n let internalUp = glMatrix.vec3.create();\r\n return function pp_lookToWorld(direction, up = this.pp_getUpWorld(internalUp)) {\r\n this.pp_setForwardWorld(direction, up);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_lookToLocal = function () {\r\n let internalUp = glMatrix.vec3.create();\r\n return function pp_lookToLocal(direction, up = this.pp_getUpLocal(internalUp)) {\r\n this.pp_setForwardLocal(direction, up);\r\n };\r\n }();\r\n\r\n //EXTRA\r\n\r\n //Parent\r\n\r\n WL.Object.prototype.pp_setParent = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let scale = glMatrix.vec3.create();\r\n return function pp_setParent(newParent, keepTransform = true) {\r\n if (!keepTransform) {\r\n this.parent = newParent;\r\n } else {\r\n this.pp_getPositionWorld(position);\r\n this.pp_getRotationWorldQuat(rotation);\r\n this.pp_getScaleWorld(scale);\r\n this.parent = newParent;\r\n this.pp_setScaleWorld(scale);\r\n this.pp_setRotationWorldQuat(rotation);\r\n this.pp_setPositionWorld(position);\r\n }\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getParent = function () {\r\n return this.parent;\r\n };\r\n\r\n //Convert Vector Object World\r\n\r\n WL.Object.prototype.pp_convertPositionObjectToWorld = function () {\r\n let matrix = glMatrix.mat4.create();\r\n return function pp_convertPositionObjectToWorld(position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_getTransformWorldMatrix(matrix);\r\n glMatrix.vec3.transformMat4(resultPosition, position, matrix);\r\n return resultPosition;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertDirectionObjectToWorld = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertDirectionObjectToWorld(direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.vec3.transformQuat(resultDirection, direction, rotation);\r\n return resultDirection;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertPositionWorldToObject = function () {\r\n let matrix = glMatrix.mat4.create();\r\n return function pp_convertPositionWorldToObject(position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_getTransformWorldMatrix(matrix);\r\n glMatrix.mat4.invert(matrix, matrix);\r\n glMatrix.vec3.transformMat4(resultPosition, position, matrix);\r\n return resultPosition;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertDirectionWorldToObject = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertDirectionWorldToObject(direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.vec3.transformQuat(resultDirection, direction, rotation);\r\n return resultDirection;\r\n };\r\n }();\r\n\r\n //Convert Vector Local World\r\n\r\n WL.Object.prototype.pp_convertPositionLocalToWorld = function (position, resultPosition = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertPositionObjectToWorld(position, resultPosition);\r\n } else {\r\n glMatrix.vec3.copy(resultPosition, position);\r\n }\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionLocalToWorld = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertDirectionObjectToWorld(direction, resultDirection);\r\n } else {\r\n glMatrix.vec3.copy(resultDirection, direction);\r\n }\r\n return resultDirection;\r\n };\r\n\r\n WL.Object.prototype.pp_convertPositionWorldToLocal = function (position, resultPosition = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertPositionWorldToObject(position, resultPosition);\r\n } else {\r\n glMatrix.vec3.copy(resultPosition, position);\r\n }\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionWorldToLocal = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertDirectionWorldToObject(direction, resultDirection);\r\n } else {\r\n glMatrix.vec3.copy(resultDirection, direction);\r\n }\r\n return resultDirection;\r\n };\r\n\r\n //Convert Vector Local Object\r\n\r\n //I need to use the converson to world and then local also use the parent scale that changes the position in local space\r\n\r\n WL.Object.prototype.pp_convertPositionObjectToLocal = function (position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_convertPositionObjectToWorld(position, resultPosition);\r\n this.pp_convertPositionWorldToLocal(resultPosition, resultPosition);\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionObjectToLocal = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_convertDirectionObjectToWorld(direction, resultDirection);\r\n this.pp_convertDirectionWorldToLocal(resultDirection, resultDirection);\r\n return resultDirection;\r\n };\r\n\r\n WL.Object.prototype.pp_convertPositionLocalToObject = function (position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_convertPositionLocalToWorld(position, resultPosition);\r\n this.pp_convertPositionWorldToObject(resultPosition, resultPosition);\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionLocalToObject = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_convertDirectionLocalToWorld(direction, resultDirection);\r\n this.pp_convertDirectionWorldToObject(resultDirection, resultDirection);\r\n return resultDirection;\r\n };\r\n\r\n //Convert Transform Object World\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToWorld = function (transform, resultTransform) {\r\n return this.pp_convertTransformObjectToWorldMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToWorldMatrix = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_convertTransformObjectToWorldMatrix(transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_getTransformWorldMatrix(convertTransform);\r\n if (this.pp_hasUniformScaleWorld()) {\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n } else {\r\n glMatrix.vec3.set(position, transform[12], transform[13], transform[14]);\r\n this.pp_convertPositionObjectToWorld(position, position);\r\n\r\n glMatrix.mat4.getScaling(scale, convertTransform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, convertTransform, inverseScale);\r\n\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n glMatrix.mat4.scale(resultTransform, resultTransform, scale);\r\n\r\n resultTransform[12] = position[0];\r\n resultTransform[13] = position[1];\r\n resultTransform[14] = position[2];\r\n resultTransform[15] = 1;\r\n }\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToWorldQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertTransformObjectToWorldQuat(transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.quat.mul(rotation, rotation, transform);\r\n glMatrix.quat2.getTranslation(position, transform);\r\n this.pp_convertPositionObjectToWorld(position, position);\r\n glMatrix.quat2.fromRotationTranslation(resultTransform, rotation, position);\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToObject = function (transform, resultTransform) {\r\n return this.pp_convertTransformWorldToObjectMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToObjectMatrix = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_convertTransformWorldToObjectMatrix(transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_getTransformWorldMatrix(convertTransform);\r\n if (this.pp_hasUniformScaleWorld()) {\r\n glMatrix.mat4.invert(convertTransform, convertTransform);\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n } else {\r\n glMatrix.vec3.set(position, transform[12], transform[13], transform[14]);\r\n this.pp_convertPositionWorldToObject(position, position);\r\n\r\n glMatrix.mat4.getScaling(scale, convertTransform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, convertTransform, inverseScale);\r\n\r\n glMatrix.mat4.invert(convertTransform, convertTransform);\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n glMatrix.mat4.scale(resultTransform, resultTransform, inverseScale);\r\n\r\n resultTransform[12] = position[0];\r\n resultTransform[13] = position[1];\r\n resultTransform[14] = position[2];\r\n resultTransform[15] = 1;\r\n }\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToObjectQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertTransformWorldToObjectQuat(transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.quat.mul(rotation, rotation, transform);\r\n glMatrix.quat2.getTranslation(position, transform);\r\n this.pp_convertPositionWorldToObject(position, position);\r\n glMatrix.quat2.fromRotationTranslation(resultTransform, rotation, position);\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n //Convert Transform Local World\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToWorld = function (transform, resultTransform) {\r\n return this.pp_convertTransformLocalToWorldMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToWorldMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformObjectToWorldMatrix(transform, resultTransform);\r\n } else {\r\n glMatrix.mat4.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToWorldQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformObjectToWorldQuat(transform, resultTransform);\r\n } else {\r\n glMatrix.quat2.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToLocal = function (transform, resultTransform) {\r\n return this.pp_convertTransformWorldToLocalMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToLocalMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformWorldToObjectMatrix(transform, resultTransform);\r\n } else {\r\n glMatrix.mat4.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToLocalQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformWorldToObjectQuat(transform, resultTransform);\r\n } else {\r\n glMatrix.quat2.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n //Convert Transform Object Local\r\n\r\n //I need to use the converson to world and then local also use the parent scale that changes the position in local space\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToLocal = function (transform, resultTransform) {\r\n return this.pp_convertTransformObjectToLocalMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToLocalMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_convertTransformObjectToWorldMatrix(transform, resultTransform);\r\n this.pp_convertTransformWorldToLocalMatrix(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToLocalQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_convertTransformObjectToWorldQuat(transform, resultTransform);\r\n this.pp_convertTransformWorldToLocalQuat(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToObject = function (transform, resultTransform) {\r\n return this.pp_convertTransformLocalToObjectMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToObjectMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_convertTransformLocalToWorldMatrix(transform, resultTransform);\r\n this.pp_convertTransformWorldToObjectMatrix(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToObjectQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_convertTransformLocalToWorldQuat(transform, resultTransform);\r\n this.pp_convertTransformWorldToObjectQuat(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n //Component\r\n\r\n WL.Object.prototype.pp_addComponent = function (type, paramsOrActive, active = null) {\r\n let params = null;\r\n\r\n if (typeof paramsOrActive == \"boolean\") {\r\n params = {};\r\n params[\"active\"] = paramsOrActive;\r\n } else {\r\n params = paramsOrActive;\r\n\r\n if (active != null) {\r\n if (params == null) {\r\n params = {};\r\n }\r\n params[\"active\"] = active;\r\n }\r\n }\r\n\r\n return this.addComponent(type, params);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponent = function (type, index) {\r\n return this.getComponent(type, index);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponents = function (type) {\r\n return this.getComponents(type);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentHierarchy = function (type, index) {\r\n let component = this.getComponent(type, index);\r\n\r\n if (!component) {\r\n component = this.pp_getComponentDescendants(type, index);\r\n }\r\n\r\n return component;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentDescendants = function (type, index) {\r\n let component = null;\r\n\r\n let descendants = this.children;\r\n while (!component && descendants.length > 0) {\r\n let descendant = descendants.shift();\r\n component = descendant.getComponent(type, index);\r\n if (!component) {\r\n for (let object of descendant.children) {\r\n descendants.push(object);\r\n }\r\n }\r\n }\r\n\r\n return component;\r\n };\r\n WL.Object.prototype.pp_getComponentChildren = function (type, index) {\r\n let component = null;\r\n\r\n let children = this.children;\r\n for (let child of children) {\r\n component = child.getComponent(type, index);\r\n if (component) {\r\n break;\r\n }\r\n }\r\n\r\n return component;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentsHierarchy = function (type) {\r\n let components = this.getComponents(type);\r\n\r\n let descendantsComponents = this.pp_getComponentsDescendants(type);\r\n for (let component of descendantsComponents) {\r\n components.push(component);\r\n }\r\n\r\n return components;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentsDescendants = function (type) {\r\n let components = [];\r\n\r\n let descendants = this.children;\r\n while (descendants.length > 0) {\r\n let descendant = descendants.shift();\r\n let descendantComponents = descendant.getComponents(type);\r\n for (let component of descendantComponents) {\r\n components.push(component);\r\n }\r\n for (let object of descendant.children) {\r\n descendants.push(object);\r\n }\r\n }\r\n\r\n return components;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentsChildren = function (type) {\r\n let components = [];\r\n\r\n let children = this.children;\r\n for (let child of children) {\r\n let childComponents = child.getComponents(type);\r\n for (let component of childComponents) {\r\n components.push(component);\r\n }\r\n }\r\n\r\n return components;\r\n };\r\n\r\n //Active\r\n\r\n WL.Object.prototype.pp_setActive = function (active, applyToHierarchy = true) {\r\n if (applyToHierarchy) {\r\n this.pp_setActiveHierarchy(active);\r\n } else {\r\n this.active = active;\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveSelf = function (active) {\r\n this.pp_setActive(active, false);\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveHierarchy = function (active) {\r\n this.active = active;\r\n this.pp_setActiveDescendants(active);\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveDescendants = function (active) {\r\n let descendants = this.children;\r\n while (descendants.length > 0) {\r\n let descendant = descendants.shift();\r\n descendant.active = active;\r\n for (let object of descendant.children) {\r\n descendants.push(object);\r\n }\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveChildren = function (active) {\r\n let children = this.children;\r\n for (let child of children) {\r\n child.active = active;\r\n }\r\n };\r\n\r\n //Uniform Scale\r\n\r\n WL.Object.prototype.pp_hasUniformScale = function () {\r\n return this.pp_hasUniformScaleWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_hasUniformScaleWorld = function () {\r\n let scale = glMatrix.vec3.create();\r\n return function pp_hasUniformScaleWorld() {\r\n this.pp_getScaleWorld(scale);\r\n return Math.abs(scale[0] - scale[1]) < this._pp_epsilon && Math.abs(scale[1] - scale[2]) < this._pp_epsilon && Math.abs(scale[0] - scale[2]) < this._pp_epsilon;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_hasUniformScaleLocal = function () {\r\n let scale = glMatrix.vec3.create();\r\n return function pp_hasUniformScaleLocal() {\r\n this.pp_getScaleLocal(scale);\r\n return Math.abs(scale[0] - scale[1]) < this._pp_epsilon && Math.abs(scale[1] - scale[2]) < this._pp_epsilon && Math.abs(scale[0] - scale[2]) < this._pp_epsilon;\r\n };\r\n }();\r\n\r\n //Clone\r\n\r\n PP.CloneParams = class CloneParams {\r\n constructor() {\r\n this.myIgnoreNonCloneable = false; // Ignores components that are not clonable\r\n this.myIgnoreComponents = false; // All components are ignored, cloning only the object hierarchy\r\n this.myIgnoreChildren = false; // Clones only the given object without the children\r\n\r\n this.myComponentsToIgnore = []; // Ignores all component types in this list (example: \"mesh\"), has lower priority over myComponentsToInclude\r\n this.myComponentsToInclude = []; // Clones only the component types in this list (example: \"mesh\"), has higher priority over myComponentsToIgnore, if empty it's ignored\r\n this.myIgnoreComponentCallback = null; // Signature: callback(component) returns true if the component must be ignored, it is called after the previous filters\r\n\r\n this.myChildrenToIgnore = []; // Ignores all the objects in this list (example: \"mesh\"), has lower priority over myChildrenToInclude\r\n this.myChildrenToInclude = []; // Clones only the objects in this list (example: \"mesh\"), has higher priority over myChildrenToIgnore, if empty it's ignored\r\n this.myIgnoreChildCallback = null; // Signature: callback(object) returns true if the object must be ignored, it is called after the previous filters\r\n\r\n this.myDeepCloneParams = new PP.DeepCloneParams(); // Used to specify if the object must be deep cloned or not, you can also override the behavior for specific components and variables\r\n\r\n this.myExtraData = new Map(); // This map can be filled with whatever extra data the component clone function could need\r\n }\r\n };\r\n\r\n PP.DeepCloneParams = class DeepCloneParams {\r\n constructor() {\r\n this._myDeepCloneObject = false;\r\n this._myOverrideDeepCloneComponentMap = new Map();\r\n this._myOverrideDeepCloneComponentVariableMap = new Map();\r\n }\r\n\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneObject(deepClone) {\r\n this._myDeepCloneObject = deepClone;\r\n }\r\n\r\n // This value override the deep clone object value\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneComponent(componentName, deepClone) {\r\n this._myOverrideDeepCloneComponentMap.set(componentName, deepClone);\r\n }\r\n\r\n // This value override both the deep clone object value and the deep clone component one\r\n // The implementation is component dependant, not every component variable override is taken into consideration\r\n setDeepCloneComponentVariable(componentName, variableName, deepClone) {\r\n let componentMap = null;\r\n\r\n if (!this._myOverrideDeepCloneComponentVariableMap.has(componentName)) {\r\n this._myOverrideDeepCloneComponentVariableMap.set(componentName, new Map());\r\n }\r\n\r\n componentMap = this._myOverrideDeepCloneComponentVariableMap.get(componentName);\r\n\r\n componentMap.set(variableName, deepClone);\r\n }\r\n\r\n isDeepCloneComponent(componentName) {\r\n let overrideValue = this._myOverrideDeepCloneComponentMap.get(componentName);\r\n\r\n if (overrideValue != null) {\r\n return overrideValue;\r\n }\r\n\r\n return this._myDeepCloneObject;\r\n }\r\n\r\n isDeepCloneComponentVariable(componentName, variableName) {\r\n let componentMap = this._myOverrideDeepCloneComponentVariableMap.get(componentName);\r\n if (componentMap != null) {\r\n let overrideValue = componentMap.get(variableName);\r\n if (overrideValue != null) {\r\n return overrideValue;\r\n }\r\n }\r\n\r\n return this.isDeepCloneComponent(componentName);\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_clone = function () {\r\n let scale = glMatrix.vec3.create();\r\n let transformQuat = glMatrix.quat2.create();\r\n return function pp_clone(params = new PP.CloneParams()) {\r\n let clonedObject = null;\r\n\r\n if (this.pp_isCloneable(params)) {\r\n let objectsToCloneData = [];\r\n objectsToCloneData.push([this.parent, this]);\r\n\r\n // Create the object hierarchy\r\n let objectsToCloneComponentsData = [];\r\n while (objectsToCloneData.length > 0) {\r\n let cloneData = objectsToCloneData.shift();\r\n let parent = cloneData[0];\r\n let objectToClone = cloneData[1];\r\n\r\n let currentClonedObject = WL.scene.addObject(parent);\r\n currentClonedObject.name = objectToClone.name;\r\n\r\n currentClonedObject.pp_setScaleLocal(objectToClone.pp_getScaleLocal(scale));\r\n currentClonedObject.pp_setTransformLocalQuat(objectToClone.pp_getTransformLocalQuat(transformQuat));\r\n\r\n if (!params.myIgnoreComponents) {\r\n objectsToCloneComponentsData.push([objectToClone, currentClonedObject]);\r\n }\r\n\r\n if (!params.myIgnoreChildren) {\r\n for (let child of objectToClone.children) {\r\n let cloneChild = false;\r\n if (params.myChildrenToInclude.length > 0) {\r\n cloneChild = params.myChildrenToInclude.find(childToInclude => childToInclude.pp_equals(child)) != null;\r\n } else {\r\n cloneChild = params.myChildrenToIgnore.find(childToIgnore => childToIgnore.pp_equals(child)) == null;\r\n }\r\n\r\n if (cloneChild && params.myIgnoreChildCallback != null) {\r\n cloneChild = !params.myIgnoreChildCallback(child);\r\n }\r\n\r\n if (cloneChild) {\r\n objectsToCloneData.push([currentClonedObject, child]);\r\n }\r\n }\r\n }\r\n\r\n if (clonedObject == null) {\r\n clonedObject = currentClonedObject;\r\n }\r\n }\r\n\r\n // Get the components to clone\r\n let componentsToCloneData = [];\r\n while (objectsToCloneComponentsData.length > 0) {\r\n let cloneData = objectsToCloneComponentsData.shift();\r\n let objectToClone = cloneData[0];\r\n let currentClonedObject = cloneData[1];\r\n\r\n let components = objectToClone.pp_getComponents();\r\n for (let component of components) {\r\n if (component.pp_clone != null) {\r\n let cloneComponent = false;\r\n if (params.myComponentsToInclude.length > 0) {\r\n cloneComponent = params.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = params.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && params.myIgnoreComponentCallback != null) {\r\n cloneComponent = !params.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent) {\r\n componentsToCloneData.push([component, currentClonedObject]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clone the components\r\n let componentsToPostProcessData = [];\r\n while (componentsToCloneData.length > 0) {\r\n let cloneData = componentsToCloneData.shift();\r\n let componentToClone = cloneData[0];\r\n let currentClonedObject = cloneData[1];\r\n\r\n let clonedComponent = componentToClone.pp_clone(currentClonedObject, params.myDeepCloneParams, params.myExtraData);\r\n if (componentToClone.pp_clonePostProcess != null) {\r\n componentsToPostProcessData.push([componentToClone, clonedComponent]);\r\n }\r\n }\r\n\r\n // Clone post process\r\n // Can be useful if you have to get some data from other components in the hierarchy which have now been created\r\n while (componentsToCloneData.length > 0) {\r\n let cloneData = componentsToCloneData.shift();\r\n let componentToClone = cloneData[0];\r\n let currentClonedComponent = cloneData[1];\r\n\r\n componentToClone.pp_clonePostProcess(currentClonedComponent, params.myDeepCloneParams, params.myExtraData);\r\n }\r\n }\r\n\r\n return clonedObject;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_isCloneable = function (params = new PP.CloneParams()) {\r\n if (params.myIgnoreNonCloneable || params.myIgnoreComponents) {\r\n return true;\r\n }\r\n\r\n let isCloneable = true;\r\n\r\n let objects = [];\r\n objects.push(this);\r\n\r\n while (isCloneable && objects.length > 0) {\r\n let object = objects.shift();\r\n\r\n let components = this.pp_getComponents();\r\n for (let component of components) {\r\n let cloneComponent = false;\r\n if (params.myComponentsToInclude.length > 0) {\r\n cloneComponent = params.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = params.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && params.myIgnoreComponentCallback != null) {\r\n cloneComponent = !params.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent && component.pp_clone == null) {\r\n isCloneable = false;\r\n break;\r\n }\r\n }\r\n\r\n if (isCloneable && !params.myIgnoreChildren) {\r\n for (let child of object.children) {\r\n let cloneChild = false;\r\n if (params.myChildrenToInclude.length > 0) {\r\n cloneChild = params.myChildrenToInclude.find(childToInclude => childToInclude.pp_equals(child)) != null;\r\n } else {\r\n cloneChild = params.myChildrenToIgnore.find(childToInclude => childToInclude.pp_equals(child)) == null;\r\n }\r\n\r\n if (cloneChild && params.myIgnoreChildCallback != null) {\r\n cloneChild = !params.myIgnoreChildCallback(child);\r\n }\r\n\r\n if (cloneChild) {\r\n objects.push(child);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return isCloneable;\r\n };\r\n\r\n //To String\r\n\r\n WL.Object.prototype.pp_toString = function () {\r\n return this.pp_toStringCompact();\r\n }\r\n\r\n WL.Object.prototype.pp_toStringExtended = function () {\r\n let tab = \" \";\r\n let newLine = \"\\n\";\r\n let startObject = \"{\";\r\n let endObject = \"}\";\r\n let nameLabel = \"name: \";\r\n let idLabel = \"id: \";\r\n let componentsLabel = \"components: \";\r\n let typeLabel = \"type: \";\r\n let childrenLabel = \"children: \";\r\n let startComponents = \"[\";\r\n let endComponents = \"]\";\r\n let startChildren = startComponents;\r\n let endChildren = endComponents;\r\n let separator = \",\";\r\n let newLineTab = newLine.concat(tab, tab);\r\n return function pp_toString() {\r\n let objectString = \"\";\r\n objectString = objectString.concat(startObject, newLine);\r\n let name = this.pp_getName();\r\n if (name.length > 0) {\r\n objectString = objectString.concat(tab, nameLabel, this.pp_getName(), separator, newLine);\r\n }\r\n objectString = objectString.concat(tab, idLabel, this.pp_getID(), separator, newLine);\r\n\r\n let components = this.pp_getComponents();\r\n if (components.length > 0) {\r\n objectString = objectString.concat(tab, componentsLabel, newLine, tab, startComponents, newLine);\r\n for (let i = 0; i < components.length; i++) {\r\n let component = components[i];\r\n\r\n objectString = objectString.concat(tab, tab, startObject, newLine);\r\n objectString = objectString.concat(tab, tab, tab, typeLabel, component.type, separator, newLine);\r\n objectString = objectString.concat(tab, tab, tab, idLabel, component._id, separator, newLine);\r\n objectString = objectString.concat(tab, tab, endObject);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n\r\n objectString = objectString.concat(tab, endComponents, separator, newLine);\r\n }\r\n\r\n let children = this.pp_getChildren();\r\n if (children.length > 0) {\r\n objectString = objectString.concat(tab, childrenLabel, newLine, tab, startChildren, newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n let child = children[i];\r\n\r\n let childString = child.pp_toStringExtended();\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(tab, childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n objectString = objectString.concat(tab, endChildren, separator, newLine);\r\n }\r\n\r\n objectString = objectString.concat(endObject);\r\n\r\n return objectString;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_toStringCompact = function () {\r\n let tab = \" \";\r\n let newLine = \"\\n\";\r\n let emptyName = \"\";\r\n let nameLabel = \"name: \";\r\n let componentsLabel = \"components: \";\r\n let separator = \", \";\r\n let newLineTab = newLine.concat(tab);\r\n return function pp_toString() {\r\n let objectString = \"\";\r\n\r\n let name = this.pp_getName();\r\n if (name.length > 0) {\r\n objectString = objectString.concat(nameLabel, name);\r\n } else {\r\n objectString = objectString.concat(nameLabel, emptyName);\r\n }\r\n\r\n let components = this.pp_getComponents();\r\n if (components.length > 0) {\r\n objectString = objectString.concat(separator, componentsLabel);\r\n for (let i = 0; i < components.length; i++) {\r\n let component = components[i];\r\n\r\n objectString = objectString.concat(component.type);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator);\r\n }\r\n }\r\n }\r\n\r\n let children = this.pp_getChildren();\r\n if (children.length > 0) {\r\n objectString = objectString.concat(newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n let child = children[i];\r\n\r\n let childString = child.pp_toStringCompact();\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n }\r\n\r\n return objectString;\r\n };\r\n }();\r\n\r\n //Cauldron\r\n\r\n WL.Object.prototype.pp_addObject = function () {\r\n return WL.scene.addObject(this);\r\n };\r\n\r\n WL.Object.prototype.pp_getName = function () {\r\n return this.name;\r\n };\r\n\r\n WL.Object.prototype.pp_setName = function (name) {\r\n this.name = name;\r\n };\r\n\r\n WL.Object.prototype.pp_getID = function () {\r\n return this.objectId;\r\n };\r\n\r\n WL.Object.prototype.pp_getHierarchy = function () {\r\n let hierarchy = this.pp_getDescendants();\r\n\r\n hierarchy.unshift(this);\r\n\r\n return hierarchy;\r\n };\r\n\r\n WL.Object.prototype.pp_getDescendants = function () {\r\n let descendants = [];\r\n\r\n let descendantsQueue = this.children;\r\n\r\n while (descendantsQueue.length > 0) {\r\n let descendant = descendantsQueue.shift();\r\n descendants.push(descendant);\r\n for (let object of descendant.children) {\r\n descendantsQueue.push(object);\r\n }\r\n }\r\n\r\n return descendants;\r\n };\r\n\r\n WL.Object.prototype.pp_getChildren = function () {\r\n return this.children;\r\n };\r\n\r\n WL.Object.prototype.pp_markDirty = function () {\r\n return this.setDirty();\r\n };\r\n\r\n WL.Object.prototype.pp_equals = function (otherObject) {\r\n return this.equals(otherObject);\r\n };\r\n\r\n WL.Object.prototype.pp_destroy = function () {\r\n return this.destroy();\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjects = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMap();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjectsHierarchy = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMapHierarchy();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjectsDescendants = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMapDescendants();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjectsChildren = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMapChildren();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMap = function (amountMap = new Map()) {\r\n let objectAmount = amountMap.get(\"object\");\r\n if (objectAmount == null) {\r\n objectAmount = 0;\r\n }\r\n objectAmount += 1;\r\n amountMap.set(\"object\", objectAmount);\r\n\r\n let components = this.pp_getComponents();\r\n for (let component of components) {\r\n let type = component.type;\r\n let typeAmount = amountMap.get(type);\r\n if (typeAmount == null) {\r\n typeAmount = 0;\r\n }\r\n typeAmount += 1;\r\n amountMap.set(type, typeAmount);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMapHierarchy = function (amountMap = new Map()) {\r\n let hierarchy = this.pp_getHierarchy();\r\n\r\n for (let object of hierarchy) {\r\n object.pp_getComponentAmountMap(amountMap);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMapDescendants = function (amountMap = new Map()) {\r\n let descendants = this.pp_getDescendants();\r\n\r\n for (let object of descendants) {\r\n object.pp_getComponentAmountMap(amountMap);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMapChildren = function (amountMap = new Map()) {\r\n let children = this.children;\r\n\r\n for (let object of children) {\r\n object.pp_getComponentAmountMap(amountMap);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n //Private Utils\r\n\r\n WL.Object.prototype._pp_epsilon = 0.000001;\r\n\r\n WL.Object.prototype._pp_quaternionToRadians = function () {\r\n let mat3 = glMatrix.mat3.create();\r\n return function _pp_quaternionToRadians(quatRotation, radiansRotation = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(mat3, quatRotation);\r\n\r\n //Rotation order is ZYX\r\n radiansRotation[1] = Math.asin(-this._pp_clamp(mat3[2], -1, 1));\r\n\r\n if (Math.abs(mat3[2]) < 0.9999999) {\r\n\r\n radiansRotation[0] = Math.atan2(mat3[5], mat3[8]);\r\n radiansRotation[2] = Math.atan2(mat3[1], mat3[0]);\r\n\r\n } else {\r\n\r\n radiansRotation[0] = 0;\r\n radiansRotation[2] = Math.atan2(-mat3[3], mat3[4]);\r\n }\r\n\r\n return radiansRotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype._pp_degreesToQuaternion = function (degreesRotation, quatRotation = glMatrix.quat.create()) {\r\n glMatrix.quat.fromEuler(quatRotation, degreesRotation[0], degreesRotation[1], degreesRotation[2]);\r\n return quatRotation;\r\n };\r\n\r\n WL.Object.prototype._pp_toDegrees = function (angle) {\r\n return angle * (180 / Math.PI);\r\n };\r\n\r\n WL.Object.prototype._pp_clamp = function (value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n };\r\n\r\n WL.Object.prototype._pp_reserveObjects = function (count, componentAmountMap) {\r\n let objectsToReserve = componentAmountMap.get(\"object\") * count;\r\n componentAmountMap.delete(\"object\");\r\n\r\n let componentsToReserve = {};\r\n for (let [componentName, componentCount] of componentAmountMap.entries()) {\r\n componentsToReserve[componentName] = componentCount * count;\r\n }\r\n\r\n WL.scene.reserveObjects(objectsToReserve, componentsToReserve);\r\n };\r\n\r\n WL.Object.prototype._pp_setAxes = function () {\r\n let fixedAxes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()];\r\n\r\n let fixedAxesFixSignMap = [\r\n [1, -1, 1],\r\n [1, 1, -1],\r\n [-1, 1, -1]\r\n ];\r\n\r\n let fixedLeft = glMatrix.vec3.create();\r\n let fixedUp = glMatrix.vec3.create();\r\n let fixedForward = glMatrix.vec3.create();\r\n\r\n let currentAxis = glMatrix.vec3.create();\r\n\r\n let rotationAxis = glMatrix.vec3.create();\r\n let rotationMat = glMatrix.mat3.create();\r\n let rotationQuat = glMatrix.quat.create();\r\n return function _pp_setAxes(axes, priority, isLocal) {\r\n let firstAxis = axes[priority[0]];\r\n let secondAxis = axes[priority[1]];\r\n let thirdAxis = axes[priority[2]];\r\n\r\n if (firstAxis == null) {\r\n return;\r\n }\r\n\r\n let secondAxisValid = false;\r\n if (secondAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, secondAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n secondAxisValid = true;\r\n }\r\n }\r\n\r\n let thirdAxisValid = false;\r\n if (thirdAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, thirdAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n thirdAxisValid = true;\r\n }\r\n }\r\n\r\n if (secondAxisValid || thirdAxisValid) {\r\n\r\n let crossAxis = null;\r\n let secondAxisIndex = null;\r\n let thirdAxisIndex = null;\r\n if (secondAxisValid) {\r\n crossAxis = secondAxis;\r\n secondAxisIndex = 1;\r\n thirdAxisIndex = 2;\r\n } else {\r\n crossAxis = thirdAxis;\r\n secondAxisIndex = 2;\r\n thirdAxisIndex = 1;\r\n }\r\n\r\n let fixSignMap = fixedAxesFixSignMap[priority[0]];\r\n\r\n glMatrix.vec3.cross(fixedAxes[thirdAxisIndex], firstAxis, crossAxis);\r\n glMatrix.vec3.scale(fixedAxes[thirdAxisIndex], fixedAxes[thirdAxisIndex], fixSignMap[priority[thirdAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[secondAxisIndex], firstAxis, fixedAxes[thirdAxisIndex]);\r\n glMatrix.vec3.scale(fixedAxes[secondAxisIndex], fixedAxes[secondAxisIndex], fixSignMap[priority[secondAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[0], fixedAxes[1], fixedAxes[2]);\r\n glMatrix.vec3.scale(fixedAxes[0], fixedAxes[0], fixSignMap[priority[0]]);\r\n\r\n glMatrix.vec3.normalize(fixedLeft, fixedAxes[priority.pp_findIndexEqual(0)]);\r\n glMatrix.vec3.normalize(fixedUp, fixedAxes[priority.pp_findIndexEqual(1)]);\r\n glMatrix.vec3.normalize(fixedForward, fixedAxes[priority.pp_findIndexEqual(2)]);\r\n\r\n glMatrix.mat3.set(rotationMat,\r\n fixedLeft[0], fixedLeft[1], fixedLeft[2],\r\n fixedUp[0], fixedUp[1], fixedUp[2],\r\n fixedForward[0], fixedForward[1], fixedForward[2]\r\n );\r\n\r\n glMatrix.quat.fromMat3(rotationQuat, rotationMat);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n\r\n if (isLocal) {\r\n this.pp_setRotationLocalQuat(rotationQuat);\r\n } else {\r\n this.pp_setRotationWorldQuat(rotationQuat);\r\n }\r\n } else {\r\n if (priority[0] == 0) {\r\n if (isLocal) {\r\n this.pp_getLeftLocal(currentAxis);\r\n } else {\r\n this.pp_getLeftWorld(currentAxis);\r\n }\r\n } else if (priority[0] == 1) {\r\n if (isLocal) {\r\n this.pp_getUpLocal(currentAxis);\r\n } else {\r\n this.pp_getUpWorld(currentAxis);\r\n }\r\n } else {\r\n if (isLocal) {\r\n this.pp_getForwardLocal(currentAxis);\r\n } else {\r\n this.pp_getForwardWorld(currentAxis);\r\n }\r\n }\r\n\r\n let angle = glMatrix.vec3.angle(firstAxis, currentAxis);\r\n if (angle != 0) {\r\n glMatrix.vec3.cross(rotationAxis, currentAxis, firstAxis);\r\n glMatrix.vec3.normalize(rotationAxis, rotationAxis);\r\n glMatrix.quat.setAxisAngle(rotationQuat, rotationAxis, angle);\r\n\r\n if (isLocal) {\r\n this.pp_rotateLocalQuat(rotationQuat);\r\n } else {\r\n this.pp_rotateWorldQuat(rotationQuat);\r\n }\r\n }\r\n }\r\n };\r\n }();\r\n\r\n\r\n\r\n\r\n for (let key in WL.Object.prototype) {\r\n let prefixes = [\"pp_\", \"_pp_\"];\r\n\r\n let found = false;\r\n for (let prefix of prefixes) {\r\n if (key.startsWith(prefix)) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n Object.defineProperty(WL.Object.prototype, key, { enumerable: false });\r\n }\r\n }\r\n\r\n}", "/*\r\n How to use\r\n\r\n By default the rotations are in Degrees\r\n\r\n For rotations u can add a suffix like Degrees/Radians to use a specific version, example:\r\n - pp_angleDistanceSignedDegrees\r\n - pp_isInsideAngleRangeRadians\r\n \r\n List of constants:\r\n - PP_EPSILON_NUMBER / PP_EPSILON_DEGREES\r\n\r\n List of functions:\r\n Notes:\r\n - The suffixes (like Degrees or Radians) are omitted \r\n\r\n - pp_clamp\r\n - pp_sign\r\n - pp_toDegrees / pp_toRadians\r\n - pp_roundDecimal\r\n - pp_mapToRange\r\n - pp_random / pp_randomInt / pp_randomInt / pp_randomSign / pp_randomPick\r\n - pp_lerp / pp_interpolate / PP.EasingFunction\r\n - pp_angleDistance / pp_angleDistanceSigned\r\n - pp_angleClamp\r\n - pp_isInsideAngleRange\r\n*/\r\n\r\nMath.PP_EPSILON_NUMBER = 0.00001;\r\nMath.PP_EPSILON_DEGREES = 0.0001;\r\n\r\nMath.pp_clamp = function (value, start, end) {\r\n let fixedStart = (start != null) ? start : -Number.MAX_VALUE;\r\n let fixedEnd = (end != null) ? end : Number.MAX_VALUE;\r\n\r\n let min = Math.min(fixedStart, fixedEnd);\r\n let max = Math.max(fixedStart, fixedEnd);\r\n return Math.min(Math.max(value, min), max);\r\n};\r\n\r\nMath.pp_sign = function (value, zeroSign = 1) {\r\n let sign = Math.sign(value);\r\n if (sign == 0) {\r\n sign = Math.sign(zeroSign);\r\n }\r\n return sign;\r\n};\r\n\r\nMath.pp_toDegrees = function (angle) {\r\n return angle * (180 / Math.PI);\r\n};\r\n\r\nMath.pp_toRadians = function (angle) {\r\n return angle * (Math.PI / 180);\r\n};\r\n\r\nMath.pp_roundDecimal = function (number, decimalPlaces) {\r\n let factor = Math.pow(10, decimalPlaces);\r\n number = Math.round(number * factor) / factor;\r\n\r\n return number;\r\n};\r\n\r\n// Start range value doesn't need to be lower than the end one, so you can map from [0,1] to [3,2], where 3 is greater than 2\r\nMath.pp_mapToRange = function (value, originRangeStart, originRangeEnd, newRangeStart, newRangeEnd) {\r\n if (originRangeStart == originRangeEnd) {\r\n return newRangeStart;\r\n }\r\n\r\n let clampedValue = Math.pp_clamp(value, originRangeStart, originRangeEnd);\r\n\r\n if (clampedValue == originRangeStart) {\r\n return newRangeStart;\r\n } else if (clampedValue == originRangeEnd) {\r\n return newRangeEnd;\r\n }\r\n\r\n let newValue = newRangeStart + ((newRangeEnd - newRangeStart) / (originRangeEnd - originRangeStart)) * (clampedValue - originRangeStart);\r\n let clampedNewValue = Math.pp_clamp(newValue, newRangeStart, newRangeEnd);\r\n return clampedNewValue;\r\n};\r\n\r\n//Range is [start, end)\r\nMath.pp_random = function (start = 0, end = 1) {\r\n return Math.random() * (end - start) + start;\r\n};\r\n\r\n//Range is [start, end]\r\nMath.pp_randomInt = function (start, end) {\r\n let min = Math.min(start, end);\r\n let max = Math.max(start, end);\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n};\r\n\r\nMath.pp_randomBool = function () {\r\n return Math.pp_randomInt(0, 1) == 0;\r\n};\r\n\r\n//Return 1 or -1\r\nMath.pp_randomSign = function () {\r\n return (Math.random() < 0.5) ? 1 : -1;\r\n};\r\n\r\n//You give it a list of parameters and returns one\r\nMath.pp_randomPick = function (...args) {\r\n let random = null;\r\n\r\n if (args.length > 0) {\r\n if (args.length == 1 && args[0].length != null) {\r\n if (args[0].length > 0) {\r\n let randomIndex = Math.pp_randomInt(0, args[0].length - 1);\r\n random = args[0][randomIndex];\r\n }\r\n } else {\r\n let randomIndex = Math.pp_randomInt(0, args.length - 1);\r\n random = args[randomIndex];\r\n }\r\n }\r\n\r\n return random;\r\n};\r\n\r\nMath.pp_lerp = function (from, to, interpolationValue) {\r\n if (interpolationValue <= 0) {\r\n return from;\r\n } else if (interpolationValue >= 1) {\r\n return to;\r\n }\r\n\r\n return interpolationValue * (to - from) + from;\r\n};\r\n\r\nPP.EasingFunction = {\r\n linear: t => t,\r\n easeIn: t => t * t * t,\r\n easeOut: t => (t - 1) * (t - 1) * (t - 1) + 1,\r\n easeInOut: t => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\r\n};\r\n\r\nMath.pp_interpolate = function (from, to, interpolationValue, easingFunction = PP.EasingFunction.linear) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return Math.pp_lerp(from, to, lerpValue);\r\n};\r\n\r\nMath.pp_angleDistance = function (from, to) {\r\n return Math.pp_angleDistanceDegrees(from, to);\r\n};\r\n\r\nMath.pp_angleDistanceDegrees = function (from, to) {\r\n return Math.abs(Math.pp_angleDistanceSignedDegrees(from, to));\r\n};\r\n\r\nMath.pp_angleDistanceRadians = function (from, to) {\r\n return Math.abs(Math.pp_angleDistanceSignedRadians(from, to));\r\n};\r\n\r\nMath.pp_angleDistanceSigned = function (from, to) {\r\n return Math.pp_angleDistanceSignedDegrees(from, to);\r\n};\r\n\r\nMath.pp_angleDistanceSignedDegrees = function (from, to) {\r\n let clampedFrom = Math.pp_angleClampDegrees(from, true);\r\n let clampedTo = Math.pp_angleClampDegrees(to, true);\r\n\r\n let distance = clampedTo - clampedFrom;\r\n if (clampedTo - clampedFrom > 180) {\r\n distance = (clampedTo - clampedFrom) - 360;\r\n } else if (clampedTo - clampedFrom < -180) {\r\n distance = (clampedTo - clampedFrom) + 360;\r\n }\r\n\r\n return distance;\r\n};\r\n\r\nMath.pp_angleDistanceSignedRadians = function (from, to) {\r\n return Math.pp_toRadians(Math.pp_angleDistanceSignedDegrees(Math.pp_toDegrees(from), Math.pp_toDegrees(to)));\r\n};\r\n\r\n//Clamp the angle to -180/+180, so that, for example, 270 will be -90\r\n//if usePositiveRange is true, the angle will be clamped to 0/360\r\nMath.pp_angleClamp = function (angle, usePositiveRange = false) {\r\n return Math.pp_angleClampDegrees(angle, usePositiveRange);\r\n};\r\n\r\n//Clamp the angle to -180/+180, so that, for example, 270 will be -90\r\n//if usePositiveRange is true, the angle will be clamped to 0/360\r\nMath.pp_angleClampDegrees = function (angle, usePositiveRange = false) {\r\n let clampedAngle = angle % 360;\r\n\r\n if (clampedAngle < 0) {\r\n clampedAngle += 360;\r\n }\r\n\r\n if (!usePositiveRange) {\r\n if (clampedAngle > 180) {\r\n clampedAngle -= 360;\r\n }\r\n }\r\n\r\n return clampedAngle;\r\n};\r\n\r\n//Clamp the angle to -Pi/+Pi, so that, for example, 270 will be -90\r\n//if usePositiveRange is true, the angle will be clamped to 0/2Pi\r\nMath.pp_angleClampRadians = function (angle, usePositiveRange = false) {\r\n return Math.pp_toRadians(Math.pp_angleClampDegrees(Math.pp_toDegrees(angle), usePositiveRange));\r\n};\r\n\r\n//The range goes from start to end by going toward the positive direction (if useShortestAngle is false)\r\n//[20,300] is a 280 degrees range, [300, 20] is an 80 degrees range, [-150,-170] = [210, 190] is a 240 degrees range, [0, -10] = [0, 350] is a 350 degrees range\r\nMath.pp_isInsideAngleRange = function (angle, start, end, useShortestAngle = false) {\r\n return Math.pp_isInsideAngleRangeDegrees(angle, start, end, useShortestAngle);\r\n};\r\n\r\nMath.pp_isInsideAngleRangeDegrees = function (angle, start, end, useShortestAngle = false) {\r\n let isInside = false;\r\n\r\n let anglePositive = Math.pp_angleClampDegrees(angle, true);\r\n let startPositive = Math.pp_angleClampDegrees(start, true);\r\n let endPositive = Math.pp_angleClampDegrees(end, true);\r\n\r\n if (useShortestAngle) {\r\n if (Math.pp_angleDistanceSignedDegrees(startPositive, endPositive) < 0) {\r\n let temp = startPositive;\r\n startPositive = endPositive;\r\n endPositive = temp;\r\n }\r\n }\r\n\r\n if (startPositive < endPositive) {\r\n isInside = anglePositive >= startPositive && anglePositive <= endPositive;\r\n } else {\r\n isInside = anglePositive >= startPositive || anglePositive <= endPositive;\r\n }\r\n\r\n return isInside;\r\n};\r\n\r\nMath.pp_isInsideAngleRangeRadians = function (angle, start, end, useShortestAngle = false) {\r\n return Math.pp_isInsideAngleRangeDegrees(Math.pp_toDegrees(angle), Math.pp_toDegrees(start), Math.pp_toDegrees(end), useShortestAngle);\r\n};\r\n\r\n\r\n\r\n\r\nfor (let key in Math) {\r\n let prefixes = [\"pp_\", \"_pp_\"];\r\n\r\n let found = false;\r\n for (let prefix of prefixes) {\r\n if (key.startsWith(prefix)) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n Object.defineProperty(Math, key, { enumerable: false });\r\n }\r\n}", "/*!\n * howler.js v2.2.3\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Create the global controller. All contained methods and properties apply\n * to all sounds that are currently playing or will be in the future.\n */\n var HowlerGlobal = function() {\n this.init();\n };\n HowlerGlobal.prototype = {\n /**\n * Initialize the global Howler object.\n * @return {Howler}\n */\n init: function() {\n var self = this || Howler;\n\n // Create a global ID counter.\n self._counter = 1000;\n\n // Pool of unlocked HTML5 Audio objects.\n self._html5AudioPool = [];\n self.html5PoolSize = 10;\n\n // Internal properties.\n self._codecs = {};\n self._howls = [];\n self._muted = false;\n self._volume = 1;\n self._canPlayEvent = 'canplaythrough';\n self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n // Public properties.\n self.masterGain = null;\n self.noAudio = false;\n self.usingWebAudio = true;\n self.autoSuspend = true;\n self.ctx = null;\n\n // Set to false to disable the auto audio unlocker.\n self.autoUnlock = true;\n\n // Setup the various state values for global tracking.\n self._setup();\n\n return self;\n },\n\n /**\n * Get/set the global volume for all sounds.\n * @param {Float} vol Volume from 0.0 to 1.0.\n * @return {Howler/Float} Returns self or current volume.\n */\n volume: function(vol) {\n var self = this || Howler;\n vol = parseFloat(vol);\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n self._volume = vol;\n\n // Don't update any of the nodes if we are muted.\n if (self._muted) {\n return self;\n }\n\n // When using Web Audio, we just need to adjust the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n }\n\n // Loop through and change volume for all HTML5 audio nodes.\n for (var i=0; i=0; i--) {\n self._howls[i].unload();\n }\n\n // Create a new AudioContext to make sure it is fully reset.\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n self.ctx.close();\n self.ctx = null;\n setupAudioContext();\n }\n\n return self;\n },\n\n /**\n * Check for codec support of specific extension.\n * @param {String} ext Audio file extention.\n * @return {Boolean}\n */\n codecs: function(ext) {\n return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n },\n\n /**\n * Setup various state values for global tracking.\n * @return {Howler}\n */\n _setup: function() {\n var self = this || Howler;\n\n // Keeps track of the suspend/resume state of the AudioContext.\n self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n // Automatically begin the 30-second suspend process\n self._autoSuspend();\n\n // Check if audio is available.\n if (!self.usingWebAudio) {\n // No audio is available on this system if noAudio is set to true.\n if (typeof Audio !== 'undefined') {\n try {\n var test = new Audio();\n\n // Check if the canplaythrough event is available.\n if (typeof test.oncanplaythrough === 'undefined') {\n self._canPlayEvent = 'canplay';\n }\n } catch(e) {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n // Test to make sure audio isn't disabled in Internet Explorer.\n try {\n var test = new Audio();\n if (test.muted) {\n self.noAudio = true;\n }\n } catch (e) {}\n\n // Check for supported codecs.\n if (!self.noAudio) {\n self._setupCodecs();\n }\n\n return self;\n },\n\n /**\n * Check for browser support for various codecs and cache the results.\n * @return {Howler}\n */\n _setupCodecs: function() {\n var self = this || Howler;\n var audioTest = null;\n\n // Must wrap in a try/catch because IE11 in server mode throws an error.\n try {\n audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n } catch (err) {\n return self;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n return self;\n }\n\n var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n var ua = self._navigator ? self._navigator.userAgent : '';\n var checkOpera = ua.match(/OPR\\/([0-6].)/g);\n var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n var checkSafari = ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1;\n var safariVersion = ua.match(/Version\\/(.*?) /);\n var isOldSafari = (checkSafari && safariVersion && parseInt(safariVersion[1], 10) < 15);\n\n self._codecs = {\n mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n mpeg: !!mpegTest,\n opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n wav: !!(audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType('audio/wav')).replace(/^no$/, ''),\n aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n m4b: !!(audioTest.canPlayType('audio/x-m4b;') || audioTest.canPlayType('audio/m4b;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n weba: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n webm: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n };\n\n return self;\n },\n\n /**\n * Some browsers/devices will only allow audio to be played after a user interaction.\n * Attempt to automatically unlock audio on the first user interaction.\n * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n * @return {Howler}\n */\n _unlockAudio: function() {\n var self = this || Howler;\n\n // Only run this if Web Audio is supported and it hasn't already been unlocked.\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n // http://stackoverflow.com/questions/24119684\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n // Call this method on touch start to create and play a buffer,\n // then check if the audio actually played to determine if\n // audio has now been unlocked on iOS, Android, etc.\n var unlock = function(e) {\n // Create a pool of unlocked HTML5 Audio objects that can\n // be used for playing sounds without user interaction. HTML5\n // Audio objects must be individually unlocked, as opposed\n // to the WebAudio API which only needs a single activation.\n // This must occur before WebAudio setup or the source.onended\n // event will not fire.\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n var audioNode = new Audio();\n\n // Mark this Audio object as unlocked to ensure it can get returned\n // to the unlocked pool when released.\n audioNode._unlocked = true;\n\n // Add the audio node to the pool.\n self._releaseHtml5Audio(audioNode);\n } catch (e) {\n self.noAudio = true;\n break;\n }\n }\n\n // Loop through any assigned audio nodes and unlock them.\n for (var i=0; i= 55.\n if (typeof self.ctx.resume === 'function') {\n self.ctx.resume();\n }\n\n // Setup a timeout to check that we are unlocked on the next event loop.\n source.onended = function() {\n source.disconnect(0);\n\n // Update the unlocked state and prevent this check from happening again.\n self._audioUnlocked = true;\n\n // Remove the touch start listener.\n document.removeEventListener('touchstart', unlock, true);\n document.removeEventListener('touchend', unlock, true);\n document.removeEventListener('click', unlock, true);\n document.removeEventListener('keydown', unlock, true);\n\n // Let all sounds know that audio has been unlocked.\n for (var i=0; i 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n var start = self._sprite[sprite][0] / 1000;\n var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n sound._sprite = sprite;\n\n // Mark the sound as ended instantly so that this async playback\n // doesn't get grabbed by another call to play while this one waits to start.\n sound._ended = false;\n\n // Update the parameters of the sound.\n var setParams = function() {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n };\n\n // End the sound instantly if seek is at the end.\n if (seek >= stop) {\n self._ended(sound);\n return;\n }\n\n // Begin the actual playback.\n var node = sound._node;\n if (self._webAudio) {\n // Fire this when the sound is ready to play to begin Web Audio playback.\n var playWebAudio = function() {\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n // Setup the playback params.\n var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n sound._playStart = Howler.ctx.currentTime;\n\n // Play the sound using the supported method.\n if (typeof node.bufferSource.start === 'undefined') {\n sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n }\n\n // Start a new timer if none is present.\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n if (!internal) {\n setTimeout(function() {\n self._emit('play', sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (Howler.state === 'running' && Howler.ctx.state !== 'interrupted') {\n playWebAudio();\n } else {\n self._playLock = true;\n\n // Wait for the audio context to resume before playing.\n self.once('resume', playWebAudio);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n } else {\n // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n var playHtml5 = function() {\n node.currentTime = seek;\n node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n node.volume = sound._volume * Howler.volume();\n node.playbackRate = sound._rate;\n\n // Some browsers will throw an error if this is called without user interaction.\n try {\n var play = node.play();\n\n // Support older browsers that don't support promises, and thus don't have this issue.\n if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n self._playLock = true;\n\n // Set param values immediately.\n setParams();\n\n // Releases the lock and executes queued actions.\n play\n .then(function() {\n self._playLock = false;\n node._unlocked = true;\n if (!internal) {\n self._emit('play', sound._id);\n } else {\n self._loadQueue();\n }\n })\n .catch(function() {\n self._playLock = false;\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n\n // Reset the ended and paused values.\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit('play', sound._id);\n }\n\n // Setting rate before playing won't work in IE, so we set it again here.\n node.playbackRate = sound._rate;\n\n // If the node is still paused, then we can assume there was a playback issue.\n if (node.paused) {\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n return;\n }\n\n // Setup the end timer on sprites or listen for the ended event.\n if (sprite !== '__default' || sound._loop) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n } else {\n self._endTimers[sound._id] = function() {\n // Fire ended on this audio node.\n self._ended(sound);\n\n // Clear this listener.\n node.removeEventListener('ended', self._endTimers[sound._id], false);\n };\n node.addEventListener('ended', self._endTimers[sound._id], false);\n }\n } catch (err) {\n self._emit('playerror', sound._id, err);\n }\n };\n\n // If this is streaming audio, make sure the src is set and load again.\n if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n node.src = self._src;\n node.load();\n }\n\n // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n if (node.readyState >= 3 || loadedNoReadyState) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = 'loading';\n\n var listener = function() {\n self._state = 'loaded';\n \n // Begin playback.\n playHtml5();\n\n // Clear this listener.\n node.removeEventListener(Howler._canPlayEvent, listener, false);\n };\n node.addEventListener(Howler._canPlayEvent, listener, false);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n },\n\n /**\n * Pause playback and save current position.\n * @param {Number} id The sound ID (empty to pause all in group).\n * @return {Howl}\n */\n pause: function(id) {\n var self = this;\n\n // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'pause',\n action: function() {\n self.pause(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be paused.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i Returns the group's volume value.\n * volume(id) -> Returns the sound id's current volume.\n * volume(vol) -> Sets the volume of all sounds in this Howl group.\n * volume(vol, id) -> Sets the volume of passed sound id.\n * @return {Howl/Number} Returns self or current volume.\n */\n volume: function() {\n var self = this;\n var args = arguments;\n var vol, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the value of the groups' volume.\n return self._volume;\n } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n // First check if this is an ID, and if not, assume it is a new volume.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n vol = parseFloat(args[0]);\n }\n } else if (args.length >= 2) {\n vol = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the volume or return the current volume.\n var sound;\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'volume',\n action: function() {\n self.volume.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group volume.\n if (typeof id === 'undefined') {\n self._volume = vol;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i 0) ? len / steps : len);\n var lastTick = Date.now();\n\n // Store the value being faded to.\n sound._fadeTo = to;\n\n // Update the volume value on each interval tick.\n sound._interval = setInterval(function() {\n // Update the volume based on the time since the last tick.\n var tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n // Round to within 2 decimal points.\n vol = Math.round(vol * 100) / 100;\n\n // Make sure the volume is in the right bounds.\n if (diff < 0) {\n vol = Math.max(to, vol);\n } else {\n vol = Math.min(to, vol);\n }\n\n // Change the volume.\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n // Set the group's volume.\n if (isGroup) {\n self._volume = vol;\n }\n\n // When the fade is complete, stop it and fire event.\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = null;\n sound._fadeTo = null;\n self.volume(to, sound._id);\n self._emit('fade', sound._id);\n }\n }, stepLen);\n },\n\n /**\n * Internal method that stops the currently playing fade when\n * a new fade starts, volume is changed or the sound is stopped.\n * @param {Number} id The sound id.\n * @return {Howl}\n */\n _stopFade: function(id) {\n var self = this;\n var sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio) {\n sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n }\n\n clearInterval(sound._interval);\n sound._interval = null;\n self.volume(sound._fadeTo, id);\n sound._fadeTo = null;\n self._emit('fade', id);\n }\n\n return self;\n },\n\n /**\n * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n * loop() -> Returns the group's loop value.\n * loop(id) -> Returns the sound id's loop value.\n * loop(loop) -> Sets the loop value for all sounds in this Howl group.\n * loop(loop, id) -> Sets the loop value of passed sound id.\n * @return {Howl/Boolean} Returns self or current loop value.\n */\n loop: function() {\n var self = this;\n var args = arguments;\n var loop, id, sound;\n\n // Determine the values for loop and id.\n if (args.length === 0) {\n // Return the grou's loop value.\n return self._loop;\n } else if (args.length === 1) {\n if (typeof args[0] === 'boolean') {\n loop = args[0];\n self._loop = loop;\n } else {\n // Return this sound's loop value.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._loop : false;\n }\n } else if (args.length === 2) {\n loop = args[0];\n id = parseInt(args[1], 10);\n }\n\n // If no id is passed, get all ID's to be looped.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current playback rate.\n * rate(id) -> Returns the sound id's current playback rate.\n * rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n * rate(rate, id) -> Sets the playback rate of passed sound id.\n * @return {Howl/Number} Returns self or the current playback rate.\n */\n rate: function() {\n var self = this;\n var args = arguments;\n var rate, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current rate of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new rate value.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n rate = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n rate = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the playback rate or return the current value.\n var sound;\n if (typeof rate === 'number') {\n // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'rate',\n action: function() {\n self.rate.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group rate.\n if (typeof id === 'undefined') {\n self._rate = rate;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current seek position.\n * seek(id) -> Returns the sound id's current seek position.\n * seek(seek) -> Sets the seek position of the first sound node.\n * seek(seek, id) -> Sets the seek position of passed sound id.\n * @return {Howl/Number} Returns self or the current seek position.\n */\n seek: function() {\n var self = this;\n var args = arguments;\n var seek, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current position of the first node.\n if (self._sounds.length) {\n id = self._sounds[0]._id;\n }\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new seek position.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]._id;\n seek = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n seek = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // If there is no ID, bail out.\n if (typeof id === 'undefined') {\n return 0;\n }\n\n // If the sound hasn't loaded, add it to the load queue to seek when capable.\n if (typeof seek === 'number' && (self._state !== 'loaded' || self._playLock)) {\n self._queue.push({\n event: 'seek',\n action: function() {\n self.seek.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Get the sound.\n var sound = self._soundById(id);\n\n if (sound) {\n if (typeof seek === 'number' && seek >= 0) {\n // Pause the sound and update position for restarting playback.\n var playing = self.playing(id);\n if (playing) {\n self.pause(id, true);\n }\n\n // Move the position of the track and cancel timer.\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n // Update the seek position for HTML5 Audio.\n if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n // Seek and emit when ready.\n var seekAndEmit = function() {\n // Restart the playback if the sound was playing.\n if (playing) {\n self.play(id, true);\n }\n\n self._emit('seek', id);\n };\n\n // Wait for the play lock to be unset before emitting (HTML5 Audio).\n if (playing && !self._webAudio) {\n var emitSeek = function() {\n if (!self._playLock) {\n seekAndEmit();\n } else {\n setTimeout(emitSeek, 0);\n }\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n } else {\n if (self._webAudio) {\n var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n } else {\n return sound._node.currentTime;\n }\n }\n }\n\n return self;\n },\n\n /**\n * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n * @param {Number} id The sound id to check. If none is passed, the whole sound group is checked.\n * @return {Boolean} True if playing and false if not.\n */\n playing: function(id) {\n var self = this;\n\n // Check the passed sound ID (if any).\n if (typeof id === 'number') {\n var sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n // Otherwise, loop through all sounds and check if any are playing.\n for (var i=0; i= 0) {\n Howler._howls.splice(index, 1);\n }\n\n // Delete this sound from the cache (if no other Howl is using it).\n var remCache = true;\n for (i=0; i= 0) {\n remCache = false;\n break;\n }\n }\n\n if (cache && remCache) {\n delete cache[self._src];\n }\n\n // Clear global errors.\n Howler.noAudio = false;\n\n // Clear out `self`.\n self._state = 'unloaded';\n self._sounds = [];\n self = null;\n\n return null;\n },\n\n /**\n * Listen to a custom event.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @param {Number} once (INTERNAL) Marks event to fire only once.\n * @return {Howl}\n */\n on: function(event, fn, id, once) {\n var self = this;\n var events = self['_on' + event];\n\n if (typeof fn === 'function') {\n events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n }\n\n return self;\n },\n\n /**\n * Remove a custom event. Call without parameters to remove all events.\n * @param {String} event Event name.\n * @param {Function} fn Listener to remove. Leave empty to remove all.\n * @param {Number} id (optional) Only remove events for this sound.\n * @return {Howl}\n */\n off: function(event, fn, id) {\n var self = this;\n var events = self['_on' + event];\n var i = 0;\n\n // Allow passing just an event and ID.\n if (typeof fn === 'number') {\n id = fn;\n fn = null;\n }\n\n if (fn || id) {\n // Loop through event store and remove the passed function.\n for (i=0; i=0; i--) {\n // Only fire the listener if the correct ID is used.\n if (!events[i].id || events[i].id === id || event === 'load') {\n setTimeout(function(fn) {\n fn.call(this, id, msg);\n }.bind(self, events[i].fn), 0);\n\n // If this event was setup with `once`, remove it.\n if (events[i].once) {\n self.off(event, events[i].fn, events[i].id);\n }\n }\n }\n\n // Pass the event type into load queue so that it can continue stepping.\n self._loadQueue(event);\n\n return self;\n },\n\n /**\n * Queue of actions initiated before the sound has loaded.\n * These will be called in sequence, with the next only firing\n * after the previous has finished executing (even if async like play).\n * @return {Howl}\n */\n _loadQueue: function(event) {\n var self = this;\n\n if (self._queue.length > 0) {\n var task = self._queue[0];\n\n // Remove this task if a matching event was passed.\n if (task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n\n // Run the task if no event type is passed.\n if (!event) {\n task.action();\n }\n }\n\n return self;\n },\n\n /**\n * Fired when playback ends at the end of the duration.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _ended: function(sound) {\n var self = this;\n var sprite = sound._sprite;\n\n // If we are using IE and there was network latency we may be clipping\n // audio before it completes playing. Lets check the node to make sure it\n // believes it has completed, before ending the playback.\n if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n setTimeout(self._ended.bind(self, sound), 100);\n return self;\n }\n\n // Should this sound loop?\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n // Fire the ended event.\n self._emit('end', sound._id);\n\n // Restart the playback for HTML5 Audio loop.\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n // Restart this timer if on a Web Audio loop.\n if (self._webAudio && loop) {\n self._emit('play', sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = Howler.ctx.currentTime;\n\n var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n // Mark the node as paused.\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n\n // Attempt to auto-suspend AudioContext if no sounds are still playing.\n Howler._autoSuspend();\n }\n\n // When using a sprite, end the track.\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n },\n\n /**\n * Clear the end timer for a sound playback.\n * @param {Number} id The sound ID.\n * @return {Howl}\n */\n _clearTimer: function(id) {\n var self = this;\n\n if (self._endTimers[id]) {\n // Clear the timeout or remove the ended listener.\n if (typeof self._endTimers[id] !== 'function') {\n clearTimeout(self._endTimers[id]);\n } else {\n var sound = self._soundById(id);\n if (sound && sound._node) {\n sound._node.removeEventListener('ended', self._endTimers[id], false);\n }\n }\n\n delete self._endTimers[id];\n }\n\n return self;\n },\n\n /**\n * Return the sound identified by this ID, or return null.\n * @param {Number} id Sound ID\n * @return {Object} Sound object or null.\n */\n _soundById: function(id) {\n var self = this;\n\n // Loop through all sounds and find the one with this ID.\n for (var i=0; i=0; i--) {\n if (cnt <= limit) {\n return;\n }\n\n if (self._sounds[i]._ended) {\n // Disconnect the audio source when using Web Audio.\n if (self._webAudio && self._sounds[i]._node) {\n self._sounds[i]._node.disconnect(0);\n }\n\n // Remove sounds until we have the pool size.\n self._sounds.splice(i, 1);\n cnt--;\n }\n }\n },\n\n /**\n * Get all ID's from the sounds pool.\n * @param {Number} id Only return one ID if one is passed.\n * @return {Array} Array of IDs.\n */\n _getSoundIds: function(id) {\n var self = this;\n\n if (typeof id === 'undefined') {\n var ids = [];\n for (var i=0; i= 0;\n\n if (Howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n }\n }\n node.bufferSource = null;\n\n return self;\n },\n\n /**\n * Set the source to a 0-second silence to stop any downloading (except in IE).\n * @param {Object} node Audio node to clear.\n */\n _clearSound: function(node) {\n var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n if (!checkIE) {\n node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n }\n }\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Setup the sound object, which each node attached to a Howl group is contained in.\n * @param {Object} howl The Howl parent group.\n */\n var Sound = function(howl) {\n this._parent = howl;\n this.init();\n };\n Sound.prototype = {\n /**\n * Initialize a new Sound object.\n * @return {Sound}\n */\n init: function() {\n var self = this;\n var parent = self._parent;\n\n // Setup the default parameters.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a unique ID for this sound.\n self._id = ++Howler._counter;\n\n // Add itself to the parent's pool.\n parent._sounds.push(self);\n\n // Create the new node.\n self.create();\n\n return self;\n },\n\n /**\n * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n * @return {Sound}\n */\n create: function() {\n var self = this;\n var parent = self._parent;\n var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n if (parent._webAudio) {\n // Create the gain node for controlling volume (the source will connect to this).\n self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n self._node.paused = true;\n self._node.connect(Howler.masterGain);\n } else if (!Howler.noAudio) {\n // Get an unlocked Audio object from the pool.\n self._node = Howler._obtainHtml5Audio();\n\n // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n self._errorFn = self._errorListener.bind(self);\n self._node.addEventListener('error', self._errorFn, false);\n\n // Listen for 'canplaythrough' event to let us know the sound is ready.\n self._loadFn = self._loadListener.bind(self);\n self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n // Listen for the 'ended' event on the sound to account for edge-case where\n // a finite sound has a duration of Infinity.\n self._endFn = self._endListener.bind(self);\n self._node.addEventListener('ended', self._endFn, false);\n\n // Setup the new audio node.\n self._node.src = parent._src;\n self._node.preload = parent._preload === true ? 'auto' : parent._preload;\n self._node.volume = volume * Howler.volume();\n\n // Begin loading the source.\n self._node.load();\n }\n\n return self;\n },\n\n /**\n * Reset the parameters of this sound to the original state (for recycle).\n * @return {Sound}\n */\n reset: function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all of the parameters of this sound.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a new ID so that it isn't confused with the previous sound.\n self._id = ++Howler._counter;\n\n return self;\n },\n\n /**\n * HTML5 Audio error listener callback.\n */\n _errorListener: function() {\n var self = this;\n\n // Fire an error event and pass back the code.\n self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n // Clear the event listener.\n self._node.removeEventListener('error', self._errorFn, false);\n },\n\n /**\n * HTML5 Audio canplaythrough listener callback.\n */\n _loadListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Setup a sprite if none is defined.\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = {__default: [0, parent._duration * 1000]};\n }\n\n if (parent._state !== 'loaded') {\n parent._state = 'loaded';\n parent._emit('load');\n parent._loadQueue();\n }\n\n // Clear the event listener.\n self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n },\n\n /**\n * HTML5 Audio ended listener callback.\n */\n _endListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Only handle the `ended`` event if the duration is Infinity.\n if (parent._duration === Infinity) {\n // Update the parent duration to match the real audio duration.\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Update the sprite that corresponds to the real duration.\n if (parent._sprite.__default[1] === Infinity) {\n parent._sprite.__default[1] = parent._duration * 1000;\n }\n\n // Run the regular ended method.\n parent._ended(self);\n }\n\n // Clear the event listener since the duration is now correct.\n self._node.removeEventListener('ended', self._endFn, false);\n }\n };\n\n /** Helper Methods **/\n /***************************************************************************/\n\n var cache = {};\n\n /**\n * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n * @param {Howl} self\n */\n var loadBuffer = function(self) {\n var url = self._src;\n\n // Check if the buffer has already been cached and use it instead.\n if (cache[url]) {\n // Set the duration from the cache.\n self._duration = cache[url].duration;\n\n // Load the sound into this Howl.\n loadSound(self);\n\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n // Decode the base64 data URI without XHR, since some browsers don't support it.\n var data = atob(url.split(',')[1]);\n var dataView = new Uint8Array(data.length);\n for (var i=0; i 0) {\n cache[self._src] = buffer;\n loadSound(self, buffer);\n } else {\n error();\n }\n };\n\n // Decode the buffer into an audio source.\n if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n } else {\n Howler.ctx.decodeAudioData(arraybuffer, success, error);\n }\n }\n\n /**\n * Sound is now loaded, so finish setting everything up and fire the loaded event.\n * @param {Howl} self\n * @param {Object} buffer The decoded buffer sound source.\n */\n var loadSound = function(self, buffer) {\n // Set the duration.\n if (buffer && !self._duration) {\n self._duration = buffer.duration;\n }\n\n // Setup a sprite if none is defined.\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = {__default: [0, self._duration * 1000]};\n }\n\n // Fire the loaded event.\n if (self._state !== 'loaded') {\n self._state = 'loaded';\n self._emit('load');\n self._loadQueue();\n }\n };\n\n /**\n * Setup the audio context when available, or switch to HTML5 Audio mode.\n */\n var setupAudioContext = function() {\n // If we have already detected that Web Audio isn't supported, don't run this step again.\n if (!Howler.usingWebAudio) {\n return;\n }\n\n // Check if we are using Web Audio and setup the AudioContext if we are.\n try {\n if (typeof AudioContext !== 'undefined') {\n Howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== 'undefined') {\n Howler.ctx = new webkitAudioContext();\n } else {\n Howler.usingWebAudio = false;\n }\n } catch(e) {\n Howler.usingWebAudio = false;\n }\n\n // If the audio context creation still failed, set using web audio to false.\n if (!Howler.ctx) {\n Howler.usingWebAudio = false;\n }\n\n // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n // If it is, disable Web Audio as it causes crashing.\n var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n var version = appVersion ? parseInt(appVersion[1], 10) : null;\n if (iOS && version && version < 9) {\n var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n if (Howler._navigator && !safari) {\n Howler.usingWebAudio = false;\n }\n }\n\n // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n if (Howler.usingWebAudio) {\n Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : Howler._volume, Howler.ctx.currentTime);\n Howler.masterGain.connect(Howler.ctx.destination);\n }\n\n // Re-run the setup on Howler.\n Howler._setup();\n };\n\n // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n if (typeof define === 'function' && define.amd) {\n define([], function() {\n return {\n Howler: Howler,\n Howl: Howl\n };\n });\n }\n\n // Add support for CommonJS libraries such as browserify.\n if (typeof exports !== 'undefined') {\n exports.Howler = Howler;\n exports.Howl = Howl;\n }\n\n // Add to global in Node.js (for testing, etc).\n if (typeof global !== 'undefined') {\n global.HowlerGlobal = HowlerGlobal;\n global.Howler = Howler;\n global.Howl = Howl;\n global.Sound = Sound;\n } else if (typeof window !== 'undefined') { // Define globally in case AMD is not available or unused.\n window.HowlerGlobal = HowlerGlobal;\n window.Howler = Howler;\n window.Howl = Howl;\n window.Sound = Sound;\n }\n})();\n\n\n/*!\n * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n * \n * howler.js v2.2.3\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n // Setup default properties.\n HowlerGlobal.prototype._pos = [0, 0, 0];\n HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Helper method to update the stereo panning position of all current Howls.\n * Future Howls will not use this value unless explicitly set.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @return {Howler/Number} Self or current stereo panning value.\n */\n HowlerGlobal.prototype.stereo = function(pan) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Loop through all Howls and update their stereo panning.\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].stereo(pan);\n }\n\n return self;\n };\n\n /**\n * Get/set the position of the listener in 3D cartesian space. Sounds using\n * 3D position will be relative to the listener's position.\n * @param {Number} x The x-position of the listener.\n * @param {Number} y The y-position of the listener.\n * @param {Number} z The z-position of the listener.\n * @return {Howler/Array} Self or current listener position.\n */\n HowlerGlobal.prototype.pos = function(x, y, z) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._pos[1] : y;\n z = (typeof z !== 'number') ? self._pos[2] : z;\n\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n\n if (typeof self.ctx.listener.positionX !== 'undefined') {\n self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n }\n } else {\n return self._pos;\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the listener is pointing in the 3D cartesian space.\n * A front and up vector must be provided. The front is the direction the\n * face of the listener is pointing, and up is the direction the top of the\n * listener is pointing. Thus, these values are expected to be at right angles\n * from each other.\n * @param {Number} x The x-orientation of the listener.\n * @param {Number} y The y-orientation of the listener.\n * @param {Number} z The z-orientation of the listener.\n * @param {Number} xUp The x-orientation of the top of the listener.\n * @param {Number} yUp The y-orientation of the top of the listener.\n * @param {Number} zUp The z-orientation of the top of the listener.\n * @return {Howler/Array} Returns self or the current orientation vectors.\n */\n HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n var or = self._orientation;\n y = (typeof y !== 'number') ? or[1] : y;\n z = (typeof z !== 'number') ? or[2] : z;\n xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n if (typeof x === 'number') {\n self._orientation = [x, y, z, xUp, yUp, zUp];\n\n if (typeof self.ctx.listener.forwardX !== 'undefined') {\n self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upX.setTargetAtTime(xUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upY.setTargetAtTime(yUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upZ.setTargetAtTime(zUp, Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n }\n } else {\n return or;\n }\n\n return self;\n };\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core init.\n * @param {Function} _super Core init method.\n * @return {Howl}\n */\n Howl.prototype.init = (function(_super) {\n return function(o) {\n var self = this;\n\n // Setup user-defined default properties.\n self._orientation = o.orientation || [1, 0, 0];\n self._stereo = o.stereo || null;\n self._pos = o.pos || null;\n self._pannerAttr = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n };\n\n // Setup event listeners.\n self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n // Complete initilization with howler.js core's init function.\n return _super.call(this, o);\n };\n })(Howl.prototype.init);\n\n /**\n * Get/set the stereo panning of the audio source for this sound or all in the group.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Number} Returns self or the current stereo panning value.\n */\n Howl.prototype.stereo = function(pan, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'stereo',\n action: function() {\n self.stereo(pan, id);\n }\n });\n\n return self;\n }\n\n // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n // Setup the group's stereo panning if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's stereo panning if no parameters are passed.\n if (typeof pan === 'number') {\n self._stereo = pan;\n self._pos = [pan, 0, 0];\n } else {\n return self._stereo;\n }\n }\n\n // Change the streo panning of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the group's values.\n * pannerAttr(id) -> Returns the sound id's values.\n * pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n * pannerAttr(o, id) -> Set's the values of passed sound id.\n *\n * Attributes:\n * coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * inside of which there will be no volume reduction.\n * coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n * `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n * listener. Can be `linear`, `inverse` or `exponential.\n * maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n * will not be reduced any further.\n * refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n * This is simply a variable of the distance model and has a different effect depending on which model\n * is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n * variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, \u221E]`\n * with `inverse` and `exponential`.\n * panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n * Can be `HRTF` or `equalpower`.\n *\n * @return {Howl/Object} Returns self or current panner attributes.\n */\n Howl.prototype.pannerAttr = function() {\n var self = this;\n var args = arguments;\n var o, id, sound;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the group's panner attribute values.\n return self._pannerAttr;\n } else if (args.length === 1) {\n if (typeof args[0] === 'object') {\n o = args[0];\n\n // Set the grou's panner attribute values.\n if (typeof id === 'undefined') {\n if (!o.pannerAttr) {\n o.pannerAttr = {\n coneInnerAngle: o.coneInnerAngle,\n coneOuterAngle: o.coneOuterAngle,\n coneOuterGain: o.coneOuterGain,\n distanceModel: o.distanceModel,\n maxDistance: o.maxDistance,\n refDistance: o.refDistance,\n rolloffFactor: o.rolloffFactor,\n panningModel: o.panningModel\n };\n }\n\n self._pannerAttr = {\n coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n };\n }\n } else {\n // Return this sound's panner attribute values.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._pannerAttr : self._pannerAttr;\n }\n } else if (args.length === 2) {\n o = args[0];\n id = parseInt(args[1], 10);\n }\n\n // Update the values of the specified sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i 0) {\r\n this._myAddVelocityDelay--;\r\n if (this._myAddVelocityDelay == 0) {\r\n for (let physX of this._myDynamicPhysXComponents) {\r\n physX.kinematic = false;\r\n let strength = 50;\r\n physX.linearVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n physX.angularVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n }\r\n }\r\n }\r\n\r\n for (let physX of this._myKinematicPhysXObjects) {\r\n let strength = 5 * dt;\r\n this._myTranslateVec3.vec3_set(Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength));\r\n physX.pp_translate(this._myTranslateVec3);\r\n\r\n rotateStrength = 50 * dt;\r\n this._myRotateVec3.vec3_set(Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength));\r\n physX.pp_rotate(this._myRotateVec3);\r\n }\r\n },\r\n _raycastTest(debugActive) {\r\n let raycastCount = this._myRaycastCount;\r\n\r\n let distance = 10000;\r\n\r\n for (let i = 0; i < raycastCount; i++) {\r\n let origin = [Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign()];\r\n let direction = [Math.pp_random(-1, 1), Math.pp_random(-1, 1), Math.pp_random(-1, 1)];\r\n direction.vec3_normalize(direction);\r\n\r\n this._myRaycastSetup.myOrigin.vec3_copy(origin);\r\n this._myRaycastSetup.myDirection.vec3_copy(direction);\r\n this._myRaycastSetup.myDistance = distance;\r\n this._myRaycastSetup.myBlockLayerFlags.setMask(255);\r\n\r\n let raycastResult = PP.PhysicsUtils.raycast(this._myRaycastSetup, this._myRaycastResult);\r\n\r\n if (debugActive) {\r\n PP.myDebugVisualManager.drawRaycast(this._myDebugTimer.getDuration(), raycastResult, true, 5, 0.015);\r\n }\r\n }\r\n },\r\n _spawnDome(isStatic, isDynamic) {\r\n let maxCount = this._myStaticPhysXCount;\r\n let physXList = this._myStaticPhysXObjects;\r\n let cloves = Math.ceil(Math.sqrt(this._myStaticPhysXCount));\r\n if (!isStatic) {\r\n if (isDynamic) {\r\n cloves = Math.ceil(Math.sqrt(this._myDynamicPhysXCount));\r\n maxCount = this._myDynamicPhysXCount;\r\n physXList = this._myDynamicPhysXObjects;\r\n } else {\r\n cloves = Math.ceil(Math.sqrt(this._myKinematicPhysXCount));\r\n maxCount = this._myKinematicPhysXCount;\r\n physXList = this._myKinematicPhysXObjects;\r\n }\r\n }\r\n\r\n let angleForClove = Math.PI * 2 / cloves;\r\n\r\n let minDistance = Math.max(0, this._myStaticDomeSize - 20);\r\n let maxDistance = this._myStaticDomeSize + 20;\r\n\r\n if (!isStatic) {\r\n if (isDynamic) {\r\n minDistance = Math.max(0, this._myDynamicDomeSize - 20);\r\n maxDistance = this._myDynamicDomeSize + 20;\r\n } else {\r\n minDistance = Math.max(0, this._myKinematicDomeSize - 20);\r\n maxDistance = this._myKinematicDomeSize + 20;\r\n }\r\n }\r\n\r\n let minExtraRotation = 0;\r\n let maxExtraRotation = Math.pp_toRadians(10);\r\n\r\n let upDirection = [0, 1, 0];\r\n let horizontalDirection = [0, 0, -1];\r\n\r\n for (let i = 0; i < cloves / 2; i++) {\r\n let verticalDirection = [0, 1, 0];\r\n\r\n let rotationAxis = [];\r\n glMatrix.vec3.cross(rotationAxis, horizontalDirection, verticalDirection);\r\n glMatrix.vec3.normalize(rotationAxis, rotationAxis);\r\n\r\n for (let j = 0; j < cloves; j++) {\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.slice(0);\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n glMatrix.vec3.scale(physXDirection, physXDirection, distance);\r\n\r\n this._addPhysX(physXDirection, isStatic, isDynamic);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.slice(0);\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n glMatrix.vec3.scale(physXDirection, physXDirection, distance);\r\n\r\n this._addPhysX(physXDirection, isStatic, isDynamic);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n }\r\n\r\n horizontalDirection.vec3_rotateAxisRadians(angleForClove, upDirection, horizontalDirection);\r\n }\r\n },\r\n _addPhysX(physXDirection, isStatic, isDynamic) {\r\n let position = physXDirection;\r\n let scale = Math.pp_random(1, 10);\r\n let shape = Math.pp_randomPick(WL.Shape.Sphere, WL.Shape.Box);\r\n if (this._myUseConvexMesh) {\r\n shape = WL.Shape.ConvexMesh;\r\n scale *= this._myShapeScaleMultiplier;\r\n }\r\n\r\n let physX = WL.scene.addObject(this._myRootObject);\r\n physX.pp_setPosition(position);\r\n\r\n let physXComponent = physX.pp_addComponent(\"physx\", {\r\n \"shape\": shape, \"shapeData\": { index: this._myShapeIndex },\r\n \"extents\": [scale, scale, scale],\r\n \"static\": isStatic,\r\n \"kinematic\": !isDynamic,\r\n \"mass\": 1\r\n });\r\n\r\n if (isStatic) {\r\n this._myStaticPhysXObjects.push(physX);\r\n this._myStaticPhysXComponents.push(physXComponent);\r\n this._myStaticPhysXCollectors.push(new PP.PhysXCollisionCollector(physXComponent));\r\n } else if (isDynamic) {\r\n this._myDynamicPhysXObjects.push(physX);\r\n this._myDynamicPhysXComponents.push(physXComponent);\r\n this._myDynamicPhysXCollectors.push(new PP.PhysXCollisionCollector(physXComponent));\r\n } else {\r\n this._myKinematicPhysXObjects.push(physX);\r\n this._myKinematicPhysXComponents.push(physXComponent);\r\n this._myKinematicPhysXCollectors.push(new PP.PhysXCollisionCollector(physXComponent));\r\n }\r\n }\r\n});", "WL.registerComponent(\"pp-benchmark-max-visible-triangles\", {\r\n _myTargetFrameRate: { type: WL.Type.Int, default: -1 }, // -1 means it will auto detect it at start\r\n _myTargetFrameRateThreshold: { type: WL.Type.Int, default: 3 },\r\n _myStartPlaneCount: { type: WL.Type.Int, default: 1 },\r\n _myPlaneTriangles: { type: WL.Type.Int, default: 100 },\r\n _mySecondsBeforeDoubling: { type: WL.Type.Float, default: 0.5 }, // higher gives a better frame rate evaluation\r\n _myDTHistoryToIgnorePercentage: { type: WL.Type.Float, default: 0.25 },\r\n _myCloneMaterial: { type: WL.Type.Bool, default: false },\r\n _myCloneMesh: { type: WL.Type.Bool, default: false },\r\n\r\n _myEnableLog: { type: WL.Type.Bool, default: true },\r\n\r\n _myPlaneMaterial: { type: WL.Type.Material },\r\n _myBackgroundMaterial: { type: WL.Type.Material },\r\n _myTextMaterial: { type: WL.Type.Material, default: null },\r\n}, {\r\n _start() {\r\n this._myBackgroundSize = 4;\r\n this._myBackgroundObject.pp_setActive(true);\r\n this._myBackgroundObject.pp_setScale(this._myBackgroundSize + 0.1);\r\n this._myBackgroundObject.pp_translate([0, 0, -0.001]);\r\n\r\n this._myDoubleTimer = new PP.Timer(this._mySecondsBeforeDoubling);\r\n this._myIsDone = false;\r\n\r\n this._myCurrentPlanes = this._myStartPlaneCount;\r\n\r\n this._myDTHistory = [];\r\n\r\n this._myUpperLimit = -1;\r\n this._myLowerLimit = 0;\r\n\r\n this._myPlanes = [];\r\n this._mySkipNextFrames = 0;\r\n this._myMaxWaitFrames = 0;\r\n\r\n this._myMaxPlanesReached = false;\r\n\r\n this._myFirstTime = true;\r\n },\r\n _update(dt) {\r\n // Skip lag frames after the new set of plane has been shown, wait for it to be stable\r\n {\r\n if (dt < 0.00001) {\r\n return;\r\n }\r\n\r\n if (dt > 0.5 && this._myMaxWaitFrames > 0) {\r\n this._myMaxWaitFrames--;\r\n return;\r\n }\r\n\r\n this._myMaxWaitFrames = 10;\r\n\r\n if (this._mySkipNextFrames > 0) {\r\n this._mySkipNextFrames--;\r\n return;\r\n }\r\n }\r\n\r\n if (!this._myIsDone) {\r\n this._myDoubleTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myDoubleTimer.isDone()) {\r\n this._myDoubleTimer.start();\r\n\r\n let frameRate = this._computeAverageFrameRate(false);\r\n\r\n if (this._myFirstTime) {\r\n this._myFirstTime = false;\r\n } else {\r\n\r\n // if there is not lag, the current plane count is a good lower limit, otherwise the current count is now a upper threshold, we have to search below it\r\n let isLagging = false;\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n this._myUpperLimit = this._myCurrentPlanes;\r\n\r\n isLagging = true;\r\n\r\n if (this._myUpperLimit == 1) {\r\n this._myLowerLimit = 1;\r\n }\r\n } else {\r\n this._myLowerLimit = this._myCurrentPlanes;\r\n if (this._myUpperLimit > 0) {\r\n this._myUpperLimit = Math.max(this._myUpperLimit, this._myLowerLimit);\r\n }\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myCurrentPlanes * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myCurrentPlanes;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n if (isLagging) {\r\n this._myTriangleTextComponent.material.color = this._myLagColor;\r\n this._myPlaneTextComponent.material.color = this._myLagColor;\r\n this._myFPSTextComponent.material.color = this._myLagColor;\r\n } else {\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n }\r\n\r\n let reset = false;\r\n\r\n // check if the binary search is completed\r\n if ((this._myUpperLimit > 0 &&\r\n (!isLagging && (this._myUpperLimit - this._myLowerLimit) <= Math.max(2, 1000 / this._myRealTrianglesAmount)) ||\r\n (isLagging && (this._myUpperLimit - this._myLowerLimit) <= 1)) ||\r\n (!isLagging && this._myMaxPlanesReached)) {\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n // going a bit back with the binary search, maybe the lower limit was not lower after all cause of a bad assumption of average FPS\r\n this._myLowerLimit = Math.max(1, Math.floor(this._myUpperLimit / 2.5));\r\n this._myUpperLimit = 0;\r\n reset = true;\r\n\r\n if (this._myEnableLog) {\r\n console.log(\"Rst - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n } else {\r\n if (this._myMaxPlanesReached) {\r\n if (this._myEnableLog) {\r\n console.log(\"Aborted - Max Planes Reached\");\r\n\r\n this._myDoneTextComponent.text = \"Aborted - Max Planes Reached\";\r\n }\r\n } else {\r\n this._displayPlanes(this._myLowerLimit);\r\n\r\n if (this._myEnableLog) {\r\n console.log(\"\\nEnd - Triangles:\", this._myLowerLimit * this._myRealTrianglesAmount, \"- Planes:\", this._myLowerLimit, \"- Frame Rate:\", frameRate);\r\n console.log(\"Plane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myLowerLimit * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myLowerLimit;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n this._myDoneTextComponent.text = \"End\";\r\n }\r\n this._myIsDone = true;\r\n }\r\n }\r\n\r\n if (isLagging && !reset) {\r\n if (this._myEnableLog) {\r\n console.log(\"Lag - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n }\r\n\r\n if (!this._myIsDone) {\r\n // sort of binary search, if there is no upper limit yet, just double\r\n if (this._myUpperLimit > 0) {\r\n this._myCurrentPlanes = Math.floor((this._myUpperLimit + this._myLowerLimit) / 2);\r\n this._myCurrentPlanes = Math.max(this._myCurrentPlanes, 1);\r\n } else if (!reset) {\r\n this._myCurrentPlanes = this._myLowerLimit * 2;\r\n } else {\r\n this._myCurrentPlanes = this._myLowerLimit;\r\n }\r\n\r\n if (this._myCurrentPlanes > 50000) {\r\n this._myCurrentPlanes = 50000;\r\n this._myMaxPlanesReached = true;\r\n } else {\r\n this._myMaxPlanesReached = false;\r\n }\r\n }\r\n }\r\n\r\n if (!this._myIsDone) {\r\n this._displayPlanes(this._myCurrentPlanes);\r\n this._myElapsedTime = 0;\r\n this._myFrameCount = 0;\r\n\r\n this._mySkipNextFrames = 30;\r\n }\r\n }\r\n }\r\n },\r\n _displayPlanes(count) {\r\n while (this._myPlanes.length > count) {\r\n let plane = this._myPlanes.pop();\r\n this._myPlanePool.release(plane);\r\n }\r\n\r\n while (this._myPlanes.length < count) {\r\n let plane = this._myPlanePool.get();\r\n this._myPlanes.push(plane);\r\n }\r\n\r\n let gridSize = 1;\r\n while (gridSize * gridSize < count) {\r\n gridSize++;\r\n }\r\n\r\n let spaceBetween = 0.01;\r\n let totalSpaceBetween = spaceBetween * (gridSize - 1);\r\n let planeSize = (this._myBackgroundSize * 2 - totalSpaceBetween) / (gridSize * 2);\r\n\r\n let currentCount = count;\r\n\r\n for (let i = 0; i < gridSize && currentCount > 0; i++) {\r\n for (let j = 0; j < gridSize && currentCount > 0; j++) {\r\n let plane = this._myPlanes[currentCount - 1];\r\n plane.pp_setScale(planeSize);\r\n\r\n let position = [-this._myBackgroundSize + planeSize + j * planeSize * 2 + j * spaceBetween, this._myBackgroundSize - planeSize - i * planeSize * 2 - i * spaceBetween, 0];\r\n\r\n plane.pp_setPositionLocal(position);\r\n plane.pp_setActive(true);\r\n\r\n currentCount--;\r\n }\r\n }\r\n },\r\n start() {\r\n this._myLagColor = [0.5, 0, 0, 1];\r\n this._myNormalColor = [0, 0, 0, 1];\r\n\r\n this._myRealTrianglesAmount = 0;\r\n\r\n this._myTrianglesObject = WL.scene.addObject(this.object);\r\n\r\n this._myBackgroundObject = WL.scene.addObject(this._myTrianglesObject);\r\n {\r\n let meshComponent = this._myBackgroundObject.addComponent('mesh');\r\n meshComponent.mesh = PP.MeshUtils.createPlaneMesh();\r\n meshComponent.material = this._myBackgroundMaterial.clone();\r\n }\r\n\r\n this._myPlaneObject = WL.scene.addObject(this._myTrianglesObject);\r\n {\r\n let meshComponent = this._myPlaneObject.addComponent('mesh');\r\n meshComponent.mesh = this._createPlaneMesh(this._myPlaneTriangles);\r\n this._myRealTrianglesAmount = meshComponent.mesh.indexData.length / 3;\r\n meshComponent.material = this._myPlaneMaterial.clone();\r\n }\r\n\r\n let poolParams = new PP.ObjectPoolParams();\r\n if (!this._myCloneMesh) {\r\n poolParams.myInitialPoolSize = 30000;\r\n } else {\r\n if (this._myRealTrianglesAmount <= 4) {\r\n poolParams.myInitialPoolSize = 15000;\r\n } else if (this._myRealTrianglesAmount <= 8) {\r\n poolParams.myInitialPoolSize = 10000;\r\n } else if (this._myRealTrianglesAmount <= 64) {\r\n poolParams.myInitialPoolSize = 7500;\r\n } else {\r\n poolParams.myInitialPoolSize = 5000;\r\n }\r\n }\r\n poolParams.myPercentageToAddWhenEmpty = 0;\r\n poolParams.myAmountToAddWhenEmpty = 10000;\r\n poolParams.myCloneParams = new PP.CloneParams();\r\n poolParams.myCloneParams.myDeepCloneParams.setDeepCloneComponentVariable(\"mesh\", \"material\", this._myCloneMaterial);\r\n poolParams.myCloneParams.myDeepCloneParams.setDeepCloneComponentVariable(\"mesh\", \"mesh\", this._myCloneMesh);\r\n this._myPlanePool = new PP.ObjectPool(this._myPlaneObject, poolParams);\r\n\r\n this._myBackgroundObject.pp_setActive(false);\r\n this._myPlaneObject.pp_setActive(false);\r\n\r\n this._myStartTimer = new PP.Timer(this._mySecondsBeforeDoubling * 2);\r\n this._mySessionStarted = false;\r\n\r\n this._myTextsObject = WL.scene.addObject(this._myTrianglesObject);\r\n //this._myTextsObject.pp_addComponent(\"pp-easy-transform\");\r\n\r\n this._myTriangleTextObject = WL.scene.addObject(this._myTextsObject);\r\n //this._myTriangleTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myTriangleTextComponent = this._myTriangleTextObject.addComponent('text');\r\n\r\n this._myTriangleTextComponent.alignment = WL.Alignment.Left;\r\n this._myTriangleTextComponent.justification = WL.Justification.Line;\r\n this._myTriangleTextComponent.material = this._myTextMaterial.clone();\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myTriangleTextComponent.text = \" \";\r\n //this._myTriangleTextComponent.text = \"Triangles: 9999999\";\r\n\r\n this._myPlaneTextObject = WL.scene.addObject(this._myTextsObject);\r\n\r\n this._myPlaneTextComponent = this._myPlaneTextObject.addComponent('text');\r\n //this._myPlaneTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myPlaneTextComponent.alignment = WL.Alignment.Left;\r\n this._myPlaneTextComponent.justification = WL.Justification.Line;\r\n this._myPlaneTextComponent.material = this._myTextMaterial.clone();\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.text = \" \";\r\n //this._myPlaneTextComponent.text = \"Planes: 9999999\";\r\n\r\n this._myFPSTextObject = WL.scene.addObject(this._myTextsObject);\r\n\r\n this._myFPSTextComponent = this._myFPSTextObject.addComponent('text');\r\n //this._myFPSTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myFPSTextComponent.alignment = WL.Alignment.Left;\r\n this._myFPSTextComponent.justification = WL.Justification.Line;\r\n this._myFPSTextComponent.material = this._myTextMaterial.clone();\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.text = \" \";\r\n //this._myFPSTextComponent.text = \"FPS: 99.99\";\r\n\r\n this._myDoneTextObject = WL.scene.addObject(this._myTrianglesObject);\r\n\r\n this._myDoneTextComponent = this._myDoneTextObject.addComponent('text');\r\n //this._myDoneTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myDoneTextComponent.alignment = WL.Alignment.Center;\r\n this._myDoneTextComponent.justification = WL.Justification.Line;\r\n this._myDoneTextComponent.material = this._myTextMaterial.clone();\r\n this._myDoneTextComponent.material.color = this._myNormalColor;\r\n this._myDoneTextComponent.text = \" \";\r\n //this._myDoneTextComponent.text = \"End\";\r\n\r\n this._myTextsObject.pp_setPositionLocal([0, 4.3, 0]);\r\n this._myTextsObject.pp_setScale(2.75);\r\n\r\n this._myTriangleTextObject.pp_setPositionLocal([-1.4, 0, 0]);\r\n this._myPlaneTextObject.pp_setPositionLocal([0.55, 0, 0]);\r\n this._myFPSTextObject.pp_setPositionLocal([-0.315, 0, 0]);\r\n this._myDoneTextObject.pp_setPositionLocal([0, -4.6, 0]);\r\n this._myDoneTextObject.pp_setScale(4);\r\n\r\n this._myDTHistory = [];\r\n },\r\n update(dt) {\r\n if (this._mySessionStarted) {\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myStartTimer.isDone()) {\r\n this._myStableFrameRate = this._computeAverageFrameRate(true);\r\n if (this._myTargetFrameRate > 0) {\r\n this._myStableFrameRate = this._myTargetFrameRate;\r\n }\r\n\r\n if (this._myEnableLog) {\r\n console.log(\"\\nPlane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n console.log(\"\");\r\n }\r\n this._start();\r\n }\r\n } else {\r\n this._update(dt);\r\n }\r\n } else {\r\n this._mySessionStarted = WL.xrSession != null;\r\n }\r\n },\r\n _computeAverageFrameRate(isStart) {\r\n let frameRate = 0;\r\n\r\n this._myDTHistory.sort();\r\n let elementToRemove = Math.floor(this._myDTHistory.length) * Math.min(0.9, this._myDTHistoryToIgnorePercentage * (isStart ? 2 : 1));\r\n for (let i = 0; i < elementToRemove; i++) {\r\n this._myDTHistory.pop();\r\n }\r\n\r\n let averageDT = 0;\r\n for (let dt of this._myDTHistory) {\r\n averageDT += dt;\r\n }\r\n averageDT /= this._myDTHistory.length;\r\n frameRate = Math.round(1 / averageDT);\r\n\r\n this._myDTHistory = [];\r\n\r\n return frameRate;\r\n },\r\n _createPlaneMesh(trianglesAmount) {\r\n let squaresAmount = Math.ceil(trianglesAmount / 2);\r\n\r\n let row = 1;\r\n let column = 1;\r\n\r\n let closestSqrt = 1;\r\n while (closestSqrt * closestSqrt < squaresAmount) {\r\n closestSqrt++;\r\n }\r\n\r\n row = closestSqrt;\r\n column = closestSqrt;\r\n\r\n while (row > 1 && column > 1 && row * column > squaresAmount && ((row - 1) * column >= squaresAmount)) {\r\n row--;\r\n }\r\n\r\n let meshParams = new PP.MeshCreationParams();\r\n\r\n for (let i = 0; i < row + 1; i++) {\r\n for (let j = 0; j < column + 1; j++) {\r\n\r\n let x = (2 / column) * j;\r\n let y = (2 / row) * i;\r\n\r\n let vertexParams = new PP.MeshCreationVertexParams();\r\n\r\n vertexParams.myPosition = new PP.vec3_create();\r\n vertexParams.myPosition[0] = x - 1;\r\n vertexParams.myPosition[1] = y - 1;\r\n vertexParams.myPosition[2] = 0;\r\n\r\n vertexParams.myTextureCoordinates = new PP.vec2_create();\r\n vertexParams.myTextureCoordinates[0] = x / 2;\r\n vertexParams.myTextureCoordinates[1] = y / 2;\r\n\r\n vertexParams.myNormal = new PP.vec3_create();\r\n vertexParams.myNormal[0] = 0;\r\n vertexParams.myNormal[1] = 0;\r\n vertexParams.myNormal[2] = 1;\r\n\r\n meshParams.myVertexes.push(vertexParams);\r\n }\r\n }\r\n\r\n for (let i = 0; i < row; i++) {\r\n for (let j = 0; j < column; j++) {\r\n let firstTriangle = new PP.MeshCreationTriangleParams();\r\n firstTriangle.myIndexes[0] = (i * (column + 1)) + j;\r\n firstTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n firstTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j;\r\n\r\n let secondTriangle = new PP.MeshCreationTriangleParams();\r\n secondTriangle.myIndexes[0] = ((i + 1) * (column + 1)) + j;\r\n secondTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n secondTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j + 1;\r\n\r\n meshParams.myTriangles.push(firstTriangle);\r\n meshParams.myTriangles.push(secondTriangle);\r\n }\r\n }\r\n\r\n let mesh = PP.MeshUtils.createMesh(meshParams);\r\n\r\n return mesh;\r\n }\r\n});", "//This is added just to make it easy to just use plain number instead of doing new PP.NumberOverValue() \r\n//You can remove this if it cause issues but you won't be able anymore to use plain number and will have to use new PP.NumberOverValue() \r\nNumber.prototype.get = function () {\r\n return this.valueOf();\r\n};\r\nObject.defineProperty(Number.prototype, \"get\", { enumerable: false });\r\n\r\n//You can just put startNumber if u want a number that doesn't actually change -> new PP.NumberOverValue(13)\r\nPP.NumberOverValue = class NumberOverValue {\r\n constructor(startNumber, endNumber = null, startInterpolationValue = 0, endInterpolationValue = 0, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (endNumber == null) {\r\n endNumber = startNumber;\r\n }\r\n\r\n this._myStartNumber = startNumber;\r\n this._myEndNumber = endNumber;\r\n\r\n this._myStartInterpolationValue = startInterpolationValue;\r\n this._myEndInterpolationValue = endInterpolationValue;\r\n\r\n this._myEasingFunction = easingFunction;\r\n this._myRoundingFunction = roundingFunction; // function(numberToRound, startNumber = null, endNumber = null), Math.round/floor/ceil can be used, must return an int\r\n }\r\n\r\n get(interpolationValue) {\r\n let lerpInterpolationValue = this._myEasingFunction(Math.pp_mapToRange(interpolationValue, this._myStartInterpolationValue, this._myEndInterpolationValue, 0, 1));\r\n let lerpNumber = Math.pp_lerp(this._myStartNumber, this._myEndNumber, lerpInterpolationValue);\r\n\r\n if (this._myRoundingFunction) {\r\n lerpNumber = this._myRoundingFunction(lerpNumber, this._myStartNumber, this._myEndNumber);\r\n }\r\n\r\n return lerpNumber;\r\n }\r\n\r\n getAverage(interpolationValue) {\r\n return this.get(interpolationValue);\r\n }\r\n\r\n getRange(interpolationValue) {\r\n let number = this.get(interpolationValue);\r\n return [number, number];\r\n }\r\n\r\n getMax(interpolationValue) {\r\n return this.get(interpolationValue);\r\n }\r\n\r\n getMin(interpolationValue) {\r\n return this.get(interpolationValue);\r\n }\r\n\r\n isInside(number, interpolationValue) {\r\n let currentNumber = this.get(interpolationValue);\r\n\r\n return currentNumber == number;\r\n }\r\n\r\n isInsideAngleRange(number, interpolationValue) {\r\n return this.isInsideAngleRangeDegrees(number, interpolationValue);\r\n }\r\n\r\n isInsideAngleRangeDegrees(number, interpolationValue) {\r\n let currentNumber = this.get(interpolationValue);\r\n\r\n let clampedNumber = Math.pp_angleClampDegrees(number);\r\n let clampedCurrentNumber = Math.pp_angleClampDegrees(currentNumber);\r\n\r\n return clampedNumber == clampedCurrentNumber;\r\n }\r\n\r\n isInsideAngleRangeRadians(number, interpolationValue) {\r\n let currentNumber = this.get(interpolationValue);\r\n\r\n let clampedNumber = Math.pp_angleClampRadians(number);\r\n let clampedCurrentNumber = Math.pp_angleClampRadians(currentNumber);\r\n\r\n return clampedNumber == clampedCurrentNumber;\r\n }\r\n};\r\n\r\nPP.IntOverValue = class IntOverValue extends PP.NumberOverValue {\r\n constructor(startNumber, endNumber, startInterpolationValue, endInterpolationValue, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (numberToRound, startNumber, endNumber) {\r\n let roundedNumber = null;\r\n\r\n let useFloor = startNumber <= endNumber;\r\n if (useFloor) {\r\n roundedNumber = Math.floor(numberToRound);\r\n } else {\r\n roundedNumber = Math.ceil(numberToRound);\r\n }\r\n\r\n return roundedNumber;\r\n };\r\n }\r\n\r\n super(startNumber, endNumber, startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n }\r\n};\r\n\r\n//You can just put startRange if u want a range that doesn't actually change -> new PP.NumberOverValue([1,25])\r\nPP.NumberRangeOverValue = class NumberRangeOverValue {\r\n constructor(startRange, endRange = null, startInterpolationValue = 0, endInterpolationValue = 0, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (endRange == null) {\r\n endRange = startRange;\r\n }\r\n\r\n this._myStartNumberOverValue = new PP.NumberOverValue(startRange[0], endRange[0], startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n this._myEndNumberOverValue = new PP.NumberOverValue(startRange[1], endRange[1], startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n\r\n this._myRoundingFunction = roundingFunction; // function(numberToRound, startNumber = null, endNumber = null), Math.round/floor/ceil can be used, must return an int\r\n }\r\n\r\n get(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n let randomValue = null;\r\n\r\n if (this._myRoundingFunction) {\r\n randomValue = Math.pp_randomInt(startNumber, endNumber);\r\n } else {\r\n randomValue = Math.pp_random(startNumber, endNumber);\r\n }\r\n\r\n return randomValue;\r\n }\r\n\r\n getAverage(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n let average = (startNumber + endNumber) / 2;\r\n if (this._myRoundingFunction) {\r\n average = this._myRoundingFunction(average, startNumber, endNumber);\r\n }\r\n\r\n return average;\r\n }\r\n\r\n getRange(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return [startNumber, endNumber];\r\n }\r\n\r\n getMax(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.max(startNumber, endNumber);\r\n }\r\n\r\n getMin(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.min(startNumber, endNumber);\r\n }\r\n\r\n isInside(number, interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n let min = Math.min(startNumber, endNumber);\r\n let max = Math.max(startNumber, endNumber);\r\n\r\n return number >= min && number <= max;\r\n }\r\n\r\n isInsideAngleRange(number, interpolationValue) {\r\n return this.isInsideAngleRangeDegrees(number, interpolationValue);\r\n }\r\n\r\n isInsideAngleRangeDegrees(number, interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.pp_isInsideAngleRangeDegrees(number, startNumber, endNumber);\r\n }\r\n\r\n isInsideAngleRangeRadians(number, interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.pp_isInsideAngleRangeRadians(number, startNumber, endNumber);\r\n }\r\n};\r\n\r\nPP.IntRangeOverValue = class IntRangeOverValue extends PP.NumberRangeOverValue {\r\n constructor(startRange, endRange, startInterpolationValue, endInterpolationValue, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (numberToRound, startNumber, endNumber) {\r\n let roundedNumber = null;\r\n\r\n let useFloor = startNumber <= endNumber;\r\n if (useFloor) {\r\n roundedNumber = Math.floor(numberToRound);\r\n } else {\r\n roundedNumber = Math.ceil(numberToRound);\r\n }\r\n\r\n return roundedNumber;\r\n };\r\n }\r\n\r\n super(startRange, endRange, startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n }\r\n};", "PP.ObjectPoolManager = class ObjectPoolManager {\r\n constructor() {\r\n this._myPoolMap = new Map();\r\n }\r\n\r\n addPool(poolID, poolObject, objectPoolParams = new PP.ObjectPoolParams()) {\r\n if (!this._myPoolMap.has(poolID)) {\r\n let pool = new PP.ObjectPool(poolObject, objectPoolParams);\r\n this._myPoolMap.set(poolID, pool);\r\n } else {\r\n console.error(\"Pool already created with this ID\");\r\n }\r\n }\r\n\r\n increasePool(poolID, amount) {\r\n let pool = this._myPoolMap.get(poolID);\r\n if (pool) {\r\n pool.increase(amount);\r\n }\r\n }\r\n\r\n increasePoolPercentage(poolID, percentage) {\r\n let pool = this._myPoolMap.get(poolID);\r\n if (pool) {\r\n pool.increasePercentage(percentage);\r\n }\r\n }\r\n\r\n getPool(poolID) {\r\n return this._myPoolMap.get(poolID);\r\n }\r\n\r\n hasPool(poolID) {\r\n return this._myPoolMap.has(poolID);\r\n }\r\n\r\n getObject(poolID) {\r\n if (this._myPoolMap.has(poolID)) {\r\n return this._myPoolMap.get(poolID).get();\r\n }\r\n\r\n return null;\r\n }\r\n\r\n releaseObject(poolID, object) {\r\n this._myPoolMap.get(poolID).release(object);\r\n }\r\n};\r\n\r\nPP.ObjectPoolParams = class ObjectPoolParams {\r\n constructor() {\r\n this.myInitialPoolSize = 0;\r\n this.myAmountToAddWhenEmpty = 1; //If all the objects are busy, this amount will be added to the pool\r\n this.myPercentageToAddWhenEmpty = 0.5; //If all the objects are busy, this percentage of the current pool size will be added to the pool \r\n\r\n this.myCloneParams = undefined;\r\n\r\n this.myOptimizeObjectsAllocation = true; //If true it will pre-allocate the memory before adding new objects to the pool\r\n\r\n //These extra functions can be used if u want to use the pool with objects that are not from WLE (WL.Object)\r\n this.myCloneCallback = undefined; //Signature: callback(object, cloneParams) -> clonedObject\r\n this.mySetActiveCallback = undefined; //Signature: callback(object, active)\r\n this.myEqualCallback = undefined; //Signature: callback(firstObject, secondObject) -> bool\r\n this.myOptimizeObjectsAllocationCallback = undefined; //Signature: callback(object, numberOfObjectsToAllocate)\r\n\r\n this.myEnableDebugLog = true;\r\n }\r\n};\r\n\r\nPP.ObjectPool = class ObjectPool {\r\n constructor(poolObject, objectPoolParams) {\r\n this._myObjectPoolParams = objectPoolParams;\r\n this._myPrototype = this._clone(poolObject);\r\n\r\n this._myAvailableObjects = [];\r\n this._myBusyObjects = [];\r\n\r\n this._addToPool(objectPoolParams.myInitialPoolSize, false);\r\n }\r\n\r\n get() {\r\n let object = this._myAvailableObjects.shift();\r\n\r\n if (object == null) {\r\n let amountToAdd = Math.ceil(this._myBusyObjects.length * this._myObjectPoolParams.myPercentageToAddWhenEmpty);\r\n amountToAdd += this._myObjectPoolParams.myAmountToAddWhenEmpty;\r\n this._addToPool(amountToAdd, this._myObjectPoolParams.myEnableDebugLog);\r\n object = this._myAvailableObjects.shift();\r\n }\r\n\r\n //object could still be null if the amountToAdd is 0\r\n if (object != null) {\r\n this._myBusyObjects.push(object);\r\n }\r\n\r\n return object;\r\n }\r\n\r\n release(object) {\r\n let released = this._myBusyObjects.pp_remove(this._equals.bind(this, object));\r\n if (released) {\r\n this._setActive(released, false);\r\n this._myAvailableObjects.push(released);\r\n }\r\n }\r\n\r\n increase(amount) {\r\n this._addToPool(amount, false);\r\n }\r\n\r\n increasePercentage(percentage) {\r\n let amount = Math.ceil((this.getSize()) * percentage);\r\n this._addToPool(amount, false);\r\n }\r\n\r\n getSize() {\r\n return this._myBusyObjects.length + this._myAvailableObjects.length;\r\n }\r\n\r\n getAvailableSize() {\r\n return this._myAvailableObjects.length;\r\n }\r\n\r\n getBusySize() {\r\n return this._myAvailableObjects.length;\r\n }\r\n\r\n _addToPool(size, log) {\r\n if (size <= 0) {\r\n return;\r\n }\r\n\r\n if (this._myObjectPoolParams.myOptimizeObjectsAllocation) {\r\n if (this._myObjectPoolParams.myOptimizeObjectsAllocationCallback) {\r\n this._myObjectPoolParams.myOptimizeObjectsAllocationCallback(this._myPrototype, size);\r\n } else if (this._myPrototype.pp_reserveObjectsHierarchy != null) {\r\n this._myPrototype.pp_reserveObjectsHierarchy(size);\r\n }\r\n }\r\n\r\n for (let i = 0; i < size; i++) {\r\n this._myAvailableObjects.push(this._clone(this._myPrototype));\r\n }\r\n\r\n if (log) {\r\n console.warn(\"Added new elements to the pool:\", size);\r\n }\r\n }\r\n\r\n _clone(object) {\r\n let clone = null;\r\n\r\n if (this._myObjectPoolParams.myCloneCallback != null) {\r\n clone = this._myObjectPoolParams.myCloneCallback(object, this._myObjectPoolParams.myCloneParams);\r\n } else if (object.pp_clone != null) {\r\n clone = object.pp_clone(this._myObjectPoolParams.myCloneParams);\r\n } else if (object.clone != null) {\r\n clone = object.clone(this._myObjectPoolParams.myCloneParams);\r\n }\r\n\r\n if (clone == null) {\r\n console.error(\"Object not cloneable, pool will return null\");\r\n } else {\r\n this._setActive(clone, false);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n _setActive(object, active) {\r\n if (this._myObjectPoolParams.mySetActiveCallback != null) {\r\n this._myObjectPoolParams.mySetActiveCallback(object, active);\r\n } else if (object.pp_setActive != null) {\r\n object.pp_setActive(active);\r\n } else if (object.setActive != null) {\r\n object.setActive(active);\r\n }\r\n }\r\n\r\n _equals(first, second) {\r\n let equals = false;\r\n\r\n if (this._myObjectPoolParams.myEqualCallback != null) {\r\n equals = this._myObjectPoolParams.myEqualCallback(first, second);\r\n } else if (first.pp_equals != null) {\r\n equals = first.pp_equals(second);\r\n } else if (first.equals != null) {\r\n equals = first.equals(second);\r\n } else {\r\n equals = first == second;\r\n }\r\n\r\n return equals;\r\n }\r\n};", "PP.PhysXCollisionCollector = class PhysXCollisionCollector {\r\n constructor(physXComponent, isTrigger = false) {\r\n this._myPhysX = physXComponent;\r\n\r\n this._myIsTrigger = isTrigger;\r\n\r\n this._myCollisions = [];\r\n\r\n this._myCollisionsStart = [];\r\n this._myCollisionsEnd = [];\r\n this._myUpdateActive = false;\r\n this._myCollisionsStartToProcess = [];\r\n this._myCollisionsEndToProcess = [];\r\n\r\n this._myCollisionCallbackID = null;\r\n\r\n this._myIsActive = false;\r\n this.setActive(true);\r\n\r\n this._myDebugActive = false;\r\n\r\n this._myTriggerDesyncFixDelay = new PP.Timer(0.1);\r\n\r\n this._myCollisionCallbacks = new Map(); // Signature: callback(thisPhysX, otherPhysX, collisionType)\r\n this._myCollisionStartCallbacks = new Map(); // Signature: callback(thisPhysX, otherPhysX, collisionType)\r\n this._myCollisionEndCallbacks = new Map(); // Signature: callback(thisPhysX, otherPhysX, collisionType)\r\n\r\n }\r\n\r\n getPhysX() {\r\n return this._myPhysX;\r\n }\r\n\r\n getCollisions() {\r\n return this._myCollisions;\r\n }\r\n\r\n getCollisionsStart() {\r\n return this._myCollisionsStart;\r\n }\r\n\r\n getCollisionsEnd() {\r\n return this._myCollisionsEnd;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myIsActive != active) {\r\n this._myIsActive = active;\r\n\r\n this._myCollisions = [];\r\n\r\n this._myCollisionsStart = [];\r\n this._myCollisionsEnd = [];\r\n this._myUpdateActive = false;\r\n this._myCollisionsStartToProcess = [];\r\n this._myCollisionsEndToProcess = [];\r\n\r\n if (this._myIsActive) {\r\n this._myCollisionCallbackID = this._myPhysX.onCollision(this._onCollision.bind(this));\r\n } else if (this._myCollisionCallbackID != null) {\r\n this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID);\r\n this._myCollisionCallbackID = null;\r\n }\r\n }\r\n }\r\n\r\n //Set to true only if u are going to actually update this object and don't want to lose any collision start/end events prior to updating the first time after activation\r\n setUpdateActive(active) {\r\n this._myUpdateActive = active;\r\n }\r\n\r\n //Update is not mandatory, use it only if u want to access collisions start and end\r\n update(dt) {\r\n if (!this._myIsActive) {\r\n return;\r\n }\r\n\r\n this._myUpdateActive = true;\r\n\r\n this._myCollisionsStart = this._myCollisionsStartToProcess;\r\n this._myCollisionsStartToProcess = [];\r\n\r\n this._myCollisionsEnd = this._myCollisionsEndToProcess;\r\n this._myCollisionsEndToProcess = [];\r\n\r\n if (this._myIsTrigger) {\r\n this._triggerDesyncFix(dt);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this._myCollisionCallbackID != null) {\r\n this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID);\r\n this._myCollisionCallbackID = null;\r\n }\r\n }\r\n\r\n setDebugActive(active) {\r\n this._myDebugActive = active;\r\n }\r\n\r\n registerCollisionEventListener(callbackID, callback) {\r\n this._myCollisionCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCollisionEventListener(callbackID) {\r\n this._myCollisionCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCollisionStartEventListener(callbackID, callback) {\r\n this._myCollisionStartCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCollisionStartEventListener(callbackID) {\r\n this._myCollisionStartCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCollisionEndEventListener(callbackID, callback) {\r\n this._myCollisionEndCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCollisionEndEventListener(callbackID) {\r\n this._myCollisionEndCallbacks.delete(callbackID);\r\n }\r\n\r\n _onCollision(type, physXComponent) {\r\n if (type == WL.CollisionEventType.Touch || type == WL.CollisionEventType.TriggerTouch) {\r\n this._onCollisionStart(physXComponent);\r\n } else if (type == WL.CollisionEventType.TouchLost || type == WL.CollisionEventType.TriggerTouchLost) {\r\n this._onCollisionEnd(physXComponent);\r\n }\r\n\r\n if (this._myCollisionCallbacks.size > 0) {\r\n this._myCollisionCallbacks.forEach(function (callback) { callback(this._myPhysX, physXComponent, type); });\r\n }\r\n }\r\n\r\n _onCollisionStart(physXComponent) {\r\n if (this._myDebugActive) {\r\n let objectFound = false;\r\n for (let object of this._myCollisions) {\r\n if (object.pp_equals(physXComponent.object)) {\r\n objectFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (objectFound) {\r\n console.error(\"Collision Start on object already collected\");\r\n }\r\n }\r\n\r\n this._myCollisions.push(physXComponent.object);\r\n\r\n if (this._myUpdateActive) {\r\n this._myCollisionsStartToProcess.push(physXComponent.object);\r\n this._myCollisionsEndToProcess.pp_removeAll(function (element) {\r\n return element.pp_equals(physXComponent.object);\r\n });\r\n }\r\n\r\n if (this._myDebugActive) {\r\n console.log(\"Collision Start -\", this._myCollisions.length);\r\n }\r\n\r\n if (this._myCollisionStartCallbacks.size > 0) {\r\n this._myCollisionStartCallbacks.forEach(function (callback) { callback(this._myPhysX, physXComponent, type); });\r\n }\r\n }\r\n\r\n _onCollisionEnd(physXComponent) {\r\n if (this._myDebugActive) {\r\n let objectFound = false;\r\n for (let object of this._myCollisions) {\r\n if (object.pp_equals(physXComponent.object)) {\r\n objectFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!objectFound) {\r\n console.error(\"Collision End on object not collected\");\r\n }\r\n }\r\n\r\n\r\n this._myCollisions.pp_removeAll(function (element) {\r\n return element.pp_equals(physXComponent.object);\r\n });\r\n\r\n if (this._myUpdateActive) {\r\n this._myCollisionsEndToProcess.push(physXComponent.object);\r\n this._myCollisionsStartToProcess.pp_removeAll(function (element) {\r\n return element.pp_equals(physXComponent.object);\r\n });\r\n }\r\n\r\n if (this._myDebugActive) {\r\n console.log(\"Collision End -\", this._myCollisions.length);\r\n }\r\n\r\n if (this._myCollisionEndCallbacks.size > 0) {\r\n this._myCollisionEndCallbacks.forEach(function (callback) { callback(this._myPhysX, physXComponent, type); });\r\n }\r\n }\r\n\r\n _triggerDesyncFix(dt) {\r\n this._myTriggerDesyncFixDelay.update(dt);\r\n if (this._myTriggerDesyncFixDelay.isDone()) {\r\n this._myTriggerDesyncFixDelay.start();\r\n\r\n let collisionsToEnd = this._myCollisions.pp_findAll(function (element) {\r\n let physX = element.pp_getComponent(\"physx\");\r\n return physX == null || !physX.active;\r\n });\r\n\r\n if (collisionsToEnd.length > 0) {\r\n //console.error(\"DESYNC RESOLVED\");\r\n\r\n for (let collision of collisionsToEnd) {\r\n let physX = collision.pp_getComponent(\"physx\");\r\n if (physX) {\r\n this._onCollisionEnd(physX);\r\n } else {\r\n console.error(\"NO PHYSX, HOW?\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n};", "PP.SaveManager = class SaveManager {\r\n constructor() {\r\n this._mySaveCache = new Map();\r\n\r\n this._myCommitSavesDelayTimer = new PP.Timer(0, false);\r\n this._myDelaySavesCommit = true;\r\n this._myIDsToCommit = [];\r\n\r\n this._myCacheDefaultValueOnFail = true;\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n\r\n this._myClearCallbacks = new Map(); // Signature: callback()\r\n this._myDeleteCallbacks = new Map(); // Signature: callback(id)\r\n this._myDeleteIDCallbacks = new Map(); // Signature: callback(id)\r\n this._mySaveCallbacks = new Map(); // Signature: callback(id, value)\r\n this._mySaveValueChangedCallbacks = new Map(); // Signature: callback(id, value)\r\n this._mySaveIDCallbacks = new Map(); // Signature: callback(id, value)\r\n this._mySaveValueChangedIDCallbacks = new Map(); // Signature: callback(id, value)\r\n this._myCommitSaveCallbacks = new Map(); // Signature: callback(id, value, isCommitSaveDelayed, failed)\r\n this._myCommitSaveIDCallbacks = new Map(); // Signature: callback(id, value, isCommitSaveDelayed, failed)\r\n this._myCommitSavesCallbacks = new Map(); // Signature: callback(isCommitSavesDelayed, failed)\r\n\r\n this._myLoadCallbacks = new Map(); // Signature: callback(id, value, loadFromCache, failed)\r\n this._myLoadIDCallbacks = new Map(); // Signature: callback(id, value, loadFromCache, failed)\r\n }\r\n\r\n setCommitSavesDelay(delay) {\r\n this._myCommitSavesDelayTimer.start(delay);\r\n }\r\n\r\n setDelaySavesCommit(delayed) {\r\n this._myDelaySavesCommit = delayed;\r\n }\r\n\r\n setCacheDefaultValueOnFail(cache) {\r\n this._myCacheDefaultValueOnFail = cache;\r\n }\r\n\r\n update(dt) {\r\n if (this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.update(dt);\r\n if (this._myCommitSavesDelayTimer.isDone()) {\r\n this.commitSaves();\r\n }\r\n }\r\n }\r\n\r\n save(id, value, overrideDelaySavesCommit = null) {\r\n let sameValue = false;\r\n if (this._mySaveCache.has(id)) {\r\n sameValue = this._mySaveCache.get(id) === value;\r\n }\r\n\r\n if (!sameValue) {\r\n this._mySaveCache.set(id, value);\r\n if ((this._myDelaySavesCommit && overrideDelaySavesCommit == null) || (overrideDelaySavesCommit != null && overrideDelaySavesCommit)) {\r\n this._myIDsToCommit.pp_pushUnique(id);\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n let failed = this._commitSave(id, false);\r\n\r\n if (this._myCommitSavesCallbacks.size > 0) {\r\n let isCommitSaveDelayed = false;\r\n this._myCommitSavesCallbacks.forEach(function (callback) { callback(isCommitSaveDelayed, failed); });\r\n }\r\n }\r\n }\r\n\r\n if (this._mySaveCallbacks.size > 0) {\r\n this._mySaveCallbacks.forEach(function (callback) { callback(id, value); });\r\n }\r\n\r\n if (this._mySaveIDCallbacks.size > 0) {\r\n let callbackMap = this._mySaveIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value); });\r\n }\r\n }\r\n\r\n if (!sameValue) {\r\n if (this._mySaveValueChangedCallbacks.size > 0) {\r\n this._mySaveValueChangedCallbacks.forEach(function (callback) { callback(id, value); });\r\n }\r\n\r\n if (this._mySaveValueChangedIDCallbacks.size > 0) {\r\n let callbackMap = this._mySaveValueChangedIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value); });\r\n }\r\n }\r\n }\r\n }\r\n\r\n commitSaves() {\r\n if (this._myIDsToCommit.length > 0) {\r\n let failed = false;\r\n\r\n for (let id of this._myIDsToCommit) {\r\n if (this._mySaveCache.has(id)) {\r\n let result = this._commitSave(id, true);\r\n failed = failed || result;\r\n }\r\n }\r\n\r\n this._myIDsToCommit = [];\r\n\r\n if (this._myCommitSavesCallbacks.size > 0) {\r\n let isCommitSavesDelayed = true;\r\n this._myCommitSavesCallbacks.forEach(function (callback) { callback(isCommitSavesDelayed, failed); });\r\n }\r\n }\r\n }\r\n\r\n has(id) {\r\n return this._mySaveCache.has(id) || PP.SaveUtils.has(id);\r\n }\r\n\r\n delete(id) {\r\n this._mySaveCache.delete(id);\r\n PP.SaveUtils.delete(id);\r\n\r\n if (this._myDeleteCallbacks.size > 0) {\r\n this._myDeleteCallbacks.forEach(function (callback) { callback(id); });\r\n }\r\n\r\n if (this._myDeleteIDCallbacks.size > 0) {\r\n let callbackMap = this._myDeleteIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id); });\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this._mySaveCache.clear();\r\n PP.SaveUtils.clear();\r\n\r\n if (this._myClearCallbacks.size > 0) {\r\n this._myClearCallbacks.forEach(function (callback) { callback(); });\r\n }\r\n }\r\n\r\n load(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"load\");\r\n }\r\n\r\n loadString(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"loadString\");\r\n }\r\n\r\n loadNumber(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"loadNumber\");\r\n }\r\n\r\n loadBool(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"loadBool\");\r\n }\r\n\r\n getCommitSavesDelay() {\r\n return this._myCommitSavesDelayTimer.getDuration();\r\n }\r\n\r\n isDelaySavesCommit() {\r\n return this._myDelaySavesCommit;\r\n }\r\n\r\n isCacheDefaultValueOnFail() {\r\n return this._myCacheDefaultValueOnFail;\r\n }\r\n\r\n _commitSave(id, isCommitSaveDelayed) {\r\n let value = this._mySaveCache.get(id);\r\n let failed = false;\r\n\r\n try {\r\n PP.SaveUtils.save(id, value);\r\n } catch (error) {\r\n failed = true;\r\n }\r\n\r\n if (this._myCommitSaveCallbacks.size > 0) {\r\n this._myCommitSaveCallbacks.forEach(function (callback) { callback(id, value, isCommitSaveDelayed, failed); });\r\n }\r\n\r\n if (this._myCommitSaveIDCallbacks.size > 0) {\r\n let callbackMap = this._myCommitSaveIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value, isCommitSaveDelayed, failed); });\r\n }\r\n }\r\n\r\n return failed;\r\n }\r\n\r\n _load(id, defaultValue, functionName) {\r\n let value = null;\r\n let failed = false;\r\n let loadFromCache = false;\r\n\r\n if (this._mySaveCache.has(id)) {\r\n value = this._mySaveCache.get(id);\r\n\r\n if (value == null && defaultValue != null) {\r\n value = defaultValue;\r\n if (this._myCacheDefaultValueOnFail) {\r\n this._mySaveCache.set(id, value);\r\n }\r\n }\r\n\r\n loadFromCache = true;\r\n } else {\r\n let saveResult = null;\r\n try {\r\n saveResult = PP.SaveUtils[functionName](id, null);\r\n } catch (error) {\r\n // Error is managed as if it worked but there was no value\r\n saveResult = null;\r\n failed = true;\r\n }\r\n\r\n if (saveResult == null) {\r\n value = defaultValue;\r\n } else {\r\n value = saveResult;\r\n }\r\n\r\n if (saveResult != null || this._myCacheDefaultValueOnFail) {\r\n this._mySaveCache.set(id, value);\r\n } else {\r\n this._mySaveCache.set(id, null);\r\n }\r\n }\r\n\r\n if (this._myLoadCallbacks.size > 0) {\r\n this._myLoadCallbacks.forEach(function (callback) { callback(id, value, loadFromCache, failed); });\r\n }\r\n\r\n if (this._myLoadIDCallbacks.size > 0) {\r\n let callbackMap = this._myLoadIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value, loadFromCache, failed); });\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n session.addEventListener('visibilitychange', function (event) {\r\n if (event.session.visibilityState != \"visible\") {\r\n this._onXRSessionInterrupt();\r\n }\r\n }.bind(this));\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._onXRSessionInterrupt();\r\n }\r\n\r\n _onXRSessionInterrupt() {\r\n this.commitSaves();\r\n }\r\n\r\n registerClearEventListener(callbackID, callback) {\r\n this._myClearCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterClearEventListener(callbackID) {\r\n this._myClearCallbacks.delete(callbackID);\r\n }\r\n\r\n registerDeleteEventListener(callbackID, callback) {\r\n this._myDeleteCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterDeleteEventListener(callbackID) {\r\n this._myDeleteCallbacks.delete(callbackID);\r\n }\r\n\r\n registerDeleteIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._myDeleteIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._myDeleteIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._myDeleteIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterDeleteIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._myDeleteIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._myDeleteIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveEventListener(callbackID, callback) {\r\n this._mySaveCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveEventListener(callbackID) {\r\n this._mySaveCallbacks.delete(callbackID);\r\n }\r\n\r\n registerSaveIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._mySaveIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._mySaveIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._mySaveIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._mySaveIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._mySaveIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveValueChangedEventListener(callbackID, callback) {\r\n this._mySaveValueChangedCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveValueChangedEventListener(callbackID) {\r\n this._mySaveValueChangedCallbacks.delete(callbackID);\r\n }\r\n\r\n registerSaveValueChangedIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._mySaveValueChangedIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._mySaveValueChangedIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._mySaveValueChangedIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveValueChangedIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._mySaveValueChangedIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._mySaveValueChangedIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerCommitSavesEventListener(callbackID, callback) {\r\n this._myCommitSavesCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCommitSavesEventListener(callbackID) {\r\n this._myCommitSavesCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCommitSaveEventListener(callbackID, callback) {\r\n this._myCommitSaveCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCommitSaveEventListener(callbackID) {\r\n this._myCommitSaveCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCommitSaveIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._myCommitSaveIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._myCommitSaveIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._myCommitSaveIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterCommitSaveIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._myCommitSaveIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._myCommitSaveIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerLoadEventListener(callbackID, callback) {\r\n this._myLoadCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterLoadEventListener(callbackID) {\r\n this._myLoadCallbacks.delete(callbackID);\r\n }\r\n\r\n registerLoadIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._myLoadIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._myLoadIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._myLoadIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterLoadIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._myLoadIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._myLoadIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n};", "PP.Timer = class Timer {\r\n constructor(duration, autoStart = true) {\r\n this._myDuration = duration;\r\n this._myOnEndCallbacks = new Map(); // Signature: callback()\r\n\r\n this._myDone = false;\r\n this._myJustDone = false;\r\n this._myStarted = false;\r\n\r\n if (autoStart) {\r\n this.start();\r\n } else {\r\n this.reset();\r\n }\r\n }\r\n\r\n start(duration = null) {\r\n this.reset(duration);\r\n this._myStarted = true;\r\n }\r\n\r\n end() {\r\n this._done();\r\n }\r\n\r\n reset(duration = null) {\r\n if (duration != null) {\r\n this._myDuration = Math.max(0, duration);\r\n }\r\n\r\n this._myTimer = this._myDuration;\r\n this._myDone = false;\r\n this._myJustDone = false;\r\n this._myStarted = false;\r\n }\r\n\r\n update(dt) {\r\n this._myJustDone = false;\r\n\r\n if (this.isRunning()) {\r\n this._myTimer = Math.max(0, this._myTimer - dt);\r\n if (this._myTimer == 0) {\r\n this._done();\r\n }\r\n }\r\n }\r\n\r\n isDone() {\r\n return this._myDone;\r\n }\r\n\r\n isJustDone() {\r\n return this._myJustDone;\r\n }\r\n\r\n isStarted() {\r\n return this._myStarted;\r\n }\r\n\r\n isRunning() {\r\n return this.isStarted() && !this.isDone();\r\n }\r\n\r\n getDuration() {\r\n return this._myDuration;\r\n }\r\n\r\n setDuration(duration) {\r\n this._myDuration = Math.max(0, duration);\r\n }\r\n\r\n getTimer() {\r\n return this._myTimer;\r\n }\r\n\r\n getPercentage() {\r\n let percentage = 1;\r\n if (this._myTimer > 0) {\r\n percentage = (this._myDuration - this._myTimer) / this._myDuration;\r\n }\r\n return Math.pp_clamp(percentage, 0, 1);\r\n }\r\n\r\n onEnd(callback, id = null) {\r\n this._myOnEndCallbacks.set(id, callback);\r\n }\r\n\r\n unregisterOnEnd(id = null) {\r\n this._myOnEndCallbacks.delete(id);\r\n }\r\n\r\n _done() {\r\n this._myTimer = 0;\r\n this._myDone = true;\r\n this._myJustDone = true;\r\n if (this._myOnEndCallbacks.size > 0) {\r\n for (let callback of this._myOnEndCallbacks.values()) {\r\n callback();\r\n }\r\n }\r\n }\r\n};", "WL.registerComponent(\"pp-clear-console-on-xr-session-start\", {\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myFirstTime = true;\r\n WL.onXRSessionStart.push(function () {\r\n if (this._myFirstTime) {\r\n this._myFirstTime = false;\r\n console.clear();\r\n }\r\n }.bind(this));\r\n },\r\n update: function (dt) {\r\n }\r\n});", "WL.registerComponent('pp-set-active', {\n _myActive: { type: WL.Type.Bool, default: true },\n _mySetActiveOn: { type: WL.Type.Enum, values: ['self', 'children', 'descendants', 'hierarchy'], default: 'hierarchy' },\n _mySetActiveWhen: { type: WL.Type.Enum, values: ['init', 'start', 'first_update'], default: 'init' },\n}, {\n init: function () {\n if (this.active && this._mySetActiveWhen == 0) {\n this._setActive();\n }\n },\n start: function () {\n if (this._mySetActiveWhen == 1) {\n this._setActive();\n }\n this._myFirst = true;\n },\n update: function (dt) {\n if (this._mySetActiveWhen == 2 && this._myFirst) {\n this._myFirst = false;\n this._setActive();\n }\n },\n _setActive() {\n if (this._mySetActiveOn == 0) {\n this.object.pp_setActiveSelf(this._myActive);\n } else if (this._mySetActiveOn == 1) {\n this.object.pp_setActiveChildren(this._myActive);\n } else if (this._mySetActiveOn == 2) {\n this.object.pp_setActiveDescendants(this._myActive);\n } else {\n this.object.pp_setActiveHierarchy(this._myActive);\n }\n }\n});", "WL.registerComponent('pp-adjust-hierarchy-physx-scale', {\r\n _myWhen: { type: WL.Type.Enum, values: ['init', 'start', 'first_update'], default: 'start' },\r\n}, {\r\n init: function () {\r\n if (this.active && this._myWhen == 0) {\r\n this._adjustScale();\r\n }\r\n },\r\n start: function () {\r\n if (this._myWhen == 1) {\r\n this._adjustScale();\r\n }\r\n this._myFirst = true;\r\n },\r\n update: function (dt) {\r\n if (this._myWhen == 2 && this._myFirst) {\r\n this._myFirst = false;\r\n this._adjustScale();\r\n }\r\n },\r\n _adjustScale() {\r\n let scale = this.object.pp_getScale();\r\n let physXComponents = this.object.pp_getComponentsHierarchy(\"physx\");\r\n for (let physX of physXComponents) {\r\n physX.extents[0] = physX.extents[0] * scale[0];\r\n physX.extents[1] = physX.extents[1] * scale[1];\r\n physX.extents[2] = physX.extents[2] * scale[2];\r\n\r\n if (physX.active) {\r\n physX.active = false;\r\n physX.active = true;\r\n }\r\n }\r\n }\r\n});", "WL.registerComponent(\"pp-get-player-objects\", {\r\n _myPlayer: { type: WL.Type.Object },\r\n _myPlayerPivot: { type: WL.Type.Object }, // if u don't have a pivot under the player you set this to null, by default will be the same as the player\r\n _myNonVRCamera: { type: WL.Type.Object },\r\n _myEyeLeft: { type: WL.Type.Object },\r\n _myEyeRight: { type: WL.Type.Object },\r\n _myHead: { type: WL.Type.Object },\r\n _myNonVRHead: { type: WL.Type.Object },\r\n _myVRHead: { type: WL.Type.Object },\r\n _myHandLeft: { type: WL.Type.Object },\r\n _myHandRight: { type: WL.Type.Object }\r\n}, {\r\n init: function () {\r\n PP.myPlayerObjects.myPlayer = this._myPlayer;\r\n PP.myPlayerObjects.myPlayerPivot = this._myPlayerPivot;\r\n PP.myPlayerObjects.myNonVRCamera = this._myNonVRCamera;\r\n PP.myPlayerObjects.myHead = this._myHead;\r\n PP.myPlayerObjects.myNonVRHead = this._myNonVRHead;\r\n PP.myPlayerObjects.myVRHead = this._myVRHead;\r\n PP.myPlayerObjects.myEyeLeft = this._myEyeLeft;\r\n PP.myPlayerObjects.myEyeRight = this._myEyeRight;\r\n PP.myPlayerObjects.myHandLeft = this._myHandLeft;\r\n PP.myPlayerObjects.myHandRight = this._myHandRight;\r\n\r\n PP.myPlayerObjects.myEyes = [];\r\n PP.myPlayerObjects.myEyes[PP.Handedness.LEFT] = this._myEyeLeft;\r\n PP.myPlayerObjects.myEyes[PP.Handedness.RIGHT] = this._myEyeRight;\r\n\r\n PP.myPlayerObjects.myHands = [];\r\n PP.myPlayerObjects.myHands[PP.Handedness.LEFT] = this._myHandLeft;\r\n PP.myPlayerObjects.myHands[PP.Handedness.RIGHT] = this._myHandRight;\r\n\r\n if (PP.myPlayerObjects.myPlayerPivot == null) {\r\n PP.myPlayerObjects.myPlayerPivot = PP.myPlayerObjects.myPlayer;\r\n }\r\n }\r\n});\r\n\r\nPP.myPlayerObjects = {\r\n myPlayer: null,\r\n myPlayerPivot: null,\r\n myNonVRCamera: null,\r\n myNonVRHead: null,\r\n myVRHead: null,\r\n myHead: null,\r\n myEyeLeft: null,\r\n myEyeRight: null,\r\n myEyes: [],\r\n myHandLeft: null,\r\n myHandRight: null,\r\n myHands: [],\r\n};", "WL.registerComponent('pp-get-default-resources', {\r\n _myPlane: { type: WL.Type.Mesh },\r\n _myCube: { type: WL.Type.Mesh },\r\n _mySphere: { type: WL.Type.Mesh },\r\n _myCone: { type: WL.Type.Mesh },\r\n _myCylinder: { type: WL.Type.Mesh },\r\n _myCircle: { type: WL.Type.Mesh },\r\n\r\n _myFlatOpaque: { type: WL.Type.Material },\r\n _myFlatTransparentNoDepth: { type: WL.Type.Material },\r\n _myPhongOpaque: { type: WL.Type.Material },\r\n _myText: { type: WL.Type.Material },\r\n\r\n}, {\r\n init() {\r\n PP.myDefaultResources.myMeshes.myPlane = PP.MeshUtils.cloneMesh(this._myPlane);\r\n PP.myDefaultResources.myMeshes.myCube = PP.MeshUtils.cloneMesh(this._myCube);\r\n PP.myDefaultResources.myMeshes.mySphere = PP.MeshUtils.cloneMesh(this._mySphere);\r\n PP.myDefaultResources.myMeshes.myCone = PP.MeshUtils.cloneMesh(this._myCone);\r\n PP.myDefaultResources.myMeshes.myCylinder = PP.MeshUtils.cloneMesh(this._myCylinder);\r\n PP.myDefaultResources.myMeshes.myCircle = PP.MeshUtils.cloneMesh(this._myCircle);\r\n\r\n PP.myDefaultResources.myMeshes.myInvertedCube = PP.MeshUtils.invertMesh(this._myCube);\r\n PP.myDefaultResources.myMeshes.myInvertedSphere = PP.MeshUtils.invertMesh(this._mySphere);\r\n PP.myDefaultResources.myMeshes.myInvertedCone = PP.MeshUtils.invertMesh(this._myCone);\r\n PP.myDefaultResources.myMeshes.myInvertedCylinder = PP.MeshUtils.invertMesh(this._myCylinder);\r\n\r\n if (this._myFlatOpaque != null) {\r\n PP.myDefaultResources.myMaterials.myFlatOpaque = this._myFlatOpaque.clone();\r\n }\r\n\r\n if (this._myFlatTransparentNoDepth != null) {\r\n PP.myDefaultResources.myMaterials.myFlatTransparentNoDepth = this._myFlatTransparentNoDepth.clone();\r\n }\r\n\r\n if (this._myPhongOpaque != null) {\r\n PP.myDefaultResources.myMaterials.myPhongOpaque = this._myPhongOpaque.clone();\r\n }\r\n\r\n if (this._myText != null) {\r\n PP.myDefaultResources.myMaterials.myText = this._myText.clone();\r\n }\r\n }\r\n});\r\n\r\nPP.myDefaultResources = {\r\n myMeshes: {\r\n myPlane: null,\r\n myCube: null,\r\n mySphere: null,\r\n myCone: null,\r\n myCylinder: null,\r\n myCircle: null,\r\n\r\n myInvertedCube: null,\r\n myInvertedSphere: null,\r\n myInvertedCone: null,\r\n myInvertedCylinder: null\r\n },\r\n myMaterials: {\r\n myFlatOpaque: null,\r\n myFlatTransparentNoDepth: null, // for now the pipeline needs to be the last one to make this work properly\r\n myPhongOpaque: null,\r\n myText: null,\r\n }\r\n};", "WL.registerComponent('pp-show-fps', {\r\n _myRefreshSeconds: { type: WL.Type.Float, default: 0.25 },\r\n _myTextMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n },\r\n start() {\r\n this._myTimer = new PP.Timer(this._myRefreshSeconds);\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n\r\n this._myVisualFPSParent = this.object.pp_addObject();\r\n\r\n let visualParams = new PP.VisualTextParams();\r\n visualParams.myText = \"0\";\r\n\r\n visualParams.myTransform.mat4_setPositionRotationScale([-0.115, -0.115, 0.35], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n\r\n if (this._myTextMaterial != null) {\r\n visualParams.myMaterial = this._myTextMaterial.clone();\r\n } else {\r\n visualParams.myMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\n visualParams.myMaterial.color = [0, 1, 0, 1];\r\n }\r\n\r\n visualParams.myParent = this._myVisualFPSParent;\r\n\r\n this._myVisualFPS = new PP.VisualText(visualParams);\r\n\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"FPS X\", -0.25, 0.1, 3));\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"FPS Y\", -0.130, 0.1, 3));\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"FPS Z\", 0.35, 0.1, 3));\r\n },\r\n update: function () {\r\n let playerTransformQuat = PP.quat2_create();\r\n return function update(dt) {\r\n this._myTotalDT += dt;\r\n this._myFrames++;\r\n\r\n this._myTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n this._myTimer.start();\r\n\r\n let fps = Math.round(this._myFrames / this._myTotalDT);\r\n\r\n let visualParams = this._myVisualFPS.getParams();\r\n\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n visualParams.myTransform.mat4_setPositionRotationScale([-0.115, -0.115, 0.35], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n } else {\r\n visualParams.myTransform.mat4_setPositionRotationScale([-0.25, -0.130, 0.35], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n }\r\n\r\n //visualParams.myTransform.mat4_setPositionRotationScale([PP.myEasyTuneVariables.get(\"FPS X\"), PP.myEasyTuneVariables.get(\"FPS Y\"), PP.myEasyTuneVariables.get(\"FPS Z\")], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n\r\n visualParams.myText = fps.toFixed(0);\r\n this._myVisualFPS.paramsUpdated();\r\n\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n }\r\n\r\n this._myVisualFPSParent.pp_setTransformQuat(PP.myPlayerObjects.myHead.pp_getTransformQuat(playerTransformQuat));\r\n };\r\n }()\r\n});", "/*\r\n You can also use plain functions for state/transition if u want to do something simpler and faster\r\n\r\n Signatures:\r\n stateUpdateFunction(dt, fsm)\r\n initFunction(fsm, initStateData)\r\n transitionFunction(fsm, transitionData)\r\n*/\r\n\r\nPP.StateData = class StateData {\r\n constructor(stateID, stateObject) {\r\n this.myID = stateID;\r\n this.myObject = stateObject;\r\n }\r\n};\r\n\r\nPP.TransitionData = class TransitionData {\r\n constructor(transitionID, fromStateData, toStateData, transitionObject, skipStateFunction) {\r\n this.myID = transitionID;\r\n this.myFromState = fromStateData;\r\n this.myToState = toStateData;\r\n this.myObject = transitionObject;\r\n this.mySkipStateFunction = skipStateFunction;\r\n }\r\n};\r\n\r\nPP.PendingPerform = class PendingPerform {\r\n constructor(transitionID, ...args) {\r\n this.myID = transitionID;\r\n this.myArgs = args;\r\n }\r\n};\r\n\r\nPP.PerformType = {\r\n IMMEDIATE: 0,\r\n DELAYED: 1\r\n};\r\n\r\nPP.PerformDelayedType = {\r\n QUEUE: 0,\r\n KEEP_FIRST: 1,\r\n KEEP_LAST: 2\r\n};\r\n\r\nPP.SkipStateFunction = {\r\n NONE: 0,\r\n END: 1,\r\n START: 2,\r\n BOTH: 3\r\n};\r\n\r\nPP.FSM = class FSM {\r\n\r\n constructor(performType = PP.PerformType.IMMEDIATE, performDelayedType = PP.PerformDelayedType.QUEUE) {\r\n this._myCurrentStateData = null;\r\n\r\n this._myStateMap = new Map();\r\n this._myTransitionMap = new Map();\r\n\r\n this._myDebugLogActive = false;\r\n this._myDebugShowDelayedInfo = false;\r\n this._myDebugLogName = \"FSM\";\r\n\r\n this._myPerformType = performType;\r\n this._myPerformDelayedType = performDelayedType;\r\n this._myPendingPerforms = [];\r\n this._myCurrentlyPerformedTransition = null;\r\n\r\n this._myInitCallbacks = new Map(); // Signature: callback(fsm, initStateData, initTransitionObject, ...args)\r\n this._myInitIDCallbacks = new Map(); // Signature: callback(fsm, initStateData, initTransitionObject, ...args)\r\n this._myTransitionCallbacks = new Map(); // Signature: callback(fsm, fromStateData, toStateData, transitionData, performType, ...args)\r\n this._myTransitionIDCallbacks = []; // Signature: callback(fsm, fromStateData, toStateData, transitionData, performType, ...args)\r\n }\r\n\r\n addState(stateID, state = null) {\r\n let stateObject = null;\r\n if (!state || typeof state == 'function') {\r\n stateObject = {};\r\n if (typeof state == 'function') {\r\n stateObject.update = state;\r\n } else {\r\n stateObject.update = null;\r\n }\r\n stateObject.clone = function () {\r\n let cloneObject = {};\r\n cloneObject.update = this.update;\r\n cloneObject.clone = this.clone;\r\n return cloneObject;\r\n };\r\n } else {\r\n stateObject = state;\r\n }\r\n\r\n let stateData = new PP.StateData(stateID, stateObject);\r\n this._myStateMap.set(stateID, stateData);\r\n this._myTransitionMap.set(stateID, new Map());\r\n }\r\n\r\n addTransition(fromStateID, toStateID, transitionID, transition = null, skipStateFunction = PP.SkipStateFunction.NONE) {\r\n let transitionObject = null;\r\n if (!transition || typeof transition == 'function') {\r\n transitionObject = {};\r\n if (typeof transition == 'function') {\r\n transitionObject.perform = transition;\r\n } else {\r\n transitionObject.perform = null;\r\n }\r\n transitionObject.clone = function () {\r\n let cloneObject = {};\r\n cloneObject.perform = this.perform;\r\n cloneObject.clone = this.clone;\r\n return cloneObject;\r\n };\r\n } else {\r\n transitionObject = transition;\r\n }\r\n\r\n if (this.hasState(fromStateID) && this.hasState(toStateID)) {\r\n let fromMap = this._getTransitionMapFromState(fromStateID);\r\n\r\n let transitionData = new PP.TransitionData(transitionID, this.getState(fromStateID), this.getState(toStateID), transitionObject, skipStateFunction);\r\n fromMap.set(transitionID, transitionData);\r\n } else {\r\n if (!this.hasState(fromStateID) && !this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID, \"- to state not found:\", toStateID);\r\n } else if (!this.hasState(fromStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID);\r\n } else if (!this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- to state not found:\", toStateID);\r\n }\r\n }\r\n }\r\n\r\n init(initStateID, initTransition = null, ...args) {\r\n let initTransitionObject = initTransition;\r\n if (initTransition && typeof initTransition == 'function') {\r\n initTransitionObject = {};\r\n initTransitionObject.performInit = initTransition;\r\n }\r\n\r\n if (this.hasState(initStateID)) {\r\n let initStateData = this._myStateMap.get(initStateID);\r\n\r\n if (this._myDebugLogActive) {\r\n console.log(this._myDebugLogName, \"- Init:\", initStateID);\r\n }\r\n\r\n if (initTransitionObject && initTransitionObject.performInit) {\r\n initTransitionObject.performInit(this, initStateData, ...args);\r\n } else if (initStateData.myObject && initStateData.myObject.init) {\r\n initStateData.myObject.init(this, initStateData, ...args);\r\n }\r\n\r\n this._myCurrentStateData = initStateData;\r\n\r\n if (this._myInitCallbacks.size > 0) {\r\n this._myInitCallbacks.forEach(function (callback) { callback(this, initStateData, initTransitionObject, ...args); }.bind(this));\r\n }\r\n\r\n if (this._myInitIDCallbacks.size > 0) {\r\n let callbackMap = this._myInitIDCallbacks.get(initStateID);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(this, initStateData, initTransitionObject, ...args); }.bind(this));\r\n }\r\n }\r\n } else if (this._myDebugLogActive) {\r\n console.warn(this._myDebugLogName, \"- Init state not found:\", initStateID);\r\n }\r\n }\r\n\r\n update(dt, ...args) {\r\n if (this._myPendingPerforms.length > 0) {\r\n for (let i = 0; i < this._myPendingPerforms.length; i++) {\r\n this._perform(this._myPendingPerforms[i].myID, PP.PerformType.DELAYED, ...this._myPendingPerforms[i].myArgs);\r\n }\r\n this._myPendingPerforms = [];\r\n }\r\n\r\n if (this._myCurrentStateData && this._myCurrentStateData.myObject && this._myCurrentStateData.myObject.update) {\r\n this._myCurrentStateData.myObject.update(dt, this, ...args);\r\n }\r\n }\r\n\r\n perform(transitionID, ...args) {\r\n if (this._myPerformType == PP.PerformType.DELAYED) {\r\n this.performDelayed(transitionID, ...args);\r\n } else {\r\n this.performImmediate(transitionID, ...args);\r\n }\r\n }\r\n\r\n performDelayed(transitionID, ...args) {\r\n let performDelayed = false;\r\n\r\n switch (this._myPerformDelayedType) {\r\n case PP.PerformDelayedType.QUEUE:\r\n this._myPendingPerforms.push(new PP.PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n case PP.PerformDelayedType.KEEP_FIRST:\r\n if (!this.hasPendingPerforms()) {\r\n this._myPendingPerforms.push(new PP.PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n }\r\n break;\r\n case PP.PerformDelayedType.KEEP_LAST:\r\n this.resetPendingPerforms();\r\n this._myPendingPerforms.push(new PP.PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n }\r\n\r\n return performDelayed;\r\n }\r\n\r\n performImmediate(transitionID, ...args) {\r\n return this._perform(transitionID, PP.PerformType.IMMEDIATE, ...args);\r\n }\r\n\r\n canPerform(transitionID) {\r\n return this.hasTransitionFromState(this._myCurrentStateData.myID, transitionID);\r\n }\r\n\r\n canGoTo(stateID, transitionID = null) {\r\n return this.hasTransitionFromStateToState(this._myCurrentStateData.myID, stateID, transitionID);\r\n }\r\n\r\n isInState(stateID) {\r\n return this._myCurrentStateData != null && this._myCurrentStateData.myID == stateID;\r\n }\r\n\r\n isPerformingTransition() {\r\n return this._myCurrentlyPerformedTransition != null;\r\n }\r\n\r\n getCurrentlyPerformedTransition() {\r\n return this._myCurrentlyPerformedTransition;\r\n }\r\n\r\n hasBeenInit() {\r\n return this._myCurrentStateData != null;\r\n }\r\n\r\n reset() {\r\n this.resetState();\r\n this.resetPendingPerforms();\r\n }\r\n\r\n resetState() {\r\n this._myCurrentStateData = null;\r\n }\r\n\r\n resetPendingPerforms() {\r\n this._myPendingPerforms = [];\r\n }\r\n\r\n getCurrentState() {\r\n return this._myCurrentStateData;\r\n }\r\n\r\n getCurrentTransitions() {\r\n return this.getTransitionsFromState(this._myCurrentStateData.myID);\r\n }\r\n\r\n getCurrentTransitionsToState(stateID) {\r\n return this.getTransitionsFromStateToState(this._myCurrentStateData.myID, stateID);\r\n }\r\n\r\n getState(stateID) {\r\n return this._myStateMap.get(stateID);\r\n }\r\n\r\n getStates() {\r\n return this._myStateMap.values();\r\n }\r\n\r\n getTransitions() {\r\n let transitions = [];\r\n\r\n for (let transitionsPerStateMap of this._myTransitionMap.values()) {\r\n for (let transitionData of transitionsPerStateMap.values()) {\r\n transitions.push(transitionData);\r\n }\r\n }\r\n\r\n return transitions;\r\n }\r\n\r\n getTransitionsFromState(fromStateID) {\r\n let transitionMap = this._getTransitionMapFromState(fromStateID);\r\n return Array.from(transitionMap.values());\r\n }\r\n\r\n getTransitionsFromStateToState(fromStateID, toStateID) {\r\n let transitionMap = this._getTransitionMapFromState(fromStateID);\r\n\r\n let transitionsToState = [];\r\n for (let transitionData of transitionMap.values()) {\r\n if (transitionData.myToState.myID == toStateID) {\r\n transitionsToState.push(transitionData);\r\n }\r\n }\r\n\r\n return transitionsToState;\r\n }\r\n\r\n removeState(stateID) {\r\n if (this.hasState(stateID)) {\r\n this._myStateMap.delete(stateID);\r\n this._myTransitionMap.delete(stateID);\r\n\r\n for (let transitionMap of this._myTransitionMap.values()) {\r\n let toDelete = [];\r\n for (let [transitionID, transitionData] of transitionMap.entries()) {\r\n if (transitionData.myToState.myID == stateID) {\r\n toDelete.push(transitionID);\r\n }\r\n }\r\n\r\n for (let transitionID of toDelete) {\r\n transitionMap.delete(transitionID);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n removeTransitionFromState(fromStateID, transitionID) {\r\n let fromTransitions = this._getTransitionMapFromState(fromStateID);\r\n if (fromTransitions) {\r\n return fromTransitions.delete(transitionID);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasState(stateID) {\r\n return this._myStateMap.has(stateID);\r\n }\r\n\r\n hasTransitionFromState(fromStateID, transitionID) {\r\n let transitions = this.getTransitionsFromState(fromStateID);\r\n\r\n let transitionIndex = transitions.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n return transitionIndex >= 0;\r\n }\r\n\r\n hasTransitionFromStateToState(fromStateID, toStateID, transitionID = null) {\r\n let transitions = this.getTransitionsFromStateToState(fromStateID, toStateID);\r\n\r\n let hasTransition = false;\r\n if (transitionID) {\r\n let transitionIndex = transitions.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n hasTransition = transitionIndex >= 0;\r\n } else {\r\n hasTransition = transitions.length > 0;\r\n }\r\n\r\n return hasTransition;\r\n }\r\n\r\n setPerformType(performType) {\r\n this._myPerformType = performType;\r\n }\r\n\r\n getPerformType() {\r\n return this._myPerformType;\r\n }\r\n\r\n setPerformDelayedType(performDelayedType) {\r\n this._myPerformDelayedType = performDelayedType;\r\n }\r\n\r\n getPerformDelayedType() {\r\n return this._myPerformDelayedType;\r\n }\r\n\r\n hasPendingPerforms() {\r\n return this._myPendingPerforms.length > 0;\r\n }\r\n\r\n getPendingPerforms() {\r\n return this._myPendingPerforms.slice(0);\r\n }\r\n\r\n clone(deepClone = false) {\r\n if (!this.isCloneable(deepClone)) {\r\n return null;\r\n }\r\n\r\n let cloneFSM = new PP.FSM();\r\n\r\n cloneFSM._myDebugLogActive = this._myDebugLogActive;\r\n cloneFSM._myDebugShowDelayedInfo = this._myDebugShowDelayedInfo;\r\n cloneFSM._myDebugLogName = this._myDebugLogName.slice(0);\r\n\r\n cloneFSM._myPerformType = this._myPerformType;\r\n cloneFSM._myPerformDelayedType = this._myPerformDelayedType;\r\n cloneFSM._myPendingPerforms = this._myPendingPerforms.slice(0);\r\n\r\n for (let entry of this._myStateMap.entries()) {\r\n let stateData = null;\r\n\r\n if (deepClone) {\r\n stateData = new PP.StateData(entry[1].myID, entry[1].myObject.clone());\r\n } else {\r\n stateData = new PP.StateData(entry[1].myID, entry[1].myObject);\r\n }\r\n\r\n cloneFSM._myStateMap.set(stateData.myID, stateData);\r\n }\r\n\r\n for (let entry of this._myTransitionMap.entries()) {\r\n let fromStateMap = new Map();\r\n cloneFSM._myTransitionMap.set(entry[0], fromStateMap);\r\n\r\n for (let tEntry of entry[1].entries()) {\r\n let transitionData = null;\r\n\r\n let fromState = cloneFSM.getState(tEntry[1].myFromState.myID);\r\n let toState = cloneFSM.getState(tEntry[1].myToState.myID);\r\n\r\n if (deepClone) {\r\n transitionData = new PP.TransitionData(tEntry[1].myID, fromState, toState, tEntry[1].myObject.clone(), tEntry[1].mySkipStateFunction);\r\n } else {\r\n transitionData = new PP.TransitionData(tEntry[1].myID, fromState, toState, tEntry[1].myObject, tEntry[1].mySkipStateFunction);\r\n }\r\n\r\n fromStateMap.set(transitionData.myID, transitionData);\r\n }\r\n }\r\n\r\n if (this._myCurrentStateData) {\r\n cloneFSM._myCurrentStateData = cloneFSM.getState(this._myCurrentStateData.myID);\r\n }\r\n\r\n return cloneFSM;\r\n }\r\n\r\n isCloneable(deepClone = false) {\r\n if (!deepClone) {\r\n return true;\r\n }\r\n\r\n let isDeepCloneable = true;\r\n\r\n for (let entry of this._myStateMap.entries()) {\r\n isDeepCloneable = isDeepCloneable && entry[1].myObject.clone != null;\r\n }\r\n\r\n for (let entry of this._myTransitionMap.entries()) {\r\n for (let tEntry of entry[1].entries()) {\r\n isDeepCloneable = isDeepCloneable && tEntry[1].myObject.clone != null;\r\n }\r\n }\r\n\r\n return isDeepCloneable;\r\n }\r\n\r\n setDebugLogActive(active, debugLogName = null, showDelayedInfo = false) {\r\n this._myDebugLogActive = active;\r\n this._myDebugShowDelayedInfo = showDelayedInfo;\r\n if (debugLogName) {\r\n this._myDebugLogName = \"FSM: \".concat(debugLogName);\r\n }\r\n }\r\n\r\n registerInitEventListener(callbackID, callback) {\r\n this._myInitCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterInitEventListener(callbackID) {\r\n this._myInitCallbacks.delete(callbackID);\r\n }\r\n\r\n registerInitIDEventListener(iniStateID, callbackID, callback) {\r\n let iniStateIDMap = this._myInitIDCallbacks.get(iniStateID);\r\n if (iniStateIDMap == null) {\r\n this._myInitIDCallbacks.set(iniStateID, new Map());\r\n iniStateIDMap = this._myInitIDCallbacks.get(iniStateID);\r\n }\r\n\r\n iniStateIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterInitIDEventListener(iniStateID, callbackID) {\r\n let iniStateIDMap = this._myInitIDCallbacks.get(iniStateID);\r\n if (iniStateIDMap != null) {\r\n iniStateIDMap.delete(callbackID);\r\n\r\n if (iniStateIDMap.size <= 0) {\r\n this._myInitIDCallbacks.delete(iniStateID);\r\n }\r\n }\r\n }\r\n\r\n registerTransitionEventListener(callbackID, callback) {\r\n this._myTransitionCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterTransitionEventListener(callbackID) {\r\n this._myTransitionCallbacks.delete(callbackID);\r\n }\r\n\r\n //the fsm IDs can be null, that means that the callback is called whenever only the valid IDs match\r\n //this let you register to all the transitions with a specific ID and from of a specific state but to every state (toStateID == null)\r\n registerTransitionIDEventListener(fromStateID, toStateID, transitionID, callbackID, callback) {\r\n let transitionIDMap = null;\r\n for (let value of this._myTransitionIDCallbacks) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n transitionIDMap = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (transitionIDMap == null) {\r\n let transitionMapValue = [];\r\n transitionMapValue[0] = fromStateID;\r\n transitionMapValue[1] = toStateID;\r\n transitionMapValue[2] = transitionID;\r\n transitionMapValue[3] = new Map();\r\n\r\n transitionIDMap = transitionMapValue[3];\r\n\r\n this._myTransitionIDCallbacks.push(transitionMapValue);\r\n }\r\n\r\n transitionIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterTransitionIDEventListener(fromStateID, toStateID, transitionID, callbackID) {\r\n let transitionIDMap = null;\r\n for (let value of this._myTransitionIDCallbacks) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n transitionIDMap = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (transitionIDMap != null) {\r\n transitionIDMap.delete(callbackID);\r\n\r\n if (transitionIDMap.size <= 0) {\r\n this._myTransitionIDCallbacks.pp_remove(element => element[0] == fromStateID && element[1] == toStateID && element[2] == transitionID);\r\n }\r\n }\r\n }\r\n\r\n _perform(transitionID, performType, ...args) {\r\n if (this.isPerformingTransition()) {\r\n let currentlyPerformedTransition = this.getCurrentlyPerformedTransition();\r\n let consoleArguments = [this._myDebugLogName, \"- Trying to perform:\", transitionID];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n consoleArguments.push(\"- But another transition is currently being performed -\", currentlyPerformedTransition.myID);\r\n console.warn(...consoleArguments);\r\n\r\n return false;\r\n }\r\n\r\n if (this._myCurrentStateData) {\r\n if (this.canPerform(transitionID)) {\r\n let transitions = this._myTransitionMap.get(this._myCurrentStateData.myID);\r\n let transitionToPerform = transitions.get(transitionID);\r\n\r\n this._myCurrentlyPerformedTransition = transitionToPerform;\r\n\r\n let fromState = this._myCurrentStateData;\r\n let toState = this._myStateMap.get(transitionToPerform.myToState.myID);\r\n\r\n if (this._myDebugLogActive) {\r\n let consoleArguments = [this._myDebugLogName, \"- From:\", fromState.myID, \"- To:\", toState.myID, \"- With:\", transitionID];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.log(...consoleArguments);\r\n }\r\n\r\n if (transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.END && transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.BOTH &&\r\n fromState.myObject && fromState.myObject.end) {\r\n fromState.myObject.end(this, transitionToPerform, ...args);\r\n }\r\n\r\n if (transitionToPerform.myObject && transitionToPerform.myObject.perform) {\r\n transitionToPerform.myObject.perform(this, transitionToPerform, ...args);\r\n }\r\n\r\n if (transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.START && transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.BOTH &&\r\n toState.myObject && toState.myObject.start) {\r\n toState.myObject.start(this, transitionToPerform, ...args);\r\n }\r\n\r\n this._myCurrentStateData = transitionToPerform.myToState;\r\n\r\n if (this._myTransitionCallbacks.size > 0) {\r\n this._myTransitionCallbacks.forEach(function (callback) { callback(this, fromState, toState, transitionToPerform, performType, ...args); }.bind(this));\r\n }\r\n\r\n if (this._myTransitionIDCallbacks.length > 0) {\r\n let transitionIDMaps = [];\r\n for (let value of this._myTransitionIDCallbacks) {\r\n if ((value[0] == null || value[0] == fromState.myID) &&\r\n (value[1] == null || value[1] == toState.myID) &&\r\n (value[2] == null || value[2] == transitionToPerform.myID)) {\r\n transitionIDMaps.push(value[3]);\r\n }\r\n }\r\n\r\n for (let callbackMap of this.transitionIDMaps) {\r\n callbackMap.forEach(function (callback) { callback(this, fromState, toState, transitionToPerform, performType, ...args); }.bind(this));\r\n }\r\n }\r\n\r\n this._myCurrentlyPerformedTransition = null;\r\n\r\n return true;\r\n } else if (this._myDebugLogActive) {\r\n let consoleArguments = [this._myDebugLogName, \"- No Transition:\", transitionID, \"- From:\", this._myCurrentStateData.myID];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n } else if (this._myDebugLogActive) {\r\n let consoleArguments = [this._myDebugLogName, \"- FSM not initialized yet\"];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n _getTransitionMapFromState(fromStateID) {\r\n return this._myTransitionMap.get(fromStateID);\r\n }\r\n};", "/*\r\n There is no need to inherit from this state, especially since states can be only functions\r\n It's more like an example of what is needed\r\n \r\n If you don't specify some functions the fsm will just skip them\r\n Or consider them always valid\r\n\r\n The param state is of type PP.StateData and can be used to retrieve the stateID and other data\r\n The param transition is of type PP.TransitionData and can be used to retrieve the transitionID, the from and to states and other data\r\n*/\r\n\r\nPP.State = class State {\r\n\r\n //Called every frame if this is the current state\r\n //You can retrieve this state data by calling fsm.getCurrentState()\r\n update(dt, fsm, ...args) {\r\n }\r\n\r\n //Called when the fsm is started with this init state if no init transition object is specified or it does not have a performInit function\r\n //Since the state is set as the current one after the init, you can't use fsm.getCurrentState() to get it, so it is forwarded as a param if needed\r\n init(fsm, state, ...args) {\r\n }\r\n\r\n //Called when entering this state if no transition object is specified or it does not have a perform function\r\n //You can get this state data by accesing to the to state data inside the transition\r\n start(fsm, transition, ...args) {\r\n }\r\n\r\n //Called when exiting this state if no transition function is specified\r\n //You can get this state data by accesing to the from state data inside the transition\r\n end(fsm, transition, ...args) {\r\n }\r\n\r\n};", "/*\r\n There is no need to inherit from this transition, especially since states can be only transitions\r\n It's more like an example of what is needed\r\n \r\n The param transition (forwarded at the end every function) is of type PP.TransitionData and can be used to retrieve the transitionID and other data\r\n The initState param is of type PP.StateData and can be used to retrieve the stateID and other data\r\n*/\r\n\r\nPP.Transition = class Transition {\r\n\r\n //Called if this is used as an init transition for the fsm\r\n performInit(fsm, initState, ...args) {\r\n\r\n }\r\n\r\n //Called when performing a transition\r\n //You can find the from and to states inside the transition params\r\n perform(fsm, transition, ...args) {\r\n }\r\n\r\n};", "PP.TimerState = class TimerState extends PP.State {\r\n constructor(duration = 0, transitionToPerformOnEnd = null, ...transitionArgs) {\r\n super();\r\n\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n\r\n this._myTimer = new PP.Timer(duration, false);\r\n }\r\n\r\n setDuration(duration) {\r\n this._myTimer.setDuration(duration);\r\n }\r\n\r\n setTransitionToPerformOnEnd(transitionToPerformOnEnd, ...transitionArgs) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n\r\n onEnd(callback, id = null) {\r\n this._myTimer.onEnd(callback, id);\r\n }\r\n\r\n unregisterOnEnd(id = null) {\r\n this._myTimer.unregisterOnEnd(id);\r\n }\r\n\r\n update(dt, fsm) {\r\n this._myTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n if (this._myTransitionToPerformOnEnd != null) {\r\n fsm.perform(this._myTransitionToPerformOnEnd, ...this._myTransitionArgs);\r\n }\r\n }\r\n }\r\n\r\n start(fsm, transition, duration = null, transitionToPerformOnEnd = null, ...transitionArgs) {\r\n this._myTimer.start(duration);\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n\r\n init(fsm, state, duration = null, transitionToPerformOnEnd = null, ...transitionArgs) {\r\n this._myTimer.start(duration);\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n};", "PP.CAUtils = {\r\n _myDummyServer: null,\r\n _myUseDummyServerOnSDKMissing: false,\r\n _myUseDummyServerOnError: false,\r\n setUseDummyServerOnSDKMissing: function (useDummyServer) {\r\n PP.CAUtils._myUseDummyServerOnSDKMissing = useDummyServer;\r\n },\r\n setUseDummyServerOnError: function (useDummyServer) {\r\n PP.CAUtils._myUseDummyServerOnError = useDummyServer;\r\n },\r\n setDummyServer: function (dummyServer) {\r\n PP.CAUtils._myDummyServer = dummyServer;\r\n },\r\n isUseDummyServerOnSDKMissing: function () {\r\n return PP.CAUtils._myUseDummyServerOnSDKMissing;\r\n },\r\n isUseDummyServerOnError: function () {\r\n return PP.CAUtils._myUseDummyServerOnError;\r\n },\r\n getDummyServer: function () {\r\n return PP.CAUtils._myDummyServer;\r\n },\r\n isSDKAvailable: function () {\r\n return \"casdk\" in window;\r\n },\r\n getLeaderboard: function (leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError, overrideUseDummyServer = null) {\r\n if (PP.CAUtils.isSDKAvailable()) {\r\n if (!isAroundPlayer) {\r\n casdk.getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount).then(function (result) {\r\n if (result.leaderboard) {\r\n if (callbackOnDone) {\r\n callbackOnDone(result.leaderboard);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n });\r\n } else {\r\n PP.CAUtils.getUser(\r\n function (user) {\r\n let userName = user.displayName;\r\n casdk.getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount).then(function (result) {\r\n if (result.leaderboard) {\r\n let userValid = false;\r\n for (let value of result.leaderboard) {\r\n if (value.displayName == userName && value.score != 0) {\r\n userValid = true;\r\n break;\r\n }\r\n }\r\n if (userValid) {\r\n if (callbackOnDone) {\r\n callbackOnDone(result.leaderboard);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Searching for around player but the user has not submitted a score yet\";\r\n error.type = PP.CAUtils.ErrorType.USER_HAS_NO_SCORE;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n });\r\n\r\n },\r\n function () {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Searching for around player but the user can't be retrieved\";\r\n error.type = PP.CAUtils.ErrorType.GET_USER_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n },\r\n false);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnSDKMissing && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = PP.CAUtils.ErrorType.CA_SDK_MISSING;\r\n callbackOnError(error, null);\r\n }\r\n }\r\n },\r\n getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError) {\r\n if (PP.CAUtils._myDummyServer) {\r\n PP.CAUtils._myDummyServer.getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else {\r\n if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED;\r\n callbackOnError(error);\r\n }\r\n }\r\n },\r\n submitScore: function (leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError, overrideUseDummyServer = null) {\r\n if (PP.CAUtils.isSDKAvailable()) {\r\n casdk.submitScore(leaderboardID, scoreToSubmit).then(function (result) {\r\n if (result.error) {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = PP.CAUtils.ErrorType.SUBMIT_SCORE_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n } else {\r\n callbackOnDone();\r\n }\r\n });\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnSDKMissing && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = PP.CAUtils.ErrorType.CA_SDK_MISSING;\r\n callbackOnError(error, null);\r\n }\r\n }\r\n },\r\n submitScoreDummy(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError) {\r\n if (PP.CAUtils._myDummyServer) {\r\n PP.CAUtils._myDummyServer.submitScore(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError);\r\n } else {\r\n if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED;\r\n callbackOnError(error);\r\n }\r\n }\r\n },\r\n getUser: function (callbackOnDone, callbackOnError, overrideUseDummyServer = null) {\r\n if (PP.CAUtils.isSDKAvailable()) {\r\n casdk.getUser().then(function (result) {\r\n if (result.user) {\r\n if (callbackOnDone) {\r\n callbackOnDone(result.user);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getUserDummy(callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = PP.CAUtils.ErrorType.GET_USER_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n });\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnSDKMissing && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getUserDummy(callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = PP.CAUtils.ErrorType.CA_SDK_MISSING;\r\n callbackOnError(error, null);\r\n }\r\n }\r\n },\r\n getUserDummy(callbackOnDone, callbackOnError) {\r\n if (PP.CAUtils._myDummyServer) {\r\n PP.CAUtils._myDummyServer.getUser(callbackOnDone, callbackOnError);\r\n } else {\r\n if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED;\r\n callbackOnError(error);\r\n }\r\n }\r\n },\r\n ErrorType: {\r\n DUMMY_NOT_INITIALIZED: 0,\r\n CA_SDK_MISSING: 1,\r\n SUBMIT_SCORE_FAILED: 2,\r\n GET_LEADERBOARD_FAILED: 3,\r\n GET_USER_FAILED: 4,\r\n USER_HAS_NO_SCORE: 5\r\n }\r\n};\r\n\r\nPP.CADummyServer = class CADummyServer {\r\n\r\n constructor() {\r\n }\r\n\r\n getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError) {\r\n let leaderboard = null;\r\n\r\n if (isAroundPlayer) {\r\n leaderboard = [\r\n { rank: 7, displayName: \"Player 1\", score: 1000000 },\r\n { rank: 8, displayName: \"Player 2\", score: 1000000 },\r\n { rank: 9, displayName: \"Player 3\", score: 900000 },\r\n { rank: 10, displayName: \"Player 4\", score: 800000 },\r\n { rank: 11111, displayName: \"Player 5\", score: 70000000 },\r\n { rank: 22222, displayName: \"VeryLongName_06\", score: 600000 },\r\n { rank: 33333, displayName: \"Player 7\", score: 500000 },\r\n { rank: 44444, displayName: \"Player 8\", score: 400000 },\r\n { rank: 55555, displayName: \"Player 9\", score: 300000 },\r\n { rank: 66666, displayName: \"Player 10\", score: 200000 }];\r\n } else {\r\n leaderboard = [\r\n { rank: 0, displayName: \"Player 1\", score: 1000000 },\r\n { rank: 1, displayName: \"Player 2\", score: 1000000 },\r\n { rank: 2, displayName: \"Player 3\", score: 900000 },\r\n { rank: 3, displayName: \"Player 4\", score: 800000 },\r\n { rank: 4, displayName: \"Player 5\", score: 700000 },\r\n { rank: 5, displayName: \"Player 6\", score: 600000 },\r\n { rank: 6, displayName: \"Player 7\", score: 500000 },\r\n { rank: 7, displayName: \"Player 8\", score: 400000 },\r\n { rank: 8, displayName: \"Player 9\", score: 300000 },\r\n { rank: 9, displayName: \"Player 10\", score: 200000 }];\r\n }\r\n\r\n while (leaderboard.length > scoresAmount) {\r\n leaderboard.pop();\r\n }\r\n\r\n if (callbackOnDone) {\r\n callbackOnDone(leaderboard);\r\n }\r\n }\r\n\r\n submitScore(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError) {\r\n if (callbackOnDone) {\r\n callbackOnDone();\r\n }\r\n }\r\n\r\n getUser(callbackOnDone, callbackOnError) {\r\n let user = {};\r\n user.displayName = \"Jonathan\";\r\n\r\n if (callbackOnDone) {\r\n callbackOnDone(user);\r\n }\r\n }\r\n};", "PP.ColorUtils = {\r\n //RGB is in [0,1], alpha is not changed\r\n rgbToHsv: function (rgb) {\r\n let hsv = rgb.pp_clone();\r\n\r\n let r = rgb[0];\r\n let g = rgb[1];\r\n let b = rgb[2];\r\n\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b),\r\n d = max - min,\r\n h,\r\n s = (max === 0 ? 0 : d / max),\r\n v = max;\r\n\r\n switch (max) {\r\n case min: h = 0; break;\r\n case r: h = (g - b) + d * (g < b ? 6 : 0); h /= 6 * d; break;\r\n case g: h = (b - r) + d * 2; h /= 6 * d; break;\r\n case b: h = (r - g) + d * 4; h /= 6 * d; break;\r\n }\r\n\r\n hsv[0] = h;\r\n hsv[1] = s;\r\n hsv[2] = v;\r\n\r\n return hsv;\r\n },\r\n //alpha is not changed\r\n hsvToRgb: function (hsv) {\r\n let rgb = hsv.pp_clone();\r\n\r\n let h = hsv[0];\r\n let s = hsv[1];\r\n let v = hsv[2];\r\n\r\n let r, g, b, i, f, p, q, t;\r\n i = Math.floor(h * 6);\r\n f = h * 6 - i;\r\n p = v * (1 - s);\r\n q = v * (1 - f * s);\r\n t = v * (1 - (1 - f) * s);\r\n\r\n switch (i % 6) {\r\n case 0: r = v, g = t, b = p; break;\r\n case 1: r = q, g = v, b = p; break;\r\n case 2: r = p, g = v, b = t; break;\r\n case 3: r = p, g = q, b = v; break;\r\n case 4: r = t, g = p, b = v; break;\r\n case 5: r = v, g = p, b = q; break;\r\n }\r\n\r\n rgb[0] = r;\r\n rgb[1] = g;\r\n rgb[2] = b;\r\n\r\n return rgb;\r\n },\r\n rgbCodeToHuman(rgb) {\r\n return PP.ColorUtils.color1To255(rgb);\r\n },\r\n rgbHumanToCode(rgb) {\r\n return PP.ColorUtils.color255To1(rgb);\r\n },\r\n hsvCodeToHuman(hsv) {\r\n return PP.ColorUtils.color1To255(hsv);\r\n },\r\n hsvHumanToCode(hsv) {\r\n return PP.ColorUtils.color255To1(hsv);\r\n },\r\n color255To1(color) {\r\n let result = color.pp_clone();\r\n\r\n for (let i = 0; i < result.length; i++) {\r\n result[i] /= 255;\r\n result[i] = Math.pp_clamp(result[i], 0, 1);\r\n }\r\n\r\n return result;\r\n },\r\n color1To255(color) {\r\n let result = color.pp_clone();\r\n\r\n for (let i = 0; i < result.length; i++) {\r\n result[i] = Math.round(result[i] * 255);\r\n result[i] = Math.pp_clamp(result[i], 0, 255);\r\n }\r\n\r\n return result;\r\n },\r\n};", "PP.MeshCreationVertexParams = class MeshCreationVertexParams {\n constructor() {\n this.myPosition = null; // vec3\n this.myTextureCoordinates = null; // vec2\n this.myNormal = null; // vec3\n this.myColor = null; // vec4\n }\n};\n\nPP.MeshCreationTriangleParams = class MeshCreationTriangleParams {\n constructor() {\n this.myIndexes = new Uint32Array(3);\n }\n};\n\nPP.MeshCreationParams = class MeshCreationParams {\n constructor() {\n this.myVertexes = [];\n this.myTriangles = [];\n }\n};\n\nPP.MeshUtils = {\n createPlaneMesh: function () {\n let vertexCount = 4;\n\n let meshParams = new PP.MeshCreationParams();\n\n for (let i = 0; i < vertexCount; ++i) {\n let vertexParams = new PP.MeshCreationVertexParams();\n\n vertexParams.myPosition = new PP.vec3_create();\n vertexParams.myPosition[0] = -1 + (i & 1) * 2;\n vertexParams.myPosition[1] = -1 + ((i & 2) >> 1) * 2; // this is a quick way to have positions (-1,-1) (1,-1) (1,-1) (1,1)\n vertexParams.myPosition[2] = 0;\n\n vertexParams.myTextureCoordinates = new PP.vec2_create();\n vertexParams.myTextureCoordinates[0] = (i & 1);\n vertexParams.myTextureCoordinates[1] = ((i & 2) >> 1);\n\n vertexParams.myNormal = new PP.vec3_create();\n vertexParams.myNormal[0] = 0;\n vertexParams.myNormal[1] = 0;\n vertexParams.myNormal[2] = 1;\n\n meshParams.myVertexes.push(vertexParams);\n }\n\n let firstTriangle = new PP.MeshCreationTriangleParams();\n firstTriangle.myIndexes[0] = 0;\n firstTriangle.myIndexes[1] = 1;\n firstTriangle.myIndexes[2] = 2;\n\n let secondTriangle = new PP.MeshCreationTriangleParams();\n secondTriangle.myIndexes[0] = 2;\n secondTriangle.myIndexes[1] = 1;\n secondTriangle.myIndexes[2] = 3;\n\n meshParams.myTriangles.push(firstTriangle);\n meshParams.myTriangles.push(secondTriangle);\n\n let mesh = PP.MeshUtils.createMesh(meshParams);\n\n return mesh;\n },\n createMesh: function (meshCreationParams) {\n let indexData = [];\n for (let triangle of meshCreationParams.myTriangles) {\n indexData.push(triangle.myIndexes[0]);\n indexData.push(triangle.myIndexes[1]);\n indexData.push(triangle.myIndexes[2]);\n }\n\n let indexDataUnsignedInt = new Uint32Array(indexData.length);\n indexDataUnsignedInt.pp_copy(indexData);\n\n let vertexCount = meshCreationParams.myVertexes.length;\n let mesh = new WL.Mesh({\n vertexCount: vertexCount,\n indexData: indexDataUnsignedInt,\n indexType: WL.MeshIndexType.UnsignedInt,\n });\n\n let positionAttribute = null;\n let textureCoordinatesAttribute = null;\n let normalAttribute = null;\n let colorAttribute = null;\n\n try {\n positionAttribute = mesh.attribute(WL.MeshAttribute.Position);\n } catch (error) {\n positionAttribute = null;\n }\n\n try {\n textureCoordinatesAttribute = mesh.attribute(WL.MeshAttribute.TextureCoordinate);\n } catch (error) {\n textureCoordinatesAttribute = null;\n }\n\n try {\n normalAttribute = mesh.attribute(WL.MeshAttribute.Normal);\n } catch (error) {\n normalAttribute = null;\n }\n\n try {\n colorAttribute = mesh.attribute(WL.MeshAttribute.Color);\n } catch (error) {\n colorAttribute = null;\n }\n\n for (let i = 0; i < meshCreationParams.myVertexes.length; i++) {\n let vertex = meshCreationParams.myVertexes[i];\n if (positionAttribute != null && vertex.myPosition) {\n positionAttribute.set(i, vertex.myPosition);\n }\n if (textureCoordinatesAttribute != null && vertex.myTextureCoordinates) {\n textureCoordinatesAttribute.set(i, vertex.myTextureCoordinates);\n }\n if (normalAttribute != null && vertex.myNormal) {\n normalAttribute.set(i, vertex.myNormal);\n }\n if (colorAttribute != null && vertex.myColor) {\n colorAttribute.set(i, vertex.myColor);\n }\n }\n\n return mesh;\n },\n cloneMesh: function () {\n let position = PP.vec3_create();\n let textureCoordinates = PP.vec2_create();\n let normal = PP.vec3_create();\n let color = PP.vec4_create();\n\n return function cloneMesh(mesh) {\n if (mesh == null) {\n return null;\n }\n\n let clonedIndexData = new Uint32Array(mesh.indexData.length);\n for (let i = 0; i < mesh.indexData.length; i++) {\n clonedIndexData[i] = mesh.indexData[i];\n }\n\n let clonedMesh = new WL.Mesh({\n vertexCount: mesh.vertexCount,\n indexData: clonedIndexData,\n indexType: WL.MeshIndexType.UnsignedInt,\n });\n\n let positionAttribute = null;\n let textureCoordinatesAttribute = null;\n let normalAttribute = null;\n let colorAttribute = null;\n\n let clonedPositionAttribute = null;\n let clonedTextureCoordinatesAttribute = null;\n let clonedNormalAttribute = null;\n let clonedColorAttribute = null;\n\n\n try {\n positionAttribute = mesh.attribute(WL.MeshAttribute.Position);\n clonedPositionAttribute = clonedMesh.attribute(WL.MeshAttribute.Position);\n } catch (error) {\n positionAttribute = null;\n clonedPositionAttribute = null;\n }\n\n try {\n textureCoordinatesAttribute = mesh.attribute(WL.MeshAttribute.TextureCoordinate);\n clonedTextureCoordinatesAttribute = clonedMesh.attribute(WL.MeshAttribute.TextureCoordinate);\n } catch (error) {\n textureCoordinatesAttribute = null;\n clonedTextureCoordinatesAttribute = null;\n }\n\n try {\n normalAttribute = mesh.attribute(WL.MeshAttribute.Normal);\n clonedNormalAttribute = clonedMesh.attribute(WL.MeshAttribute.Normal);\n } catch (error) {\n normalAttribute = null;\n clonedNormalAttribute = null;\n }\n\n try {\n colorAttribute = mesh.attribute(WL.MeshAttribute.Color);\n clonedColorAttribute = clonedMesh.attribute(WL.MeshAttribute.Color);\n } catch (error) {\n colorAttribute = null;\n clonedColorAttribute = null;\n }\n\n for (let i = 0; i < mesh.vertexCount; i++) {\n if (positionAttribute != null && clonedPositionAttribute != null) {\n clonedPositionAttribute.set(i, positionAttribute.get(i, position));\n }\n if (textureCoordinatesAttribute != null && clonedTextureCoordinatesAttribute != null) {\n clonedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\n }\n if (normalAttribute != null && clonedNormalAttribute != null) {\n clonedNormalAttribute.set(i, normalAttribute.get(i, normal));\n }\n if (colorAttribute != null && clonedColorAttribute != null) {\n clonedColorAttribute.set(i, colorAttribute.get(i, color));\n }\n }\n\n return clonedMesh;\n };\n }(),\n invertMesh: function () {\n let position = PP.vec3_create();\n let textureCoordinates = PP.vec2_create();\n let normal = PP.vec3_create();\n let color = PP.vec4_create();\n\n return function invertMesh(mesh) {\n if (mesh == null) {\n return null;\n }\n\n let invertedIndexData = new Uint32Array(mesh.indexData.length);\n for (let i = 0; i < mesh.indexData.length / 3; i++) {\n invertedIndexData[i * 3 + 0] = mesh.indexData[i * 3 + 2];\n invertedIndexData[i * 3 + 1] = mesh.indexData[i * 3 + 1];\n invertedIndexData[i * 3 + 2] = mesh.indexData[i * 3 + 0];\n }\n\n let invertedMesh = new WL.Mesh({\n vertexCount: mesh.vertexCount,\n indexData: invertedIndexData,\n indexType: WL.MeshIndexType.UnsignedInt,\n });\n\n let positionAttribute = null;\n let textureCoordinatesAttribute = null;\n let normalAttribute = null;\n let colorAttribute = null;\n\n let invertedPositionAttribute = null;\n let invertedTextureCoordinatesAttribute = null;\n let invertedNormalAttribute = null;\n let invertedColorAttribute = null;\n\n\n try {\n positionAttribute = mesh.attribute(WL.MeshAttribute.Position);\n invertedPositionAttribute = invertedMesh.attribute(WL.MeshAttribute.Position);\n } catch (error) {\n positionAttribute = null;\n invertedPositionAttribute = null;\n }\n\n try {\n textureCoordinatesAttribute = mesh.attribute(WL.MeshAttribute.TextureCoordinate);\n invertedTextureCoordinatesAttribute = invertedMesh.attribute(WL.MeshAttribute.TextureCoordinate);\n } catch (error) {\n textureCoordinatesAttribute = null;\n invertedTextureCoordinatesAttribute = null;\n }\n\n try {\n normalAttribute = mesh.attribute(WL.MeshAttribute.Normal);\n invertedNormalAttribute = invertedMesh.attribute(WL.MeshAttribute.Normal);\n } catch (error) {\n normalAttribute = null;\n invertedNormalAttribute = null;\n }\n\n try {\n colorAttribute = mesh.attribute(WL.MeshAttribute.Color);\n invertedColorAttribute = invertedMesh.attribute(WL.MeshAttribute.Color);\n } catch (error) {\n colorAttribute = null;\n invertedColorAttribute = null;\n }\n\n for (let i = 0; i < mesh.vertexCount; i++) {\n if (positionAttribute != null && invertedPositionAttribute != null) {\n invertedPositionAttribute.set(i, positionAttribute.get(i, position));\n }\n if (textureCoordinatesAttribute != null && invertedTextureCoordinatesAttribute != null) {\n invertedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\n }\n if (normalAttribute != null && invertedNormalAttribute != null) {\n normalAttribute.get(i, normal)\n normal.vec3_negate(normal);\n invertedNormalAttribute.set(i, normal);\n }\n if (colorAttribute != null && invertedColorAttribute != null) {\n invertedColorAttribute.set(i, colorAttribute.get(i, color));\n }\n }\n\n return invertedMesh;\n };\n }(),\n setAlpha: function () {\n let color = PP.vec4_create();\n return function setAlpha(object, alpha) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (meshComponent.material.color != null) {\n color.vec4_copy(meshComponent.material.color);\n color[3] = alpha;\n meshComponent.material.color = color;\n }\n\n if (meshComponent.material.diffuseColor != null) {\n color.vec4_copy(meshComponent.material.diffuseColor);\n color[3] = alpha;\n meshComponent.material.diffuseColor = color;\n }\n\n if (meshComponent.material.ambientColor != null) {\n color.vec4_copy(meshComponent.material.ambientColor);\n color[3] = alpha;\n meshComponent.material.ambientColor = color;\n }\n }\n };\n }(),\n setMaterial: function (object, material, cloneMaterial = false) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (cloneMaterial) {\n meshComponent.material = material.clone();\n } else {\n meshComponent.material = material;\n }\n }\n },\n setClonedMaterials: function (object) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n meshComponent.material = meshComponent.material.clone();\n }\n },\n setSpecularColor: function (object, color) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (meshComponent.material.specularColor != null) {\n meshComponent.material.specularColor = color;\n }\n }\n },\n setFogColor: function (object, color) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (meshComponent.material.fogColor != null) {\n meshComponent.material.fogColor = color;\n }\n }\n },\n};", "PP.SaveUtils = {\r\n save: function (id, value) {\r\n if (value != null) {\r\n localStorage.setItem(id, value);\r\n }\r\n },\r\n has: function (id) {\r\n return PP.SaveUtils.loadString(id, null) != null;\r\n },\r\n delete: function (id) {\r\n return localStorage.removeItem(id);\r\n },\r\n clear: function () {\r\n return localStorage.clear();\r\n },\r\n load: function (id, defaultValue = null) {\r\n return PP.SaveUtils.loadString(id, defaultValue);\r\n },\r\n loadString: function (id, defaultValue = null) {\r\n let item = localStorage.getItem(id);\r\n\r\n if (item == null) {\r\n item = defaultValue;\r\n }\r\n\r\n return item;\r\n },\r\n loadNumber: function (id, defaultValue = null) {\r\n let item = PP.SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n return Number(item);\r\n }\r\n\r\n return defaultValue;\r\n },\r\n loadBool: function (id, defaultValue = null) {\r\n let item = PP.SaveUtils.loadString(id);\r\n\r\n if (item == \"true\") {\r\n return true;\r\n } else if (item == \"false\") {\r\n return false;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n};", "PP.TextUtils = {\r\n setClonedMaterials: function (object) {\r\n let textComponents = object.pp_getComponentsHierarchy(\"text\");\r\n\r\n for (let textComponent of textComponents) {\r\n textComponent.material = textComponent.material.clone();\r\n }\r\n },\r\n};", "PP.XRUtils = {\r\n isDeviceEmulated: function () {\r\n let isEmulated = ('CustomWebXRPolyfill' in window);\r\n return isEmulated;\r\n },\r\n isXRSessionActive: function () {\r\n return WL.xrSession != null;\r\n },\r\n isReferenceSpaceLocalFloor: function () {\r\n return ![\"local\", \"viewer\"].includes(WebXR.refSpace);\r\n }\r\n};", "PP.PhysicsUtils = {\r\n _myLayerFlagAmount: 8,\r\n _myLayerFlagNames: [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"],\r\n setLayerFlagAmount: function (layerFlagAmount) {\r\n PP.PhysicsUtils._myLayerFlagAmount = layerFlagAmount;\r\n },\r\n setLayerFlagNames: function (layerFlagNames) {\r\n PP.PhysicsUtils._myLayerFlagNames = layerFlagNames;\r\n },\r\n getLayerFlagAmount: function () {\r\n return PP.PhysicsUtils._myLayerFlagAmount;\r\n },\r\n getLayerFlagNames: function () {\r\n return PP.PhysicsUtils._myLayerFlagNames;\r\n },\r\n raycast: function () {\r\n let objectsEqualCallback = (first, second) => first.pp_equals(second);\r\n return function raycast(raycastSetup, raycastResult = new PP.RaycastResult()) {\r\n let internalRaycastResult = WL.physics.rayCast(raycastSetup.myOrigin, raycastSetup.myDirection, raycastSetup.myBlockLayerFlags.getMask(), raycastSetup.myDistance);\r\n\r\n raycastResult.myRaycastSetup = raycastSetup;\r\n\r\n let currentValidHitIndex = 0;\r\n let validHitsCount = 0;\r\n\r\n for (let i = 0; i < internalRaycastResult.hitCount; i++) {\r\n let isHitValid = true;\r\n\r\n isHitValid = isHitValid &&\r\n (raycastSetup.myObjectsToIgnore.length == 0 ||\r\n !raycastSetup.myObjectsToIgnore.pp_hasEqual(internalRaycastResult.objects[i], objectsEqualCallback));\r\n\r\n let isHitInsideCollision = isHitValid &&\r\n internalRaycastResult.distances[i] == 0 &&\r\n (raycastSetup.myOrigin.vec3_distance(internalRaycastResult.locations[i]) < 0.00001 &&\r\n Math.abs(raycastSetup.myDirection.vec3_angle(internalRaycastResult.normals[i]) - 180) < 0.00001);\r\n\r\n isHitValid = isHitValid && (!raycastSetup.myIgnoreHitsInsideCollision || !isHitInsideCollision);\r\n\r\n if (isHitValid) {\r\n let hit = null;\r\n\r\n if (currentValidHitIndex < raycastResult.myHits.length) {\r\n hit = raycastResult.myHits[currentValidHitIndex];\r\n } else if (raycastResult._myUnusedHits != null && raycastResult._myUnusedHits.length > 0) {\r\n hit = raycastResult._myUnusedHits.pop();\r\n raycastResult.myHits.push(hit);\r\n } else {\r\n hit = new PP.RaycastHit();\r\n raycastResult.myHits.push(hit);\r\n }\r\n\r\n hit.myPosition.vec3_copy(internalRaycastResult.locations[i]);\r\n hit.myNormal.vec3_copy(internalRaycastResult.normals[i]);\r\n hit.myDistance = internalRaycastResult.distances[i];\r\n hit.myObject = internalRaycastResult.objects[i];\r\n hit.myIsInsideCollision = isHitInsideCollision;\r\n\r\n validHitsCount++;\r\n currentValidHitIndex++;\r\n }\r\n }\r\n\r\n if (raycastResult.myHits.length > validHitsCount) {\r\n if (raycastResult._myUnusedHits == null) {\r\n raycastResult._myUnusedHits = [];\r\n }\r\n\r\n let hitsToRemove = raycastResult.myHits.length - validHitsCount;\r\n for (let i = 0; i < hitsToRemove; i++) {\r\n raycastResult._myUnusedHits.push(raycastResult.myHits.pop());\r\n }\r\n }\r\n\r\n return raycastResult;\r\n };\r\n }()\r\n};", "/*\r\nlet raycastSetup = new PP.RaycastSetup();\r\n\r\nraycastSetup.myOrigin.vec3_copy(origin);\r\nraycastSetup.myDirection.vec3_copy(direction);\r\nraycastSetup.myDistance = distance;\r\nraycastSetup.myBlockLayerFlags.setMask(flags);\r\nraycastSetup.myObjectsToIgnore.pp_clear();\r\nraycastSetup.myIgnoreHitsInsideCollision = false;\r\n\r\nlet raycastResult = PP.PhysicsUtils.raycast(raycastSetup);\r\n*/\r\n\r\nPP.RaycastSetup = class RaycastSetup {\r\n constructor() {\r\n this.myOrigin = [0, 0, 0];\r\n this.myDirection = [0, 0, 0];\r\n this.myDistance = 0;\r\n\r\n this.myBlockLayerFlags = new PP.PhysicsLayerFlags();\r\n\r\n this.myObjectsToIgnore = [];\r\n this.myIgnoreHitsInsideCollision = false;\r\n }\r\n\r\n copy(setup) {\r\n this.myOrigin.vec3_copy(setup.myOrigin);\r\n this.myDirection.vec3_copy(setup.myDirection);\r\n this.myDistance = setup.myDistance;\r\n\r\n this.myBlockLayerFlags.copy(setup.myBlockLayerFlags);\r\n\r\n this.myObjectsToIgnore.pp_copy(setup.myObjectsToIgnore);\r\n this.myIgnoreHitsInsideCollision = setup.myIgnoreHitsInsideCollision;\r\n }\r\n};\r\n\r\nPP.RaycastResult = class RaycastResult {\r\n constructor() {\r\n this.myRaycastSetup = null;\r\n this.myHits = [];\r\n\r\n this._myUnusedHits = null;\r\n }\r\n\r\n isColliding(ignoreHitsInsideCollision = false) {\r\n return ignoreHitsInsideCollision ? this.getFirstHitOutsideCollision() != null : this.myHits.length > 0;\r\n }\r\n\r\n getFirstHitInsideCollision() {\r\n let firstHit = null;\r\n\r\n for (let hit of this.myHits) {\r\n if (hit.myIsInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n getFirstHitOutsideCollision() {\r\n let firstHit = null;\r\n\r\n for (let hit of this.myHits) {\r\n if (!hit.myIsInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n getHitsInsideCollision() {\r\n let hits = [];\r\n\r\n for (let hit of this.myHits) {\r\n if (hit.myIsInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n getHitsOutsideCollision() {\r\n let hits = [];\r\n\r\n for (let hit of this.myHits) {\r\n if (!hit.myIsInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n removeHit(hitIndex) {\r\n let removedHit = this.myHits.pp_removeIndex(hitIndex);\r\n\r\n if (removedHit != null) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n this._myUnusedHits.push(removedHit);\r\n }\r\n\r\n return removedHit;\r\n }\r\n\r\n copy(result) {\r\n // implemented outside class definition\r\n }\r\n};\r\n\r\nPP.RaycastResult.prototype.copy = function () {\r\n let copyHitCallback = function (currentElement, elementToCopy) {\r\n if (currentElement == null) {\r\n currentElement = new PP.RaycastHit();\r\n }\r\n\r\n currentElement.copy(elementToCopy);\r\n\r\n return currentElement;\r\n };\r\n\r\n return function copy(result) {\r\n if (result.myRaycastSetup == null) {\r\n this.myRaycastSetup = null;\r\n } else {\r\n if (this.myRaycastSetup == null) {\r\n this.myRaycastSetup = new PP.RaycastSetup();\r\n }\r\n\r\n this.myRaycastSetup.copy(result.myRaycastSetup);\r\n }\r\n\r\n if (this.myHits.length > result.myHits.length) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n for (let i = 0; i < this.myHits.length - result.myHits.length; i++) {\r\n this._myUnusedHits.push(this.myHits.pop());\r\n }\r\n } else if (this.myHits.length < result.myHits.length) {\r\n if (this._myUnusedHits != null) {\r\n let length = Math.min(this._myUnusedHits.length, result.myHits.length - this.myHits.length);\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.myHits.push(this._myUnusedHits.pop());\r\n }\r\n }\r\n }\r\n\r\n this.myHits.pp_copy(result.myHits, copyHitCallback);\r\n };\r\n}();\r\n\r\nPP.RaycastHit = class RaycastHit {\r\n constructor() {\r\n this.myPosition = [0, 0, 0];\r\n this.myNormal = [0, 0, 0];\r\n this.myDistance = 0;\r\n this.myObject = null;\r\n\r\n this.myIsInsideCollision = false;\r\n }\r\n\r\n isValid() {\r\n return this.myObject != null;\r\n }\r\n\r\n copy(hit) {\r\n this.myPosition.vec3_copy(hit.myPosition);\r\n this.myNormal.vec3_copy(hit.myNormal);\r\n this.myDistance = hit.myDistance;\r\n this.myObject = hit.myObject;\r\n this.myIsInsideCollision = hit.myIsInsideCollision;\r\n }\r\n\r\n reset() {\r\n this.myPosition.vec3_zero();\r\n this.myNormal.vec3_zero();\r\n this.myDistance = 0;\r\n this.myObject = null;\r\n this.myIsInsideCollision = false;\r\n }\r\n};\r\n\r\n\r\n\r\nObject.defineProperty(PP.RaycastResult.prototype, \"copy\", { enumerable: false });", "PP.PhysicsLayerFlags = class PhysicsLayerFlags {\r\n constructor() {\r\n this._myLayerMask = 0;\r\n }\r\n\r\n setFlagActive(indexOrName, active) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PP.PhysicsUtils.getLayerFlagNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n if (index >= 0 && index < PP.PhysicsUtils.getLayerFlagAmount()) {\r\n let mask = 1 << index;\r\n\r\n if (active) {\r\n this._myLayerMask = this._myLayerMask | mask;\r\n } else {\r\n this._myLayerMask = this._myLayerMask & ~mask;\r\n }\r\n }\r\n }\r\n\r\n isFlagActive(indexOrName) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PP.PhysicsUtils.getLayerFlagNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n let isActive = false;\r\n\r\n if (index >= 0 && index < PP.PhysicsUtils.getLayerFlagAmount()) {\r\n let mask = 1 << index;\r\n isActive = !!(this._myLayerMask & mask);\r\n }\r\n\r\n return isActive;\r\n }\r\n\r\n setAllFlagsActive(active) {\r\n if (!active) {\r\n this._myLayerMask = 0;\r\n } else {\r\n this._myLayerMask = Math.pow(2, PP.PhysicsUtils.getLayerFlagAmount()) - 1;\r\n }\r\n }\r\n\r\n getMask() {\r\n return this._myLayerMask;\r\n }\r\n\r\n setMask(layerMask) {\r\n this._myLayerMask = layerMask;\r\n }\r\n\r\n copy(layerFlags) {\r\n this._myLayerMask = layerFlags._myLayerMask;\r\n }\r\n};", "PP.VisualManager = class VisualManager {\r\n constructor() {\r\n this._myVisualElementTypeMap = new Map();\r\n this._myVisualElementLastID = 0;\r\n this._myVisualElementsPool = new PP.ObjectPoolManager();\r\n this._myVisualElementsToShow = [];\r\n\r\n this._myActive = true;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (!this._myActive) {\r\n this.clearDraw();\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n update(dt) {\r\n this._updateDraw(dt);\r\n }\r\n\r\n //lifetimeSeconds can be null, in that case the element will be drawn until cleared\r\n draw(visualElementParams, lifetimeSeconds = 0, idToReuse = null) {\r\n if (!this._myActive) {\r\n return 0;\r\n }\r\n\r\n let visualElement = null;\r\n let idReused = false;\r\n if (idToReuse != null) {\r\n if (this._myVisualElementTypeMap.has(visualElementParams.myType)) {\r\n let visualElementMap = this._myVisualElementTypeMap.get(visualElementParams.myType);\r\n if (visualElementMap.has(idToReuse)) {\r\n visualElement = visualElementMap.get(idToReuse)[0];\r\n visualElement.setParams(visualElementParams);\r\n visualElement.setVisible(false);\r\n idReused = true;\r\n }\r\n }\r\n }\r\n\r\n if (visualElement == null) {\r\n visualElement = this._getVisualElement(visualElementParams);\r\n }\r\n\r\n if (visualElement == null) {\r\n console.error(\"Couldn't create the requested visual element\");\r\n return null;\r\n }\r\n\r\n if (!this._myVisualElementTypeMap.has(visualElementParams.myType)) {\r\n this._myVisualElementTypeMap.set(visualElementParams.myType, new Map());\r\n }\r\n let visualElementMap = this._myVisualElementTypeMap.get(visualElementParams.myType);\r\n\r\n let elementID = null;\r\n if (!idReused) {\r\n elementID = this._myVisualElementLastID + 1;\r\n this._myVisualElementLastID = elementID;\r\n\r\n visualElementMap.set(elementID, [visualElement, new PP.Timer(lifetimeSeconds, lifetimeSeconds != null)]);\r\n } else {\r\n elementID = idToReuse;\r\n let visualElementPair = visualElementMap.get(elementID);\r\n visualElementPair[0] = visualElement;\r\n visualElementPair[1].reset(lifetimeSeconds);\r\n if (lifetimeSeconds != null) {\r\n visualElementPair[1].start();\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow.push(visualElement);\r\n\r\n return elementID;\r\n }\r\n\r\n getDraw(elementID) {\r\n let visualElement = null;\r\n\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n if (visualElementMap.has(elementID)) {\r\n let visualElementPair = visualElementMap.get(elementID);\r\n visualElement = visualElementPair[0];\r\n break;\r\n }\r\n }\r\n\r\n return visualElement;\r\n }\r\n\r\n clearDraw(elementID = null) {\r\n if (elementID == null) {\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n for (let visualElement of visualElementMap.values()) {\r\n this._myVisualElementsPool.releaseObject(visualElement[0].getParams().myType, visualElement[0]);\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow = [];\r\n this._myVisualElementTypeMap = new Map();\r\n this._myVisualElementLastID = 0;\r\n } else {\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n if (visualElementMap.has(elementID)) {\r\n let visualElementPair = visualElementMap.get(elementID);\r\n this._myVisualElementsPool.releaseObject(visualElementPair[0].getParams().myType, visualElementPair[0]);\r\n visualElementMap.delete(elementID);\r\n\r\n this._myVisualElementsToShow.pp_removeEqual(visualElementPair[0]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n allocateDraw(visualElementType, amount) {\r\n if (!this._myVisualElementsPool.hasPool(visualElementType)) {\r\n this._addVisualElementTypeToPool(visualElementType);\r\n }\r\n\r\n let pool = this._myVisualElementsPool.getPool(visualElementType);\r\n\r\n let difference = pool.getAvailableSize() - amount;\r\n if (difference < 0) {\r\n pool.increase(-difference);\r\n }\r\n }\r\n\r\n _updateDraw(dt) {\r\n for (let visualElement of this._myVisualElementsToShow) {\r\n visualElement.setVisible(true);\r\n }\r\n this._myVisualElementsToShow = [];\r\n\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n let idsToRemove = [];\r\n for (let visualElementMapEntry of visualElementMap.entries()) {\r\n let visualElement = visualElementMapEntry[1];\r\n if (visualElement[1].isDone()) {\r\n this._myVisualElementsPool.releaseObject(visualElement[0].getParams().myType, visualElement[0]);\r\n idsToRemove.push(visualElementMapEntry[0]);\r\n }\r\n\r\n visualElement[1].update(dt);\r\n }\r\n\r\n for (let id of idsToRemove) {\r\n visualElementMap.delete(id);\r\n }\r\n }\r\n }\r\n\r\n _getVisualElement(params) {\r\n let element = null;\r\n\r\n if (!this._myVisualElementsPool.hasPool(params.myType)) {\r\n this._addVisualElementTypeToPool(params.myType);\r\n }\r\n\r\n element = this._myVisualElementsPool.getObject(params.myType);\r\n\r\n if (element != null) {\r\n element.setParams(params);\r\n }\r\n\r\n return element;\r\n }\r\n\r\n _addVisualElementTypeToPool(type) {\r\n let objectPoolParams = new PP.ObjectPoolParams();\r\n objectPoolParams.myInitialPoolSize = 10;\r\n objectPoolParams.myPercentageToAddWhenEmpty = 1;\r\n objectPoolParams.myEnableDebugLog = false;\r\n objectPoolParams.mySetActiveCallback = function (object, active) {\r\n object.setVisible(active);\r\n };\r\n\r\n let visualElement = null;\r\n switch (type) {\r\n case PP.VisualElementType.LINE:\r\n visualElement = new PP.VisualLine();\r\n break;\r\n case PP.VisualElementType.MESH:\r\n visualElement = new PP.VisualMesh();\r\n break;\r\n case PP.VisualElementType.POINT:\r\n visualElement = new PP.VisualPoint();\r\n break;\r\n case PP.VisualElementType.ARROW:\r\n visualElement = new PP.VisualArrow();\r\n break;\r\n case PP.VisualElementType.TEXT:\r\n visualElement = new PP.VisualText();\r\n break;\r\n case PP.VisualElementType.TRANSFORM:\r\n visualElement = new PP.VisualTransform();\r\n break;\r\n case PP.VisualElementType.RAYCAST:\r\n visualElement = new PP.VisualRaycast();\r\n break;\r\n case PP.VisualElementType.TORUS:\r\n visualElement = new PP.VisualTorus();\r\n break;\r\n }\r\n\r\n visualElement.setVisible(false);\r\n visualElement.setAutoRefresh(true);\r\n\r\n if (visualElement != null) {\r\n this._myVisualElementsPool.addPool(type, visualElement, objectPoolParams);\r\n } else {\r\n console.error(\"Visual element type not supported\");\r\n }\r\n }\r\n};", "PP.VisualElementType = {\r\n MESH: 0,\r\n LINE: 1,\r\n POINT: 2,\r\n TEXT: 3,\r\n ARROW: 4,\r\n TRANSFORM: 5,\r\n RAYCAST: 6,\r\n TORUS: 7,\r\n};", "/*\r\nlet visualParams = new PP.VisualLineParams();\r\nvisualParams.myStart.vec3_copy(start);\r\nvisualParams.myDirection.vec3_copy(direction);\r\nvisualParams.myLength = 0.2;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualLine = new PP.VisualLine(visualParams);\r\n*/\r\n\r\nPP.VisualLineParams = class VisualLineParams {\r\n\r\n constructor() {\r\n this.myStart = [0, 0, 0];\r\n this.myDirection = [0, 0, 1];\r\n this.myLength = 0;\r\n\r\n this.myThickness = 0.005;\r\n\r\n this.myMaterial = null;\r\n this.myColor = null; // if this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.LINE;\r\n }\r\n\r\n setStartEnd(start, end) {\r\n end.vec3_sub(start, this.myDirection);\r\n this.myLength = this.myDirection.vec3_length();\r\n this.myDirection.vec3_normalize(this.myDirection);\r\n this.myStart.vec3_copy(start);\r\n\r\n return this;\r\n }\r\n};\r\n\r\nPP.VisualLine = class VisualLine {\r\n\r\n constructor(params = new PP.VisualLineParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myLineRootObject = null;\r\n this._myLineObject = null;\r\n this._myLineMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myLineRootObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _build() {\r\n this._myLineRootObject = WL.scene.addObject(null);\r\n this._myLineObject = WL.scene.addObject(this._myLineRootObject);\r\n\r\n this._myLineMeshComponent = this._myLineObject.addComponent('mesh');\r\n this._myLineMeshComponent.mesh = PP.myDefaultResources.myMeshes.myCylinder;\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualLineParams();\r\n clonedParams.myStart.vec3_copy(this._myParams.myStart);\r\n clonedParams.myDirection.vec3_copy(this._myParams.myDirection);\r\n clonedParams.myLength = this._myParams.myLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualLine(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualLine.prototype._refresh = function () {\r\n let scaleLine = PP.vec3_create();\r\n let translateLine = PP.vec3_create();\r\n\r\n let forward = PP.vec3_create(0, 0, 1);\r\n return function _refresh() {\r\n this._myLineRootObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myLineRootObject.pp_setPositionLocal(this._myParams.myStart);\r\n\r\n this._myLineObject.pp_resetPositionLocal();\r\n this._myLineObject.pp_resetScaleLocal();\r\n\r\n scaleLine.vec3_set(this._myParams.myThickness / 2, this._myParams.myLength / 2, this._myParams.myThickness / 2);\r\n this._myLineObject.pp_scaleObject(scaleLine);\r\n\r\n this._myLineObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n translateLine.vec3_set(0, this._myParams.myLength / 2, 0);\r\n this._myLineObject.pp_translateObject(translateLine);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myLineMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n this._myLineMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myLineMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualLine.prototype, \"_refresh\", { enumerable: false });", "/*\r\nlet visualParams = new PP.VisualMeshParams();\r\nvisualParams.myTransform = transform;\r\nvisualParams.myMesh = PP.myDefaultResources.myMeshes.mySphere;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualMesh = new PP.VisualMesh(visualParams);\r\n*/\r\n\r\nPP.VisualMeshParams = class VisualMeshParams {\r\n\r\n constructor() {\r\n this.myTransform = PP.mat4_create();\r\n\r\n this.myMesh = null;\r\n this.myMaterial = null;\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.MESH;\r\n }\r\n};\r\n\r\nPP.VisualMesh = class VisualMesh {\r\n\r\n constructor(params = new PP.VisualMeshParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myMeshObject = null;\r\n this._myMeshComponent = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myMeshObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _refresh() {\r\n this._myMeshObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n this._myMeshObject.pp_setTransformLocal(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMesh == null) {\r\n this._myMeshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\r\n } else {\r\n this._myMeshComponent.mesh = this._myParams.myMesh;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n this._myMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n this._myMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n }\r\n\r\n _build() {\r\n this._myMeshObject = WL.scene.addObject(null);\r\n\r\n this._myMeshComponent = this._myMeshObject.addComponent('mesh');\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualMeshParams();\r\n clonedParams.myTransform.pp_copy(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMesh != null) {\r\n clonedParams.myMesh = this._myParams.myMesh;\r\n } else {\r\n clonedParams.myMesh = null;\r\n }\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualMesh(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualPointParams();\r\nvisualParams.myPosition.vec3_copy(position);\r\nvisualParams.myRadius = 0.005;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualPoint = new PP.VisualPoint(visualParams);\r\n*/\r\n\r\nPP.VisualPointParams = class VisualPointParams {\r\n\r\n constructor() {\r\n this.myPosition = [0, 0, 0];\r\n this.myRadius = 0.005;\r\n\r\n this.myMaterial = null;\r\n this.myColor = null; // if this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.POINT;\r\n }\r\n};\r\n\r\nPP.VisualPoint = class VisualPoint {\r\n\r\n constructor(params = new PP.VisualPointParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myPointObject = null;\r\n this._myPointMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myPointObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _refresh() {\r\n this._myPointObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myPointObject.pp_setPositionLocal(this._myParams.myPosition);\r\n this._myPointObject.pp_setScaleLocal(this._myParams.myRadius);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myPointMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n this._myPointMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myPointMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n }\r\n\r\n _build() {\r\n this._myPointObject = WL.scene.addObject(null);\r\n\r\n this._myPointMeshComponent = this._myPointObject.addComponent('mesh');\r\n this._myPointMeshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualPointParams();\r\n clonedParams.myPosition.vec3_copy(this._myParams.myPosition);\r\n clonedParams.myRadius = this._myParams.myRadius;\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualPoint(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualArrowParams();\r\nvisualParams.myStart.vec3_copy(start);\r\nvisualParams.myDirection.vec3_copy(direction);\r\nvisualParams.myLength = 0.2;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualArrow = new PP.VisualArrow(visualParams);\r\n*/\r\n\r\nPP.VisualArrowParams = class VisualArrowParams extends PP.VisualLineParams {\r\n constructor() {\r\n super();\r\n\r\n this.myType = PP.VisualElementType.ARROW;\r\n }\r\n};\r\n\r\nPP.VisualArrow = class VisualArrow {\r\n\r\n constructor(params = new PP.VisualArrowParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myVisualLine = new PP.VisualLine();\r\n this._myVisualLine.setAutoRefresh(false);\r\n\r\n this._myArrowRootObject = null;\r\n this._myArrowObject = null;\r\n this._myArrowMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myVisualLine.setVisible(visible);\r\n this._myArrowRootObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n this._myVisualLine.forceRefresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n this._myDirty = false;\r\n }\r\n\r\n this._myVisualLine.update(dt);\r\n }\r\n\r\n _build() {\r\n this._myArrowRootObject = WL.scene.addObject(null);\r\n this._myArrowObject = WL.scene.addObject(this._myArrowRootObject);\r\n\r\n this._myArrowMeshComponent = this._myArrowObject.addComponent('mesh');\r\n this._myArrowMeshComponent.mesh = PP.myDefaultResources.myMeshes.myCone;\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualArrowParams();\r\n clonedParams.myStart.vec3_copy(this._myParams.myStart);\r\n clonedParams.myDirection.vec3_copy(this._myParams.myDirection);\r\n clonedParams.myLength = this._myParams.myLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualArrow(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualArrow.prototype._refresh = function () {\r\n let end = PP.vec3_create();\r\n let translateRoot = PP.vec3_create();\r\n let scaleArrow = PP.vec3_create();\r\n let direction = PP.vec3_create();\r\n\r\n let forward = PP.vec3_create(0, 0, 1);\r\n return function _refresh() {\r\n this._myArrowRootObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myParams.myDirection.vec3_scale(Math.max(0.001, this._myParams.myLength - this._myParams.myThickness * 4), end);\r\n end.vec3_add(this._myParams.myStart, end);\r\n\r\n this._myArrowRootObject.pp_setPositionLocal(end);\r\n this._myArrowRootObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n\r\n translateRoot.vec3_set(0, this._myParams.myThickness * 2 - 0.00001, 0);\r\n this._myArrowRootObject.pp_translateObject(translateRoot);\r\n\r\n this._myArrowObject.pp_resetScaleLocal();\r\n scaleArrow.vec3_set(this._myParams.myThickness * 1.25, this._myParams.myThickness * 2, this._myParams.myThickness * 1.25);\r\n this._myArrowObject.pp_scaleObject(scaleArrow);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myArrowMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n this._myArrowMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myArrowMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n direction = end.vec3_sub(this._myParams.myStart, direction);\r\n let visualLineParams = this._myVisualLine.getParams();\r\n visualLineParams.myStart.vec3_copy(this._myParams.myStart);\r\n visualLineParams.myDirection = direction.vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = direction.vec3_length();\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n visualLineParams.myMaterial = this._myArrowMeshComponent.material;\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualLine.paramsUpdated();\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualArrow.prototype, \"_refresh\", { enumerable: false });", "/*\r\nlet visualParams = new PP.VisualTextParams();\r\nvisualParams.myText = text;\r\nvisualParams.myTransform.mat4_copy(transform);\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualText = new PP.VisualText(visualParams);\r\n*/\r\n\r\nPP.VisualTextParams = class VisualTextParams {\r\n\r\n constructor() {\r\n this.myText = \"\";\r\n this.myAlignment = WL.Alignment.Center;\r\n this.myJustification = WL.Justification.Middle;\r\n\r\n this.myTransform = PP.mat4_create();\r\n\r\n this.myMaterial = null;\r\n\r\n this.myColor = null; // if this is set and material is null, it will use the default text material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.TEXT;\r\n }\r\n};\r\n\r\nPP.VisualText = class VisualText {\r\n\r\n constructor(params = new PP.VisualTextParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myTextObject = null;\r\n this._myTextComponent = null;\r\n\r\n this._myTextMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myTextObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _refresh() {\r\n this._myTextObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myTextObject.pp_setTransformLocal(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myTextComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial;\r\n } else {\r\n if (this._myTextMaterial == null) {\r\n this._myTextMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\n }\r\n this._myTextComponent.material = this._myTextMaterial;\r\n this._myTextMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myTextComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n this._myTextComponent.text = this._myParams.myText;\r\n this._myTextComponent.alignment = this._myParams.myAlignment;\r\n this._myTextComponent.justification = this._myParams.myJustification;\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n _build() {\r\n this._myTextObject = WL.scene.addObject(null);\r\n this._myTextComponent = this._myTextObject.addComponent('text');\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualTextParams();\r\n\r\n clonedParams.myText = this._myParams.myText;\r\n clonedParams.myAlignment = this._myParams.myAlignment;\r\n clonedParams.myJustification = this._myParams.myJustification;\r\n\r\n clonedParams.myTransform.mat4_copy(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualText(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualTransformParams();\r\nvisualParams.myTransform.mat4_copy(transform);\r\nvisualParams.myLength = 0.2;\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualTransform = new PP.VisualTransform(visualParams);\r\n*/\r\n\r\nPP.VisualTransformParams = class VisualTransformParams {\r\n\r\n constructor() {\r\n this.myTransform = PP.mat4_create();\r\n this.myLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myForwardMaterial = null;\r\n this.myUpMaterial = null;\r\n this.myRightMaterial = null;\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.TRANSFORM;\r\n }\r\n};\r\n\r\nPP.VisualTransform = class VisualTransform {\r\n\r\n constructor(params = new PP.VisualTransformParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myVisualRight = new PP.VisualArrow();\r\n this._myVisualUp = new PP.VisualArrow();\r\n this._myVisualForward = new PP.VisualArrow();\r\n\r\n this._myVisualRight.setAutoRefresh(false);\r\n this._myVisualUp.setAutoRefresh(false);\r\n this._myVisualForward.setAutoRefresh(false);\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myVisualRight.setVisible(visible);\r\n this._myVisualUp.setVisible(visible);\r\n this._myVisualForward.setVisible(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n this._myVisualRight.forceRefresh();\r\n this._myVisualUp.forceRefresh();\r\n this._myVisualForward.forceRefresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n this._myVisualRight.update(dt);\r\n this._myVisualUp.update(dt);\r\n this._myVisualForward.update(dt);\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualTransformParams();\r\n clonedParams.myTransform.mat4_copy(this._myParams.myTransform);\r\n clonedParams.myLength = this._myParams.myLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRightMaterial != null) {\r\n clonedParams.myRightMaterial = this._myParams.myRightMaterial.clone();\r\n } else {\r\n clonedParams.myRightMaterial = null;\r\n }\r\n\r\n if (this._myParams.myUpMaterial != null) {\r\n clonedParams.myUpMaterial = this._myParams.myUpMaterial.clone();\r\n } else {\r\n clonedParams.myUpMaterial = null;\r\n }\r\n\r\n if (this._myParams.myForwardMaterial != null) {\r\n clonedParams.myForwardMaterial = this._myParams.myForwardMaterial.clone();\r\n } else {\r\n clonedParams.myForwardMaterial = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualTransform(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualTransform.prototype._refresh = function () {\r\n let axes = [PP.vec3_create(), PP.vec3_create(), PP.vec3_create()];\r\n let scale = PP.vec3_create();\r\n let position = PP.vec3_create();\r\n return function _refresh() {\r\n axes = this._myParams.myTransform.mat4_getAxes(axes);\r\n scale = this._myParams.myTransform.mat4_getScale(scale);\r\n let maxValue = 0;\r\n for (let value of scale) {\r\n maxValue = Math.max(value, maxValue);\r\n }\r\n\r\n if (maxValue == 0) {\r\n scale[0] = 1;\r\n scale[1] = 1;\r\n scale[2] = 1;\r\n } else {\r\n scale[0] = scale[0] / maxValue;\r\n scale[1] = scale[1] / maxValue;\r\n scale[2] = scale[2] / maxValue;\r\n }\r\n\r\n position = this._myParams.myTransform.mat4_getPosition(position);\r\n\r\n {\r\n let visualLineParams = this._myVisualRight.getParams();\r\n visualLineParams.myStart.vec3_copy(position);\r\n visualLineParams.myDirection = axes[0].vec3_negate(visualLineParams.myDirection).vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = Math.max(this._myParams.myLength * scale[0], 0.001);\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRightMaterial == null) {\r\n visualLineParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial;\r\n } else {\r\n visualLineParams.myMaterial = this._myParams.myRightMaterial;\r\n }\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualRight.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualLineParams = this._myVisualUp.getParams();\r\n visualLineParams.myStart.vec3_copy(position);\r\n visualLineParams.myDirection = axes[1].vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = Math.max(this._myParams.myLength * scale[1], 0.001);\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myUpMaterial == null) {\r\n visualLineParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial;\r\n } else {\r\n visualLineParams.myMaterial = this._myParams.myUpMaterial;\r\n }\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualUp.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualLineParams = this._myVisualForward.getParams();\r\n visualLineParams.myStart.vec3_copy(position);\r\n visualLineParams.myDirection = axes[2].vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = Math.max(this._myParams.myLength * scale[2], 0.001);\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myForwardMaterial == null) {\r\n visualLineParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial;\r\n } else {\r\n visualLineParams.myMaterial = this._myParams.myForwardMaterial;\r\n }\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualForward.paramsUpdated();\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualTransform.prototype, \"_refresh\", { enumerable: false });", "/*\r\nlet visualParams = new PP.VisualRaycastParams();\r\nvisualParams.myRaycastResult = raycastResult;\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualRaycast = new PP.VisualRaycast(visualParams);\r\n*/\r\n\r\nPP.VisualRaycastParams = class VisualRaycastParams {\r\n\r\n constructor() {\r\n this._myRaycastResult = new PP.RaycastResult();\r\n\r\n this.myHitNormalLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myShowOnlyFirstHit = true;\r\n\r\n this.myRayMaterial = null;\r\n this.myHitNormalMaterial = null;\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.RAYCAST;\r\n }\r\n\r\n get myRaycastResult() {\r\n return this._myRaycastResult;\r\n }\r\n\r\n set myRaycastResult(result) {\r\n this._myRaycastResult.copy(result);\r\n }\r\n};\r\n\r\nPP.VisualRaycast = class VisualRaycast {\r\n\r\n constructor(params = new PP.VisualRaycastParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myVisualRaycast = new PP.VisualArrow();\r\n\r\n this._myVisualRaycast.setAutoRefresh(false);\r\n\r\n this._myVisualRaycastHitList = [];\r\n this._addVisualRaycastHit();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myVisible) {\r\n if (this._myParams.myRaycastResult.myRaycastSetup != null) {\r\n this._myVisualRaycast.setVisible(true);\r\n }\r\n\r\n if (this._myParams.myRaycastResult.myHits.length > 0) {\r\n let hitsToShow = Math.min(this._myParams.myRaycastResult.myHits.length, this._myVisualRaycastHitList.length);\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n visualRaycastHit.setVisible(true);\r\n }\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n this._myVisualRaycast.forceRefresh();\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.forceRefresh();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n this._myDirty = false;\r\n }\r\n\r\n this._myVisualRaycast.update(dt);\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.update(dt);\r\n }\r\n }\r\n\r\n _refresh() {\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n\r\n if (this._myParams.myRaycastResult.myHits.length > 0) {\r\n let raycastDistance = this._myParams.myShowOnlyFirstHit ?\r\n this._myParams.myRaycastResult.myHits.pp_first().myDistance :\r\n this._myParams.myRaycastResult.myHits.pp_last().myDistance;\r\n\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myDirection);\r\n visualRaycastParams.myLength = raycastDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n\r\n let hitsToShow = this._myParams.myShowOnlyFirstHit ? 1 : this._myParams.myRaycastResult.myHits.length;\r\n while (hitsToShow > this._myVisualRaycastHitList.length) {\r\n this._addVisualRaycastHit();\r\n }\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n\r\n {\r\n let visualRaycastHitParams = visualRaycastHit.getParams();\r\n visualRaycastHitParams.myStart.vec3_copy(this._myParams.myRaycastResult.myHits[i].myPosition);\r\n visualRaycastHitParams.myDirection.vec3_copy(this._myParams.myRaycastResult.myHits[i].myNormal);\r\n visualRaycastHitParams.myLength = this._myParams.myHitNormalLength;\r\n visualRaycastHitParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myHitNormalMaterial == null) {\r\n visualRaycastHitParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial;\r\n } else {\r\n visualRaycastHitParams.myMaterial = this._myParams.myHitNormalMaterial;\r\n }\r\n\r\n visualRaycastHitParams.myParent = this._myParams.myParent;\r\n\r\n visualRaycastHit.paramsUpdated();\r\n\r\n visualRaycastHit.setVisible(this._myVisible);\r\n }\r\n }\r\n\r\n } else if (this._myParams.myRaycastResult.myRaycastSetup != null) {\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myDirection);\r\n visualRaycastParams.myLength = this._myParams.myRaycastResult.myRaycastSetup.myDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n }\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualRaycastParams();\r\n clonedParams.myRaycastResult = this._myParams.myRaycastResult;\r\n clonedParams.myHitNormalLength = this._myParams.myHitNormalLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n clonedParams.myShowOnlyFirstHit = this._myParams.myShowOnlyFirstHit;\r\n\r\n if (this._myParams.myRayMaterial != null) {\r\n clonedParams.myRayMaterial = this._myParams.myRayMaterial.clone();\r\n } else {\r\n clonedParams.myRayMaterial = null;\r\n }\r\n\r\n if (this._myParams.myHitNormalMaterial != null) {\r\n clonedParams.myHitNormalMaterial = this._myParams.myHitNormalMaterial.clone();\r\n } else {\r\n clonedParams.myHitNormalMaterial = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualRaycast(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n\r\n _addVisualRaycastHit() {\r\n let visualRaycastHit = new PP.VisualArrow();\r\n\r\n visualRaycastHit.setAutoRefresh(false);\r\n visualRaycastHit.setVisible(false);\r\n\r\n this._myVisualRaycastHitList.push(visualRaycastHit);\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualTorusParams();\r\nvisualParams.myRadius = 1;\r\nvisualParams.mySegmentAmount = 12;\r\nvisualParams.mySegmentThickness = 0.05;\r\nvisualParams.myTransform.mat4_copy(transform);\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualTorus = new PP.VisualTorus(visualParams);\r\n*/\r\n\r\nPP.VisualTorusParams = class VisualTorusParams {\r\n\r\n constructor() {\r\n this.myRadius = 0;\r\n\r\n this.mySegmentAmount = 12;\r\n this.mySegmentThickness = 0.05;\r\n\r\n this.myTransform = PP.mat4_create();\r\n\r\n this.myMaterial = null;\r\n this.myColor = null; // if this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.TORUS;\r\n }\r\n};\r\n\r\nPP.VisualTorus = class VisualTorus {\r\n\r\n constructor(params = new PP.VisualTorusParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myTorusRootObject = null;\r\n\r\n this._myVisualSegmentList = [];\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myVisible) {\r\n let segmentToShow = Math.min(this._myParams.mySegmentAmount, this._myVisualSegmentList.length);\r\n\r\n for (let i = 0; i < segmentToShow; i++) {\r\n let visualSegment = this._myVisualSegmentList[i];\r\n visualSegment.setVisible(true);\r\n }\r\n } else {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.setVisible(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.forceRefresh();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.update(dt);\r\n }\r\n }\r\n\r\n _build() {\r\n this._myTorusRootObject = WL.scene.addObject(null);\r\n\r\n this._fillSegmentList();\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n _fillSegmentList() {\r\n while (this._myVisualSegmentList.length < this._myParams.mySegmentAmount) {\r\n let visualSegment = new PP.VisualLine();\r\n\r\n visualSegment.setAutoRefresh(false);\r\n visualSegment.setVisible(false);\r\n\r\n visualSegment.getParams().myParent = this._myTorusRootObject;\r\n\r\n this._myVisualSegmentList.push(visualSegment);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualTorusParams();\r\n clonedParams.myRadius = this._myParams.myRadius;\r\n clonedParams.mySegmentAmount = this._myParams.mySegmentAmount;\r\n clonedParams.mySegmentThickness = this._myParams.mySegmentThickness;\r\n\r\n clonedParams.myTransform.mat4_copy(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualTorus(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualTorus.prototype._refresh = function () {\r\n let segmentStart = PP.vec3_create();\r\n let segmentEnd = PP.vec3_create();\r\n\r\n let segmentDirection = PP.vec3_create();\r\n\r\n let fixedSegmentStart = PP.vec3_create();\r\n let fixedSegmentEnd = PP.vec3_create();\r\n\r\n let up = PP.vec3_create(0, 1, 0);\r\n return function _refresh() {\r\n this._fillSegmentList();\r\n\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.setVisible(false);\r\n }\r\n\r\n this._myTorusRootObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n this._myTorusRootObject.pp_setTransformLocal(this._myParams.myTransform);\r\n\r\n let sliceAngle = 2 * Math.PI / this._myParams.mySegmentAmount;\r\n segmentStart.vec3_set(this._myParams.myRadius, 0, 0);\r\n for (let i = 0; i < this._myParams.mySegmentAmount; i++) {\r\n segmentEnd = segmentStart.vec3_rotateAxisRadians(sliceAngle, up, segmentEnd);\r\n\r\n segmentDirection = segmentEnd.vec3_sub(segmentStart, segmentDirection).vec3_normalize(segmentDirection);\r\n\r\n let extraLength = Math.tan(sliceAngle / 2) * this._myParams.mySegmentThickness / 2;\r\n\r\n fixedSegmentStart = segmentStart.vec3_sub(segmentDirection.vec3_scale(extraLength, fixedSegmentStart), fixedSegmentStart);\r\n fixedSegmentEnd = segmentEnd.vec3_add(segmentDirection.vec3_scale(extraLength, fixedSegmentEnd), fixedSegmentEnd);\r\n\r\n let visualSegment = this._myVisualSegmentList[i];\r\n\r\n let visualSegmentParams = visualSegment.getParams();\r\n visualSegmentParams.setStartEnd(fixedSegmentStart, fixedSegmentEnd);\r\n visualSegmentParams.myThickness = this._myParams.mySegmentThickness;\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n visualSegmentParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n visualSegmentParams.myMaterial = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n visualSegmentParams.myMaterial = this._myParams.myMaterial;\r\n }\r\n\r\n visualSegment.paramsUpdated();\r\n\r\n visualSegment.setVisible(this._myVisible);\r\n\r\n segmentStart.vec3_copy(segmentEnd);\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualTorus.prototype, \"_refresh\", { enumerable: false });", "WL.registerComponent('pp-visual-manager', {\r\n}, {\r\n init: function () {\r\n if (this.active) {\r\n PP.myVisualData.myRootObject = WL.scene.addObject(null);\r\n\r\n PP.myVisualManager = new PP.VisualManager();\r\n }\r\n },\r\n start() {\r\n PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n\r\n PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\n\r\n PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial.color = [1, 0, 0, 1];\r\n PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial.color = [0, 1, 0, 1];\r\n PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial.color = [0, 0, 1, 1];\r\n\r\n PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial.color = [0, 1, 0, 1];\r\n PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial.color = [1, 0, 0, 1];\r\n\r\n PP.myVisualManager.start();\r\n },\r\n update(dt) {\r\n PP.myVisualManager.update(dt);\r\n }\r\n});\r\n\r\nPP.myVisualManager = null;\r\n\r\nPP.myVisualData = {\r\n myRootObject: null,\r\n myDefaultMaterials: {\r\n myDefaultMeshMaterial: null,\r\n myDefaultTextMaterial: null,\r\n myDefaultRightMaterial: null,\r\n myDefaultUpMaterial: null,\r\n myDefaultForwardMaterial: null,\r\n myDefaultRayMaterial: null,\r\n myDefaultHitNormalMaterial: null\r\n }\r\n};", "PP.DebugManager = class DebugManager {\r\n constructor() {\r\n this._myDebugVisualManager = new PP.DebugVisualManager();\r\n }\r\n\r\n getDebugVisualManager() {\r\n return this._myDebugVisualManager;\r\n }\r\n\r\n start() {\r\n this._myDebugVisualManager.start();\r\n }\r\n\r\n update(dt) {\r\n this._myDebugVisualManager.update(dt);\r\n }\r\n};", "PP.DebugVisualManager = class DebugVisualManager extends PP.VisualManager {\r\n drawLine(lifetimeSeconds, start, direction, length, color = [0, 1, 0, 1], thickness = 0.005) {\r\n let visualParams = new PP.VisualLineParams();\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawLineEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n // implemented outside class definition\r\n }\r\n\r\n drawArrow(lifetimeSeconds, start, direction, length, color = [0, 1, 0, 1], thickness = 0.005) {\r\n let visualParams = new PP.VisualArrowParams();\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawArrowEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n // implemented outside class definition\r\n }\r\n\r\n drawPoint(lifetimeSeconds, position, color = [0, 1, 0, 1], radius = 0.005) {\r\n let visualParams = new PP.VisualPointParams();\r\n visualParams.myPosition.vec3_copy(position);\r\n visualParams.myRadius = radius;\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawText(lifetimeSeconds, text, transform, color = [0, 1, 0, 1], alignment = WL.Alignment.Center, justification = WL.Justification.Middle) {\r\n let visualParams = new PP.VisualTextParams();\r\n visualParams.myText = text;\r\n visualParams.myAlignment = alignment;\r\n visualParams.myJustification = justification;\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawRaycast(lifetimeSeconds, raycastResult, showOnlyFirstHit = true, hitNormalLength = 0.2, thickness = 0.005) {\r\n let visualParams = new PP.VisualRaycastParams();\r\n visualParams.myRaycastResult = raycastResult;\r\n visualParams.myShowOnlyFirstHit = showOnlyFirstHit;\r\n visualParams.myHitNormalLength = hitNormalLength;\r\n visualParams.myThickness = thickness;\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawTransform(lifetimeSeconds, transform, length = 0.2, thickness = 0.005) {\r\n let visualParams = new PP.VisualTransformParams();\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n};\r\n\r\nPP.DebugVisualManager.prototype.drawLineEnd = function () {\r\n let direction = PP.vec3_create();\r\n return function drawLineEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n direction = end.vec3_sub(start, direction);\r\n length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n this.drawLine(lifetimeSeconds, start, direction, length, color, thickness);\r\n };\r\n}();\r\n\r\nPP.DebugVisualManager.prototype.drawArrowEnd = function () {\r\n let direction = PP.vec3_create();\r\n return function drawArrowEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n direction = end.vec3_sub(start, direction);\r\n length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n this.drawArrow(lifetimeSeconds, start, direction, length, color, thickness);\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.DebugVisualManager.prototype, \"drawLineEnd\", { enumerable: false });\r\nObject.defineProperty(PP.DebugVisualManager.prototype, \"drawArrowEnd\", { enumerable: false });", "WL.registerComponent(\"pp-debug-transform\", {\r\n _myLength: { type: WL.Type.Float, default: 0.1 },\r\n _myThickness: { type: WL.Type.Float, default: 0.005 }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myDebugTransformParams = new PP.VisualTransformParams();\r\n this._myDebugTransformParams.myLength = this._myLength;\r\n this._myDebugTransformParams.myThickness = this._myThickness;\r\n },\r\n update: function (dt) {\r\n this.object.pp_getTransform(this._myDebugTransformParams.myTransform);\r\n PP.myDebugVisualManager.draw(this._myDebugTransformParams);\r\n }\r\n});", "WL.registerComponent('pp-debug-manager', {\r\n}, {\r\n init: function () {\r\n if (this.active) {\r\n PP.myDebugManager = new PP.DebugManager();\r\n PP.myDebugVisualManager = PP.myDebugManager.getDebugVisualManager();\r\n }\r\n },\r\n start() {\r\n PP.myDebugManager.start();\r\n },\r\n update(dt) {\r\n PP.myDebugManager.update(dt);\r\n }\r\n});\r\n\r\nPP.myDebugManager = null;\r\nPP.myDebugVisualManager = null;", "PP.Direction2DTo3DConverterParams = class Direction2DTo3DConverterParams {\r\n constructor() {\r\n this.myStartFlyingForward = false;\r\n this.myStartFlyingRight = false;\r\n\r\n this.myAutoUpdateFlyForward = false;\r\n this.myAutoUpdateFlyRight = false;\r\n\r\n this.myResetFlyForwardWhenZero = false;\r\n this.myResetFlyRightWhenZero = false;\r\n\r\n this.myMinAngleToFlyForwardUp = 90;\r\n this.myMinAngleToFlyForwardDown = 90;\r\n this.myMinAngleToFlyRightUp = 90;\r\n this.myMinAngleToFlyRightDown = 90;\r\n }\r\n};\r\n\r\nPP.Direction2DTo3DConverter = class Direction2DTo3DConverter {\r\n\r\n constructor(params = new PP.Direction2DTo3DConverterParams()) {\r\n this._myParams = params;\r\n\r\n this._myIsFlyingForward = this._myParams.myStartFlyingForward;\r\n this._myIsFlyingRight = this._myParams.myStartFlyingRight;\r\n\r\n this._myLastValidFlatForward = PP.vec3_create();\r\n this._myLastValidFlatRight = PP.vec3_create();\r\n\r\n //Setup\r\n this._myMinAngleToBeValid = 5;\r\n }\r\n\r\n // directionUp is needed when u want to understand when the direction is going to fly or not\r\n // if you don't want the direction to be flat (so like it's always flying) you can avoid specifying it\r\n convert(direction2D, referenceTransformQuat, directionUp = null, outDirection3D = PP.vec3_create()) {\r\n // implemented outside class definition\r\n }\r\n\r\n isFlying() {\r\n return this._myIsFlyingForward || this._myIsFlyingRight;\r\n }\r\n\r\n isFlyingForward() {\r\n return this._myIsFlyingForward;\r\n }\r\n\r\n isFlyingRight() {\r\n return this._myIsFlyingRight;\r\n }\r\n\r\n startFlying() {\r\n this._myIsFlyingForward = true;\r\n this._myIsFlyingRight = true;\r\n }\r\n\r\n startFlyingForward() {\r\n this._myIsFlyingForward = true;\r\n }\r\n\r\n startFlyingRight() {\r\n this._myIsFlyingRight = true;\r\n }\r\n\r\n stopFlying() {\r\n this._myIsFlyingForward = false;\r\n this._myIsFlyingRight = false;\r\n }\r\n\r\n stopFlyingForward() {\r\n this._myIsFlyingForward = false;\r\n }\r\n\r\n stopFlyingRight() {\r\n this._myIsFlyingRight = false;\r\n }\r\n\r\n resetFly() {\r\n this.resetFlyForward();\r\n this.resetFlyRight();\r\n }\r\n\r\n resetFlyForward() {\r\n if (this._myParams.myStartFlyingForward) {\r\n this.startFlyingForward();\r\n } else {\r\n this.stopFlyingForward();\r\n }\r\n\r\n this._myLastValidFlatForward.vec3_zero();\r\n }\r\n\r\n resetFlyRight() {\r\n if (this._myParams.myStartFlyingRight) {\r\n this.startFlyingRight();\r\n } else {\r\n this.stopFlyingRight();\r\n }\r\n\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n};\r\n\r\nPP.Direction2DTo3DConverter.prototype.convert = function () {\r\n let forward = PP.vec3_create();\r\n let right = PP.vec3_create();\r\n let directionUpNegate = PP.vec3_create();\r\n let forwardScaled = PP.vec3_create();\r\n let rightScaled = PP.vec3_create();\r\n return function convert(direction2D, referenceTransformQuat, directionUp = null, outDirection3D = PP.vec3_create()) {\r\n if (direction2D.vec2_isZero()) {\r\n let resetFlyForward = this._myParams.myAutoUpdateFlyForward && this._myParams.myResetFlyForwardWhenZero;\r\n if (resetFlyForward) {\r\n this.resetFlyForward();\r\n }\r\n\r\n let resetFlyRight = this._myParams.myAutoUpdateFlyRight && this._myParams.myResetFlyRightWhenZero;\r\n if (resetFlyRight) {\r\n this.resetFlyRight();\r\n }\r\n\r\n return [0, 0, 0];\r\n } else {\r\n if (direction2D[0] == 0) {\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n\r\n if (direction2D[1] == 0) {\r\n this._myLastValidFlatForward.vec3_zero();\r\n }\r\n }\r\n\r\n forward = referenceTransformQuat.quat2_getForward(forward);\r\n right = referenceTransformQuat.quat2_getRight(right);\r\n\r\n if (directionUp != null) {\r\n directionUpNegate = directionUp.vec3_negate(directionUpNegate);\r\n\r\n // check if it is flying based on the convert transform orientation \r\n if (this._myParams.myAutoUpdateFlyForward) {\r\n let angleForwardWithDirectionUp = forward.vec3_angle(directionUp);\r\n this._myIsFlyingForward = this._myIsFlyingForward ||\r\n (angleForwardWithDirectionUp < 90 - this._myParams.myMinAngleToFlyForwardUp || angleForwardWithDirectionUp > 90 + this._myParams.myMinAngleToFlyForwardDown);\r\n }\r\n\r\n if (this._myParams.myAutoUpdateFlyRight) {\r\n let angleRightWithDirectionUp = right.vec3_angle(directionUp);\r\n this._myIsFlyingRight = this._myIsFlyingRight ||\r\n (angleRightWithDirectionUp < 90 - this._myParams.myMinAngleToFlyRightUp || angleRightWithDirectionUp > 90 + this._myParams.myMinAngleToFlyRightDown);\r\n }\r\n\r\n // remove the component to prevent flying, if needed\r\n if (!this._myIsFlyingForward) {\r\n // if the forward is too similar to the up (or down) take the last valid forward\r\n if (!this._myLastValidFlatForward.vec3_isZero(0.000001) && (forward.vec3_angle(directionUp) < this._myMinAngleToBeValid || forward.vec3_angle(directionUpNegate) < this._myMinAngleToBeValid)) {\r\n if (forward.vec3_isConcordant(this._myLastValidFlatForward)) {\r\n forward.pp_copy(this._myLastValidFlatForward);\r\n } else {\r\n forward = this._myLastValidFlatForward.vec3_negate(forward);\r\n }\r\n }\r\n\r\n forward = forward.vec3_removeComponentAlongAxis(directionUp, forward);\r\n forward.vec3_normalize(forward);\r\n }\r\n\r\n if (!this._myIsFlyingRight) {\r\n // if the right is too similar to the up (or down) take the last valid right\r\n if (!this._myLastValidFlatRight.vec3_isZero(0.000001) && (right.vec3_angle(directionUp) < this._myMinAngleToBeValid || right.vec3_angle(directionUpNegate) < this._myMinAngleToBeValid)) {\r\n if (right.vec3_isConcordant(this._myLastValidFlatRight)) {\r\n right.pp_copy(this._myLastValidFlatRight);\r\n } else {\r\n right = this._myLastValidFlatRight.vec3_negate(right);\r\n }\r\n }\r\n\r\n right = right.vec3_removeComponentAlongAxis(directionUp, right);\r\n right.vec3_normalize(right);\r\n }\r\n\r\n // update last valid\r\n if ((forward.vec3_angle(directionUp) > this._myMinAngleToBeValid && forward.vec3_angle(directionUpNegate) > this._myMinAngleToBeValid) ||\r\n (direction2D[1] != 0 && this._myLastValidFlatForward.vec3_isZero(0.000001))) {\r\n this._myLastValidFlatForward = forward.vec3_removeComponentAlongAxis(directionUp, this._myLastValidFlatForward);\r\n this._myLastValidFlatForward.vec3_normalize(this._myLastValidFlatForward);\r\n }\r\n\r\n if ((right.vec3_angle(directionUp) > this._myMinAngleToBeValid && right.vec3_angle(directionUpNegate) > this._myMinAngleToBeValid) ||\r\n (direction2D[0] != 0 && this._myLastValidFlatRight.vec3_isZero(0.000001))) {\r\n this._myLastValidFlatRight = right.vec3_removeComponentAlongAxis(directionUp, this._myLastValidFlatRight);\r\n this._myLastValidFlatRight.vec3_normalize(this._myLastValidFlatRight);\r\n }\r\n }\r\n\r\n // compute direction 3D\r\n outDirection3D = right.vec3_scale(direction2D[0], rightScaled).vec3_add(forward.vec3_scale(direction2D[1], forwardScaled), outDirection3D);\r\n\r\n if (directionUp != null && !this._myIsFlyingForward && !this._myIsFlyingRight) {\r\n outDirection3D = outDirection3D.vec3_removeComponentAlongAxis(directionUp, outDirection3D);\r\n }\r\n\r\n outDirection3D.vec3_normalize(outDirection3D);\r\n\r\n return outDirection3D;\r\n };\r\n}();", "WL.registerComponent('pp-grabbable', {\n _myThrowLinearVelocityMultiplier: { type: WL.Type.Float, default: 1 },\n _myThrowAngularVelocityMultiplier: { type: WL.Type.Float, default: 1 },\n _myKinematicValueOnRelease: { type: WL.Type.Enum, values: ['true', 'false', 'keep'], default: 'false' },\n}, {\n init: function () {\n this._myIsGrabbed = false;\n\n this._myGrabber = null;\n\n this._myGrabCallbacks = new Map(); // Signature: callback(grabber, grabbable)\n this._myThrowCallbacks = new Map(); // Signature: callback(grabber, grabbable)\n this._myReleaseCallbacks = new Map(); // Signature: callback(grabber, grabbable, isThrow)\n },\n start: function () {\n this._myOldParent = this.object.parent;\n this._myPhysX = this.object.pp_getComponent('physx');\n this._myOldKinematicValue = null;\n },\n onDeactivate: function () {\n this.release();\n },\n grab: function (grabber) {\n if (!this.isGrabbed()) {\n this._myOldKinematicValue = this._myPhysX.kinematic;\n }\n\n this.release();\n\n this._myPhysX.kinematic = true;\n\n this._myOldParent = this.object.parent;\n this.object.pp_setParent(grabber);\n\n this._myIsGrabbed = true;\n\n this._myGrabCallbacks.forEach(function (callback) { callback(grabber, this); }.bind(this));\n },\n throw: function (linearVelocity, angularVelocity) {\n if (this._myIsGrabbed) {\n let grabber = this._myGrabber;\n\n this._release();\n\n //#TODO for now kinematic is not updated instantly, add the if as soon as it is\n //if (!this._myPhysX.kinematic) {\n this._myPhysX.linearVelocity = linearVelocity.vec3_scale(this._myThrowLinearVelocityMultiplier);\n this._myPhysX.angularVelocity = angularVelocity.vec3_scale(this._myThrowAngularVelocityMultiplier);\n //}\n\n this._myThrowCallbacks.forEach(function (callback) { callback(grabber, this); }.bind(this));\n this._myReleaseCallbacks.forEach(function (callback) { callback(grabber, this, true); }.bind(this));\n }\n },\n release() {\n if (this._myIsGrabbed) {\n let grabber = this._myGrabber;\n\n this._release();\n\n this._myReleaseCallbacks.forEach(function (callback) { callback(grabber, this, false); }.bind(this));\n }\n },\n getLinearVelocity() {\n let linearVelocity = PP.vec3_create();\n\n this._myPhysX.linearVelocity.vec3_clone(linearVelocity);\n\n return linearVelocity;\n },\n getAngularVelocity() {\n return this.getAngularVelocityDegrees();\n },\n getAngularVelocityDegrees() {\n let angularVelocityDegrees = PP.vec3_create();\n\n this._myPhysX.angularVelocity.vec3_toDegrees(angularVelocityDegrees);\n\n return angularVelocityDegrees;\n },\n getAngularVelocityRadians() {\n let angularVelocityRadians = PP.vec3_create();\n\n this._myPhysX.angularVelocity.vec3_clone(angularVelocityRadians);\n\n return angularVelocityRadians;\n },\n isGrabbed() {\n return this._myIsGrabbed;\n },\n getGrabber() {\n return this._myGrabber;\n },\n registerGrabEventListener(id, callback) {\n this._myGrabCallbacks.set(id, callback);\n },\n unregisterGrabEventListener(id) {\n this._myGrabCallbacks.delete(id);\n },\n registerThrowEventListener(id, callback) {\n this._myThrowCallbacks.set(id, callback);\n },\n unregisterThrowEventListener(id) {\n this._myThrowCallbacks.delete(id);\n },\n registerReleaseEventListener(id, callback) {\n this._myReleaseCallbacks.set(id, callback);\n },\n unregisterReleaseEventListener(id) {\n this._myReleaseCallbacks.delete(id);\n },\n _release() {\n this.object.pp_setParent(this._myOldParent);\n this._myIsGrabbed = false;\n this._myGrabber = null;\n\n if (this._myKinematicValueOnRelease == 0) {\n this._myPhysX.kinematic = true;\n } else if (this._myKinematicValueOnRelease == 1) {\n this._myPhysX.kinematic = false;\n } else if (this._myOldKinematicValue != null) {\n this._myPhysX.kinematic = this._myOldKinematicValue;\n }\n\n if (this._myPhysX.kinematic) {\n this._myPhysX.linearVelocity = [0, 0, 0];\n this._myPhysX.angularVelocity = [0, 0, 0];\n }\n }\n});", "WL.registerComponent('pp-grabber-hand', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myGrabButton: { type: WL.Type.Enum, values: ['select', 'squeeze', 'both', 'both_exclusive'], default: 'squeeze' }, // both_exclusive means u can use both buttons but you have to use the same button you grabbed with to throw\r\n _mySnapOnPivot: { type: WL.Type.Bool, default: false },\r\n _myMaxNumberOfObjects: { type: WL.Type.Int, default: 1 }, // how many objects you can grab at the same time\r\n // ADVANCED SETTINGS\r\n _myThrowVelocitySource: { type: WL.Type.Enum, values: ['hand', 'grabbable'], default: 'hand' },\r\n _myThrowLinearVelocityMultiplier: { type: WL.Type.Float, default: 1 }, // multiply the overall throw speed, so slow throws will be multiplied too\r\n _myThrowMaxLinearSpeed: { type: WL.Type.Float, default: 15 },\r\n _myThrowAngularVelocityMultiplier: { type: WL.Type.Float, default: 0.5 },\r\n _myThrowMaxAngularSpeed: { type: WL.Type.Float, default: 1080 }, // degrees\r\n _myThrowLinearVelocityBoost: { type: WL.Type.Float, default: 1.75 }, // this boost is applied from 0% to 100% based on how fast you throw, so slow throws are not affected\r\n _myThrowLinearVelocityBoostMinSpeedThreshold: { type: WL.Type.Float, default: 0.6 }, // 0% boost is applied if plain throw speed is under this value\r\n _myThrowLinearVelocityBoostMaxSpeedThreshold: { type: WL.Type.Float, default: 2.5 }, // 100% boost is applied if plain throw speed is over this value\r\n}, {\r\n init: function () {\r\n this._myGrabbables = [];\r\n\r\n this._myGamepad = null;\r\n\r\n this._myActiveGrabButton = null;\r\n\r\n this._myLinearVelocityHistorySize = 5;\r\n this._myLinearVelocityHistorySpeedAverageSamplesFromStart = 1;\r\n this._myLinearVelocityHistoryDirectionAverageSamplesFromStart = 3;\r\n this._myLinearVelocityHistoryDirectionAverageSkipFromStart = 0;\r\n\r\n this._myHandLinearVelocityHistory = new Array(this._myLinearVelocityHistorySize);\r\n this._myHandLinearVelocityHistory.fill([0, 0, 0]);\r\n\r\n this._myAngularVelocityHistorySize = 1;\r\n this._myHandAngularVelocityHistory = new Array(this._myAngularVelocityHistorySize);\r\n this._myHandAngularVelocityHistory.fill([0, 0, 0]);\r\n\r\n this._myThrowMaxAngularSpeedRadians = Math.pp_toRadians(this._myThrowMaxAngularSpeed);\r\n\r\n this._myGrabCallbacks = new Map(); // Signature: callback(grabber, grabbable)\r\n this._myThrowCallbacks = new Map(); // Signature: callback(grabber, grabbable)\r\n\r\n this._myDebugActive = false;\r\n },\r\n start: function () {\r\n if (this._myHandedness == PP.HandednessIndex.LEFT) {\r\n this._myGamepad = PP.myLeftGamepad;\r\n } else {\r\n this._myGamepad = PP.myRightGamepad;\r\n }\r\n\r\n this._myPhysX = this.object.pp_getComponent('physx');\r\n this._myCollisionsCollector = new PP.PhysXCollisionCollector(this._myPhysX, true);\r\n },\r\n update: function (dt) {\r\n this._myCollisionsCollector.update(dt);\r\n\r\n if (this._myGrabbables.length > 0) {\r\n this._updateLinearVelocityHistory();\r\n this._updateAngularVelocityHistory();\r\n }\r\n },\r\n grab: function (grabButton = null) {\r\n this._grab(grabButton);\r\n },\r\n throw: function (throwButton = null) {\r\n this._throw(throwButton);\r\n },\r\n registerGrabEventListener(id, callback) {\r\n this._myGrabCallbacks.set(id, callback);\r\n },\r\n unregisterGrabEventListener(id) {\r\n this._myGrabCallbacks.delete(id);\r\n },\r\n registerThrowEventListener(id, callback) {\r\n this._myThrowCallbacks.set(id, callback);\r\n },\r\n unregisterThrowEventListener(id) {\r\n this._myThrowCallbacks.delete(id);\r\n },\r\n onActivate() {\r\n if (this._myGamepad == null) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 0) {\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SELECT));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SELECT));\r\n } else if (this._myGrabButton == 1) {\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SQUEEZE));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SQUEEZE));\r\n } else {\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SQUEEZE));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SQUEEZE));\r\n\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SELECT));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SELECT));\r\n }\r\n },\r\n onDeactivate() {\r\n if (this._myGamepad == null) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 0) {\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this);\r\n } else if (this._myGrabButton == 1) {\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this);\r\n } else {\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this);\r\n\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this);\r\n }\r\n },\r\n _grab: function (grabButton) {\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == grabButton || grabButton == null) {\r\n let grabbablesToGrab = [];\r\n\r\n let collisions = this._myCollisionsCollector.getCollisions();\r\n for (let i = 0; i < collisions.length; i++) {\r\n let grabbable = collisions[i].getComponent(\"pp-grabbable\");\r\n if (grabbable && grabbable.active) {\r\n grabbablesToGrab.push(grabbable);\r\n }\r\n }\r\n\r\n let grabberPosition = this.object.pp_getPosition();\r\n grabbablesToGrab.sort(function (first, second) {\r\n let firstPosition = first.object.pp_getPosition();\r\n let secondPosition = second.object.pp_getPosition();\r\n\r\n let firstDistance = firstPosition.vec3_distance(grabberPosition);\r\n let secondDistance = secondPosition.vec3_distance(grabberPosition);\r\n\r\n return Math.pp_sign(firstDistance - secondDistance, 0);\r\n });\r\n\r\n for (let grabbableToGrab of grabbablesToGrab) {\r\n if (!this._isAlreadyGrabbed(grabbableToGrab)) {\r\n let grabbableData = new PP.GrabberHandGrabbableData(grabbableToGrab, this._myThrowVelocitySource == 1, this._myLinearVelocityHistorySize, this._myAngularVelocityHistorySize);\r\n this._myGrabbables.push(grabbableData);\r\n grabbableToGrab.grab(this.object);\r\n grabbableToGrab.registerReleaseEventListener(this, this._onRelease.bind(this));\r\n\r\n if (this._mySnapOnPivot) {\r\n grabbableToGrab.object.resetTranslation();\r\n }\r\n\r\n this._myGrabCallbacks.forEach(function (callback) { callback(this, grabbableToGrab); }.bind(this));\r\n }\r\n\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n break;\r\n }\r\n }\r\n\r\n if (this._myGrabbables.length > 0) {\r\n if (this._myActiveGrabButton == null) {\r\n this._myActiveGrabButton = grabButton;\r\n }\r\n }\r\n }\r\n },\r\n _throw: function (throwButton) {\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == throwButton || throwButton == null) {\r\n if (this._myGrabbables.length > 0) {\r\n let linearVelocity = null;\r\n let angularVelocity = null;\r\n\r\n if (this._myThrowVelocitySource == 0) {\r\n linearVelocity = this._computeReleaseLinearVelocity(this._myHandLinearVelocityHistory);\r\n angularVelocity = this._computeReleaseAngularVelocity(this._myHandAngularVelocityHistory);\r\n }\r\n\r\n for (let grabbableData of this._myGrabbables) {\r\n let grabbable = grabbableData.getGrabbable();\r\n\r\n grabbable.unregisterReleaseEventListener(this);\r\n\r\n if (this._myThrowVelocitySource == 1) {\r\n linearVelocity = this._computeReleaseLinearVelocity(grabbableData.getLinearVelocityHistory());\r\n angularVelocity = this._computeReleaseAngularVelocity(grabbableData.getAngularVelocityHistory());\r\n }\r\n\r\n grabbable.throw(linearVelocity, angularVelocity);\r\n\r\n this._myThrowCallbacks.forEach(function (callback) { callback(this, grabbable); }.bind(this));\r\n }\r\n\r\n this._myGrabbables = [];\r\n }\r\n\r\n this._myActiveGrabButton = null;\r\n }\r\n },\r\n _onRelease(grabber, grabbable) {\r\n grabbable.unregisterReleaseEventListener(this);\r\n this._myGrabbables.pp_remove(element => element.getGrabbable() == grabbable);\r\n\r\n if (this._myGrabbables.length <= 0) {\r\n this._myActiveGrabButton = null;\r\n }\r\n },\r\n _updateLinearVelocityHistory() {\r\n let handPose = this._myGamepad.getHandPose();\r\n this._myHandLinearVelocityHistory.unshift(handPose.getLinearVelocity().pp_clone());\r\n this._myHandLinearVelocityHistory.pop();\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateLinearVelocityHistory();\r\n }\r\n },\r\n _updateAngularVelocityHistory() {\r\n let handPose = this._myGamepad.getHandPose();\r\n this._myHandAngularVelocityHistory.unshift(handPose.getAngularVelocityRadians().pp_clone());\r\n this._myHandAngularVelocityHistory.pop();\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateAngularVelocityHistory();\r\n }\r\n },\r\n _computeReleaseLinearVelocity(linearVelocityHistory) {\r\n //speed\r\n let speed = linearVelocityHistory[0].vec3_length();\r\n for (let i = 1; i < this._myLinearVelocityHistorySpeedAverageSamplesFromStart; i++) {\r\n speed += linearVelocityHistory[i].vec3_length();\r\n }\r\n speed /= this._myLinearVelocityHistorySpeedAverageSamplesFromStart;\r\n\r\n // This way I give an increasing and smooth boost to the throw so that when u want to perform a weak throw, the value is not changed, but if u put more speed\r\n // it will be boosted to make it easier and still feel good and natural (value does not increase suddenly)\r\n let speedEaseMultiplier = Math.pp_mapToRange(speed, this._myThrowLinearVelocityBoostMinSpeedThreshold, this._myThrowLinearVelocityBoostMaxSpeedThreshold, 0, 1);\r\n speedEaseMultiplier = PP.EasingFunction.easeIn(speedEaseMultiplier);\r\n\r\n // Add the boost to the speed\r\n let extraSpeed = speed * (speedEaseMultiplier * this._myThrowLinearVelocityBoost);\r\n speed += extraSpeed;\r\n speed *= this._myThrowLinearVelocityMultiplier;\r\n speed = Math.pp_clamp(speed, 0, this._myThrowMaxLinearSpeed);\r\n\r\n if (this._myDebugActive) {\r\n this._debugDirectionLines(linearVelocityHistory);\r\n }\r\n\r\n //direction\r\n let directionCurrentWeight = this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let lastDirectionIndex = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let direction = [0, 0, 0];\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i];\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n },\r\n _computeReleaseAngularVelocity(angularVelocityHistory) {\r\n let angularVelocity = angularVelocityHistory[0];\r\n\r\n //speed\r\n let speed = angularVelocity.vec3_length();\r\n\r\n speed = Math.pp_clamp(speed * this._myThrowAngularVelocityMultiplier, 0, this._myThrowMaxAngularSpeedRadians);\r\n\r\n //direction\r\n let direction = angularVelocity;\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n },\r\n _debugDirectionLines(linearVelocityHistory) {\r\n for (let j = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart; j > this._myLinearVelocityHistoryDirectionAverageSkipFromStart; j--) {\r\n\r\n let directionCurrentWeight = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let lastDirectionIndex = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let direction = [0, 0, 0];\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i].pp_clone();\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n let color = 1 / j;\r\n\r\n PP.myDebugVisualManager.drawLine(5, this.object.pp_getPosition(), direction, 0.2, [olor, color, color, 1]);\r\n }\r\n },\r\n _isAlreadyGrabbed(grabbable) {\r\n let found = this._myGrabbables.pp_find(element => element.getGrabbable() == grabbable);\r\n return found != null;\r\n }\r\n});\r\n\r\nPP.GrabberHandGrabbableData = class GrabberHandGrabbableData {\r\n constructor(grabbable, useGrabbableAsVelocitySource, linearVelocityHistorySize, angularVelocityHistorySize) {\r\n this._myGrabbable = grabbable;\r\n this._myUseGrabbableAsVelocitySource = useGrabbableAsVelocitySource;\r\n\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory = new Array(linearVelocityHistorySize);\r\n this._myLinearVelocityHistory.fill([0, 0, 0]);\r\n\r\n this._myAngularVelocityHistory = new Array(angularVelocityHistorySize);\r\n this._myAngularVelocityHistory.fill([0, 0, 0]);\r\n }\r\n }\r\n\r\n getGrabbable() {\r\n return this._myGrabbable;\r\n }\r\n\r\n getLinearVelocityHistory() {\r\n return this._myLinearVelocityHistory;\r\n }\r\n\r\n getAngularVelocityHistory() {\r\n return this._myAngularVelocityHistory;\r\n }\r\n\r\n updateLinearVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory.unshift(this._myGrabbable.getLinearVelocity());\r\n this._myLinearVelocityHistory.pop();\r\n }\r\n }\r\n\r\n updateAngularVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myAngularVelocityHistory.unshift(this._myGrabbable.getAngularVelocityRadians());\r\n this._myAngularVelocityHistory.pop();\r\n }\r\n }\r\n};", "WL.registerComponent('pp-finger-cursor', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myEnableMultipleClicks: { type: WL.Type.Bool, default: true },\r\n _myCollisionGroup: { type: WL.Type.Int, default: 1 },\r\n _myCollisionSize: { type: WL.Type.Float, default: 0.0125 },\r\n _myCursorObject: { type: WL.Type.Object, default: null }\r\n}, {\r\n init: function () {\r\n this._myLastTarget = null;\r\n this._myReferenceSpace = null;\r\n this._myHandInputSource = null;\r\n this._myHandednessString = ['left', 'right'][this._myHandedness];\r\n\r\n this._myDoubleClickTimer = 0;\r\n this._myTripleClickTimer = 0;\r\n this._myMultipleClickObject = null;\r\n this._myMultipleClickDelay = 0.3;\r\n },\r\n start: function () {\r\n this._myCursorObjectRoot = WL.scene.addObject(null);\r\n\r\n if (this._myCursorObject == null) {\r\n this._myCursorObject = this._myCursorObjectRoot.pp_addObject();\r\n } else {\r\n this._myCursorObject.pp_setParent(this._myCursorObjectRoot);\r\n }\r\n\r\n this._myCollisionComponent = this._myCursorObject.addComponent('collision');\r\n this._myCollisionComponent.collider = WL.Collider.Sphere;\r\n this._myCollisionComponent.group = 1 << this._myCollisionGroup;\r\n this._myCollisionComponent.extents = [this._myCollisionSize, this._myCollisionSize, this._myCollisionSize];\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n },\r\n update: function (dt) {\r\n if (this._myDoubleClickTimer > 0) {\r\n this._myDoubleClickTimer -= dt;\r\n }\r\n\r\n if (this._myTripleClickTimer > 0) {\r\n this._myTripleClickTimer -= dt;\r\n }\r\n\r\n this._myCursorObjectRoot.pp_setTransformQuat(PP.myPlayerObjects.myPlayerPivot.pp_getTransformQuat());\r\n this._updateHand();\r\n\r\n if (this._myHandInputSource) {\r\n let overlaps = this._myCollisionComponent.queryOverlaps();\r\n let overlapTarget = null;\r\n for (let i = 0; i < overlaps.length; ++i) {\r\n let object = overlaps[i].object;\r\n let target = object.getComponent('cursor-target');\r\n if (target && (overlapTarget == null || !target.isSurface)) {\r\n overlapTarget = target;\r\n if (!target.isSurface) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!overlapTarget) {\r\n this._targetTouchEnd();\r\n } else if (!overlapTarget.equals(this._myLastTarget)) {\r\n this._targetTouchEnd();\r\n\r\n this._myLastTarget = overlapTarget;\r\n\r\n this._targetTouchStart();\r\n }\r\n } else {\r\n this._targetTouchEnd();\r\n }\r\n },\r\n _targetTouchStart: function () {\r\n this._myLastTarget.onHover(this._myLastTarget.object, this);\r\n this._myLastTarget.onDown(this._myLastTarget.object, this);\r\n },\r\n _targetTouchEnd: function () {\r\n if (this._myLastTarget) {\r\n if (this._myEnableMultipleClicks && this._myTripleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject.equals(this._myLastTarget.object)) {\r\n this._myLastTarget.onTripleClick(this._myLastTarget.object, this);\r\n\r\n this._myTripleClickTimer = 0;\r\n } else if (this._myEnableMultipleClicks && this._myDoubleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject.equals(this._myLastTarget.object)) {\r\n this._myLastTarget.onDoubleClick(this._myLastTarget.object, this);\r\n\r\n this._myTripleClickTimer = this._myMultipleClickDelay;\r\n this._myDoubleClickTimer = 0;\r\n } else {\r\n this._myLastTarget.onClick(this._myLastTarget.object, this);\r\n\r\n this._myTripleClickTimer = 0;\r\n this._myDoubleClickTimer = this._myMultipleClickDelay;\r\n this._myMultipleClickObject = this._myLastTarget.object;\r\n }\r\n\r\n this._myLastTarget.onUp(this._myLastTarget.object, this);\r\n this._myLastTarget.onUnhover(this._myLastTarget.object, this);\r\n\r\n this._myLastTarget = null;\r\n }\r\n },\r\n onActivate: function () {\r\n this._myCursorObjectRoot.pp_setActive(true);\r\n },\r\n onDeactivate: function () {\r\n this._myCursorObjectRoot.pp_setActive(false);\r\n },\r\n _updateHand() {\r\n this._myHandInputSource = PP.InputUtils.getInputSource(this._myHandednessString, PP.InputSourceType.TRACKED_HAND);\r\n\r\n if (this._myHandInputSource) {\r\n let tip = Module['webxr_frame'].getJointPose(this._myHandInputSource.hand.get(\"index-finger-tip\"), this._myReferenceSpace);\r\n\r\n if (tip) {\r\n this._myCursorObject.pp_setRotationLocalQuat([\r\n tip.transform.orientation.x,\r\n tip.transform.orientation.y,\r\n tip.transform.orientation.z,\r\n tip.transform.orientation.w]);\r\n\r\n this._myCursorObject.pp_setPositionLocal([\r\n tip.transform.position.x,\r\n tip.transform.position.y,\r\n tip.transform.position.z]);\r\n }\r\n }\r\n },\r\n _onXRSessionStart: function (session) {\r\n session.requestReferenceSpace(WebXR.refSpace).then(function (referenceSpace) { this._myReferenceSpace = referenceSpace; }.bind(this));\r\n },\r\n _onXRSessionEnd: function (session) {\r\n this._myReferenceSpace = null;\r\n }\r\n});", "\nPP.Handedness = {\n LEFT: \"left\",\n RIGHT: \"right\"\n};\n\nPP.HandednessIndex = {\n LEFT: 0,\n RIGHT: 1\n};\n\nPP.InputSourceType = {\n GAMEPAD: 0,\n TRACKED_HAND: 1\n};\n\nPP.TrackedHandJointType = {\n WRIST: \"wrist\",\n\n THUMB_METACARPAL: \"thumb-metacarpal\",\n THUMB_PHALANX_PROXIMAL: \"thumb-phalanx-proximal\",\n THUMB_PHALANX_DISTAL: \"thumb-phalanx-distal\",\n THUMB_TIP: \"thumb-tip\",\n\n INDEX_FINGER_METACARPAL: \"index-finger-metacarpal\",\n INDEX_FINGER_PHALANX_PROXIMAL: \"index-finger-phalanx-proximal\",\n INDEX_FINGER_PHALANX_INTERMEDIATE: \"index-finger-phalanx-intermediate\",\n INDEX_FINGER_PHALANX_DISTAL: \"index-finger-phalanx-distal\",\n INDEX_FINGER_TIP: \"index-finger-tip\",\n\n MIDDLE_FINGER_METACARPAL: \"middle-finger-metacarpal\",\n MIDDLE_FINGER_PHALANX_PROXIMAL: \"middle-finger-phalanx-proximal\",\n MIDDLE_FINGER_PHALANX_INTERMEDIATE: \"middle-finger-phalanx-intermediate\",\n MIDDLE_FINGER_PHALANX_DISTAL: \"middle-finger-phalanx-distal\",\n MIDDLE_FINGER_TIP: \"middle-finger-tip\",\n\n RING_FINGER_METACARPAL: \"ring-finger-metacarpal\",\n RING_FINGER_PHALANX_PROXIMAL: \"ring-finger-phalanx-proximal\",\n RING_FINGER_PHALANX_INTERMEDIATE: \"ring-finger-phalanx-intermediate\",\n RING_FINGER_PHALANX_DISTAL: \"ring-finger-phalanx-distal\",\n RING_FINGER_TIP: \"ring-finger-tip\",\n\n PINKY_FINGER_METACARPAL: \"pinky-finger-metacarpal\",\n PINKY_FINGER_PHALANX_PROXIMAL: \"pinky-finger-phalanx-proximal\",\n PINKY_FINGER_PHALANX_INTERMEDIATE: \"pinky-finger-phalanx-intermediate\",\n PINKY_FINGER_PHALANX_DISTAL: \"pinky-finger-phalanx-distal\",\n PINKY_FINGER_TIP: \"pinky-finger-tip\",\n};\n\nPP.TrackedHandJointTypeIndex = {\n WRIST: 0,\n\n THUMB_METACARPAL: 1,\n THUMB_PHALANX_PROXIMAL: 2,\n THUMB_PHALANX_DISTAL: 3,\n THUMB_TIP: 4,\n\n INDEX_FINGER_METACARPAL: 5,\n INDEX_FINGER_PHALANX_PROXIMAL: 6,\n INDEX_FINGER_PHALANX_INTERMEDIATE: 7,\n INDEX_FINGER_PHALANX_DISTAL: 8,\n INDEX_FINGER_TIP: 9,\n\n MIDDLE_FINGER_METACARPAL: 10,\n MIDDLE_FINGER_PHALANX_PROXIMAL: 11,\n MIDDLE_FINGER_PHALANX_INTERMEDIATE: 12,\n MIDDLE_FINGER_PHALANX_DISTAL: 13,\n MIDDLE_FINGER_TIP: 14,\n\n RING_FINGER_METACARPAL: 15,\n RING_FINGER_PHALANX_PROXIMAL: 16,\n RING_FINGER_PHALANX_INTERMEDIATE: 17,\n RING_FINGER_PHALANX_DISTAL: 18,\n RING_FINGER_TIP: 19,\n\n PINKY_FINGER_METACARPAL: 20,\n PINKY_FINGER_PHALANX_PROXIMAL: 21,\n PINKY_FINGER_PHALANX_INTERMEDIATE: 22,\n PINKY_FINGER_PHALANX_DISTAL: 23,\n PINKY_FINGER_TIP: 24,\n};", "PP.InputUtils = {\r\n getHandednessByIndex: function (index) {\r\n let handedness = null;\r\n\r\n switch (index) {\r\n case PP.HandednessIndex.LEFT:\r\n handedness = PP.Handedness.LEFT;\r\n break;\r\n case PP.HandednessIndex.RIGHT:\r\n handedness = PP.Handedness.RIGHT;\r\n break;\r\n }\r\n\r\n return handedness;\r\n },\r\n getInputSource: function (handedness, inputSourceType) {\r\n let inputSource = null;\r\n\r\n if (WL.xrSession && WL.xrSession.inputSources) {\r\n for (let i = 0; i < WL.xrSession.inputSources.length; i++) {\r\n let input = WL.xrSession.inputSources[i];\r\n\r\n let isCorrectType = (!inputSourceType) || (inputSourceType == PP.InputSourceType.GAMEPAD && !input.hand) || (inputSourceType == PP.InputSourceType.TRACKED_HAND && input.hand);\r\n if (isCorrectType && input.handedness == handedness) {\r\n inputSource = input;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return inputSource;\r\n },\r\n getInputSourceTypeByHandedness: function (handedness) {\r\n let inputSource = PP.InputUtils.getInputSource(handedness);\r\n\r\n return PP.InputUtils.getInputSourceType(inputSource);\r\n },\r\n getInputSourceType: function (inputSource) {\r\n let inputSourceType = null;\r\n\r\n if (inputSource) {\r\n if (inputSource.hand) {\r\n inputSourceType = PP.InputSourceType.TRACKED_HAND;\r\n } else {\r\n inputSourceType = PP.InputSourceType.GAMEPAD;\r\n }\r\n }\r\n\r\n return inputSourceType;\r\n },\r\n getOppositeHandedness: function (handedness) {\r\n let oppositeHandedness = null;\r\n\r\n switch (handedness) {\r\n case PP.Handedness.LEFT:\r\n oppositeHandedness = PP.Handedness.RIGHT;\r\n break;\r\n case PP.Handedness.RIGHT:\r\n oppositeHandedness = PP.Handedness.LEFT;\r\n break;\r\n }\r\n\r\n return oppositeHandedness;\r\n },\r\n getJointTypeByIndex: function (index) {\r\n let jointType = null;\r\n\r\n let jointTypeKey = null;\r\n for (let jointTypeIndexKey in PP.TrackedHandJointTypeIndex) {\r\n if (PP.TrackedHandJointTypeIndex[jointTypeIndexKey] == index) {\r\n jointTypeKey = jointTypeIndexKey;\r\n break;\r\n }\r\n }\r\n\r\n if (jointTypeKey != null) {\r\n jointType = PP.TrackedHandJointType[jointTypeKey];\r\n }\r\n\r\n return jointType;\r\n },\r\n};", "PP.KeyType = {\r\n _0: \"0\",\r\n _1: \"1\",\r\n _2: \"2\",\r\n _3: \"3\",\r\n _4: \"4\",\r\n _5: \"5\",\r\n _6: \"6\",\r\n _7: \"7\",\r\n _8: \"8\",\r\n _9: \"9\",\r\n\r\n A: \"A\",\r\n B: \"B\",\r\n C: \"C\",\r\n D: \"D\",\r\n E: \"E\",\r\n F: \"F\",\r\n G: \"G\",\r\n H: \"H\",\r\n I: \"I\",\r\n J: \"J\",\r\n K: \"K\",\r\n L: \"L\",\r\n M: \"M\",\r\n N: \"N\",\r\n O: \"O\",\r\n P: \"P\",\r\n Q: \"Q\",\r\n R: \"R\",\r\n S: \"S\",\r\n T: \"T\",\r\n U: \"U\",\r\n V: \"V\",\r\n W: \"W\",\r\n X: \"X\",\r\n Y: \"Y\",\r\n Z: \"Z\",\r\n\r\n a: \"a\",\r\n b: \"b\",\r\n c: \"c\",\r\n d: \"d\",\r\n e: \"e\",\r\n f: \"f\",\r\n g: \"g\",\r\n h: \"h\",\r\n i: \"i\",\r\n j: \"j\",\r\n k: \"k\",\r\n l: \"l\",\r\n m: \"m\",\r\n n: \"n\",\r\n o: \"o\",\r\n p: \"p\",\r\n q: \"q\",\r\n r: \"r\",\r\n s: \"s\",\r\n t: \"t\",\r\n u: \"u\",\r\n v: \"v\",\r\n w: \"w\",\r\n x: \"x\",\r\n y: \"y\",\r\n z: \"z\",\r\n\r\n UP: \"ArrowUp\",\r\n DOWN: \"ArrowDown\",\r\n LEFT: \"ArrowLeft\",\r\n RIGHT: \"ArrowRight\",\r\n\r\n SPACE: \" \",\r\n ENTER: \"Enter\",\r\n BACKSPACE: \"Backspace\",\r\n ESC: \"Escape\",\r\n\r\n SHIFT_LEFT: \"ShiftLeft\",\r\n SHIFT_RIGHT: \"ShiftRight\",\r\n CONTROL_LEFT: \"ControlLeft\",\r\n CONTROL_RIGHT: \"ControlRight\",\r\n ALT_LEFT: \"AltLeft\",\r\n ALT_RIGHT: \"AltRight\",\r\n};\r\n\r\nPP.Keyboard = class Keyboard {\r\n constructor() {\r\n this._myKeyInfos = new Map();\r\n\r\n for (let keyType in PP.KeyType) {\r\n this.addKey(PP.KeyType[keyType]);\r\n }\r\n }\r\n\r\n isKeyPressed(keyType) {\r\n let isPressed = false;\r\n\r\n if (this._myKeyInfos.has(keyType)) {\r\n isPressed = this._myKeyInfos.get(keyType).myIsPressed;\r\n }\r\n\r\n return isPressed;\r\n }\r\n\r\n isKeyPressStart(keyType) {\r\n let isPressStart = false;\r\n\r\n if (this._myKeyInfos.has(keyType)) {\r\n isPressStart = this._myKeyInfos.get(keyType).myIsPressStart;\r\n }\r\n\r\n return isPressStart;\r\n }\r\n\r\n isKeyPressEnd(keyType) {\r\n let isPressEnd = false;\r\n\r\n if (this._myKeyInfos.has(keyType)) {\r\n isPressEnd = this._myKeyInfos.get(keyType).myIsPressEnd;\r\n }\r\n\r\n return isPressEnd;\r\n }\r\n\r\n addKey(keyType) {\r\n this._myKeyInfos.set(keyType,\r\n { myIsPressed: false, myIsPressStart: false, myIsPressStartToProcess: false, myIsPressEnd: false, myIsPressEndToProcess: false, });\r\n }\r\n\r\n start() {\r\n window.addEventListener('keydown', this._keyDown.bind(this));\r\n window.addEventListener('keyup', this._keyUp.bind(this));\r\n }\r\n\r\n update(dt) {\r\n if (!document.hasFocus()) {\r\n for (let keyInfo of this._myKeyInfos.values()) {\r\n if (keyInfo.myIsPressed) {\r\n keyInfo.myIsPressed = false;\r\n keyInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n for (let keyInfo of this._myKeyInfos.values()) {\r\n keyInfo.myIsPressStart = keyInfo.myIsPressStartToProcess;\r\n keyInfo.myIsPressEnd = keyInfo.myIsPressEndToProcess;\r\n keyInfo.myIsPressStartToProcess = false;\r\n keyInfo.myIsPressEndToProcess = false;\r\n }\r\n }\r\n\r\n _keyDown(event) {\r\n this._keyPressedChanged(event.key, true);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, true);\r\n }\r\n }\r\n\r\n _keyUp(event) {\r\n this._keyPressedChanged(event.key, false);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, false);\r\n }\r\n }\r\n\r\n _keyPressedChanged(keyType, isPressed) {\r\n if (this._myKeyInfos.has(keyType)) {\r\n let keyInfo = this._myKeyInfos.get(keyType);\r\n\r\n if (isPressed) {\r\n keyInfo.myIsPressed = true;\r\n keyInfo.myIsPressStartToProcess = true;\r\n } else {\r\n keyInfo.myIsPressed = false;\r\n keyInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n};", "PP.MouseButtonType = {\r\n LEFT: 0,\r\n MIDDLE: 1,\r\n RIGHT: 2,\r\n};\r\n\r\nPP.Mouse = class Mouse {\r\n constructor() {\r\n // #TODO refactor Mouse/Keyboard/Gamepad and create a sort of parent ButtonHandler that have the base ButtonInfo and all of them inherit\r\n // ButtonType could also become GamepadButtonID or directly GamepadButton like in Unity\r\n\r\n this._myButtonInfos = new Map();\r\n for (let typeKey in PP.MouseButtonType) {\r\n this._myButtonInfos.set(PP.MouseButtonType[typeKey],\r\n { myIsPressed: false, myIsPressStart: false, myIsPressStartToProcess: false, myIsPressEnd: false, myIsPressEndToProcess: false, });\r\n }\r\n\r\n this._myPreventContextMenuCallback = this._preventContextMenu.bind(this);\r\n this._myPreventMiddleButtonScrollCallback = this._preventMiddleButtonScroll.bind(this);\r\n\r\n this._myInternalMousePosition = PP.vec2_create();\r\n this._myScreenSize = PP.vec2_create();\r\n\r\n this._myResetMovingDelay = 0.15;\r\n this._myResetMovingTimer = new PP.Timer(this._myResetMovingDelay, false);\r\n this._myIsMoving = false;\r\n\r\n this._myIsInsideView = true;\r\n\r\n this._myContextMenuActive = true;\r\n this._myMiddleButtonScrollActive = true;\r\n\r\n // Support Variables\r\n this._myProjectionMatrixInverse = PP.mat4_create();\r\n this._myRotationQuat = PP.quat_create();\r\n this._myOriginWorld = PP.vec3_create();\r\n this._myDirectionWorld = PP.vec3_create();\r\n }\r\n\r\n start() {\r\n this._myOnMouseMoveCallback = this._onMouseMove.bind(this);\r\n WL.canvas.addEventListener(\"mousemove\", this._myOnMouseMoveCallback);\r\n this._myOnMouseDownCallback = this._onMouseDown.bind(this);\r\n WL.canvas.addEventListener(\"mousedown\", this._myOnMouseDownCallback);\r\n this._myOnMouseUpCallback = this._onMouseUp.bind(this);\r\n WL.canvas.addEventListener(\"mouseup\", this._myOnMouseUpCallback);\r\n this._myOnMouseLeaveCallback = this._onMouseLeave.bind(this);\r\n WL.canvas.addEventListener(\"mouseleave\", this._myOnMouseLeaveCallback);\r\n this._myOnMouseEnterCallback = this._onMouseEnter.bind(this);\r\n WL.canvas.addEventListener(\"mouseenter\", this._myOnMouseEnterCallback);\r\n }\r\n\r\n update(dt) {\r\n if (this._myResetMovingTimer.isRunning()) {\r\n this._myResetMovingTimer.update(dt);\r\n if (this._myResetMovingTimer.isDone()) {\r\n this._myResetMovingTimer.reset();\r\n this._myIsMoving = false;\r\n }\r\n }\r\n\r\n for (let buttonInfo of this._myButtonInfos.values()) {\r\n buttonInfo.myIsPressStart = buttonInfo.myIsPressStartToProcess;\r\n buttonInfo.myIsPressEnd = buttonInfo.myIsPressEndToProcess;\r\n buttonInfo.myIsPressStartToProcess = false;\r\n buttonInfo.myIsPressEndToProcess = false;\r\n }\r\n }\r\n\r\n destroy() {\r\n WL.canvas.removeEventListener(\"mousemove\", this._myOnMouseMoveCallback);\r\n WL.canvas.removeEventListener(\"mousedown\", this._myOnMouseDownCallback);\r\n WL.canvas.removeEventListener(\"mouseup\", this._myOnMouseUpCallback);\r\n WL.canvas.removeEventListener(\"mouseleave\", this._myOnMouseLeaveCallback);\r\n WL.canvas.removeEventListener(\"contextmenu\", this._myPreventContextMenuCallback);\r\n WL.canvas.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollCallback);\r\n }\r\n\r\n isButtonPressed(buttonInfoType) {\r\n let isPressed = false;\r\n\r\n if (this._myButtonInfos.has(buttonInfoType)) {\r\n isPressed = this._myButtonInfos.get(buttonInfoType).myIsPressed;\r\n }\r\n\r\n return isPressed;\r\n }\r\n\r\n isButtonPressStart(buttonInfoType) {\r\n let isPressStart = false;\r\n\r\n if (this._myButtonInfos.has(buttonInfoType)) {\r\n isPressStart = this._myButtonInfos.get(buttonInfoType).myIsPressStart;\r\n }\r\n\r\n return isPressStart;\r\n }\r\n\r\n isButtonPressEnd(buttonInfoType = null) {\r\n let isPressEnd = false;\r\n\r\n if (this._myButtonInfos.has(buttonInfoType)) {\r\n isPressEnd = this._myButtonInfos.get(buttonInfoType).myIsPressEnd;\r\n }\r\n\r\n return isPressEnd;\r\n }\r\n\r\n isMoving() {\r\n return this._myIsMoving;\r\n }\r\n\r\n isInsideView() {\r\n return this._myIsInsideView;\r\n }\r\n\r\n setContextMenuActive(active) {\r\n if (this._myContextMenuActive != active) {\r\n if (active) {\r\n WL.canvas.removeEventListener(\"contextmenu\", this._myPreventContextMenuCallback);\r\n } else {\r\n WL.canvas.addEventListener(\"contextmenu\", this._myPreventContextMenuCallback, false);\r\n }\r\n this._myContextMenuActive = active;\r\n }\r\n }\r\n\r\n setMiddleButtonScrollActive(active) {\r\n if (this._myMiddleButtonScrollActive != active) {\r\n if (active) {\r\n WL.canvas.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollCallback);\r\n } else {\r\n WL.canvas.addEventListener(\"mousedown\", this._myPreventMiddleButtonScrollCallback, false);\r\n }\r\n this._myMiddleButtonScrollActive = active;\r\n }\r\n }\r\n\r\n getPositionScreen(out = PP.vec2_create()) {\r\n let mousePosition = out;\r\n mousePosition[0] = this._myInternalMousePosition[0];\r\n mousePosition[1] = this._myScreenSize[1] - 1 - this._myInternalMousePosition[1];\r\n return mousePosition;\r\n }\r\n\r\n getScreenSize() {\r\n return this._myScreenSize;\r\n }\r\n\r\n getPositionWorld(distanceFromCamera, out = PP.vec3_create()) {\r\n let originWorld = this.getOriginWorld(this._myOriginWorld);\r\n let directionWorld = this.getDirectionWorld(this._myDirectionWorld);\r\n\r\n out = originWorld.vec3_add(directionWorld.vec3_scale(distanceFromCamera, out), out);\r\n return out;\r\n }\r\n\r\n getOriginWorld(out = PP.vec3_create()) {\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n PP.myPlayerObjects.myEyeLeft.pp_getPosition(out); // in theory mouse should not be used inside the session, but may make sense for AR which uses eye left\r\n } else {\r\n PP.myPlayerObjects.myNonVRCamera.pp_getPosition(out);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n getDirectionWorld(out = PP.vec3_create()) {\r\n let right = this._myInternalMousePosition[0] / this._myScreenSize[0];\r\n let up = this._myInternalMousePosition[1] / this._myScreenSize[1];\r\n\r\n let directionLocal = out;\r\n directionLocal.vec3_set(right * 2 - 1, -up * 2 + 1, -1.0);\r\n\r\n let projectionMatrixInvert = this._myProjectionMatrixInverse;\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n projectionMatrixInvert = PP.myPlayerObjects.myEyeLeft.pp_getComponentHierarchy(\"view\").projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n } else {\r\n projectionMatrixInvert = PP.myPlayerObjects.myNonVRCamera.pp_getComponentHierarchy(\"view\").projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n }\r\n\r\n directionLocal.vec3_transformMat4(projectionMatrixInvert, directionLocal);\r\n directionLocal.vec3_normalize(directionLocal);\r\n\r\n let directionWorld = directionLocal;\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n directionWorld = directionLocal.vec3_transformQuat(PP.myPlayerObjects.myEyeLeft.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n } else {\r\n directionWorld = directionLocal.vec3_transformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n }\r\n\r\n directionWorld.vec3_normalize(directionWorld);\r\n\r\n return out;\r\n }\r\n\r\n // the origin and direction are set by the mouse\r\n raycastWorld(raycastSetup, raycastResult = new PP.RaycastResult()) {\r\n this.getOriginWorld(raycastSetup.myOrigin);\r\n this.getDirectionWorld(raycastSetup.myDirection);\r\n raycastResult = PP.PhysicsUtils.raycast(raycastSetup, raycastResult);\r\n return raycastResult;\r\n }\r\n\r\n setResetMovingDelay(delay) {\r\n this._myResetMovingDelay = delay;\r\n }\r\n\r\n getResetMovingDelay() {\r\n return this._myResetMovingDelay;\r\n }\r\n\r\n _updatePositionAndView(event) {\r\n let bounds = event.target.getBoundingClientRect();\r\n this._myScreenSize[0] = bounds.width;\r\n this._myScreenSize[1] = bounds.height;\r\n this._myInternalMousePosition[0] = event.clientX;\r\n this._myInternalMousePosition[1] = event.clientY;\r\n }\r\n\r\n _onMouseMove(event) {\r\n this._myResetMovingTimer.start(this._myResetMovingDelay);\r\n this._myIsMoving = true;\r\n\r\n this._updatePositionAndView(event);\r\n }\r\n\r\n _onMouseDown(event) {\r\n let buttonInfo = this._myButtonInfos.get(event.button);\r\n if (!buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = true;\r\n buttonInfo.myIsPressStartToProcess = true;\r\n }\r\n\r\n this._updatePositionAndView(event);\r\n }\r\n\r\n _onMouseUp(event) {\r\n let buttonInfo = this._myButtonInfos.get(event.button);\r\n if (buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = false;\r\n buttonInfo.myIsPressEndToProcess = true;\r\n }\r\n\r\n this._updatePositionAndView(event);\r\n }\r\n\r\n _onMouseLeave(event) {\r\n this._myIsInsideView = false;\r\n\r\n for (let buttonInfo of this._myButtonInfos.values()) {\r\n if (buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = false;\r\n buttonInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n _onMouseEnter(event) {\r\n this._myIsInsideView = true;\r\n\r\n for (let buttonInfo of this._myButtonInfos.values()) {\r\n if (buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = false;\r\n buttonInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n _preventContextMenu(event) {\r\n event.preventDefault();\r\n }\r\n\r\n _preventMiddleButtonScroll(event) {\r\n if (event.button == 1) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n }\r\n};", "PP.InputManager = class InputManager {\r\n constructor() {\r\n this._myMouse = new PP.Mouse();\r\n this._myKeyboard = new PP.Keyboard();\r\n this._myGamepadManager = new PP.GamepadManager();\r\n }\r\n\r\n start() {\r\n this._myMouse.start();\r\n this._myKeyboard.start();\r\n this._myGamepadManager.start();\r\n }\r\n\r\n update(dt) {\r\n this._myMouse.update(dt);\r\n this._myKeyboard.update(dt);\r\n this._myGamepadManager.update(dt);\r\n }\r\n\r\n getMouse() {\r\n return this._myMouse;\r\n }\r\n\r\n getKeyboard() {\r\n return this._myKeyboard;\r\n }\r\n\r\n getGamepadManager() {\r\n return this._myGamepadManager;\r\n }\r\n};", "WL.registerComponent('pp-input-manager', {\r\n _myGamepadFixForward: { type: WL.Type.Bool, default: true },\r\n _myMousePreventContextMenu: { type: WL.Type.Bool, default: true },\r\n _myMousePreventMiddleButtonScroll: { type: WL.Type.Bool, default: true },\r\n}, {\r\n init() {\r\n this._myInputManager = new PP.InputManager();\r\n\r\n PP.myInputManager = this._myInputManager;\r\n\r\n PP.myMouse = this._myInputManager.getMouse();\r\n PP.myKeyboard = this._myInputManager.getKeyboard();\r\n\r\n PP.myGamepadManager = this._myInputManager.getGamepadManager();\r\n PP.myGamepads = PP.myGamepadManager.getGamepads();\r\n PP.myLeftGamepad = PP.myGamepadManager.getLeftGamepad();\r\n PP.myRightGamepad = PP.myGamepadManager.getRightGamepad();\r\n },\r\n start() {\r\n this._myInputManager.start();\r\n\r\n this._setupMousePrevent();\r\n this._addGamepadCores();\r\n },\r\n update(dt) {\r\n this._myInputManager.update(dt);\r\n },\r\n _setupMousePrevent() {\r\n if (this._myMousePreventContextMenu) {\r\n PP.myMouse.setContextMenuActive(false);\r\n }\r\n\r\n if (this._myMousePreventMiddleButtonScroll) {\r\n PP.myMouse.setMiddleButtonScrollActive(false);\r\n }\r\n },\r\n _addGamepadCores() {\r\n let handPoseParams = new PP.HandPoseParams();\r\n handPoseParams.myReferenceObject = PP.myPlayerObjects.myPlayerPivot;\r\n handPoseParams.myFixForward = this._myFixForward;\r\n handPoseParams.myForceEmulatedVelocities = false;\r\n\r\n let leftXRGamepadCore = new PP.XRGamepadCore(PP.Handedness.LEFT, handPoseParams);\r\n let rightXRGamepadCore = new PP.XRGamepadCore(PP.Handedness.RIGHT, handPoseParams);\r\n\r\n PP.myLeftGamepad.addGamepadCore(\"left_xr_gamepad\", leftXRGamepadCore);\r\n PP.myRightGamepad.addGamepadCore(\"right_xr_gamepad\", rightXRGamepadCore);\r\n\r\n let leftKeyboardGamepadCore = new PP.KeyboardGamepadCore(PP.Handedness.LEFT, leftXRGamepadCore.getHandPose());\r\n let rightKeyboardGamepadCore = new PP.KeyboardGamepadCore(PP.Handedness.RIGHT, rightXRGamepadCore.getHandPose());\r\n\r\n PP.myLeftGamepad.addGamepadCore(\"left_keyboard_gamepad\", leftKeyboardGamepadCore);\r\n PP.myRightGamepad.addGamepadCore(\"right_keyboard_gamepad\", rightKeyboardGamepadCore);\r\n }\r\n});\r\n\r\nPP.myInputManager = null;\r\n\r\nPP.myMouse = null;\r\n\r\nPP.myKeyboard = null;\r\n\r\nPP.myGamepadManager = null;\r\nPP.myGamepads = null;\r\nPP.myLeftGamepad = null;\r\nPP.myRightGamepad = null;", "WL.registerComponent('pp-switch-hand-object', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myGamepad: { type: WL.Type.Object },\r\n _myTrackedHand: { type: WL.Type.Object }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myHandednessType = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myFirstUpdate = true;\r\n\r\n this._myCurrentInputSourceType = null;\r\n },\r\n onActivate() {\r\n this._myFirstUpdate = true;\r\n },\r\n update: function (dt) {\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n this._start();\r\n }\r\n\r\n let inputSourceType = PP.InputUtils.getInputSourceTypeByHandedness(this._myHandednessType);\r\n if (inputSourceType != null && this._myCurrentInputSourceType != inputSourceType) {\r\n this._myCurrentInputSourceType = inputSourceType;\r\n\r\n if (inputSourceType == PP.InputSourceType.TRACKED_HAND) {\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(true);\r\n } else if (inputSourceType == PP.InputSourceType.GAMEPAD) {\r\n this._myTrackedHand.pp_setActive(false);\r\n this._myGamepad.pp_setActive(true);\r\n }\r\n }\r\n },\r\n _start() {\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(false);\r\n\r\n this._myCurrentInputSourceType = null;\r\n }\r\n});", "WL.registerComponent('pp-tracked-hand-draw-joint', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _myJointType: {\r\n type: WL.Type.Enum, values:\r\n [\r\n 'Wrist',\r\n 'Thumb Metacarpal', 'Thumb Phalanx Proximal', 'Thumb Phalanx Distal', 'Thumb Tip',\r\n 'Index Metacarpal', 'Index Phalanx Proximal', 'Index Phalanx Intermediate', 'Index Phalanx Distal', 'Index Tip',\r\n 'Middle Metacarpal', 'Middle Phalanx Proximal', 'Middle Phalanx Intermediate', 'Middle Phalanx Distal', 'Middle Tip',\r\n 'Ring Metacarpal', 'Ring Phalanx Proximal', 'Ring Phalanx Intermediate', 'Ring Phalanx Distal', 'Ring Tip',\r\n 'Pinky Metacarpal', 'Pinky Phalanx Proximal', 'Pinky Phalanx Intermediate', 'Pinky Phalanx Distal', 'Pinky Tip'\r\n ],\r\n default: 'Wrist'\r\n },\r\n _myJointMesh: { type: WL.Type.Mesh },\r\n _myJointMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n this._myHandednessInternal = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointTypeInternal = PP.InputUtils.getJointTypeByIndex(this._myJointType);\r\n\r\n this._myTrackedHandJointPose = new PP.TrackedHandJointPose(this._myHandednessInternal, this._myJointTypeInternal);\r\n this._myTrackedHandJointPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myTrackedHandJointPose.start();\r\n\r\n this._buildTrackedHandHierarchy();\r\n },\r\n update: function (dt) {\r\n this._myTrackedHandJointPose.update(dt);\r\n this._myJointMeshObject.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat());\r\n this._myJointMeshObject.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius());\r\n },\r\n _buildTrackedHandHierarchy() {\r\n this._myJointMeshObject = this.object.pp_addObject();\r\n\r\n let mesh = this._myJointMeshObject.pp_addComponent(\"mesh\");\r\n mesh.mesh = this._myJointMesh;\r\n mesh.material = this._myJointMaterial;\r\n\r\n this._myJointMeshObject.pp_setScaleLocal(0);\r\n }\r\n});", "WL.registerComponent('pp-tracked-hand-draw-all-joints', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _myHideMetacarpals: { type: WL.Type.Bool, default: true },\r\n _myJointMesh: { type: WL.Type.Mesh },\r\n _myJointMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._buildTrackedHandHierarchy();\r\n },\r\n update: function (dt) {\r\n },\r\n _buildTrackedHandHierarchy() {\r\n this._myTrackedHandMeshObject = this.object.pp_addObject();\r\n\r\n this._myJointMeshObjectList = [];\r\n\r\n for (let jointTypeKey in PP.TrackedHandJointType) {\r\n let jointType = PP.TrackedHandJointType[jointTypeKey];\r\n if (!this._myHideMetacarpals ||\r\n (jointType != PP.TrackedHandJointType.THUMB_METACARPAL &&\r\n jointType != PP.TrackedHandJointType.INDEX_FINGER_METACARPAL && jointType != PP.TrackedHandJointType.MIDDLE_FINGER_METACARPAL &&\r\n jointType != PP.TrackedHandJointType.RING_FINGER_METACARPAL && jointType != PP.TrackedHandJointType.PINKY_FINGER_METACARPAL)\r\n ) {\r\n let jointObject = this._myTrackedHandMeshObject.pp_addObject();\r\n this._myJointMeshObjectList[jointType] = jointObject;\r\n\r\n jointObject.pp_addComponent(\"pp-tracked-hand-draw-joint\",\r\n {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myFixForward\": this._myFixForward,\r\n \"_myJointType\": PP.TrackedHandJointTypeIndex[jointTypeKey],\r\n \"_myJointMesh\": this._myJointMesh,\r\n \"_myJointMaterial\": this._myJointMaterial,\r\n });\r\n\r\n }\r\n }\r\n }\r\n});", "WL.registerComponent('pp-tracked-hand-draw-skin', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _myHandSkin: { type: WL.Type.Skin, default: null }\r\n}, {\r\n init: function () {\r\n this._myHandednessInternal = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myTrackedHandPose = new PP.TrackedHandPose(this._myHandednessInternal);\r\n this._myTrackedHandPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myTrackedHandPose.start();\r\n\r\n this._prepareJoints();\r\n },\r\n update: function update(dt) {\r\n this._myTrackedHandPose.update(dt);\r\n\r\n for (let i = 0; i < this._myJoints.length; i++) {\r\n let jointObject = this._myJoints[i];\r\n\r\n let jointType = jointObject.name; // joint name must match the PP.TrackedHandJointType enum value\r\n let jointPose = this._myTrackedHandPose.getJointPose(jointType);\r\n\r\n jointObject.pp_setTransformLocalQuat(jointPose.getTransformQuat());\r\n }\r\n },\r\n _prepareJoints() {\r\n this._myJoints = [];\r\n\r\n let skinJointIDs = this._myHandSkin.jointIds;\r\n\r\n for (let i = 0; i < skinJointIDs.length; i++) {\r\n this._myJoints[i] = new WL.Object(skinJointIDs[i]);\r\n }\r\n }\r\n});", "PP.ButtonType = {\r\n SELECT: 0, // Trigger\r\n SQUEEZE: 1, // Grip\r\n TOUCHPAD: 2, // This is to support older gamepads, you can just use TOP_BUTTON to use this button for both older and newer gamepads\r\n THUMBSTICK: 3,\r\n BOTTOM_BUTTON: 4, // A or X button on oculus quest gamepad\r\n TOP_BUTTON: 5, // B or Y button on oculus quest gamepad, reverts to TOUCHPAD button for gamepads that does not support TOP_BUTTON\r\n THUMB_REST: 6\r\n};\r\n\r\nPP.ButtonEvent = {\r\n PRESS_START: 0,\r\n PRESS_END: 1,\r\n PRESSED: 2, //Every frame that it is pressed\r\n NOT_PRESSED: 3, //Every frame that it is not pressed\r\n TOUCH_START: 4,\r\n TOUCH_END: 5,\r\n TOUCHED: 6, //Every frame that it is touched\r\n NOT_TOUCHED: 7, //Every frame that it is not touched\r\n VALUE_CHANGED: 8,\r\n ALWAYS: 9, //Every frame\r\n};\r\n\r\nPP.AxesEvent = {\r\n X_CHANGED: 0,\r\n Y_CHANGED: 1,\r\n AXES_CHANGED: 2,\r\n ALWAYS: 3\r\n};\r\n\r\nPP.ButtonInfo = class ButtonInfo {\r\n constructor(type, handedness) {\r\n this.myType = type;\r\n this.myHandedness = handedness;\r\n\r\n this.myIsPressed = false;\r\n this.myPrevIsPressed = false;\r\n\r\n this.myIsTouched = false;\r\n this.myPrevIsTouched = false;\r\n\r\n this.myValue = 0.0;\r\n this.myPrevValue = 0.0;\r\n\r\n this.myTimePressed = 0;\r\n this.myPrevTimePressed = 0;\r\n\r\n this.myTimeNotPressed = 0;\r\n this.myPrevTimeNotPressed = 0;\r\n\r\n this.myTimeTouched = 0;\r\n this.myPrevTimeTouched = 0;\r\n\r\n this.myTimeNotTouched = 0;\r\n this.myPrevTimeNotTouched = 0;\r\n\r\n this.myMultiplePressStartCount = 0;\r\n this.myPrevMultiplePressStartCount = 0;\r\n this.myMultiplePressEndCount = 0;\r\n this.myPrevMultiplePressEndCount = 0;\r\n\r\n this.myMultipleTouchStartCount = 0;\r\n this.myPrevMultipleTouchStartCount = 0;\r\n this.myMultipleTouchEndCount = 0;\r\n this.myPrevMultipleTouchEndCount = 0;\r\n }\r\n\r\n getType() {\r\n return this.myType;\r\n }\r\n\r\n getHandedness() {\r\n return this.myHandedness;\r\n }\r\n\r\n getValue() {\r\n return this.myValue;\r\n }\r\n\r\n isPressed() {\r\n return this.myIsPressed;\r\n }\r\n\r\n isTouched() {\r\n return this.myIsTouched;\r\n }\r\n\r\n isPressStart(multiplePressCount = null) {\r\n return (this.myIsPressed && !this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressStartCount == multiplePressCount);\r\n }\r\n\r\n isPressEnd(multiplePressCount = null) {\r\n return (!this.myIsPressed && this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressEndCount == multiplePressCount);\r\n }\r\n\r\n isTouchStart(multipleTouchCount = null) {\r\n return (this.myIsTouched && !this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchStartCount == multipleTouchCount);\r\n }\r\n\r\n isTouchEnd(multipleTouchCount = null) {\r\n return (!this.myIsTouched && this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchEndCount == multipleTouchCount);\r\n }\r\n\r\n clone() {\r\n let value = new ButtonInfo(this.myType, this.myHandedness);\r\n value.myIsPressed = this.myIsPressed;\r\n value.myPrevIsPressed = this.myPrevIsPressed;\r\n value.myIsTouched = this.myIsTouched;\r\n value.myPrevIsTouched = this.myPrevIsTouched;\r\n value.myValue = this.myValue;\r\n value.myPrevValue = this.myPrevValue;\r\n\r\n value.myTimePressed = this.myTimePressed;\r\n value.myPrevTimePressed = this.myPrevTimePressed;\r\n value.myTimeNotPressed = this.myTimeNotPressed;\r\n value.myPrevTimeNotPressed = this.myPrevTimeNotPressed;\r\n\r\n value.myTimeTouched = this.myTimeTouched;\r\n value.myPrevTimeTouched = this.myPrevTimeTouched;\r\n value.myTimeNotTouched = this.myTimeNotTouched;\r\n value.myPrevTimeNotTouched = this.myPrevTimeNotTouched;\r\n\r\n value.myMultiplePressStartCount = this.myMultiplePressStartCount;\r\n value.myPrevMultiplePressStartCount = this.myPrevMultiplePressStartCount;\r\n value.myMultiplePressEndCount = this.myMultiplePressEndCount;\r\n value.myPrevMultiplePressEndCount = this.myPrevMultiplePressEndCount;\r\n\r\n value.myMultipleTouchStartCount = this.myMultipleTouchStartCount;\r\n value.myPrevMultipleTouchStartCount = this.myPrevMultipleTouchStartCount;\r\n value.myMultipleTouchEndCount = this.myMultipleTouchEndCount;\r\n value.myPrevMultipleTouchEndCount = this.myPrevMultipleTouchEndCount;\r\n\r\n return value;\r\n }\r\n};\r\n\r\nPP.AxesInfo = class AxesInfo {\r\n constructor(handedness) {\r\n this.myHandedness = handedness;\r\n\r\n this.myAxes = new Float32Array(2); // this.myAxes[0] is X, this.myAxes[1] is Y\r\n this.myAxes.fill(0.0);\r\n\r\n this.myPrevAxes = new Float32Array(2);\r\n this.myPrevAxes.fill(0.0);\r\n }\r\n\r\n getAxes() {\r\n return this.myAxes;\r\n }\r\n\r\n getHandedness() {\r\n return this.myHandedness;\r\n }\r\n\r\n clone() {\r\n let value = new AxesInfo(this.myHandedness);\r\n value.myAxes = this.myAxes;\r\n value.myPrevAxes = this.myPrevAxes;\r\n\r\n return value;\r\n }\r\n};\r\n\r\nPP.PulseInfo = class PulseInfo {\r\n constructor() {\r\n this.myIntensity = 0.0;\r\n this.myDuration = 0.0;\r\n\r\n this.myIsDevicePulsing = false; // true if the gamepad actually sent a request to pulse to the device\r\n }\r\n\r\n clone() {\r\n let value = new PulseInfo();\r\n value.myIntensity = this.myIntensity;\r\n value.myDuration = this.myDuration;\r\n value.myIsDevicePulsing = this.myIsDevicePulsing;\r\n\r\n return value;\r\n }\r\n};", "PP.BaseGamepad = class BaseGamepad {\r\n\r\n constructor(handedness) {\r\n this._myHandedness = handedness;\r\n\r\n this._myButtonInfos = [];\r\n for (let key in PP.ButtonType) {\r\n this._myButtonInfos[PP.ButtonType[key]] = new PP.ButtonInfo(PP.ButtonType[key], this._myHandedness);\r\n }\r\n\r\n this._myAxesInfo = new PP.AxesInfo(this._myHandedness);\r\n\r\n this._myButtonCallbacks = []; // Signature: callback(ButtonInfo, Gamepad)\r\n for (let typeKey in PP.ButtonType) {\r\n this._myButtonCallbacks[PP.ButtonType[typeKey]] = [];\r\n for (let eventKey in PP.ButtonEvent) {\r\n this._myButtonCallbacks[PP.ButtonType[typeKey]][PP.ButtonEvent[eventKey]] = new Map();\r\n }\r\n }\r\n\r\n this._myAxesCallbacks = []; // Signature: callback(AxesInfo, Gamepad)\r\n for (let eventKey in PP.AxesEvent) {\r\n this._myAxesCallbacks[PP.AxesEvent[eventKey]] = new Map();\r\n }\r\n\r\n this._myPulseInfo = new PP.PulseInfo();\r\n\r\n //Setup\r\n this._myMultiplePressMaxDelay = 0.3;\r\n this._myMultipleTouchMaxDelay = 0.3;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getButtonInfo(buttonType) {\r\n return this._myButtonInfos[buttonType];\r\n }\r\n\r\n registerButtonEventListener(buttonType, buttonEvent, id, callback) {\r\n this._myButtonCallbacks[buttonType][buttonEvent].set(id, callback);\r\n }\r\n\r\n unregisterButtonEventListener(buttonType, buttonEvent, id) {\r\n this._myButtonCallbacks[buttonType][buttonEvent].delete(id);\r\n }\r\n\r\n getAxesInfo() {\r\n return this._myAxesInfo;\r\n }\r\n\r\n registerAxesEventListener(axesEvent, id, callback) {\r\n this._myAxesCallbacks[axesEvent].set(id, callback);\r\n }\r\n\r\n unregisterAxesEventListener(axesEvent, id) {\r\n this._myAxesCallbacks[axesEvent].delete(id);\r\n }\r\n\r\n pulse(intensity, duration = 0) {\r\n this._myPulseInfo.myIntensity = Math.min(Math.max(intensity, 0), 1); // clamp \r\n this._myPulseInfo.myDuration = Math.max(duration, 0);\r\n }\r\n\r\n stopPulse() {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n\r\n isPulsing() {\r\n return this._myPulseInfo.myIntensity > 0 || this._myPulseInfo.myDuration > 0;\r\n }\r\n\r\n getPulseInfo() {\r\n return this._myPulseInfo;\r\n }\r\n\r\n getMultiplePressMaxDelay() {\r\n return this._myMultiplePressMaxDelay;\r\n }\r\n\r\n setMultiplePressMaxDelay(maxDelay) {\r\n this._myMultiplePressMaxDelay = maxDelay;\r\n }\r\n\r\n getMultipleTouchMaxDelay() {\r\n return this._myMultipleTouchMaxDelay;\r\n }\r\n\r\n setMultipleTouchMaxDelay(maxDelay) {\r\n this._myMultipleTouchMaxDelay = maxDelay;\r\n }\r\n\r\n // the following functions should be re-implemented in the actual class\r\n\r\n getHandPose() {\r\n return null;\r\n }\r\n\r\n isGamepadActive() {\r\n return true;\r\n }\r\n\r\n _start() {\r\n\r\n }\r\n\r\n _preUpdate(dt) {\r\n\r\n }\r\n\r\n _postUpdate(dt) {\r\n\r\n }\r\n\r\n _getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n return buttonData;\r\n }\r\n\r\n _getAxesData() {\r\n let axes = [0.0, 0.0];\r\n return axes;\r\n }\r\n\r\n _getHapticActuators() {\r\n let hapticActuator = [];\r\n return hapticActuator;\r\n }\r\n\r\n // the above functions should be re-implemented in the actual class\r\n\r\n start() {\r\n this._start();\r\n }\r\n\r\n update(dt) {\r\n this._preUpdate(dt);\r\n\r\n this._preUpdateButtonInfos();\r\n this._updateButtonInfos();\r\n this._postUpdateButtonInfos(dt);\r\n\r\n this._preUpdateAxesInfos();\r\n this._updateAxesInfos();\r\n this._postUpdateAxesInfos();\r\n\r\n this._updatePulse(dt);\r\n\r\n this._postUpdate(dt);\r\n }\r\n\r\n _preUpdateButtonInfos() {\r\n this._myButtonInfos.forEach(function (item) {\r\n item.myPrevIsPressed = item.myIsPressed;\r\n item.myPrevIsTouched = item.myIsTouched;\r\n item.myPrevValue = item.myValue;\r\n });\r\n }\r\n\r\n _updateButtonInfos() {\r\n this._updateSingleButtonInfo(PP.ButtonType.SELECT);\r\n this._updateSingleButtonInfo(PP.ButtonType.SQUEEZE);\r\n this._updateSingleButtonInfo(PP.ButtonType.TOUCHPAD);\r\n this._updateSingleButtonInfo(PP.ButtonType.THUMBSTICK);\r\n this._updateSingleButtonInfo(PP.ButtonType.BOTTOM_BUTTON);\r\n this._updateSingleButtonInfo(PP.ButtonType.TOP_BUTTON);\r\n this._updateSingleButtonInfo(PP.ButtonType.THUMB_REST);\r\n }\r\n\r\n _updateSingleButtonInfo(buttonType) {\r\n let button = this._myButtonInfos[buttonType];\r\n let buttonData = this._getButtonData(buttonType);\r\n\r\n button.myIsPressed = buttonData.myIsPressed;\r\n button.myIsTouched = buttonData.myIsTouched;\r\n button.myValue = buttonData.myValue;\r\n }\r\n\r\n _postUpdateButtonInfos(dt) {\r\n this._myButtonInfos.forEach(function (item) {\r\n if (item.myIsPressed) {\r\n item.myTimePressed += dt;\r\n if (!item.myPrevIsPressed) {\r\n item.myMultiplePressStartCount += 1;\r\n\r\n item.myPrevTimeNotPressed = item.myTimeNotPressed;\r\n item.myTimeNotPressed = 0;\r\n }\r\n\r\n if (item.myPrevTimeNotPressed + item.myTimePressed > this._myMultiplePressMaxDelay && item.myMultiplePressEndCount > 0) {\r\n item.myPrevMultiplePressEndCount = item.myMultiplePressEndCount;\r\n item.myMultiplePressEndCount = 0;\r\n }\r\n\r\n if (item.myTimePressed > this._myMultiplePressMaxDelay && item.myMultiplePressStartCount > 0) {\r\n item.myPrevMultiplePressStartCount = item.myMultiplePressStartCount;\r\n item.myMultiplePressStartCount = 0;\r\n }\r\n } else {\r\n item.myTimeNotPressed += dt;\r\n if (item.myPrevIsPressed) {\r\n item.myMultiplePressEndCount += 1;\r\n\r\n item.myPrevTimePressed = item.myTimePressed;\r\n item.myTimePressed = 0;\r\n }\r\n\r\n if (item.myPrevTimePressed + item.myTimeNotPressed > this._myMultiplePressMaxDelay && item.myMultiplePressStartCount > 0) {\r\n item.myPrevMultiplePressStartCount = item.myMultiplePressStartCount;\r\n item.myMultiplePressStartCount = 0;\r\n }\r\n\r\n if (item.myTimeNotPressed > this._myMultiplePressMaxDelay && item.myMultiplePressEndCount > 0) {\r\n item.myPrevMultiplePressEndCount = item.myMultiplePressEndCount;\r\n item.myMultiplePressEndCount = 0;\r\n }\r\n }\r\n\r\n if (item.myIsTouched) {\r\n item.myTimeTouched += dt;\r\n if (!item.myPrevIsTouched) {\r\n item.myMultipleTouchStartCount += 1;\r\n\r\n item.myPrevTimeNotTouched = item.myTimeNotTouched;\r\n item.myTimeNotTouched = 0;\r\n }\r\n\r\n if (item.myPrevTimeNotTouched + item.myTimeTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchEndCount > 0) {\r\n item.myPrevMultipleTouchEndCount = item.myMultipleTouchEndCount;\r\n item.myMultipleTouchEndCount = 0;\r\n }\r\n\r\n if (item.myTimeTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchStartCount > 0) {\r\n item.myPrevMultipleTouchStartCount = item.myMultipleTouchStartCount;\r\n item.myMultipleTouchStartCount = 0;\r\n }\r\n } else {\r\n item.myTimeNotTouched += dt;\r\n if (item.myPrevIsTouched) {\r\n item.myMultipleTouchEndCount += 1;\r\n\r\n item.myPrevTimeTouched = item.myTimeTouched;\r\n item.myTimeTouched = 0;\r\n }\r\n\r\n if (item.myPrevTimeTouched + item.myTimeNotTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchStartCount > 0) {\r\n item.myPrevMultipleTouchStartCount = item.myMultipleTouchStartCount;\r\n item.myMultipleTouchStartCount = 0;\r\n }\r\n\r\n if (item.myTimeNotTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchEndCount > 0) {\r\n item.myPrevMultipleTouchEndCount = item.myMultipleTouchEndCount;\r\n item.myMultipleTouchEndCount = 0;\r\n }\r\n }\r\n }.bind(this));\r\n\r\n for (let typeKey in PP.ButtonType) {\r\n let buttonInfo = this._myButtonInfos[PP.ButtonType[typeKey]];\r\n let buttonCallbacks = this._myButtonCallbacks[PP.ButtonType[typeKey]];\r\n\r\n //PRESSED\r\n if (buttonInfo.myIsPressed && !buttonInfo.myPrevIsPressed) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.PRESS_START];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (!buttonInfo.myIsPressed && buttonInfo.myPrevIsPressed) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.PRESS_END];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (buttonInfo.myIsPressed) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.PRESSED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n } else {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.NOT_PRESSED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n //TOUCHED\r\n if (buttonInfo.myIsTouched && !buttonInfo.myPrevIsTouched) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.TOUCH_START];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (!buttonInfo.myIsTouched && buttonInfo.myPrevIsTouched) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.TOUCH_END];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (buttonInfo.myIsTouched) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.TOUCHED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n } else {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.NOT_TOUCHED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n //VALUE\r\n if (buttonInfo.myValue != buttonInfo.myPrevValue) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.VALUE_CHANGED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n //ALWAYS\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.ALWAYS];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n this._mySelectStart = false;\r\n this._mySelectEnd = false;\r\n this._mySqueezeStart = false;\r\n this._mySqueezeEnd = false;\r\n }\r\n\r\n _preUpdateAxesInfos() {\r\n this._myAxesInfo.myPrevAxes = this._myAxesInfo.myAxes;\r\n }\r\n\r\n _updateAxesInfos() {\r\n this._myAxesInfo.myAxes = this._getAxesData();\r\n }\r\n\r\n _postUpdateAxesInfos() {\r\n //X CHANGED\r\n if (this._myAxesInfo.myAxes[0] != this._myAxesInfo.myPrevAxes[0]) {\r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.X_CHANGED];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n //Y CHANGED\r\n if (this._myAxesInfo.myAxes[1] != this._myAxesInfo.myPrevAxes[1]) {\r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.Y_CHANGED];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n //AXES CHANGED\r\n if (this._myAxesInfo.myAxes[0] != this._myAxesInfo.myPrevAxes[0] ||\r\n this._myAxesInfo.myAxes[1] != this._myAxesInfo.myPrevAxes[1]) {\r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.AXES_CHANGED];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n //ALWAYS \r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.ALWAYS];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n _updatePulse(dt) {\r\n if (this._myPulseInfo.myIsDevicePulsing || this._myPulseInfo.myIntensity > 0) {\r\n let hapticActuators = this._getHapticActuators();\r\n if (hapticActuators.length > 0) {\r\n if (this._myPulseInfo.myIntensity > 0) {\r\n for (let hapticActuator of hapticActuators) {\r\n hapticActuator.pulse(this._myPulseInfo.myIntensity, 1000); // duration is managed by this class\r\n }\r\n this._myPulseInfo.myIsDevicePulsing = true;\r\n } else if (this._myPulseInfo.myIsDevicePulsing) {\r\n for (let hapticActuator of hapticActuators) {\r\n hapticActuator.reset();\r\n }\r\n this._myPulseInfo.myIsDevicePulsing = false;\r\n }\r\n } else {\r\n this._myPulseInfo.myIsDevicePulsing = false;\r\n }\r\n }\r\n\r\n this._myPulseInfo.myDuration -= dt;\r\n if (this._myPulseInfo.myDuration <= 0) {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n }\r\n\r\n _triggerCallbacks(callbacksMap, info) {\r\n for (let callback of callbacksMap.values()) {\r\n callback(info, this);\r\n }\r\n }\r\n};", "PP.UniversalGamepad = class UniversalGamepad extends PP.BaseGamepad {\r\n\r\n constructor(handedness) {\r\n super(handedness);\r\n\r\n this._myGamepadCores = new Map();\r\n\r\n this._myStarted = false;\r\n }\r\n\r\n addGamepadCore(id, gamepadCore) {\r\n if (gamepadCore.getHandedness() == this.getHandedness()) {\r\n this._myGamepadCores.set(id, gamepadCore);\r\n if (this._myStarted) {\r\n gamepadCore.start();\r\n }\r\n }\r\n }\r\n\r\n getGamepadCore(id) {\r\n this._myGamepadCores.get(id);\r\n }\r\n\r\n removeGamepadCore(id) {\r\n let gamepadCore = this._myGamepadCores.get(id);\r\n if (gamepadCore) {\r\n this._myGamepadCores.delete(id);\r\n }\r\n }\r\n\r\n removeAllGamepadCores() {\r\n for (let id of this._myGamepadCores.keys()) {\r\n this.removeGamepadCore(id);\r\n }\r\n }\r\n\r\n getHandPose() {\r\n let handPose = null;\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n handPose = core.getHandPose();\r\n }\r\n\r\n if (handPose != null) {\r\n break;\r\n }\r\n }\r\n\r\n return handPose;\r\n }\r\n\r\n isGamepadActive() {\r\n let isActive = false;\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n isActive = true;\r\n break;\r\n }\r\n }\r\n\r\n return isActive;\r\n }\r\n\r\n _start() {\r\n for (let core of this._myGamepadCores.values()) {\r\n core.start();\r\n }\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n _preUpdate(dt) {\r\n for (let core of this._myGamepadCores.values()) {\r\n core.preUpdate(dt);\r\n }\r\n }\r\n\r\n _postUpdate(dt) {\r\n for (let core of this._myGamepadCores.values()) {\r\n core.postUpdate(dt);\r\n }\r\n }\r\n\r\n _getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n let coreButtonData = core.getButtonData(buttonType);\r\n buttonData.myIsPressed = buttonData.myIsPressed || coreButtonData.myIsPressed;\r\n buttonData.myIsTouched = buttonData.myIsTouched || coreButtonData.myIsTouched;\r\n if (Math.abs(coreButtonData.myValue) > Math.abs(buttonData.myValue)) {\r\n buttonData.myValue = coreButtonData.myValue;\r\n }\r\n }\r\n }\r\n\r\n return buttonData;\r\n }\r\n\r\n _getAxesData() {\r\n let axesData = [0.0, 0.0];\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n let coreAxesData = core.getAxesData();\r\n\r\n if (Math.abs(coreAxesData[0]) > Math.abs(axesData[0])) {\r\n axesData[0] = coreAxesData[0];\r\n }\r\n\r\n if (Math.abs(coreAxesData[1]) > Math.abs(axesData[1])) {\r\n axesData[1] = coreAxesData[1];\r\n }\r\n }\r\n }\r\n\r\n return axesData;\r\n }\r\n\r\n _getHapticActuators() {\r\n let hapticActuators = [];\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n hapticActuators.push(...core.getHapticActuators());\r\n }\r\n }\r\n\r\n return hapticActuators;\r\n }\r\n};", "PP.GamepadCore = class GamepadCore {\r\n\r\n constructor(handedness) {\r\n this._myHandedness = handedness;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getHandPose() {\r\n return null;\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return true;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n preUpdate(dt) {\r\n\r\n }\r\n\r\n postUpdate(dt) {\r\n\r\n }\r\n\r\n getButtonData(buttonType) {\r\n let buttonData = { pressed: false, touched: false, value: 0 };\r\n return buttonData;\r\n }\r\n\r\n getAxesData() {\r\n let axesData = [0.0, 0.0];\r\n return axesData;\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n return hapticActuators;\r\n }\r\n};", "// xr-standard mapping is assumed\r\nPP.XRGamepadCore = class XRGamepadCore extends PP.GamepadCore {\r\n\r\n constructor(handedness, handPoseParams = new PP.HandPoseParams()) {\r\n super(handedness);\r\n\r\n this._myHandPose = new PP.HandPose(this._myHandedness, handPoseParams);\r\n\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myIsXRSessionActive = false;\r\n this._myInputSource = null;\r\n this._myGamepad = null;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getHandPose() {\r\n return this._myHandPose;\r\n }\r\n\r\n isGamepadCoreActive() {\r\n //connected == null is to fix webxr emulator that leaves that field undefined\r\n return this._myIsXRSessionActive && this._myGamepad != null && (this._myGamepad.connected == null || this._myGamepad.connected);\r\n }\r\n\r\n start() {\r\n this._myHandPose.start();\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n }\r\n\r\n preUpdate(dt) {\r\n this._updateHandPose(dt);\r\n }\r\n\r\n getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (buttonType < this._myGamepad.buttons.length) {\r\n let gamepadButton = this._myGamepad.buttons[buttonType];\r\n\r\n if (buttonType != PP.ButtonType.SELECT && buttonType != PP.ButtonType.SQUEEZE) {\r\n buttonData.myIsPressed = gamepadButton.pressed;\r\n } else {\r\n buttonData.myIsPressed = this._getSpecialButtonPressed(buttonType);\r\n }\r\n\r\n buttonData.myIsTouched = gamepadButton.touched;\r\n buttonData.myValue = gamepadButton.value;\r\n } else if (buttonType == PP.ButtonType.TOP_BUTTON && this._myGamepad.buttons.length >= 3) {\r\n //This way if you are using a basic touch gamepad, top button will work anyway\r\n let touchButton = this._myGamepad.buttons[2];\r\n buttonData.myIsPressed = touchButton.pressed;\r\n buttonData.myIsTouched = touchButton.touched;\r\n buttonData.myValue = touchButton.value;\r\n }\r\n }\r\n\r\n return buttonData;\r\n }\r\n\r\n getAxesData() {\r\n let axes = [0.0, 0.0];\r\n\r\n if (this.isGamepadCoreActive()) {\r\n let internalAxes = this._myGamepad.axes;\r\n if (internalAxes.length == 4) {\r\n //in this case it could be both touch axes or thumbstick axes, that depends on the gamepad\r\n //to support both I simply choose the absolute max value (unused axes will always be 0)\r\n\r\n //X\r\n if (Math.abs(internalAxes[0]) > Math.abs(internalAxes[2])) {\r\n axes[0] = internalAxes[0];\r\n } else {\r\n axes[0] = internalAxes[2];\r\n }\r\n\r\n //Y\r\n if (Math.abs(internalAxes[1]) > Math.abs(internalAxes[3])) {\r\n axes[1] = internalAxes[1];\r\n } else {\r\n axes[1] = internalAxes[3];\r\n }\r\n\r\n } else if (internalAxes.length == 2) {\r\n axes[0] = internalAxes[0];\r\n axes[1] = internalAxes[1];\r\n }\r\n\r\n //y axis is recorder negative when thumbstick is pressed forward for weird reasons\r\n axes[1] = -axes[1];\r\n }\r\n\r\n return axes;\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this._myGamepad.hapticActuators && this._myGamepad.hapticActuators.length > 0) {\r\n hapticActuators = this._myGamepad.hapticActuators;\r\n } else if (this._myGamepad.vibrationActuator) {\r\n hapticActuators.push(this._myGamepad.vibrationActuator);\r\n }\r\n }\r\n\r\n return hapticActuators;\r\n }\r\n\r\n _updateHandPose(dt) {\r\n this._myHandPose.update(dt);\r\n\r\n this._myInputSource = this._myHandPose.getInputSource();\r\n if (this._myInputSource != null) {\r\n this._myGamepad = this._myInputSource.gamepad;\r\n } else {\r\n this._myGamepad = null;\r\n }\r\n }\r\n\r\n //This is to be more compatible\r\n _getSpecialButtonPressed(buttonType) {\r\n let isPressed = false;\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (buttonType == PP.ButtonType.SELECT) {\r\n isPressed = this._mySelectPressed;\r\n } else if (buttonType == PP.ButtonType.SQUEEZE) {\r\n isPressed = this._mySqueezePressed;\r\n }\r\n }\r\n\r\n return isPressed;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n session.addEventListener(\"selectstart\", this._selectStart.bind(this));\r\n session.addEventListener(\"selectend\", this._selectEnd.bind(this));\r\n\r\n session.addEventListener(\"squeezestart\", this._squeezeStart.bind(this));\r\n session.addEventListener(\"squeezeend\", this._squeezeEnd.bind(this));\r\n\r\n this._myIsXRSessionActive = true;\r\n }\r\n\r\n _onXRSessionEnd(session) {\r\n this._myIsXRSessionActive = false;\r\n }\r\n\r\n //Select and Squeeze are managed this way to be more compatible\r\n _selectStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = true;\r\n }\r\n }\r\n\r\n _selectEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = false;\r\n }\r\n }\r\n\r\n _squeezeStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = true;\r\n }\r\n }\r\n\r\n _squeezeEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = false;\r\n }\r\n }\r\n};", "// xr-standard mapping is assumed\r\nPP.KeyboardGamepadCore = class KeyboardGamepadCore extends PP.GamepadCore {\r\n\r\n constructor(handedness, handPose) {\r\n super(handedness);\r\n\r\n this._myHandPose = handPose; // can be null for keyboard\r\n this._myHandPoseUpdateActive = false;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getHandPose() {\r\n return this._myHandPose;\r\n }\r\n\r\n setHandPoseUpdateActive(active) {\r\n this._myHandPoseUpdateActive = active;\r\n }\r\n\r\n isHandPoseUpdateActive() {\r\n return this._myHandPoseUpdateActive;\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return true;\r\n }\r\n\r\n start() {\r\n if (this._myHandPose && this._myHandPoseUpdateActive) {\r\n this._myHandPose.start();\r\n }\r\n }\r\n\r\n preUpdate(dt) {\r\n if (this._myHandPose && this._myHandPoseUpdateActive) {\r\n this._myHandPose.update(dt);\r\n }\r\n }\r\n\r\n getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == PP.Handedness.LEFT) {\r\n switch (buttonType) {\r\n case PP.ButtonType.SELECT:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.C) || PP.myKeyboard.isKeyPressed(PP.KeyType.c);\r\n break;\r\n case PP.ButtonType.SQUEEZE:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.F) || PP.myKeyboard.isKeyPressed(PP.KeyType.f);\r\n break;\r\n case PP.ButtonType.TOUCHPAD:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.X) || PP.myKeyboard.isKeyPressed(PP.KeyType.x);\r\n break;\r\n case PP.ButtonType.THUMBSTICK:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.R) || PP.myKeyboard.isKeyPressed(PP.KeyType.r);\r\n break;\r\n case PP.ButtonType.BOTTOM_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.Q) || PP.myKeyboard.isKeyPressed(PP.KeyType.q);\r\n break;\r\n case PP.ButtonType.TOP_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.E) || PP.myKeyboard.isKeyPressed(PP.KeyType.e);\r\n break;\r\n case PP.ButtonType.THUMB_REST:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.V) || PP.myKeyboard.isKeyPressed(PP.KeyType.v);\r\n break;\r\n }\r\n } else {\r\n switch (buttonType) {\r\n case PP.ButtonType.SELECT:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.N) || PP.myKeyboard.isKeyPressed(PP.KeyType.n);\r\n break;\r\n case PP.ButtonType.SQUEEZE:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.H) || PP.myKeyboard.isKeyPressed(PP.KeyType.h);\r\n break;\r\n case PP.ButtonType.TOUCHPAD:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.M) || PP.myKeyboard.isKeyPressed(PP.KeyType.m);\r\n break;\r\n case PP.ButtonType.THUMBSTICK:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.Y) || PP.myKeyboard.isKeyPressed(PP.KeyType.y);\r\n break;\r\n case PP.ButtonType.BOTTOM_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.O) || PP.myKeyboard.isKeyPressed(PP.KeyType.o);\r\n break;\r\n case PP.ButtonType.TOP_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.U) || PP.myKeyboard.isKeyPressed(PP.KeyType.u);\r\n break;\r\n case PP.ButtonType.THUMB_REST:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.B) || PP.myKeyboard.isKeyPressed(PP.KeyType.b);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (buttonData.myIsPressed) {\r\n buttonData.myIsTouched = true;\r\n buttonData.myValue = 1;\r\n }\r\n\r\n return buttonData;\r\n }\r\n\r\n getAxesData() {\r\n let axes = [0.0, 0.0];\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == PP.Handedness.LEFT) {\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.W) || PP.myKeyboard.isKeyPressed(PP.KeyType.w)) axes[1] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.S) || PP.myKeyboard.isKeyPressed(PP.KeyType.s)) axes[1] += -1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.D) || PP.myKeyboard.isKeyPressed(PP.KeyType.d)) axes[0] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.A) || PP.myKeyboard.isKeyPressed(PP.KeyType.a)) axes[0] += -1.0;\r\n } else {\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.I) || PP.myKeyboard.isKeyPressed(PP.KeyType.i) || PP.myKeyboard.isKeyPressed(PP.KeyType.UP)) axes[1] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.K) || PP.myKeyboard.isKeyPressed(PP.KeyType.k) || PP.myKeyboard.isKeyPressed(PP.KeyType.DOWN)) axes[1] += -1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.L) || PP.myKeyboard.isKeyPressed(PP.KeyType.l) || PP.myKeyboard.isKeyPressed(PP.KeyType.RIGHT)) axes[0] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.J) || PP.myKeyboard.isKeyPressed(PP.KeyType.j) || PP.myKeyboard.isKeyPressed(PP.KeyType.LEFT)) axes[0] += -1.0;\r\n }\r\n }\r\n\r\n return axes;\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n return hapticActuators;\r\n }\r\n};", "WL.registerComponent('pp-gamepad-mesh-animator', {\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\n _mySelect: { type: WL.Type.Object, default: null },\n _mySqueeze: { type: WL.Type.Object, default: null },\n _myThumbstick: { type: WL.Type.Object, default: null },\n _myTopButton: { type: WL.Type.Object, default: null },\n _myBottomButton: { type: WL.Type.Object, default: null },\n _mySelectRotateAngle: { type: WL.Type.Float, default: 15 },\n _mySqueezeRotateAngle: { type: WL.Type.Float, default: 11 },\n _myThumbstickRotateAngle: { type: WL.Type.Float, default: 15 },\n _myThumbstickPressOffset: { type: WL.Type.Float, default: 0.000625 },\n _myTopButtonPressOffset: { type: WL.Type.Float, default: 0.0015 },\n _myBottomButtonPressOffset: { type: WL.Type.Float, default: 0.0015 },\n _myUsePressForSqueeze: { type: WL.Type.Bool, default: false },\n _mySqueezePressOffset: { type: WL.Type.Float, default: 0.0015 },\n}, {\n start: function () {\n let gamepad = null;\n if (this._myHandedness == 0) {\n gamepad = PP.myLeftGamepad; // @EDIT get gamepad LEFT here based on how you store it in your game\n } else {\n gamepad = PP.myRightGamepad; // @EDIT get gamepad RIGHT here based on how you store it in your game\n }\n\n if (this._mySelect != null) {\n this._mySelectOriginalRotation = this._mySelect.pp_getRotationLocalQuat();\n this._mySelectOriginalLeft = this._mySelect.pp_getLeftLocal();\n }\n\n if (this._mySqueeze != null) {\n this._mySqueezeOriginalPosition = this._mySqueeze.pp_getPositionLocal();\n this._mySqueezeOriginalRotation = this._mySqueeze.pp_getRotationLocalQuat();\n this._mySqueezeOriginalLeft = this._mySqueeze.pp_getLeftLocal();\n this._mySqueezeOriginalForward = this._mySqueeze.pp_getForwardLocal();\n }\n\n if (this._myThumbstick != null) {\n this._myThumbstickOriginalPosition = this._myThumbstick.pp_getPositionLocal();\n this._myThumbstickOriginalRotation = this._myThumbstick.pp_getRotationLocalQuat();\n this._myThumbstickOriginalLeft = this._myThumbstick.pp_getLeftLocal();\n this._myThumbstickOriginalUp = this._myThumbstick.pp_getUpLocal();\n this._myThumbstickOriginalForward = this._myThumbstick.pp_getForwardLocal();\n }\n\n if (this._myTopButton != null) {\n this._myTopButtonOriginalPosition = this._myTopButton.pp_getPositionLocal();\n this._myTopButtonOriginalUp = this._myTopButton.pp_getUpLocal();\n }\n\n if (this._myBottomButton != null) {\n this._myBottomButtonOriginalPosition = this._myBottomButton.pp_getPositionLocal();\n this._myBottomButtonOriginalUp = this._myBottomButton.pp_getUpLocal();\n }\n\n // PRESSED\n if (this._myThumbstick != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.THUMBSTICK, PP.ButtonEvent.PRESS_START, this, this._thumbstickPressedStart.bind(this));\n gamepad.registerButtonEventListener(PP.ButtonType.THUMBSTICK, PP.ButtonEvent.PRESS_END, this, this._thumbstickPressedEnd.bind(this));\n }\n\n if (this._myTopButton != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.TOP_BUTTON, PP.ButtonEvent.PRESS_START, this, this._topButtonPressedStart.bind(this));\n gamepad.registerButtonEventListener(PP.ButtonType.TOP_BUTTON, PP.ButtonEvent.PRESS_END, this, this._topButtonPressedEnd.bind(this));\n }\n\n if (this._myBottomButton != null) {\n\n gamepad.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON, PP.ButtonEvent.PRESS_START, this, this._bottomButtonPressedStart.bind(this));\n gamepad.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON, PP.ButtonEvent.PRESS_END, this, this._bottomButtonPressedEnd.bind(this));\n }\n\n // VALUE CHANGED\n if (this._mySelect != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.VALUE_CHANGED, this, this._selectValueChanged.bind(this));\n }\n\n if (this._mySqueeze != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.VALUE_CHANGED, this, this._squeezeValueChanged.bind(this));\n }\n\n // AXES CHANGED\n if (this._myThumbstick != null) {\n gamepad.registerAxesEventListener(PP.AxesEvent.AXES_CHANGED, this, this._thumbstickValueChanged.bind(this));\n }\n },\n _thumbstickPressedStart: function () {\n let upTranslation = PP.vec3_create();\n return function _thumbstickPressedStart(buttonInfo, gamepad) {\n // since thumbstick object rotate you need to specifically use its original up to translate it\n this._myThumbstickOriginalUp.vec3_scale(-this._myThumbstickPressOffset, upTranslation);\n this._myThumbstick.pp_translateLocal(upTranslation);\n };\n }(),\n _thumbstickPressedEnd: function _thumbstickPressedEnd(buttonInfo, gamepad) {\n this._myThumbstick.pp_setPositionLocal(this._myThumbstickOriginalPosition);\n },\n _topButtonPressedStart: function (buttonInfo, gamepad) {\n this._myTopButton.pp_translateAxisLocal(-this._myTopButtonPressOffset, this._myTopButtonOriginalUp);\n },\n _topButtonPressedEnd: function (buttonInfo, gamepad) {\n this._myTopButton.pp_setPositionLocal(this._myTopButtonOriginalPosition);\n },\n _bottomButtonPressedStart: function (buttonInfo, gamepad) {\n this._myBottomButton.pp_translateAxisLocal(-this._myBottomButtonPressOffset, this._myBottomButtonOriginalUp);\n },\n _bottomButtonPressedEnd: function (buttonInfo, gamepad) {\n this._myBottomButton.pp_setPositionLocal(this._myBottomButtonOriginalPosition);\n },\n _selectValueChanged: function (buttonInfo, gamepad) {\n this._mySelect.pp_setRotationLocalQuat(this._mySelectOriginalRotation);\n\n if (buttonInfo.myValue > 0.00001) {\n this._mySelect.pp_rotateAxisLocal(this._mySelectRotateAngle * buttonInfo.myValue, this._mySelectOriginalLeft);\n }\n },\n _squeezeValueChanged: function (buttonInfo, gamepad) {\n this._mySqueeze.pp_setPositionLocal(this._mySqueezeOriginalPosition);\n this._mySqueeze.pp_setRotationLocalQuat(this._mySqueezeOriginalRotation);\n\n if (buttonInfo.myValue > 0.00001) {\n if (this._myUsePressForSqueeze) {\n let translation = this._mySqueezePressOffset;\n if (this._myHandedness == 1) {\n translation *= -1;\n }\n\n this._mySqueeze.pp_translateAxisLocal(translation * buttonInfo.myValue, this._mySqueezeOriginalLeft);\n } else {\n let rotation = -this._mySqueezeRotateAngle;\n if (this._myHandedness == 1) {\n rotation *= -1;\n }\n\n this._mySqueeze.pp_rotateAxisLocal(rotation * buttonInfo.myValue, this._mySqueezeOriginalForward);\n }\n }\n },\n _thumbstickValueChanged: function (axesInfo, gamepad) {\n this._myThumbstick.pp_setRotationLocalQuat(this._myThumbstickOriginalRotation);\n\n let leftRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[1];\n let forwardRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[0];\n\n if (Math.abs(leftRotation) > 0.0001) {\n this._myThumbstick.pp_rotateAxisLocal(leftRotation, this._myThumbstickOriginalLeft);\n }\n\n if (Math.abs(forwardRotation) > 0.0001) {\n this._myThumbstick.pp_rotateAxisLocal(forwardRotation, this._myThumbstickOriginalForward);\n }\n }\n});", "PP.GamepadManager = class GamepadManager {\r\n constructor() {\r\n this._myLeftGamepad = new PP.UniversalGamepad(PP.Handedness.LEFT);\r\n this._myRightGamepad = new PP.UniversalGamepad(PP.Handedness.RIGHT);\r\n }\r\n\r\n start() {\r\n this._myLeftGamepad.start();\r\n this._myRightGamepad.start();\r\n }\r\n\r\n update(dt) {\r\n this._myLeftGamepad.update(dt);\r\n this._myRightGamepad.update(dt);\r\n }\r\n\r\n getLeftGamepad() {\r\n return this._myLeftGamepad;\r\n }\r\n\r\n getRightGamepad() {\r\n return this._myRightGamepad;\r\n }\r\n\r\n getGamepad(handedness) {\r\n let gamepad = null;\r\n\r\n switch (handedness) {\r\n case PP.Handedness.LEFT:\r\n gamepad = this._myLeftGamepad;\r\n break;\r\n case PP.Handedness.RIGHT:\r\n gamepad = this._myRightGamepad;\r\n break;\r\n default:\r\n gamepad = null;\r\n }\r\n\r\n return gamepad;\r\n }\r\n\r\n getGamepads() {\r\n let gamepads = [];\r\n\r\n gamepads[PP.Handedness.LEFT] = this._myLeftGamepad;\r\n gamepads[PP.Handedness.RIGHT] = this._myRightGamepad;\r\n\r\n return gamepads;\r\n }\r\n};", "PP.GamepadUtils = {\r\n _mySimultaneousPressMaxDelay: 0.15,\r\n _mySimultaneousTouchMaxDelay: 0.15,\r\n setSimultaneousPressMaxDelay: function (simultaneousPressMaxDelay) {\r\n PP.GamepadUtils._mySimultaneousPressMaxDelay = simultaneousPressMaxDelay;\r\n },\r\n setSimultaneousTouchMaxDelay: function (simultaneousTouchMaxDelay) {\r\n PP.GamepadUtils._mySimultaneousTouchMaxDelay = simultaneousTouchMaxDelay;\r\n },\r\n getSimultaneousPressMaxDelay: function () {\r\n return PP.GamepadUtils._mySimultaneousPressMaxDelay;\r\n },\r\n getSimultaneousTouchMaxDelay: function () {\r\n return PP.GamepadUtils._mySimultaneousTouchMaxDelay;\r\n },\r\n\r\n // gamepadButtonTypesList is a sequence of a gamepads and a list of buttonTypes like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n // if the first parameter is a number it's used as multiplePressCount\r\n // if the buttonTypes list is empty for a given gamepad, it means that every button will be included\r\n isAnyButtonPressStart: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOnePressStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n isOnePressStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOnePressStart) {\r\n break;\r\n }\r\n }\r\n\r\n return isOnePressStart;\r\n },\r\n // gamepadButtonTypesList is a sequence of a gamepads and a list of buttonTypes like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n // if the first parameter is a number it's used as multiplePressCount\r\n // if the buttonTypes list is empty for a given gamepad, it means that every button will be included\r\n areButtonsPressStart: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonPressedRecently = true;\r\n let isOnePressStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(button.myIsPressed && (multiplePressCount == null || button.myMultiplePressStartCount == multiplePressCount) && button.myTimePressed < PP.GamepadUtils._mySimultaneousPressMaxDelay)) {\r\n areButtonPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n isOnePressStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonPressedRecently && isOnePressStart;\r\n },\r\n isAnyButtonPressEnd: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOnePressEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n isOnePressEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOnePressEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return isOnePressEnd;\r\n },\r\n areButtonsPressEnd: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotPressedRecently = true;\r\n let isOnePressEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(!button.myIsPressed && (multiplePressCount == null || button.myMultiplePressEndCount == multiplePressCount) && button.myTimeNotPressed < PP.GamepadUtils._mySimultaneousPressMaxDelay)) {\r\n areButtonNotPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n isOnePressEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotPressedRecently && isOnePressEnd;\r\n },\r\n isAnyButtonTouchStart: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOneTouchStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isTouchStart(multiplePressCount)) {\r\n isOneTouchStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOneTouchStart) {\r\n break;\r\n }\r\n }\r\n\r\n return isOneTouchStart;\r\n },\r\n areButtonsTouchStart: function (...gamepadButtonTypesList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multipleTouchCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonTouchedRecently = true;\r\n let isOneTouchStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(button.myIsTouched && (multipleTouchCount == null || button.myMultipleTouchStartCount == multipleTouchCount) && button.myTimeTouched < PP.GamepadUtils._mySimultaneousTouchMaxDelay)) {\r\n areButtonTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchStart(multipleTouchCount)) {\r\n isOneTouchStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonTouchedRecently && isOneTouchStart;\r\n },\r\n isAnyButtonTouchEnd: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOneTouchEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isTouchEnd(multiplePressCount)) {\r\n isOneTouchEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOneTouchEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return isOneTouchEnd;\r\n },\r\n areButtonsTouchEnd: function (...gamepadButtonTypesList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multipleTouchCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotTouchedRecently = true;\r\n let isOneTouchEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(!button.myIsTouched && (multipleTouchCount == null || button.myMultipleTouchEndCount == multipleTouchCount) && button.myTimeNotTouched < PP.GamepadUtils._mySimultaneousTouchMaxDelay)) {\r\n areButtonNotTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchEnd(multipleTouchCount)) {\r\n isOneTouchEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotTouchedRecently && isOneTouchEnd;\r\n },\r\n};", "WL.registerComponent('pp-gamepad-control-scheme', {\r\n _myStartVisible: { type: WL.Type.Bool, default: true },\r\n\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n\r\n _myTextScaleMultiplier: { type: WL.Type.Float, default: 1 },\r\n _myLineLengthMultiplier: { type: WL.Type.Float, default: 1 },\r\n _myLineThicknessMultiplier: { type: WL.Type.Float, default: 1 },\r\n\r\n _mySelectText: { type: WL.Type.String, default: \"\" },\r\n _mySqueezeText: { type: WL.Type.String, default: \"\" },\r\n _myThumbstickText: { type: WL.Type.String, default: \"\" },\r\n _myBottomButtonText: { type: WL.Type.String, default: \"\" },\r\n _myTopButtonText: { type: WL.Type.String, default: \"\" },\r\n\r\n _mySelect: { type: WL.Type.Object, default: null },\r\n _mySqueeze: { type: WL.Type.Object, default: null },\r\n _myThumbstick: { type: WL.Type.Object, default: null },\r\n _myBottomButton: { type: WL.Type.Object, default: null },\r\n _myTopButton: { type: WL.Type.Object, default: null },\r\n\r\n _myTextMaterial: { type: WL.Type.Material },\r\n _myLineMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myTextMaterialFinal = (this._myTextMaterial != null) ? this._myTextMaterial : PP.myDefaultResources.myMaterials.myText.clone();\r\n this._myLineMaterialFinal = (this._myLineMaterial != null) ? this._myLineMaterial : PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n\r\n this._myHandednessType = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myControlSchemeDirection = (this._myHandednessType == PP.Handedness.LEFT) ? 1 : -1;\r\n\r\n this._myVisible = false;\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._createControlScheme();\r\n this.setVisible(this._myStartVisible);\r\n },\r\n update: function (dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this.setVisible(false);\r\n this.setVisible(this._myVisible);\r\n }\r\n },\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n },\r\n onDeactivate() {\r\n let backupVisible = this._myVisible;\r\n this.setVisible(false);\r\n this._myVisible = backupVisible;\r\n },\r\n isVisible() {\r\n return this._myVisible;\r\n },\r\n setVisible(visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myRootObject != null) {\r\n this._myRootObject.pp_setActive(this._myVisible);\r\n\r\n if (this._myVisible) {\r\n this._hideEmptySchemes();\r\n }\r\n }\r\n },\r\n setSelectText(text) {\r\n this._mySelectText = text;\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setSqueezeText(text) {\r\n this._mySqueezeText = text;\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setThumbstickText(text) {\r\n this._myThumbstickText = text;\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setBottomButtonText(text) {\r\n this._myBottomButtonText = text;\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setTopButtonText(text) {\r\n this._myTopButtonText = text;\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n this.setVisible(this._myVisible);\r\n },\r\n _createControlScheme() {\r\n this._myRootObject = this.object.pp_addObject();\r\n\r\n let objectScale = this.object.pp_getScale();\r\n this.object.pp_resetScale();\r\n\r\n let distanceFromButton = 0.015;\r\n let lineLength = 0.0935 * this._myLineLengthMultiplier;\r\n\r\n let referenceObject = this._myThumbstick;\r\n\r\n this._mySelectObject = this._myRootObject.pp_addObject();\r\n this._mySelectTextComponent = this._addScheme(this._mySelect, referenceObject,\r\n [0, 0, distanceFromButton],\r\n [lineLength * this._myControlSchemeDirection, 0, 0],\r\n this._mySelectObject);\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n\r\n this._mySqueezeObject = this._myRootObject.pp_addObject();\r\n this._mySqueezeTextComponent = this._addScheme(this._mySqueeze, referenceObject,\r\n [distanceFromButton * this._myControlSchemeDirection, 0, 0],\r\n [lineLength * this._myControlSchemeDirection, 0, 0],\r\n this._mySqueezeObject);\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n\r\n this._myThumbstickObject = this._myRootObject.pp_addObject();\r\n this._myThumbstickTextComponent = this._addScheme(this._myThumbstick, referenceObject,\r\n [0, distanceFromButton, 0],\r\n [-lineLength * this._myControlSchemeDirection, 0, 0],\r\n this._myThumbstickObject);\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n\r\n this._myBottomButtonObject = this._myRootObject.pp_addObject();\r\n this._myBottomButtonTextComponent = this._addScheme(this._myBottomButton, referenceObject,\r\n [0, distanceFromButton, 0],\r\n [0, 0, -lineLength],\r\n this._myBottomButtonObject);\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n\r\n this._myTopButtonObject = this._myRootObject.pp_addObject();\r\n this._myTopButtonTextComponent = this._addScheme(this._myTopButton, referenceObject,\r\n [0, distanceFromButton, 0],\r\n [-lineLength * this._myControlSchemeDirection, 0, 0].vec3_rotateAxis(-45 * this._myControlSchemeDirection, [0, 1, 0]),\r\n this._myTopButtonObject);\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n\r\n this.object.pp_setScale(objectScale);\r\n },\r\n _addScheme(buttonObject, referenceObject, startOffset, endOffset, parentObject) {\r\n let buttonPosition = buttonObject.pp_getPosition();\r\n let referenceForward = referenceObject.pp_getForward();\r\n let referenceRight = referenceObject.pp_getRight();\r\n let referenceUp = referenceObject.pp_getUp();\r\n\r\n let lineStart = buttonPosition.vec3_add(referenceRight.vec3_scale(startOffset[0]));\r\n lineStart.vec3_add(referenceUp.vec3_scale(startOffset[1]), lineStart);\r\n lineStart.vec3_add(referenceForward.vec3_scale(startOffset[2]), lineStart);\r\n\r\n let lineEnd = lineStart.vec3_add(referenceRight.vec3_scale(endOffset[0]));\r\n lineEnd.vec3_add(referenceUp.vec3_scale(endOffset[1]), lineEnd);\r\n lineEnd.vec3_add(referenceForward.vec3_scale(endOffset[2]), lineEnd);\r\n\r\n let textOffset = 0.01;\r\n let textPosition = lineEnd.vec3_add(referenceForward.vec3_scale(-textOffset));\r\n\r\n this._addLine(lineStart, lineEnd, parentObject);\r\n let textComponent = this._addText(textPosition, referenceForward, referenceUp, parentObject);\r\n\r\n return textComponent;\r\n },\r\n _addLine(start, end, parentObject) {\r\n let lineDirection = end.vec3_sub(start);\r\n let length = lineDirection.vec3_length();\r\n lineDirection.vec3_normalize(lineDirection);\r\n\r\n lineRootObject = parentObject.pp_addObject();\r\n lineObject = lineRootObject.pp_addObject();\r\n\r\n let lineMesh = lineObject.addComponent('mesh');\r\n lineMesh.mesh = PP.myDefaultResources.myMeshes.myCube;\r\n lineMesh.material = this._myLineMaterialFinal;\r\n\r\n lineRootObject.pp_setPosition(start);\r\n\r\n let thickness = 0.001 * this._myLineThicknessMultiplier;\r\n lineObject.pp_scaleObject([thickness / 2, thickness / 2, length / 2]);\r\n\r\n lineObject.pp_lookTo(lineDirection);\r\n lineObject.pp_translateObject([0, 0, length / 2]);\r\n },\r\n _addText(position, forward, up, parentObject) {\r\n let textObject = parentObject.pp_addObject();\r\n textObject.pp_setPosition(position);\r\n textObject.pp_lookTo(up, forward);\r\n textObject.pp_scaleObject(0.0935 * this._myTextScaleMultiplier);\r\n\r\n let textComponent = textObject.pp_addComponent(\"text\");\r\n textComponent.alignment = WL.Alignment.Center;\r\n textComponent.justification = WL.Justification.Top;\r\n textComponent.material = this._myTextMaterialFinal;\r\n\r\n return textComponent;\r\n },\r\n _hideEmptySchemes() {\r\n if (this._mySelectText.length == 0) {\r\n this._mySelectObject.pp_setActive(false);\r\n }\r\n if (this._mySqueezeText.length == 0) {\r\n this._mySqueezeObject.pp_setActive(false);\r\n }\r\n if (this._myThumbstickText.length == 0) {\r\n this._myThumbstickObject.pp_setActive(false);\r\n }\r\n if (this._myBottomButtonText.length == 0) {\r\n this._myBottomButtonObject.pp_setActive(false);\r\n }\r\n if (this._myTopButtonText.length == 0) {\r\n this._myTopButtonObject.pp_setActive(false);\r\n }\r\n }\r\n});", "PP.BasePoseParams = class BasePoseParams {\r\n constructor() {\r\n this.myReferenceObject = null;\r\n this.myFixForward = true;\r\n this.myForceEmulatedVelocities = false;\r\n }\r\n};\r\n\r\n// BasePose transform is local by default (as if the parent/reference object was the identity transform)\r\n// you can use setReferenceObject if you want the BasePose to return the transform in world space \r\nPP.BasePose = class BasePose {\r\n\r\n constructor(basePoseParams = new PP.BasePoseParams()) {\r\n this._myFixForward = basePoseParams.myFixForward;\r\n this._myForceEmulatedVelocities = basePoseParams.myForceEmulatedVelocities;\r\n\r\n this._myReferenceSpace = null;\r\n this._myReferenceObject = basePoseParams.myReferenceObject;\r\n\r\n this._myPosition = [0, 0, 0];\r\n this._myRotation = [0, 0, 0, 1];\r\n\r\n this._myPrevPosition = [0, 0, 0];\r\n this._myPrevRotation = [0, 0, 0, 1];\r\n\r\n this._myLinearVelocity = [0, 0, 0];\r\n this._myAngularVelocity = [0, 0, 0]; // Radians\r\n\r\n this._myIsValid = false;\r\n this._myIsLinearVelocityEmulated = true;\r\n this._myIsAngularVelocityEmulated = true;\r\n }\r\n\r\n // if the reference object is set, the transform will be converted using it as a parent,\r\n // otherwise the transform will be local, as if the parent/reference object was the identity transform\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setFixForward(fixForward) {\r\n this._myFixForward = fixForward;\r\n }\r\n\r\n isFixForward() {\r\n return this._myFixForward;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n\r\n getReferenceSpace() {\r\n return this._myReferenceSpace;\r\n }\r\n\r\n getInputSource() {\r\n return this._myInputSource;\r\n }\r\n\r\n getPosition() {\r\n // implemented outside class definition\r\n }\r\n\r\n getRotation() {\r\n return this.getRotationDegrees();\r\n }\r\n\r\n getRotationDegrees() {\r\n return this.getRotationQuat().quat_toDegrees();\r\n\r\n }\r\n\r\n getRotationRadians() {\r\n return this.getRotationQuat().quat_toRadians();\r\n }\r\n\r\n getRotationQuat() {\r\n // implemented outside class definition\r\n }\r\n\r\n getTransform() {\r\n return this.getTransformMatrix();\r\n }\r\n\r\n getTransformMatrix() {\r\n // implemented outside class definition\r\n }\r\n\r\n getTransformQuat() {\r\n // implemented outside class definition\r\n }\r\n\r\n getLinearVelocity() {\r\n // implemented outside class definition\r\n }\r\n\r\n getAngularVelocity() {\r\n return this.getAngularVelocityDegrees();\r\n }\r\n\r\n getAngularVelocityDegrees() {\r\n // implemented outside class definition\r\n }\r\n\r\n getAngularVelocityRadians() {\r\n // implemented outside class definition\r\n }\r\n\r\n isValid() {\r\n return this._myIsValid;\r\n }\r\n\r\n isLinearVelocityEmulated() {\r\n return this._myIsLinearVelocityEmulated;\r\n }\r\n\r\n isAngularVelocityEmulated() {\r\n return this._myIsAngularVelocityEmulated;\r\n }\r\n\r\n start() {\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(true, WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this, false));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n }\r\n\r\n update(dt) {\r\n this._myPrevPosition.vec3_copy(this._myPosition);\r\n this._myPrevRotation.quat_copy(this._myRotation);\r\n\r\n let xrFrame = Module['webxr_frame'];\r\n if (xrFrame && this._isReadyToGetPose()) {\r\n let xrPose = null;\r\n try {\r\n xrPose = this._getPose(xrFrame);\r\n } catch (error) {\r\n // not handled, pose will be null\r\n }\r\n\r\n if (xrPose) {\r\n this._myPosition[0] = xrPose.transform.position.x;\r\n this._myPosition[1] = xrPose.transform.position.y;\r\n this._myPosition[2] = xrPose.transform.position.z;\r\n\r\n this._myRotation[0] = xrPose.transform.orientation.x;\r\n this._myRotation[1] = xrPose.transform.orientation.y;\r\n this._myRotation[2] = xrPose.transform.orientation.z;\r\n this._myRotation[3] = xrPose.transform.orientation.w;\r\n\r\n if (xrPose.linearVelocity && !this._myForceEmulatedVelocities) {\r\n this._myLinearVelocity[0] = xrPose.linearVelocity.x;\r\n this._myLinearVelocity[1] = xrPose.linearVelocity.y;\r\n this._myLinearVelocity[2] = xrPose.linearVelocity.z;\r\n\r\n this._myIsLinearVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedLinearVelocity(dt);\r\n\r\n this._myIsLinearVelocityEmulated = true;\r\n }\r\n\r\n if (xrPose.angularVelocity && !this._myForceEmulatedVelocities) {\r\n this._myAngularVelocity[0] = xrPose.angularVelocity.x;\r\n this._myAngularVelocity[1] = xrPose.angularVelocity.y;\r\n this._myAngularVelocity[2] = xrPose.angularVelocity.z;\r\n\r\n this._myIsAngularVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedAngularVelocity(dt);\r\n\r\n this._myIsAngularVelocityEmulated = true;\r\n }\r\n\r\n this._myIsValid = true;\r\n } else {\r\n // keep previous position and rotation but reset velocity because reasons\r\n\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocity[0] = 0;\r\n this._myAngularVelocity[1] = 0;\r\n this._myAngularVelocity[2] = 0;\r\n\r\n this._myIsValid = false;\r\n this._myIsLinearVelocityEmulated = true;\r\n this._myIsAngularVelocityEmulated = true;\r\n }\r\n\r\n this._updateHook(dt, xrPose);\r\n } else {\r\n // keep previous position and rotation but reset velocity because reasons\r\n\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocity[0] = 0;\r\n this._myAngularVelocity[1] = 0;\r\n this._myAngularVelocity[2] = 0;\r\n\r\n this._myIsValid = false;\r\n this._myIsLinearVelocityEmulated = true;\r\n this._myIsAngularVelocityEmulated = true;\r\n\r\n this._updateHook(dt, null);\r\n }\r\n }\r\n\r\n // Hooks\r\n\r\n _isReadyToGetPose() {\r\n return true;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return null;\r\n }\r\n\r\n _updateHook(dt, xrPose) {\r\n }\r\n\r\n _onXRSessionStartHook(manualStart, session) {\r\n\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n\r\n }\r\n\r\n // Hooks end\r\n\r\n _computeEmulatedLinearVelocity(dt) {\r\n if (dt > 0) {\r\n this._myPosition.vec3_sub(this._myPrevPosition, this._myLinearVelocity);\r\n this._myLinearVelocity.vec3_scale(1 / dt, this._myLinearVelocity);\r\n } else {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n }\r\n }\r\n\r\n _onXRSessionStart(manualStart, session) {\r\n session.requestReferenceSpace(WebXR.refSpace).then(function (referenceSpace) { this._myReferenceSpace = referenceSpace; }.bind(this));\r\n\r\n this._onXRSessionStartHook(manualStart, session);\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._onXRSessionEndHook();\r\n\r\n this._myReferenceSpace = null;\r\n }\r\n};\r\n\r\nPP.BasePose.prototype.getPosition = function () {\r\n let position = PP.vec3_create();\r\n let transform = PP.mat4_create();\r\n return function getPosition() {\r\n if (this._myReferenceObject == null) {\r\n return this._myPosition;\r\n }\r\n\r\n return this._myPosition.vec3_convertPositionToWorld(this._myReferenceObject.pp_getTransform(transform), position);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getRotationQuat = function () {\r\n let rotationQuat = PP.quat_create();\r\n let playerRotationQuat = PP.quat_create();\r\n let up = PP.vec3_create();\r\n return function getRotationQuat() {\r\n rotationQuat.quat_copy(this._myRotation);\r\n\r\n if (this._myFixForward) {\r\n rotationQuat.quat_rotateAxisRadians(Math.PI, rotationQuat.quat_getUp(up), rotationQuat);\r\n }\r\n\r\n if (this._myReferenceObject == null) {\r\n return rotationQuat;\r\n }\r\n\r\n return rotationQuat.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(playerRotationQuat), rotationQuat);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getTransformMatrix = function () {\r\n let transform = PP.mat4_create();\r\n return function getTransformMatrix() {\r\n return this.getTransformQuat().quat2_toMatrix(transform);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getTransformQuat = function () {\r\n let transformQuat = PP.quat2_create();\r\n let playerTransformQuat = PP.quat2_create();\r\n return function getTransformQuat() {\r\n transformQuat.quat2_setPositionRotationQuat(this._myPosition, this.getRotationQuat());\r\n\r\n if (this._myReferenceObject == null) {\r\n return transformQuat;\r\n }\r\n\r\n return transformQuat.quat_toWorld(this._myReferenceObject.pp_getTransformQuat(playerTransformQuat), transformQuat);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getLinearVelocity = function () {\r\n let position = PP.vec3_create();\r\n let transform = PP.mat4_create();\r\n return function getLinearVelocity() {\r\n if (this._myReferenceObject == null) {\r\n return this._myLinearVelocity;\r\n }\r\n\r\n return this._myLinearVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(transform), position);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getAngularVelocityDegrees = function () {\r\n let rotationDegrees = PP.vec3_create();\r\n return function getAngularVelocityDegrees() {\r\n this.getAngularVelocityRadians().vec3_toDegrees(rotationDegrees);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getAngularVelocityRadians = function () {\r\n let rotationRadians = PP.vec3_create();\r\n let transform = PP.mat4_create();\r\n return function getAngularVelocityRadians() {\r\n if (this._myReferenceObject == null) {\r\n return this._myAngularVelocity;\r\n }\r\n\r\n return this._myAngularVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(transform), rotationRadians);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype._computeEmulatedAngularVelocity = function () {\r\n let rotationRadians = PP.vec3_create();\r\n let prevRotationRadians = PP.vec3_create();\r\n return function _computeEmulatedAngularVelocity(dt) {\r\n if (dt > 0) {\r\n rotationRadians = this._myRotation.quat_toRadians(rotationRadians);\r\n prevRotationRadians = this._myPrevRotation.quat_toRadians(prevRotationRadians);\r\n rotationRadians.vec3_sub(prevRotationRadians, this._myAngularVelocity);\r\n this._myAngularVelocity.vec3_scale(1 / dt, this._myAngularVelocity);\r\n } else {\r\n this._myAngularVelocity[0] = 0;\r\n this._myAngularVelocity[1] = 0;\r\n this._myAngularVelocity[2] = 0;\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.BasePose.prototype, \"getPosition\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getRotationQuat\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getTransformMatrix\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getTransformQuat\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getLinearVelocity\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getAngularVelocityDegrees\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getAngularVelocityRadians\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"_computeEmulatedAngularVelocity\", { enumerable: false });", "PP.HandPoseParams = class HandPoseParams extends PP.BasePoseParams {\r\n constructor() {\r\n super();\r\n\r\n this.myFixTrackedHandRotation = true;\r\n }\r\n};\r\n\r\nPP.HandPose = class HandPose extends PP.BasePose {\r\n\r\n constructor(handedness, handPoseParams = new PP.HandPoseParams()) {\r\n super(handPoseParams);\r\n\r\n this._myInputSource = null;\r\n\r\n this._myHandedness = handedness;\r\n this._myFixTrackedHandRotation = handPoseParams.myFixTrackedHandRotation;\r\n\r\n this._myIsTrackedHand = false;\r\n }\r\n\r\n getInputSourceType() {\r\n if (this._myInputSource == null) {\r\n return null;\r\n }\r\n\r\n return PP.InputUtils.getInputSourceType(this._myInputSource);\r\n }\r\n\r\n isFixTrackedHandRotation() {\r\n return this._myFixTrackedHandRotation;\r\n }\r\n\r\n setFixTrackedHandRotation(fixTrackedHandRotation) {\r\n this.myFixTrackedHandRotation = fixTrackedHandRotation;\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getPose(this._myInputSource.gripSpace, this._myReferenceSpace);\r\n }\r\n\r\n _onXRSessionStartHook(manualStart, session) {\r\n session.addEventListener('inputsourceschange', function (event) {\r\n if (event.removed) {\r\n for (let item of event.removed) {\r\n if (item == this._myInputSource) {\r\n this._myInputSource = null;\r\n }\r\n }\r\n }\r\n\r\n if (event.added) {\r\n for (let item of event.added) {\r\n if (item.handedness == this._myHandedness) {\r\n this._myInputSource = item;\r\n this._myIsTrackedHand = PP.InputUtils.getInputSourceType(this._myInputSource) == PP.InputSourceType.TRACKED_HAND;\r\n }\r\n }\r\n }\r\n }.bind(this));\r\n\r\n if (manualStart && this._myInputSource == null && session.inputSources) {\r\n for (let item of session.inputSources) {\r\n if (item.handedness == this._myHandedness) {\r\n this._myInputSource = item;\r\n this._myIsTrackedHand = PP.InputUtils.getInputSourceType(this._myInputSource) == PP.InputSourceType.TRACKED_HAND;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myInputSource = null;\r\n }\r\n};\r\n\r\nPP.HandPose.prototype.getRotationQuat = function () {\r\n let rotationQuat = PP.quat_create();\r\n let playerRotationQuat = PP.quat_create();\r\n let up = PP.vec3_create();\r\n let right = PP.vec3_create();\r\n let forward = PP.vec3_create();\r\n return function getRotationQuat() {\r\n rotationQuat.quat_copy(this._myRotation);\r\n\r\n if (this._myFixForward) {\r\n rotationQuat.quat_rotateAxisRadians(Math.PI, rotationQuat.quat_getUp(up), rotationQuat);\r\n }\r\n\r\n if (this._myFixTrackedHandRotation && this._myIsTrackedHand) {\r\n rotationQuat.quat_rotateAxis(-60, rotationQuat.quat_getRight(right), rotationQuat);\r\n\r\n let forwardRotation = 20;\r\n forwardRotation = (this._myHandedness == PP.Handedness.LEFT) ? forwardRotation : -forwardRotation;\r\n rotationQuat.quat_rotateAxis(forwardRotation, rotationQuat.quat_getForward(forward), rotationQuat);\r\n }\r\n\r\n if (this._myReferenceObject == null) {\r\n return rotationQuat;\r\n }\r\n\r\n return rotationQuat.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(playerRotationQuat), rotationQuat);\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.HandPose.prototype, \"getRotationQuat\", { enumerable: false });", "PP.HeadPose = class HeadPose extends PP.BasePose {\r\n _getPose(xrFrame) {\r\n return xrFrame.getViewerPose(this._myReferenceSpace);\r\n }\r\n};", "PP.TrackedHandJointPose = class TrackedHandJointPose extends PP.BasePose {\r\n\r\n constructor(handedness, trackedHandJointType, basePoseParams = new PP.BasePoseParams()) {\r\n super(basePoseParams);\r\n\r\n this._myInputSource = null;\r\n\r\n this._myHandedness = handedness;\r\n this._myTrackedHandJointType = trackedHandJointType;\r\n\r\n this._myJointRadius = 0;\r\n }\r\n\r\n getTrackedHandJointType() {\r\n return this._myTrackedHandJointType;\r\n }\r\n\r\n setTrackedHandJointType(trackedHandJointType) {\r\n this._myTrackedHandJointType = trackedHandJointType;\r\n }\r\n\r\n getJointRadius() {\r\n return this._myJointRadius;\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getJointPose(this._myInputSource.hand.get(this._myTrackedHandJointType), this._myReferenceSpace);\r\n }\r\n\r\n _updateHook(dt, xrPose) {\r\n if (xrPose != null) {\r\n this._myJointRadius = xrPose.radius;\r\n }\r\n }\r\n\r\n _onXRSessionStartHook(manualStart, session) {\r\n session.addEventListener('inputsourceschange', function (event) {\r\n if (event.removed) {\r\n for (let item of event.removed) {\r\n if (item == this._myInputSource) {\r\n this._myInputSource = null;\r\n }\r\n }\r\n }\r\n\r\n if (event.added) {\r\n for (let item of event.added) {\r\n if (item.handedness == this._myHandedness) {\r\n if (PP.InputUtils.getInputSourceType(item) == PP.InputSourceType.TRACKED_HAND) {\r\n this._myInputSource = item;\r\n }\r\n }\r\n }\r\n }\r\n }.bind(this));\r\n\r\n if (manualStart && this._myInputSource == null && session.inputSources) {\r\n for (let item of session.inputSources) {\r\n if (item.handedness == this._myHandedness) {\r\n if (PP.InputUtils.getInputSourceType(item) == PP.InputSourceType.TRACKED_HAND) {\r\n this._myInputSource = item;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myInputSource = null;\r\n }\r\n};", "PP.TrackedHandPoseParams = class TrackedHandPoseParams extends PP.BasePoseParams {\r\n constructor(addAllJointTypes = true) {\r\n super();\r\n\r\n this.myTrackedHandJointTypeList = [];\r\n\r\n if (addAllJointTypes) {\r\n for (let typeKey in PP.TrackedHandJointType) {\r\n this.myTrackedHandJointTypeList.push([PP.TrackedHandJointType[typeKey]]);\r\n }\r\n }\r\n }\r\n};\r\n\r\nPP.TrackedHandPose = class TrackedHandPose {\r\n constructor(handedness, trackedHandPoseParams = new PP.TrackedHandPoseParams()) {\r\n this._myHandedness = handedness;\r\n\r\n this._myFixForward = trackedHandPoseParams.myFixForward;\r\n this._myForceEmulatedVelocities = trackedHandPoseParams.myForceEmulatedVelocities;\r\n this._myReferenceObject = trackedHandPoseParams.myReferenceObject;\r\n\r\n this._myTrackedHandJointPoseParams = new PP.BasePoseParams();\r\n this._myTrackedHandJointPoseParams.myFixForward = this._myFixForward;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n\r\n this._myTrackedHandJointPoseList = [];\r\n for (let jointType of trackedHandPoseParams.myTrackedHandJointTypeList) {\r\n let trackedHandJointPose = new PP.TrackedHandJointPose(this._myHandedness, jointType, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoseList[jointType] = trackedHandJointPose;\r\n }\r\n }\r\n\r\n start() {\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.start();\r\n }\r\n }\r\n\r\n update(dt) {\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.update(dt);\r\n }\r\n }\r\n\r\n getJointPose(jointType) {\r\n return this._myTrackedHandJointPoseList[jointType];\r\n }\r\n\r\n getJointPoseByIndex(jointPoseTypeIndex) {\r\n return this._myTrackedHandJointPoseList[PP.InputUtils.getJointTypeByIndex(jointPoseTypeIndex)];\r\n }\r\n\r\n addTrackedHandJointType(jointType) {\r\n if (!this._myTrackedHandJointPoseList.pp_has(element => element.getTrackedHandJointType() == jointType)) {\r\n let trackedHandJointPose = new PP.TrackedHandJointPose(this._myHandedness, jointType, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoseList.push(trackedHandJointPose);\r\n }\r\n }\r\n\r\n removeTrackedHandJointType(jointType) {\r\n this._myTrackedHandJointPoseList.pp_remove(element => element.getTrackedHandJointType() == jointType);\r\n }\r\n\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.setReferenceObject(referenceObject);\r\n }\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setFixForward(fixForward) {\r\n this._myFixForward = fixForward;\r\n this._myTrackedHandJointPoseParams.myFixForward = this._myFixForward;\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.setFixForward(fixForward);\r\n }\r\n }\r\n\r\n isFixForward() {\r\n return this._myFixForward;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.setForceEmulatedVelocities(forceEmulatedVelocities);\r\n }\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n};", "WL.registerComponent(\"pp-set-player-height\", {\r\n _myEyesHeight: { type: WL.Type.Float, default: 1.65 },\r\n _mySetOnlyOnStart: { type: WL.Type.Bool, default: false }\r\n}, {\r\n start() {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal([localPosition[0], this._myEyesHeight, localPosition[2]]);\r\n\r\n this._myHeightSetOnce = false;\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n },\r\n _onXRSessionStart() {\r\n if (this.active && (!this._mySetOnlyOnStart || !this._myHeightSetOnce)) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n if (PP.XRUtils.isReferenceSpaceLocalFloor()) {\r\n this.object.pp_setPositionLocal([localPosition[0], 0, localPosition[2]]);\r\n } else if (PP.XRUtils.isDeviceEmulated()) {\r\n this.object.pp_setPositionLocal([localPosition[0], 0, localPosition[2]]);\r\n } else {\r\n this.object.pp_setPositionLocal([localPosition[0], this._myEyesHeight, localPosition[2]]);\r\n }\r\n\r\n this._myHeightSetOnce = true;\r\n }\r\n },\r\n _onXRSessionEnd() {\r\n if (this.active && !this._mySetOnlyOnStart) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal([localPosition[0], this._myEyesHeight, localPosition[2]]);\r\n }\r\n }\r\n});", "WL.registerComponent('pp-set-hand-local-transform', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n this._myHandPose = new PP.HandPose(PP.InputUtils.getHandednessByIndex(this._myHandedness));\r\n this._myHandPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myHandPose.start();\r\n },\r\n update: function () {\r\n let handPoseTransform = PP.quat2_create();\r\n return function update(dt) {\r\n this._myHandPose.update(dt);\r\n this.object.pp_setTransformLocalQuat(this._myHandPose.getTransformQuat(handPoseTransform));\r\n };\r\n }(),\r\n});", "WL.registerComponent('pp-set-head-local-transform', {\r\n _myNonVRCamera: { type: WL.Type.Object },\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n this._myHeadPose = new PP.HeadPose();\r\n this._myHeadPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myHeadPose.start();\r\n },\r\n update: function () {\r\n let headPoseTransform = PP.quat2_create();\r\n let nonVRCameraRotation = PP.quat_create();\r\n let nonVRCameraUp = PP.vec3_create();\r\n let nonVRCameraPosition = PP.vec3_create();\r\n return function update(dt) {\r\n this._myHeadPose.update(dt);\r\n\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(headPoseTransform));\r\n } else {\r\n nonVRCameraRotation = this._myNonVRCamera.pp_getRotationLocalQuat(nonVRCameraRotation);\r\n if (this._myFixForward) {\r\n nonVRCameraRotation.quat_rotateAxisRadians(Math.PI, nonVRCameraRotation.quat_getUp(nonVRCameraUp), nonVRCameraRotation);\r\n }\r\n this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(nonVRCameraPosition));\r\n this.object.pp_setRotationLocalQuat(nonVRCameraRotation);\r\n }\r\n };\r\n }(),\r\n});", "WL.registerComponent('pp-set-vr-head-local-transform', {\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n this._myHeadPose = new PP.HeadPose();\r\n this._myHeadPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myHeadPose.start();\r\n },\r\n update: function () {\r\n let headPoseTransform = PP.quat2_create();\r\n return function update(dt) {\r\n this._myHeadPose.update(dt);\r\n this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(headPoseTransform));\r\n };\r\n }(),\r\n});", "WL.registerComponent('pp-set-non-vr-head-local-transform', {\r\n _myNonVRCamera: { type: WL.Type.Object },\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n },\r\n update: function (dt) {\r\n let nonVRCameraRotation = PP.quat_create();\r\n let nonVRCameraUp = PP.vec3_create();\r\n let nonVRCameraPosition = PP.vec3_create();\r\n return function update(dt) {\r\n nonVRCameraRotation = this._myNonVRCamera.pp_getRotationLocalQuat(nonVRCameraRotation);\r\n if (this._myFixForward) {\r\n nonVRCameraRotation.quat_rotateAxisRadians(Math.PI, nonVRCameraRotation.quat_getUp(nonVRCameraUp), nonVRCameraRotation);\r\n }\r\n this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(nonVRCameraPosition));\r\n this.object.pp_setRotationLocalQuat(nonVRCameraRotation);\r\n };\r\n }(),\r\n}); ", "WL.registerComponent('pp-set-tracked-hand-joint-local-transform', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _mySetLocalScaleAsJointRadius: { type: WL.Type.Bool, default: false },\r\n _myJointType: {\r\n type: WL.Type.Enum, values:\r\n [\r\n 'Wrist',\r\n 'Thumb Metacarpal', 'Thumb Phalanx Proximal', 'Thumb Phalanx Distal', 'Thumb Tip',\r\n 'Index Metacarpal', 'Index Phalanx Proximal', 'Index Phalanx Intermediate', 'Index Phalanx Distal', 'Index Tip',\r\n 'Middle Metacarpal', 'Middle Phalanx Proximal', 'Middle Phalanx Intermediate', 'Middle Phalanx Distal', 'Middle Tip',\r\n 'Ring Metacarpal', 'Ring Phalanx Proximal', 'Ring Phalanx Intermediate', 'Ring Phalanx Distal', 'Ring Tip',\r\n 'Pinky Metacarpal', 'Pinky Phalanx Proximal', 'Pinky Phalanx Intermediate', 'Pinky Phalanx Distal', 'Pinky Tip'\r\n ],\r\n default: 'Wrist'\r\n }\r\n}, {\r\n init: function () {\r\n this._myHandednessInternal = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointTypeInternal = PP.InputUtils.getJointTypeByIndex(this._myJointType);\r\n\r\n this._myTrackedHandJointPose = new PP.TrackedHandJointPose(this._myHandednessInternal, this._myJointTypeInternal);\r\n this._myTrackedHandJointPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myTrackedHandJointPose.start();\r\n },\r\n update: function (dt) {\r\n this._myTrackedHandJointPose.update(dt);\r\n\r\n this.object.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat());\r\n\r\n if (this._mySetLocalScaleAsJointRadius) {\r\n this.object.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius());\r\n }\r\n }\r\n});", "WL.registerComponent('pp-copy-hand-transform', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n}, {\r\n init: function () {\r\n this._myHandednessType = (this._myHandedness == 0) ? PP.Handedness.LEFT : PP.Handedness.RIGHT;\r\n },\r\n update: function (dt) {\r\n let hand = PP.myPlayerObjects.myHands[this._myHandednessType];\r\n this.object.pp_setTransformQuat(hand.pp_getTransformQuat());\r\n this.object.pp_setScale(hand.pp_getScale());\r\n },\r\n});", "WL.registerComponent('pp-copy-head-transform', {\r\n}, {\r\n update: function (dt) {\r\n let head = PP.myPlayerObjects.myHead;\r\n this.object.pp_setTransformQuat(head.pp_getTransformQuat());\r\n this.object.pp_setScale(head.pp_getScale());\r\n },\r\n});", "WL.registerComponent('pp-copy-player-transform', {\r\n}, {\r\n update: function (dt) {\r\n let player = PP.myPlayerObjects.myPlayer;\r\n this.object.pp_setTransformQuat(player.pp_getTransformQuat());\r\n this.object.pp_setScale(player.pp_getScale());\r\n },\r\n});", "WL.registerComponent('pp-copy-player-pivot-transform', {\r\n}, {\r\n update: function (dt) {\r\n let playerPivot = PP.myPlayerObjects.myPlayerPivot;\r\n this.object.pp_setTransformQuat(playerPivot.pp_getTransformQuat());\r\n this.object.pp_setScale(playerPivot.pp_getScale());\r\n },\r\n});", "\r\nPP.ToolHandedness = {\r\n NONE: null,\r\n LEFT: \"left\",\r\n RIGHT: \"right\",\r\n};\r\n\r\nPP.ToolInputSourceType = {\r\n NONE: null,\r\n GAMEPAD: 0,\r\n TRACKED_HAND: 1\r\n};", "WL.registerComponent('pp-tool-cursor', {\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\n _myPulseOnHover: { type: WL.Type.Bool, default: false },\n _myShowFingerCursor: { type: WL.Type.Bool, default: false }\n}, {\n init: function () {\n this._myHandednessString = ['left', 'right'][this._myHandedness];\n\n if (this._myHandedness == 0) {\n this._myCursorPosition = [-0.01, -0.024, -0.05];\n } else {\n this._myCursorPosition = [0.01, -0.024, -0.05];\n }\n\n this._myCursorRotation = [-0.382, 0, 0, 0.924];\n this._myCursorRotation.quat_normalize(this._myCursorRotation);\n this._myCursorMeshScale = [0.0025, 0.0025, 0.0025];\n\n this._myCursorColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this._myCursorTargetCollisionGroup = 7;\n },\n start: function () {\n this._myFixForwardObject = WL.scene.addObject(this.object);\n this._myFixForwardObject.pp_rotateObject([0, 180, 0]);\n\n this._myCursorObjectVR = WL.scene.addObject(this._myFixForwardObject);\n this._myCursorObjectVR.setTranslationLocal(this._myCursorPosition);\n this._myCursorObjectVR.rotateObject(this._myCursorRotation);\n\n {\n let cursorMeshObject = WL.scene.addObject(this._myCursorObjectVR);\n cursorMeshObject.pp_setScale(this._myCursorMeshScale);\n\n let cursorMeshComponent = cursorMeshObject.addComponent(\"mesh\");\n cursorMeshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\n cursorMeshComponent.material = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\n cursorMeshComponent.material.color = this._myCursorColor;\n\n let cursorComponent = this._myCursorObjectVR.addComponent(\"cursor\", { \"collisionGroup\": this._myCursorTargetCollisionGroup, \"handedness\": this._myHandedness + 1, \"cursorObject\": cursorMeshObject });\n cursorComponent.rayCastMode = 0; //collision\n if (this._myPulseOnHover) {\n cursorComponent.globalTarget.addHoverFunction(this._pulseOnHover.bind(this));\n }\n }\n\n this._myCursorObjectNonVR = WL.scene.addObject(null);\n\n {\n let cursorComponent = this._myCursorObjectNonVR.addComponent(\"cursor\", { \"collisionGroup\": this._myCursorTargetCollisionGroup, \"handedness\": this._myHandedness + 1 });\n cursorComponent.rayCastMode = 0; //collision\n if (this._myPulseOnHover) {\n cursorComponent.globalTarget.addHoverFunction(this._pulseOnHover.bind(this));\n }\n cursorComponent.setViewComponent(PP.myPlayerObjects.myNonVRCamera.getComponent(\"view\"));\n }\n\n let fingerCursorObject = null;\n let fingerCollisionSize = 0.0125;\n\n if (this._myShowFingerCursor) {\n fingerCursorObject = this.object.pp_addObject();\n\n let meshComponent = fingerCursorObject.addComponent(\"mesh\");\n meshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\n meshComponent.material = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\n meshComponent.material.color = this._myCursorColor;\n\n fingerCursorObject.pp_setScale(fingerCollisionSize);\n }\n\n this._myFingerCursorObject = WL.scene.addObject(this.object);\n this._myFingerCursorComponent = this._myFingerCursorObject.addComponent(\"pp-finger-cursor\", {\n \"_myHandedness\": this._myHandedness,\n \"_myEnableMultipleClicks\": true,\n \"_myCollisionGroup\": this._myCursorTargetCollisionGroup,\n \"_myCollisionSize\": fingerCollisionSize,\n \"_myCursorObject\": fingerCursorObject\n });\n\n this._myCursorObjectVR.pp_setActive(false);\n this._myCursorObjectNonVR.pp_setActive(false);\n this._myFingerCursorObject.pp_setActive(false);\n\n },\n update: function () {\n let transformQuat = PP.quat2_create();\n return function update(dt) {\n let isUsingHand = this._isUsingHand();\n\n this._myFingerCursorObject.pp_setActive(isUsingHand);\n\n if (isUsingHand) {\n this._myCursorObjectNonVR.pp_setActive(false);\n this._myCursorObjectVR.pp_setActive(false);\n } else {\n if (PP.XRUtils.isXRSessionActive()) {\n this._myCursorObjectVR.pp_setActive(!isUsingHand);\n this._myCursorObjectNonVR.pp_setActive(false);\n } else {\n this._myCursorObjectNonVR.pp_setActive(!isUsingHand);\n this._myCursorObjectVR.pp_setActive(false);\n\n this._myCursorObjectNonVR.pp_setTransformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getTransformQuat(transformQuat));\n }\n }\n };\n }(),\n _isUsingHand: function () {\n let isUsingHand = false;\n\n if (WL.xrSession && WL.xrSession.inputSources) {\n for (let i = 0; i < WL.xrSession.inputSources.length; i++) {\n let input = WL.xrSession.inputSources[i];\n if (input.hand && input.handedness == this._myHandednessString) {\n isUsingHand = true;\n break;\n }\n }\n }\n\n return isUsingHand;\n },\n _pulseOnHover: function (object) {\n let targetComponent = object.getComponent(\"cursor-target\");\n\n if (targetComponent && !targetComponent.isSurface) {\n if (this._myHandedness == 0) {\n if (PP.myLeftGamepad) {\n PP.myLeftGamepad.pulse(0.4, 0);\n }\n } else {\n if (PP.myRightGamepad) {\n PP.myRightGamepad.pulse(0.4, 0);\n }\n }\n }\n }\n});", "PP.ConsoleVRWidgetSetup = class ConsoleVRWidgetSetup {\n\n constructor() {\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7; //keep this in sync with ConsoleVRSetup\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n this.myMessageTypeColors = [];\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG] = this.myDefaultTextColor;\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR] = [255 / 255, 40 / 255, 40 / 255, 1];\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN] = [250 / 255, 220 / 255, 40 / 255, 1];\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO] = [60 / 255, 200 / 255, 255 / 255, 1];\n\n //Messages\n this.myMessagesPanelPosition = [0, 0.075, 0];\n\n this.myMessagesBackgroundScale = [0.34, 0.15, 1];\n\n {\n let xPaddingPercentage = 0.03;\n let yPaddingPercentage = xPaddingPercentage * this.myMessagesBackgroundScale[0] / this.myMessagesBackgroundScale[1] * 0.8; //a bit less padding\n let xPosition = -this.myMessagesBackgroundScale[0] + this.myMessagesBackgroundScale[0] * xPaddingPercentage;\n let yPosition = this.myMessagesBackgroundScale[1] - this.myMessagesBackgroundScale[1] * yPaddingPercentage;\n this.myMessagesTextsPanelPosition = [xPosition, yPosition, 0.007];\n }\n this.myMessagesTextsPanelScale = [0.1, 0.1, 0.1];\n\n this.myMessagesTextStartString = \".\\n\"; // to avoid issue with text component padding\n this.myMessagesTextAlignment = 1; // left\n this.myMessagesTextJustification = 3; // top\n\n this.myMessagesTextPositions = [];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.LOG] = [0, 0, 0.00001];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.ERROR] = [0, 0, 0];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.WARN] = [0, 0, 0];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.INFO] = [0, 0, 0];\n\n this.myMessagesTextColors = [];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.LOG] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.ERROR] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.WARN] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.INFO] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO];\n\n //Buttons \n this.myButtonsPanelPosition = [0, -0.11, 0.015];\n\n this.myButtonBackgroundScale = [0.04, 0.02, 1];\n\n this.myButtonTextPosition = [0, 0, 0.0065];\n this.myButtonTextScale = [0.18, 0.18, 0.18];\n\n this.myButtonCursorTargetPosition = [0, 0, 0];\n this.myButtonCursorTargetPosition[2] = this.myButtonTextPosition[2];\n\n this.myButtonsCollisionCollider = this.myCursorTargetCollisionCollider;\n this.myButtonsCollisionGroup = this.myCursorTargetCollisionGroup;\n this.myButtonsCollisionExtents = this.myButtonBackgroundScale.slice(0);\n this.myButtonsCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myClearButtonTextLabel = \"clear\";\n this.myUpButtonTextLabel = \"up\";\n this.myDownButtonTextLabel = \"down\";\n\n this.myFilterButtonsTextColors = [];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.LOG] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.ERROR] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.WARN] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.INFO] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO];\n\n this.myFilterButtonsTextLabel = [];\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.LOG] = \"log\";\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.ERROR] = \"error\";\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.WARN] = \"warn\";\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.INFO] = \"info\";\n\n //Buttons positioning\n {\n let numberOfButtons = 7;\n let buttonsHorizontalSpace = Math.max(0.68, this.myButtonBackgroundScale[0] * numberOfButtons);\n //2 at start, 3 between filters, 4 spaces between filter and clear and 4 spaces between clear and up/down, 1 space between up and down, 1 at end\n let numberOfSpacesBetweenButtons = 2 + 3 + 4 + 4 + 1 + 2;\n let spaceWidth = Math.max((buttonsHorizontalSpace - numberOfButtons * this.myButtonBackgroundScale[0] * 2) / numberOfSpacesBetweenButtons, 0);\n let halfButtonWidth = this.myButtonBackgroundScale[0];\n let initialPosition = - buttonsHorizontalSpace / 2;\n\n this.myFilterButtonsPositions = [];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.LOG] = [initialPosition + spaceWidth * 2 + halfButtonWidth, 0, 0];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.ERROR] = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.LOG][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.WARN] = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.ERROR][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.INFO] = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.WARN][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n\n this.myClearButtonPosition = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.INFO][0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\n this.myUpButtonPosition = [this.myClearButtonPosition[0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\n this.myDownButtonPosition = [this.myUpButtonPosition[0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n }\n\n //Notify Icon\n this.myNotifyIconBackgroundScale = [0.01, 0.01, 1];\n\n this.myNotifyIconPanelPositions = [];\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE] = [0, 0, 0];\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][0] = -this.myMessagesBackgroundScale[0] + this.myNotifyIconBackgroundScale[0] + 0.01;\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][1] = -this.myMessagesBackgroundScale[1] + this.myNotifyIconBackgroundScale[1] + 0.01;\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][2] = this.myMessagesTextsPanelPosition[2] - 0.00001; //prevent glitches with text\n\n this.myNotifyIconPanelPositions[PP.ToolHandedness.LEFT] = this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE];\n\n this.myNotifyIconPanelPositions[PP.ToolHandedness.RIGHT] = this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE];\n\n this.myNotifyIconCursorTargetPosition = [0, 0, 0];\n this.myNotifyIconCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - this.myMessagesTextsPanelPosition[2]; // a little behind the button target to avoid hiding it\n\n this.myNotifyIconCollisionExtents = this.myNotifyIconBackgroundScale.slice(0);\n this.myNotifyIconCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNotifyIconColor = [210 / 255, 210 / 255, 210 / 255, 1];\n\n //Pointer\n this.myPointerCollisionCollider = this.myCursorTargetCollisionCollider;\n this.myPointerCollisionGroup = this.myCursorTargetCollisionGroup;\n\n {\n let spaceBetweenMessagesAndButtons = Math.abs((this.myMessagesPanelPosition[1] - this.myMessagesBackgroundScale[1]) - (this.myButtonsPanelPosition[1] + this.myButtonBackgroundScale[1]));\n let pointerCollisionHalfHeight = this.myMessagesBackgroundScale[1] + this.myButtonBackgroundScale[1] + spaceBetweenMessagesAndButtons / 2;\n this.myPointerCollisionExtents = [this.myMessagesBackgroundScale[0], pointerCollisionHalfHeight, this.myCursorTargetCollisionThickness];\n }\n\n this.myPointerCursorTargetPosition = [0, 0, 0];\n this.myPointerCursorTargetPosition[1] = (this.myMessagesPanelPosition[1] + this.myMessagesBackgroundScale[1]) - this.myPointerCollisionExtents[1];\n this.myPointerCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myTabString = \" \";\n this.myAssertStartString = \"Assertion failed:\";\n\n this.myMaxCharactersPerLine = 100;\n this.myMaxLineSplits = 50; //prevent infinite splitting\n this.myMaxLines = 22;\n this.myMaxMessages = 2000;\n this.myMaxMessagesDeletePad = 2000; // to prevent deleting at every message, delay the delete after the limit is exceed by this value\n\n this.myLinesBetweenMessages = 1;\n\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myButtonDisabledTextColor = this.myBackgroundColor;\n this.myButtonDisabledBackgroundColor = [110 / 255, 110 / 255, 110 / 255, 1];\n\n this.myFilterButtonDisabledTextColor = this.myButtonDisabledTextColor;\n this.myFilterButtonDisabledBackgroundColor = this.myButtonDisabledBackgroundColor;\n\n this.myScrollDelay = 0.1;\n this.myScrollAmount = 1;\n this.myScrollThumbstickHandedness = PP.ToolHandedness.RIGHT;\n this.myScrollThumbstickDelay = 0.1;\n this.myScrollThumbstickMinThreshold = 0.2;\n this.myScrollThumbstickAmount = 3;\n\n this.myPulseDelay = 5;\n this.myPulseIntensity = 0.3;\n this.myPulseDuration = 0.085;\n\n this.myClearBrowserConsoleWhenClearPressed = true;\n\n this.myGamepadScrollOnlyOnHover = true;\n }\n};", "PP.ConsoleVRWidgetUI = class ConsoleVRWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this._createMessagesSkeleton();\n this._createButtonsSkeleton();\n this._createPointerSkeleton();\n }\n\n _createMessagesSkeleton() {\n this.myMessagesPanel = WL.scene.addObject(this.myPivotObject);\n this.myMessagesBackground = WL.scene.addObject(this.myMessagesPanel);\n this.myMessagesTextsPanel = WL.scene.addObject(this.myMessagesPanel);\n\n this.myMessagesTexts = [];\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myMessagesTextsPanel);\n }\n\n this.myNotifyIconPanel = WL.scene.addObject(this.myMessagesPanel);\n this.myNotifyIconBackground = WL.scene.addObject(this.myNotifyIconPanel);\n this.myNotifyIconCursorTarget = WL.scene.addObject(this.myNotifyIconPanel);\n }\n\n _createButtonsSkeleton() {\n this.myButtonsPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myFilterButtonsPanels = [];\n this.myFilterButtonsBackgrounds = [];\n this.myFilterButtonsTexts = [];\n this.myFilterButtonsCursorTargets = [];\n\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myButtonsPanel);\n this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]]);\n this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]]);\n this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]]);\n }\n\n this.myClearButtonPanel = WL.scene.addObject(this.myButtonsPanel);\n this.myClearButtonBackground = WL.scene.addObject(this.myClearButtonPanel);\n this.myClearButtonText = WL.scene.addObject(this.myClearButtonPanel);\n this.myClearButtonCursorTarget = WL.scene.addObject(this.myClearButtonPanel);\n\n this.myUpButtonPanel = WL.scene.addObject(this.myButtonsPanel);\n this.myUpButtonBackground = WL.scene.addObject(this.myUpButtonPanel);\n this.myUpButtonText = WL.scene.addObject(this.myUpButtonPanel);\n this.myUpButtonCursorTarget = WL.scene.addObject(this.myUpButtonPanel);\n\n this.myDownButtonPanel = WL.scene.addObject(this.myButtonsPanel);\n this.myDownButtonBackground = WL.scene.addObject(this.myDownButtonPanel);\n this.myDownButtonText = WL.scene.addObject(this.myDownButtonPanel);\n this.myDownButtonCursorTarget = WL.scene.addObject(this.myDownButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setDirty();\n\n this._setMessagesTransforms();\n this._setButtonsTransforms();\n this._setPointerTransform();\n }\n\n _setMessagesTransforms() {\n this.myMessagesPanel.setTranslationLocal(this._mySetup.myMessagesPanelPosition);\n this.myMessagesBackground.scale(this._mySetup.myMessagesBackgroundScale);\n\n this.myMessagesTextsPanel.setTranslationLocal(this._mySetup.myMessagesTextsPanelPosition);\n this.myMessagesTextsPanel.scale(this._mySetup.myMessagesTextsPanelScale);\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType[key]]);\n }\n\n this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[this._myAdditionalSetup.myHandedness]);\n this.myNotifyIconBackground.scale(this._mySetup.myNotifyIconBackgroundScale);\n this.myNotifyIconCursorTarget.setTranslationLocal(this._mySetup.myNotifyIconCursorTargetPosition);\n }\n\n _setButtonsTransforms() {\n this.myButtonsPanel.setTranslationLocal(this._mySetup.myButtonsPanelPosition);\n\n //Filter Buttons\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType[key]]);\n\n this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[key]].scale(this._mySetup.myButtonBackgroundScale);\n\n this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]].scale(this._mySetup.myButtonTextScale);\n\n this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n\n //Clear\n {\n this.myClearButtonPanel.setTranslationLocal(this._mySetup.myClearButtonPosition);\n\n this.myClearButtonBackground.scale(this._mySetup.myButtonBackgroundScale);\n\n this.myClearButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myClearButtonText.scale(this._mySetup.myButtonTextScale);\n\n this.myClearButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n\n //Up\n {\n this.myUpButtonPanel.setTranslationLocal(this._mySetup.myUpButtonPosition);\n\n this.myUpButtonBackground.scale(this._mySetup.myButtonBackgroundScale);\n\n this.myUpButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myUpButtonText.scale(this._mySetup.myButtonTextScale);\n\n this.myUpButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n\n //Down\n {\n this.myDownButtonPanel.setTranslationLocal(this._mySetup.myDownButtonPosition);\n\n this.myDownButtonBackground.scale(this._mySetup.myButtonBackgroundScale);\n\n this.myDownButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myDownButtonText.scale(this._mySetup.myButtonTextScale);\n\n this.myDownButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this._addMessagesComponents();\n this._addButtonsComponents();\n this._addPointerComponents();\n }\n\n _addMessagesComponents() {\n let messagesBackgroundMeshComp = this.myMessagesBackground.addComponent('mesh');\n messagesBackgroundMeshComp.mesh = this._myPlaneMesh;\n messagesBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n messagesBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n this.myMessagesTextComponents = [];\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let textComp = this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[key]].addComponent('text');\n\n textComp.alignment = this._mySetup.myMessagesTextAlignment;\n textComp.justification = this._mySetup.myMessagesTextJustification;\n textComp.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComp.material.color = this._mySetup.myMessagesTextColors[PP.ConsoleVRWidget.MessageType[key]];\n textComp.lineSpacing = 1.2;\n textComp.text = this._mySetup.myMessagesTextStartString;\n\n this.myMessagesTextComponents[PP.ConsoleVRWidget.MessageType[key]] = textComp;\n }\n\n this.myNotifyIconBackgroundComponent = this.myNotifyIconBackground.addComponent('mesh');\n this.myNotifyIconBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNotifyIconBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNotifyIconBackgroundComponent.material.color = this._mySetup.myNotifyIconColor;\n\n this.myNotifyIconCursorTargetComponent = this.myNotifyIconCursorTarget.addComponent('cursor-target');\n\n this.myNotifyIconCollisionComponent = this.myNotifyIconCursorTarget.addComponent('collision');\n this.myNotifyIconCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNotifyIconCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNotifyIconCollisionComponent.extents = this._mySetup.myNotifyIconCollisionExtents;\n }\n\n _addButtonsComponents() {\n //worship the code copy pasteness\n\n this.myFilterButtonsBackgroundComponents = [];\n this.myFilterButtonsTextComponents = [];\n this.myFilterButtonsCursorTargetComponents = [];\n this.myFilterButtonsCollisionComponents = [];\n\n //Filter Buttons\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let buttonBackgroundMeshComp = this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[key]].addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]].addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.material.color = this._mySetup.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType[key]];\n buttonTextComp.text = this._mySetup.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType[key]];\n\n let buttonCursorTargetComp = this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]].addComponent('cursor-target');\n\n let buttonCollisionComp = this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]].addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonBackgroundMeshComp;\n this.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonTextComp;\n this.myFilterButtonsCursorTargetComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonCursorTargetComp;\n this.myFilterButtonsCollisionComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonCollisionComp;\n }\n\n //Clear \n {\n let buttonBackgroundMeshComp = this.myClearButtonBackground.addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myClearButtonText.addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.text = this._mySetup.myClearButtonTextLabel;\n\n let buttonCursorTargetComp = this.myClearButtonCursorTarget.addComponent('cursor-target');\n\n let buttonCollisionComp = this.myClearButtonCursorTarget.addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myClearButtonBackgroundComponent = buttonBackgroundMeshComp;\n this.myClearButtonTextComponent = buttonTextComp;\n this.myClearButtonCursorTargetComponent = buttonCursorTargetComp;\n this.myClearButtonCollisionComponent = buttonCollisionComp;\n }\n\n //Up \n {\n let buttonBackgroundMeshComp = this.myUpButtonBackground.addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myUpButtonText.addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.text = this._mySetup.myUpButtonTextLabel;\n\n let buttonCursorTargetComp = this.myUpButtonCursorTarget.addComponent('cursor-target');\n\n let buttonCollisionComp = this.myUpButtonCursorTarget.addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myUpButtonBackgroundComponent = buttonBackgroundMeshComp;\n this.myUpButtonTextComponent = buttonTextComp;\n this.myUpButtonCursorTargetComponent = buttonCursorTargetComp;\n this.myUpButtonCollisionComponent = buttonCollisionComp;\n }\n\n //Down \n {\n let buttonBackgroundMeshComp = this.myDownButtonBackground.addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myDownButtonText.addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.text = this._mySetup.myDownButtonTextLabel;\n\n let buttonCursorTargetComp = this.myDownButtonCursorTarget.addComponent('cursor-target');\n\n let buttonCollisionComp = this.myDownButtonCursorTarget.addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myDownButtonBackgroundComponent = buttonBackgroundMeshComp;\n this.myDownButtonTextComponent = buttonTextComp;\n this.myDownButtonCursorTargetComponent = buttonCursorTargetComp;\n this.myDownButtonCollisionComponent = buttonCollisionComp;\n }\n }\n\n _addPointerComponents() {\n this.myPointerCursorTargetComponent = this.myPointerCursorTarget.addComponent('cursor-target');\n this.myPointerCursorTargetComponent.isSurface = true;\n\n let collisionComp = this.myPointerCursorTarget.addComponent('collision');\n collisionComp.collider = this._mySetup.myPointerCollisionCollider;\n collisionComp.group = 1 << this._mySetup.myPointerCollisionGroup;\n collisionComp.extents = this._mySetup.myPointerCollisionExtents;\n\n this.myPointerCollisionComponent = collisionComp;\n }\n\n _setupButtonTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[PP.ToolHandedness.NONE]);\n }\n};", "/* Doesn't support\n - Placeholder like %d and other similar kind of way to build strings\n*/\n\nPP.ConsoleVRWidget = class ConsoleVRWidget {\n\n constructor() {\n this._myWidgetFrame = new PP.WidgetFrame(\"C\", 0);\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\n\n this._mySetup = new PP.ConsoleVRWidgetSetup();\n this._myAdditionalSetup = null;\n\n this._myUI = new PP.ConsoleVRWidgetUI();\n\n this._myMessages = [];\n\n this._myOldBrowserConsole = [];\n this._myOldConsoleVR = [];\n\n this._myTypeFilters = [];\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = false;\n }\n\n this._myScrollUp = false;\n this._myScrollDown = false;\n this._myScrollOffset = 0;\n this._myScrollTimer = 0;\n this._myScrollThumbstickTimer = 0;\n\n this._myPulseTimer = 0;\n\n this._myGamepadScrollActive = true;\n if (this._mySetup.myGamepadScrollOnlyOnHover) {\n this._myGamepadScrollActive = false;\n }\n }\n\n setVisible(visible) {\n this._myWidgetFrame.setVisible(visible);\n }\n\n isVisible() {\n return this._myWidgetFrame.isVisible();\n }\n\n start(parentObject, additionalSetup) {\n this._myLeftGamepad = PP.myLeftGamepad; //@EDIT get gamepad LEFT here based on how you store it in your game\n this._myRightGamepad = PP.myRightGamepad; //@EDIT get gamepad RIGHT here based on how you store it in your game\n\n this._myAdditionalSetup = additionalSetup;\n\n this._myWidgetFrame.start(parentObject, additionalSetup);\n\n this._myUI.build(this._myWidgetFrame.getWidgetObject(), this._mySetup, additionalSetup);\n this._myUI.setVisible(this._myWidgetFrame.myIsWidgetVisible);\n this._setNotifyIconActive(false);\n\n this._addListeners();\n\n this._overrideConsolesFunctions();\n }\n\n //This must be done only when all the setup is complete, to avoid issues with other part of the code calling the console and then triggering the console vr while not ready yet\n _overrideConsolesFunctions() {\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.LOG] = console.log;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.ERROR] = console.error;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.WARN] = console.warn;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.INFO] = console.info;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.DEBUG] = console.debug;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.ASSERT] = console.assert;\n this._myOldBrowserConsoleClear = console.clear;\n\n if (this._myAdditionalSetup.myOverrideBrowserConsole) {\n console.log = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.LOG, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.error = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.warn = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.WARN, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.info = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.INFO, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.debug = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.DEBUG, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.assert = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ASSERT, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.clear = this._clearConsole.bind(this, true, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n\n window.addEventListener('error', function (errorEvent) {\n this._consolePrint(PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.WINDOW, \"Uncaught\", errorEvent.error.stack);\n }.bind(this));\n\n window.addEventListener('unhandledrejection', function (errorEvent) {\n this._consolePrint(PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.WINDOW, \"Uncaught (in promise)\", errorEvent.reason);\n }.bind(this));\n }\n\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.LOG] = PP.ConsoleVR.log;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.ERROR] = PP.ConsoleVR.error;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.WARN] = PP.ConsoleVR.warn;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.INFO] = PP.ConsoleVR.info;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.DEBUG] = PP.ConsoleVR.debug;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.ASSERT] = PP.ConsoleVR.assert;\n this._myOldConsoleVRClear = PP.ConsoleVR.clear;\n\n PP.ConsoleVR.log = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.LOG, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.error = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.warn = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.WARN, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.info = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.INFO, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.debug = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.DEBUG, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.assert = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ASSERT, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.clear = this._clearConsole.bind(this, true, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n }\n\n update(dt) {\n this._myWidgetFrame.update(dt);\n\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._updateScroll(dt);\n }\n\n this._updateGamepadsExtraActions(dt);\n }\n\n //Text section\n\n _updateText(messageType) {\n let consoleText = \"\";\n\n if (!this._myTypeFilters[messageType]) {\n let linesCount = 0;\n let i = this._myMessages.length - 1;\n\n let scrollLinesToSkip = Math.round(this._myScrollOffset);\n\n while (i >= 0 && linesCount < this._mySetup.myMaxLines) {\n let message = this._myMessages[i];\n\n //skip filtered messages\n if (this._myTypeFilters[message.myType]) {\n i -= 1;\n continue;\n }\n\n let messageLines = message.myLines.length;\n\n //compute line to skip due to scroll offset\n let linesToSkip = 0;\n if (scrollLinesToSkip > 0) {\n let additionalEmptyLines = 0;\n if (i != this._myMessages.length - 1) {\n additionalEmptyLines = this._mySetup.myLinesBetweenMessages;\n }\n\n if (scrollLinesToSkip >= messageLines + additionalEmptyLines) { // + empty lines between messages\n scrollLinesToSkip -= messageLines + additionalEmptyLines;\n linesToSkip = messageLines + additionalEmptyLines;\n } else {\n linesToSkip = scrollLinesToSkip;\n scrollLinesToSkip = 0;\n }\n }\n\n //add empty lines between messages\n if (i != this._myMessages.length - 1) {\n let emptyLinesToSkip = this._mySetup.myLinesBetweenMessages - Math.max(this._mySetup.myLinesBetweenMessages - linesToSkip, 0);\n let emptyLinesToShow = this._mySetup.myLinesBetweenMessages - emptyLinesToSkip;\n if (linesCount + emptyLinesToShow > this._mySetup.myMaxLines) {\n emptyLinesToShow = this._myMaxLines - linesCount;\n }\n\n for (let j = 0; j < emptyLinesToShow; j++) {\n consoleText = (\"\\n\").concat(consoleText);\n }\n\n linesCount += emptyLinesToShow;\n linesToSkip -= emptyLinesToSkip;\n }\n\n //computing the number of message lines to show\n let linesToShow = messageLines - linesToSkip;\n if (linesCount + linesToShow > this._mySetup.myMaxLines) {\n linesToShow = this._mySetup.myMaxLines - linesCount;\n }\n\n if (linesToShow > 0) {\n if (message.myType == messageType) {\n //if the message is the same type of this message text component, add the message lines\n\n let linesToPrint = message.myLines.slice(messageLines - linesToShow - linesToSkip, messageLines - linesToSkip);\n let text = linesToPrint.join(\"\\n\");\n consoleText = (text.concat(\"\\n\")).concat(consoleText);\n\n linesCount += linesToShow;\n } else {\n //otherwise add empty lines, so that the text component with the correct type will have space to show this message\n\n for (let j = 0; j < linesToShow; j++) {\n consoleText = (\"\\n\").concat(consoleText);\n }\n\n linesCount += linesToShow;\n }\n }\n\n i -= 1;\n }\n }\n\n consoleText = this._mySetup.myMessagesTextStartString.concat(consoleText);\n\n this._myUI.myMessagesTextComponents[messageType].text = consoleText;\n }\n\n _consolePrint(consoleFunction, sender, ...args) {\n if (consoleFunction != PP.ConsoleVRWidget.ConsoleFunction.ASSERT || (args.length > 0 && !args[0])) {\n let message = this._argsToMessage(consoleFunction, ...args);\n this._addMessage(message);\n\n if (this._myMessages.length >= this._mySetup.myMaxMessages + this._mySetup.myMaxMessagesDeletePad) {\n this._myMessages = this._myMessages.slice(this._myMessages.length - this._mySetup.myMaxMessages);\n this._clampScrollOffset();\n }\n\n this._updateAllTexts();\n\n this._pulseGamepad();\n }\n\n switch (sender) {\n case PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE:\n this._myOldBrowserConsole[consoleFunction].apply(console, args);\n break;\n case PP.ConsoleVRWidget.Sender.CONSOLE_VR:\n this._myOldConsoleVR[consoleFunction].apply(PP.ConsoleVR, args);\n break;\n default:\n break;\n }\n }\n\n _argsToMessage(consoleFunction, ...args) {\n if (consoleFunction == PP.ConsoleVRWidget.ConsoleFunction.ASSERT) {\n args = args.slice(1);\n args.splice(0, 0, this._mySetup.myAssertStartString);\n }\n\n let messageType = this._consoleFunctionToMessageType(consoleFunction);\n\n let formattedText = this._formatArgs(...args);\n\n let lines = this._splitLongLines(formattedText);\n\n if (messageType == PP.ConsoleVRWidget.MessageType.DEBUG) {\n messageType = PP.ConsoleVRWidget.MessageType.LOG;\n } else if (messageType == PP.ConsoleVRWidget.MessageType.EXCEPTION || messageType == PP.ConsoleVRWidget.MessageType.ASSERT) {\n messageType = PP.ConsoleVRWidget.MessageType.ERROR;\n }\n\n\n let message = new PP.ConsoleVRWidget.Message(messageType, lines);\n\n return message;\n }\n\n _consoleFunctionToMessageType(consoleFunction) {\n let messageType = PP.ConsoleVRWidget.MessageType.LOG;\n\n if (consoleFunction < PP.ConsoleVRWidget.ConsoleFunction.DEBUG) {\n messageType = consoleFunction;\n } else if (consoleFunction == PP.ConsoleVRWidget.ConsoleFunction.DEBUG) {\n messageType = PP.ConsoleVRWidget.MessageType.LOG;\n } else {\n messageType = PP.ConsoleVRWidget.MessageType.ERROR;\n }\n\n return messageType;\n }\n\n //Here the formatting using placeholder like %d could be implemented in the future\n _formatArgs(...args) {\n let stringifiedArgs = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i] === undefined) {\n stringifiedArgs.push(\"undefined\");\n } else {\n stringifiedArgs.push(this._stringifyItem(args[i]));\n }\n }\n\n let formattedString = stringifiedArgs.join(\" \");\n\n return formattedString;\n }\n\n _stringifyItem(item) {\n if (typeof item === 'object') {\n let stringifiedItem = null;\n let linesBetweenItems = 2;\n\n try {\n stringifiedItem = JSON.stringify(item, this._jsonReplacer.bind(this), linesBetweenItems);\n } catch (error) {\n let cache = new WeakSet();\n\n stringifiedItem = JSON.stringify(item, function (key, value) {\n if (typeof value === 'object' && value !== null) {\n if (cache.has(value)) {\n return \"\"; //try to avoid circular reference, a repeated object will be caught in this check too sadly\n }\n cache.add(value);\n }\n\n return this._jsonReplacer(key, value);\n }.bind(this), linesBetweenItems);\n }\n\n stringifiedItem = stringifiedItem.replaceAll('\"[', '[');\n stringifiedItem = stringifiedItem.replaceAll(\"'[\", \"[\");\n stringifiedItem = stringifiedItem.replaceAll(']\"', ']');\n stringifiedItem = stringifiedItem.replaceAll(\"]'\", \"]\");\n\n return stringifiedItem;\n }\n\n return item;\n }\n\n _splitLongLines(messageText) {\n let linesToSplit = messageText.split(\"\\n\");\n let lines = [];\n for (let i = 0; i < linesToSplit.length; i++) {\n let lineToSplit = linesToSplit[i];\n\n if (lineToSplit.length > this._mySetup.myMaxCharactersPerLine) {\n let spacesAtStart = this._getSpacesAtStart(lineToSplit);\n let spaceToAdd = this._mySetup.myTabString.concat(spacesAtStart);\n let lineSplits = 0;\n\n while (lineToSplit.length > this._mySetup.myMaxCharactersPerLine && lineSplits < this._mySetup.myMaxLineSplits) {\n let firstSub = lineToSplit.substr(0, this._mySetup.myMaxCharactersPerLine - 1);\n let secondSub = lineToSplit.substr(this._mySetup.myMaxCharactersPerLine - 1);\n secondSub = spaceToAdd.concat(secondSub);\n\n lines.push(firstSub);\n\n lineToSplit = secondSub;\n lineSplits++;\n }\n lines.push(lineToSplit);\n } else {\n lines.push(lineToSplit);\n }\n }\n\n return lines;\n }\n\n _getSpacesAtStart(text) {\n let spaces = \"\";\n let i = 0;\n\n while (i < text.length && text[i] == ' ') {\n spaces = spaces.concat(\" \");\n i++;\n }\n\n return spaces;\n }\n\n _addMessage(message) {\n let hasSameInfoAsPrev = false;\n if (this._myMessages.length > 0) {\n let lastMessage = this._myMessages[this._myMessages.length - 1];\n if (lastMessage.hasSameInfo(message)) {\n lastMessage.increaseCount();\n hasSameInfoAsPrev = true;\n }\n }\n\n if (!hasSameInfoAsPrev) {\n this._myMessages.push(message);\n }\n\n this._adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev);\n this._updateNotifyIcon(message);\n }\n\n //if you have scrolled, new messages does not move the scroll position\n _adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev) {\n if (!hasSameInfoAsPrev && !(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\n this._myScrollOffset += message.myLines.length + this._mySetup.myLinesBetweenMessages;\n }\n }\n\n _updateAllTexts() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this._updateText(PP.ConsoleVRWidget.MessageType[key]);\n }\n }\n }\n\n _updateNotifyIcon(message) {\n if (!(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\n this._setNotifyIconActive(true);\n }\n }\n\n _updateScroll(dt) {\n if (this._myScrollUp) {\n this._myScrollTimer += dt;\n while (this._myScrollTimer > this._mySetup.myScrollDelay) {\n this._myScrollTimer -= this._mySetup.myScrollDelay;\n this._myScrollOffset += this._mySetup.myScrollAmount;\n }\n } else if (this._myScrollDown) {\n this._myScrollTimer += dt;\n while (this._myScrollTimer > this._mySetup.myScrollDelay) {\n this._myScrollTimer -= this._mySetup.myScrollDelay;\n this._myScrollOffset -= this._mySetup.myScrollAmount;\n }\n }\n\n this._clampScrollOffset();\n\n if (this._myScrollUp || this._myScrollDown) {\n this._updateAllTexts();\n }\n\n if (this._myScrollOffset == 0) {\n this._setNotifyIconActive(false);\n }\n }\n\n _clampScrollOffset() {\n let maxScroll = this._getMaxScrollOffset();\n this._myScrollOffset = Math.min(Math.max(this._myScrollOffset, 0), maxScroll); //clamp \n }\n\n _getMaxScrollOffset() {\n return Math.max(this._getLinesCount() - this._mySetup.myMaxLines, 0);\n }\n\n _getLinesCount() {\n let linesCount = 0;\n for (let message of this._myMessages) {\n if (!this._myTypeFilters[message.myType]) {\n linesCount += message.myLines.length + this._mySetup.myLinesBetweenMessages;\n }\n }\n linesCount -= this._mySetup.myLinesBetweenMessages; //empty line is added only between messages\n linesCount = Math.max(linesCount, 0);\n\n return linesCount;\n }\n\n //Listener section\n\n _addListeners() {\n let ui = this._myUI;\n\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let cursorTarget = ui.myFilterButtonsCursorTargetComponents[PP.ConsoleVRWidget.MessageType[key]];\n let backgroundMaterial = ui.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n let textMaterial = ui.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n\n cursorTarget.addTripleClickFunction(this._resetFilters.bind(this, PP.ConsoleVRWidget.MessageType[key]));\n cursorTarget.addDoubleClickFunction(this._filterAllButOne.bind(this, PP.ConsoleVRWidget.MessageType[key], textMaterial));\n cursorTarget.addClickFunction(this._toggleFilter.bind(this, PP.ConsoleVRWidget.MessageType[key], textMaterial));\n cursorTarget.addHoverFunction(this._filterHover.bind(this, PP.ConsoleVRWidget.MessageType[key], backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._filterUnHover.bind(this, PP.ConsoleVRWidget.MessageType[key], backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myClearButtonCursorTargetComponent;\n let backgroundMaterial = ui.myClearButtonBackgroundComponent.material;\n\n cursorTarget.addClickFunction(this._clearConsole.bind(this, false, null));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._genericUnHover.bind(this, backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myUpButtonCursorTargetComponent;\n let backgroundMaterial = ui.myUpButtonBackgroundComponent.material;\n\n cursorTarget.addDoubleClickFunction(this._instantScrollUp.bind(this, true));\n cursorTarget.addDownFunction(this._setScrollUp.bind(this, true));\n cursorTarget.addUpFunction(this._setScrollUp.bind(this, false));\n cursorTarget.addUnHoverFunction(this._setScrollUp.bind(this, false));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._genericUnHover.bind(this, backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myDownButtonCursorTargetComponent;\n let backgroundMaterial = ui.myDownButtonBackgroundComponent.material;\n\n cursorTarget.addDoubleClickFunction(this._instantScrollDown.bind(this));\n cursorTarget.addDownFunction(this._setScrollDown.bind(this, true));\n cursorTarget.addUpFunction(this._setScrollDown.bind(this, false));\n cursorTarget.addUnHoverFunction(this._setScrollDown.bind(this, false));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._genericUnHover.bind(this, backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myNotifyIconCursorTargetComponent;\n let backgroundMaterial = ui.myNotifyIconBackgroundComponent.material;\n\n cursorTarget.addClickFunction(this._instantScrollDown.bind(this));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._notifyIconUnHover.bind(this));\n }\n\n ui.myPointerCursorTargetComponent.addHoverFunction(this._setGamepadScrollActive.bind(this, true));\n ui.myPointerCursorTargetComponent.addUnHoverFunction(this._setGamepadScrollActive.bind(this, false));\n }\n\n _resetFilters(messageType) {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = false;\n filterTextMaterial.color = this._mySetup.myMessageTypeColors[PP.ConsoleVRWidget.MessageType[key]];\n if (PP.ConsoleVRWidget.MessageType[key] != messageType) {\n backgroundMaterial.color = this._mySetup.myBackgroundColor;\n }\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _filterAllButOne(messageType) {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n if (PP.ConsoleVRWidget.MessageType[key] != messageType) {\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = true;\n backgroundMaterial.color = this._mySetup.myFilterButtonDisabledBackgroundColor;\n filterTextMaterial.color = this._mySetup.myFilterButtonDisabledTextColor;\n } else {\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = false;\n filterTextMaterial.color = this._mySetup.myMessageTypeColors[messageType];\n }\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _toggleFilter(messageType, textMaterial) {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n\n this._myTypeFilters[messageType] = !this._myTypeFilters[messageType];\n if (this._myTypeFilters[messageType]) {\n textMaterial.color = this._mySetup.myFilterButtonDisabledTextColor;\n } else {\n textMaterial.color = this._mySetup.myMessageTypeColors[messageType];\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _clearConsole(codeDrivenClear = false, sender = null) {\n if (this._myWidgetFrame.myIsWidgetVisible || codeDrivenClear) {\n this._myMessages = [];\n this._clampScrollOffset();\n this._updateAllTexts();\n\n if (codeDrivenClear) {\n switch (sender) {\n case PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE:\n this._myOldBrowserConsoleClear.apply(console);\n break;\n case PP.ConsoleVRWidget.Sender.CONSOLE_VR:\n this._myOldConsoleVRClear.apply(PP.ConsoleVR);\n break;\n default:\n break;\n }\n } else if (this._mySetup.myClearBrowserConsoleWhenClearPressed) {\n PP.ConsoleVR._myRealClear();\n }\n }\n }\n\n _setScrollUp(value) {\n if (this._myWidgetFrame.myIsWidgetVisible || !value) {\n if (value) {\n this._myScrollTimer = 0;\n }\n\n this._myScrollUp = value;\n }\n }\n\n _setScrollDown(value) {\n if (this._myWidgetFrame.myIsWidgetVisible || !value) {\n if (value) {\n this._myScrollTimer = 0;\n }\n\n this._myScrollDown = value;\n }\n }\n\n _instantScrollUp() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._myScrollOffset = this._getMaxScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _instantScrollDown() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._myScrollOffset = 0;\n this._setNotifyIconActive(false);\n this._updateAllTexts();\n }\n }\n\n _setNotifyIconActive(active) {\n this._myUI.myNotifyIconPanel.pp_setActiveHierarchy(active && this._myWidgetFrame.myIsWidgetVisible);\n }\n\n _notifyIconUnHover() {\n let material = this._myUI.myNotifyIconBackgroundComponent.material;\n material.color = this._mySetup.myNotifyIconColor;\n }\n\n _filterHover(messageType, material) {\n this._genericHover(material);\n }\n\n _filterUnHover(messageType, material) {\n if (this._myTypeFilters[messageType]) {\n material.color = this._mySetup.myFilterButtonDisabledBackgroundColor;\n } else {\n material.color = this._mySetup.myBackgroundColor;\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n //Gamepad section\n\n _updateGamepadsExtraActions(dt) {\n if (this._myLeftGamepad && this._myRightGamepad) {\n if ((this._myLeftGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).isPressStart() && this._myRightGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).myIsPressed) ||\n (this._myRightGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).isPressStart() && this._myLeftGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).myIsPressed)) {\n this._toggleVisibility();\n }\n\n this._myPulseTimer = Math.max(this._myPulseTimer - dt, 0);\n\n this._updateScrollWithThumbstick(dt);\n }\n }\n\n _toggleVisibility() {\n this._myWidgetFrame.toggleVisibility();\n }\n\n _widgetVisibleChanged(visible) {\n this._myUI.setVisible(visible);\n if (visible) {\n this._updateAllTexts();\n }\n }\n\n _updateScrollWithThumbstick(dt) {\n if (this._myWidgetFrame.myIsWidgetVisible && this._myGamepadScrollActive) {\n let axes = [0, 0];\n if (this._mySetup.myScrollThumbstickHandedness == PP.ToolHandedness.LEFT) {\n axes = this._myLeftGamepad.getAxesInfo().myAxes;\n } else if (this._mySetup.myScrollThumbstickHandedness == PP.ToolHandedness.RIGHT) {\n axes = this._myRightGamepad.getAxesInfo().myAxes;\n }\n\n if (Math.abs(axes[1]) > this._mySetup.myScrollThumbstickMinThreshold) {\n this._myScrollThumbstickTimer += dt;\n\n while (this._myScrollThumbstickTimer > this._mySetup.myScrollThumbstickDelay) {\n this._myScrollThumbstickTimer -= this._mySetup.myScrollThumbstickDelay;\n\n let normalizedScrollAmount = (Math.abs(axes[1]) - this._mySetup.myScrollThumbstickMinThreshold) / (1 - this._mySetup.myScrollThumbstickMinThreshold);\n this._myScrollOffset += Math.sign(axes[1]) * normalizedScrollAmount * this._mySetup.myScrollThumbstickAmount;\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n } else {\n this._myScrollThumbstickTimer = 0;\n }\n }\n }\n\n _pulseGamepad() {\n if (this._myLeftGamepad && this._myRightGamepad) {\n let pulseType = this._myAdditionalSetup.myPulseOnNewMessage;\n let pulseEnabled = pulseType == PP.ConsoleVRWidget.PulseOnNewMessage.ALWAYS || (!this._myWidgetFrame.myIsWidgetVisible && pulseType == PP.ConsoleVRWidget.PulseOnNewMessage.WHEN_HIDDEN);\n if (pulseEnabled && this._myPulseTimer == 0) {\n if (this._myAdditionalSetup.myHandedness == PP.ToolHandedness.RIGHT) {\n this._myRightGamepad.pulse(this._mySetup.myPulseIntensity, this._mySetup.myPulseDuration);\n } else {\n this._myLeftGamepad.pulse(this._mySetup.myPulseIntensity, this._mySetup.myPulseDuration);\n }\n this._myPulseTimer = this._mySetup.myPulseDelay;\n }\n }\n }\n\n _isSimpleArray(array) {\n if (this._isSpecialSimpleArray(array)) {\n return true;\n } else if (Array.isArray(array)) {\n let isBuiltIn = true;\n for (let element of array) {\n if (element instanceof Object) {\n isBuiltIn = false;\n break;\n }\n }\n\n return isBuiltIn;\n }\n\n return false;\n }\n\n _isSpecialSimpleArray(item) {\n return item && item.constructor &&\n (\n item.constructor.name == \"Uint32Array\" ||\n item.constructor.name == \"Int32Array\" ||\n item.constructor.name == \"Float32Array\" ||\n item.constructor.name == \"Float64Array\"\n );\n }\n\n _setGamepadScrollActive(active) {\n this._myGamepadScrollActive = active;\n\n if (!this._mySetup.myGamepadScrollOnlyOnHover) {\n this._myGamepadScrollActive = true;\n }\n }\n\n _jsonReplacer(key, value) {\n if (value instanceof Map) {\n return Array.from(value.entries());\n } else if (this._isSimpleArray(value)) {\n let array = value;\n if (this._isSpecialSimpleArray(array)) {\n let arrayCopy = []; // Special arrays like Float32Array do not print like Array\n for (let i = 0; i < array.length; i++) {\n arrayCopy[i] = array[i];\n }\n\n array = arrayCopy;\n }\n\n let stringifiedArray = JSON.stringify(array);\n stringifiedArray = stringifiedArray.split(\",\").join(\", \");\n return stringifiedArray;\n } else {\n return value;\n }\n }\n};\n\nPP.ConsoleVRWidget.ConsoleFunction = {\n INFO: 0,\n WARN: 1,\n ERROR: 2,\n LOG: 3,\n DEBUG: 4,\n ASSERT: 5\n};\n\nPP.ConsoleVRWidget.Sender = {\n BROWSER_CONSOLE: 0,\n CONSOLE_VR: 1,\n WINDOW: 2\n};\n\nPP.ConsoleVRWidget.PulseOnNewMessage = {\n NEVER: 0,\n ALWAYS: 1,\n WHEN_HIDDEN: 2,\n};\n\nPP.ConsoleVRWidget.MessageType = {\n INFO: 0,\n WARN: 1,\n ERROR: 2,\n LOG: 3\n};\n\nPP.ConsoleVRWidget.Message = class Message {\n constructor(messageType, messageLines) {\n this.myType = messageType;\n this.myLines = messageLines;\n\n this._myOriginalText = messageLines.join(\"\\n\");\n\n this._myMessagesCount = 1;\n }\n\n hasSameInfo(message) {\n return this._myOriginalText == message._myOriginalText && this.myType == message.myType;\n }\n\n increaseCount() {\n this._myMessagesCount += 1;\n\n let countString = ((\"(x\").concat(this._myMessagesCount)).concat(\") \");\n\n let text = this._myOriginalText.slice(0);\n text = countString.concat(text);\n this.myLines = text.split(\"\\n\");\n }\n};\n\nPP.ConsoleVR = {\n _myRealLog: console.log,\n _myRealError: console.error,\n _myRealWarn: console.warn,\n _myRealInfo: console.info,\n _myRealDebug: console.debug,\n _myRealAssert: console.assert,\n _myRealClear: console.clear,\n _myForwardToBrowserConsole: true,\n\n log: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealLog.apply(console, args);\n }\n },\n error: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealError.apply(console, args);\n }\n },\n warn: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealWarn.apply(console, args);\n }\n },\n info: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealInfo.apply(console, args);\n }\n },\n debug: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealDebug.apply(console, args);\n }\n },\n assert: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealAssert.apply(console, args);\n }\n },\n clear: function () {\n if (this._myForwardToBrowserConsole) {\n this._myRealClear.apply(console);\n }\n },\n setForwardToBrowserConsole: function (forwardToBrowserConsole) {\n this._myForwardToBrowserConsole = forwardToBrowserConsole;\n },\n isForwardToBrowserConsole: function () {\n return this._myForwardToBrowserConsole;\n }\n};", "WL.registerComponent('pp-console-vr', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['none', 'left', 'right'], default: 'none' },\r\n _myOverrideBrowserConsole: { type: WL.Type.Bool, default: true },\r\n _myShowOnStart: { type: WL.Type.Bool, default: false },\r\n _myShowVisibilityButton: { type: WL.Type.Bool, default: false },\r\n _myPulseOnNewMessage: { type: WL.Type.Enum, values: ['never', 'always', 'when hidden'], default: 'never' }\r\n}, {\r\n init: function () {\r\n this._myWidget = new PP.ConsoleVRWidget();\r\n\r\n this._myStarted = false;\r\n },\r\n start: function () {\r\n let additionalSetup = {};\r\n additionalSetup.myHandedness = [null, 'left', 'right'][this._myHandedness];\r\n additionalSetup.myOverrideBrowserConsole = this._myOverrideBrowserConsole;\r\n additionalSetup.myShowOnStart = this._myShowOnStart;\r\n additionalSetup.myShowVisibilityButton = this._myShowVisibilityButton;\r\n additionalSetup.myPulseOnNewMessage = this._myPulseOnNewMessage;\r\n additionalSetup.myPlaneMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque;\r\n additionalSetup.myTextMaterial = PP.myDefaultResources.myMaterials.myText;\r\n\r\n this._myWidget.start(this.object, additionalSetup);\r\n\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._myStarted = true;\r\n },\r\n update: function (dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this._myWidget.setVisible(false);\r\n this._myWidget.setVisible(this._myWidgetVisibleBackup);\r\n }\r\n\r\n this._myWidget.update(dt);\r\n },\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n },\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n\r\n this._myWidget.setVisible(false);\r\n }\r\n },\r\n});\r\n", "//Don't move inside easy_object_tuners folder, otherwise it won't resolve the parent class dependency\r\n\r\nPP.EasyObjectTuner = class EasyObjectTuner {\r\n constructor(object, variableName, setAsDefault, useTuneTarget) {\r\n this._myObject = object;\r\n this._myUseTuneTarget = useTuneTarget;\r\n this._mySetAsDefault = setAsDefault;\r\n\r\n this._myEasyObject = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n this._myEasyObject = PP.myEasyTuneTarget;\r\n }\r\n this._myPrevEasyObject = null;\r\n\r\n let variableNamePrefix = this._getVariableNamePrefix();\r\n\r\n if (variableName == \"\") {\r\n this._myEasyTuneVariableName = variableNamePrefix.concat(this._myObject.objectId);\r\n } else {\r\n this._myEasyTuneVariableName = variableNamePrefix.concat(variableName);\r\n }\r\n }\r\n\r\n start() {\r\n let easyTuneVariable = this._createEasyTuneVariable(this._myEasyTuneVariableName);\r\n\r\n PP.myEasyTuneVariables.add(easyTuneVariable);\r\n if (this._mySetAsDefault) {\r\n PP.setEasyTuneWidgetActiveVariable(this._myEasyTuneVariableName);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (PP.myEasyTuneVariables.isActive(this._myEasyTuneVariableName)) {\r\n if (this._myUseTuneTarget) {\r\n this._myEasyObject = PP.myEasyTuneTarget;\r\n }\r\n\r\n if (this._myPrevEasyObject != this._myEasyObject) {\r\n this._myPrevEasyObject = this._myEasyObject;\r\n if (this._myEasyObject) {\r\n let value = this._getObjectValue(this._myEasyObject);\r\n PP.myEasyTuneVariables.set(this._myEasyTuneVariableName, value, true);\r\n } else {\r\n let value = this._getDefaultValue();\r\n PP.myEasyTuneVariables.set(this._myEasyTuneVariableName, value, true);\r\n }\r\n }\r\n\r\n if (this._myEasyObject) {\r\n this._updateObjectValue(this._myEasyObject, PP.myEasyTuneVariables.get(this._myEasyTuneVariableName));\r\n }\r\n }\r\n }\r\n\r\n updateVariableValue(value) {\r\n PP.myEasyTuneVariables.set(this._myEasyTuneVariableName, value);\r\n }\r\n};", "WL.registerComponent(\"pp-easy-light-attenuation\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false }\r\n\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyLightAttenuation(this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyLightAttenuation = class EasyLightAttenuation extends PP.EasyObjectTuner {\r\n constructor(object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n let nameFirstPart = \"Light Attenuation \";\r\n return nameFirstPart;\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneNumber(variableName, this._getDefaultValue(), 0.01, 3, 0, 1);\r\n }\r\n\r\n _getObjectValue(object) {\r\n let attenuation = this._getLightAttenuation(object);\r\n return attenuation;\r\n }\r\n\r\n _getDefaultValue() {\r\n return 0;\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n let attenuation = value;\r\n\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n light.color[3] = attenuation;\r\n }\r\n }\r\n\r\n _getLightAttenuation(object) {\r\n let attenuation = this._getDefaultValue();\r\n\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n attenuation = light.color[3];\r\n }\r\n\r\n return attenuation;\r\n }\r\n};", "WL.registerComponent(\"pp-easy-light-color\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _myColorModel: { type: WL.Type.Enum, values: ['rgb', 'hsv'] }\r\n\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyLightColor(this._myColorModel, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyLightColor = class EasyLightColor extends PP.EasyObjectTuner {\r\n constructor(colorModel, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myColorModel = colorModel;\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == 0) {\r\n nameFirstPart = \"Light RGB \";\r\n } else {\r\n nameFirstPart = \"Light HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneIntArray(variableName, this._getDefaultValue(), 100, 0, 255);\r\n }\r\n\r\n _getObjectValue(object) {\r\n let color = null;\r\n\r\n let lightColor = this._getLightColor(object);\r\n if (lightColor) {\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbCodeToHuman(lightColor);\r\n } else {\r\n color = PP.ColorUtils.hsvCodeToHuman(PP.ColorUtils.rgbToHsv(lightColor));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n _getDefaultValue() {\r\n return PP.vec3_create();\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbHumanToCode(color);\r\n } else {\r\n color = PP.ColorUtils.hsvToRgb(PP.ColorUtils.hsvHumanToCode(color));\r\n }\r\n\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n light.color[0] = color[0];\r\n light.color[1] = color[1];\r\n light.color[2] = color[2];\r\n light.color[3] = light.color[3];\r\n }\r\n\r\n if ((PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed) ||\r\n (PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed)) {\r\n\r\n let hsvColor = PP.ColorUtils.color1To255(PP.ColorUtils.rgbToHsv(color));\r\n let rgbColor = PP.ColorUtils.color1To255(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n _getLightColor(object) {\r\n let color = null;\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n color = light.color.slice(0, 3);\r\n }\r\n\r\n return color;\r\n }\r\n};", "WL.registerComponent(\"pp-easy-mesh-color\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myColorModel: { type: WL.Type.Enum, values: ['rgb', 'hsv'], default: 'hsv' },\r\n _myColorType: { type: WL.Type.Enum, values: ['color', 'diffuse color', 'ambient color', 'specular color', 'emissive color', 'fog color', 'ambient factor'], default: 'color' },\r\n\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyMeshColor(this._myColorModel, this._myColorType, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyMeshColor = class EasyMeshColor extends PP.EasyObjectTuner {\r\n constructor(colorModel, colorType, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myColorModel = colorModel;\r\n this._myColorType = colorType;\r\n this._myColorVariableNames = ['color', 'diffuseColor', 'ambientColor', 'specularColor', 'emissiveColor', 'fogColor', 'ambientFactor',];\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == 0) {\r\n nameFirstPart = \"Mesh RGB \";\r\n } else {\r\n nameFirstPart = \"Mesh HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n if (this._myColorType == 6) {\r\n return new PP.EasyTuneNumberArray(variableName, this._getDefaultValue(), 0.1, 3, 0, 1);\r\n }\r\n return new PP.EasyTuneIntArray(variableName, this._getDefaultValue(), 100, 0, 255);\r\n }\r\n\r\n _getObjectValue(object) {\r\n let color = null;\r\n\r\n let meshMaterial = this._getMeshMaterial(object);\r\n if (meshMaterial) {\r\n if (this._myColorType != 6) {\r\n color = meshMaterial[this._myColorVariableNames[this._myColorType]].pp_clone();\r\n\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbCodeToHuman(color);\r\n } else {\r\n color = PP.ColorUtils.hsvCodeToHuman(PP.ColorUtils.rgbToHsv(color));\r\n }\r\n } else {\r\n color = [meshMaterial[this._myColorVariableNames[this._myColorType]]];\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n _getDefaultValue() {\r\n if (this._myColorType == 6) {\r\n return [0];\r\n }\r\n\r\n return PP.vec4_create();\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n let color = value;\r\n\r\n if (this._myColorType != 6) {\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbHumanToCode(color);\r\n } else {\r\n color = PP.ColorUtils.hsvToRgb(PP.ColorUtils.hsvHumanToCode(color));\r\n }\r\n }\r\n\r\n let meshMaterial = this._getMeshMaterial(object);\r\n if (meshMaterial) {\r\n meshMaterial[this._myColorVariableNames[this._myColorType]] = color;\r\n }\r\n\r\n if (this._myColorType != 6) {\r\n if ((PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed) ||\r\n (PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed)) {\r\n\r\n let hsvColor = PP.ColorUtils.color1To255(PP.ColorUtils.rgbToHsv(color));\r\n let rgbColor = PP.ColorUtils.color1To255(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n }\r\n\r\n _getMeshMaterial(object) {\r\n let material = null;\r\n let mesh = object.pp_getComponentHierarchy(\"mesh\");\r\n if (mesh) {\r\n material = mesh.material;\r\n }\r\n\r\n return material;\r\n }\r\n};", "WL.registerComponent(\"pp-easy-scale\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _myIsLocal: { type: WL.Type.Bool, default: false },\r\n _myScaleAsOne: { type: WL.Type.Bool, default: true }, // Edit all scale values together\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyScale(this._myIsLocal, this._myScaleAsOne, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyScale = class EasyScale extends PP.EasyObjectTuner {\r\n constructor(isLocal, scaleAsOne, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myIsLocal = isLocal;\r\n this._myScaleAsOne = scaleAsOne;\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n return \"Scale \";\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneNumberArray(variableName, this._getDefaultValue(), 1, 3, 0.001, null, this._myScaleAsOne);\r\n }\r\n\r\n _getObjectValue(object) {\r\n return this._myIsLocal ? object.pp_getScaleLocal() : object.pp_getScaleWorld();\r\n }\r\n\r\n _getDefaultValue() {\r\n return PP.vec3_create(1, 1, 1);\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n if (this._myIsLocal) {\r\n object.pp_setScaleLocal(value);\r\n } else {\r\n object.pp_setScaleWorld(value);\r\n }\r\n }\r\n};", "WL.registerComponent(\"pp-easy-set-tune-target-child-number\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myEasyTuneVariableName = \"Target Child \";\r\n\r\n if (this._myVariableName == \"\") {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this.object.objectId);\r\n } else {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this._myVariableName);\r\n }\r\n\r\n let childrenCount = this.object.pp_getChildren().length;\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneInt(this._myEasyTuneVariableName, 0, 10, min, max));\r\n if (this._mySetAsDefault) {\r\n PP.setEasyTuneWidgetActiveVariable(this._myEasyTuneVariableName);\r\n }\r\n\r\n this._myCurrentChildIndex = -1;\r\n this._myCurrentChildrenCount = childrenCount;\r\n },\r\n update: function () {\r\n if (PP.myEasyTuneVariables.isActive(this._myEasyTuneVariableName)) {\r\n let childrenCount = this.object.pp_getChildren().length;\r\n if (childrenCount != this._myCurrentChildrenCount) {\r\n this._myCurrentChildrenCount = childrenCount;\r\n\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n let easyTuneVariable = PP.myEasyTuneVariables.getEasyTuneVariable(this._myEasyTuneVariableName);\r\n easyTuneVariable.setMin(min);\r\n easyTuneVariable.setMax(max);\r\n }\r\n\r\n let childIndex = PP.myEasyTuneVariables.get(this._myEasyTuneVariableName);\r\n if (childIndex != this._myCurrentChildIndex) {\r\n if (childIndex == 0 && this._myCurrentChildIndex != -1) {\r\n PP.myEasyTuneTarget = null;\r\n } else if (childIndex > 0) {\r\n PP.myEasyTuneTarget = this.object.pp_getChildren()[childIndex - 1];\r\n }\r\n\r\n this._myCurrentChildIndex = childIndex;\r\n }\r\n }\r\n }\r\n});", "WL.registerComponent(\"pp-easy-set-tune-target-grab\", {\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myGrabber = this.object.pp_getComponent(\"pp-grabber-hand\");\r\n },\r\n update: function () {\r\n },\r\n _onRelease: function (grabber, grabbable) {\r\n PP.myEasyTuneTarget = grabbable.object;\r\n },\r\n _onGrab: function (grabber, grabbable) {\r\n //PP.myEasyTuneTarget = null;\r\n },\r\n onActivate() {\r\n this._myGrabber.registerGrabEventListener(this, this._onGrab.bind(this));\r\n this._myGrabber.registerThrowEventListener(this, this._onRelease.bind(this));\r\n },\r\n onDeactivate() {\r\n this._myGrabber.unregisterGrabEventListener(this);\r\n this._myGrabber.unregisterThrowEventListener(this);\r\n }\r\n});", "WL.registerComponent(\"pp-easy-transform\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _myIsLocal: { type: WL.Type.Bool, default: false },\r\n _myScaleAsOne: { type: WL.Type.Bool, default: true }, // Edit all scale values together\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyTransform(this._myIsLocal, this._myScaleAsOne, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyTransform = class EasyTransform extends PP.EasyObjectTuner {\r\n constructor(isLocal, scaleAsOne, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myIsLocal = isLocal;\r\n this._myScaleAsOne = scaleAsOne;\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n return \"Transform \";\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneTransform(variableName, this._getDefaultValue(), this._myScaleAsOne);\r\n }\r\n\r\n _getObjectValue(object) {\r\n return this._myIsLocal ? object.pp_getTransformLocal() : object.pp_getTransformWorld();\r\n }\r\n\r\n _getDefaultValue() {\r\n return PP.mat4_create();\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n if (this._myIsLocal) {\r\n object.pp_setTransformLocal(value);\r\n } else {\r\n object.pp_setTransformWorld(value);\r\n }\r\n }\r\n};", "\nPP.EasyTuneBoolArrayWidget = class EasyTuneBoolArrayWidget {\n\n constructor(arraySize, gamepad) {\n this._myGamepad = gamepad;\n\n this._mySetup = new PP.EasyTuneBoolArrayWidgetSetup(arraySize);\n this._myUI = new PP.EasyTuneBoolArrayWidgetUI();\n\n this._myVariable = null;\n\n this._myIsVisible = true;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myAppendToVariableName = \"\";\n\n this._myValueEditIndex = 0;\n this._myValueButtonEditIntensity = 0;\n this._myValueButtonEditIntensityTimer = 0;\n this._myValueEditActive = false;\n\n this._myScrollVariableActive = false;\n this._myScrollDirection = 0;\n this._myScrollVariableTimer = 0;\n this._myHasScrolled = false;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n\n if ((typeof appendToVariableName) !== 'undefined') {\n this._myAppendToVariableName = appendToVariableName;\n } else {\n this._myAppendToVariableName = \"\";\n }\n\n this._refreshUI();\n }\n\n isScrollVariableActive() {\n return this._myScrollVariableActive;\n }\n\n getScrollVariableDirection() {\n return this._myScrollDirection;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n this._myScrollVariableActive = active;\n this._myScrollDirection = scrollDirection;\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = false;\n }\n\n _refreshUI() {\n if (this._myVariable) {\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._myUI.myValueTextComponents[i].text = (this._myVariable.myValue[i]) ? \"true\" : \"false\";\n }\n }\n }\n\n setVisible(visible) {\n if (visible) {\n this._refreshUI();\n }\n this._myUI.setVisible(visible);\n\n this._myIsVisible = visible;\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setAdditionalButtonsActive(additionalSetup.myEnableAdditionalButtons);\n\n this._addListeners();\n }\n\n update(dt) {\n if (this._isActive()) {\n this._updateValue(dt);\n this._updateScrollVariable(dt);\n }\n }\n\n _updateValue(dt) {\n let stickVariableIntensity = 0;\n\n if (this._myGamepad) {\n stickVariableIntensity = this._myGamepad.getAxesInfo().myAxes[1];\n }\n\n let valueIntensity = 0;\n if (this._myValueEditActive) {\n valueIntensity = stickVariableIntensity;\n } else if (this._myValueButtonEditIntensity != 0) {\n if (this._myValueButtonEditIntensityTimer <= 0) {\n valueIntensity = this._myValueButtonEditIntensity;\n } else {\n this._myValueButtonEditIntensityTimer -= dt;\n }\n }\n\n if (Math.abs(valueIntensity) > this._mySetup.myThumbstickToggleThreshold) {\n this._myVariable.myValue[this._myValueEditIndex] = valueIntensity > 0;\n this._refreshUI();\n }\n }\n\n _updateScrollVariable(dt) {\n if (this._myScrollVariableActive) {\n if (this._myScrollVariableTimer <= 0) {\n this._scrollVariableRequest(this._myScrollDirection);\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = true;\n } else {\n this._myScrollVariableTimer -= dt;\n }\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myVariableLabelCursorTargetComponent.addClickFunction(this._resetAllValues.bind(this));\n ui.myVariableLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myVariableLabelText));\n ui.myVariableLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myVariableLabelText, this._mySetup.myVariableLabelTextScale));\n\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n\n ui.myValueIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n\n ui.myValueCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, i));\n ui.myValueCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], true));\n ui.myValueCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], false));\n }\n }\n }\n\n _setValueEditIntensity(index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myValueButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n this._myValueEditIndex = index;\n }\n\n this._myValueButtonEditIntensity = value;\n }\n }\n\n _setValueEditActive(index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n this._myValueEditIndex = index;\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myValueTextScale;\n }\n\n this._myValueEditActive = active;\n }\n }\n\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\n if (this._isActive() || !active) {\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\n let oldScrollDirection = this._myScrollDirection;\n\n this.setScrollVariableActive(active, scrollDirection);\n\n if (forceScroll) {\n this._scrollVariableRequest(oldScrollDirection);\n }\n }\n }\n\n _scrollVariableRequest(amount) {\n if (this._isActive() && amount != 0) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n }\n\n _resetValue(index) {\n if (this._isActive()) {\n this._myVariable.myValue[index] = this._myVariable.myInitialValue[index];\n this._myUI.myValueTextComponents[index].text = (this._myVariable.myValue[index]) ? \"true\" : \"false\";\n }\n }\n\n _resetAllValues() {\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._resetValue(i);\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n _genericTextHover(text) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n }\n\n _genericTextUnHover(text, originalScale) {\n text.scalingWorld = originalScale;\n }\n};", "\nPP.EasyTuneBoolArrayWidgetUI = class EasyTuneBoolArrayWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myAdditionalButtonsActive = true;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n if (visible) {\n this.setAdditionalButtonsActive(this._myAdditionalButtonsActive);\n }\n }\n\n setAdditionalButtonsActive(active) {\n this._myAdditionalButtonsActive = active;\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myValueDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n this.myVariableLabelCursorTarget = WL.scene.addObject(this.myVariableLabelPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n\n this.myValuesPanel = WL.scene.addObject(this.myDisplayPanel);\n\n this.myValuePanels = [];\n this.myValueTexts = [];\n this.myValueCursorTargets = [];\n\n this.myValueIncreaseButtonPanels = [];\n this.myValueIncreaseButtonBackgrounds = [];\n this.myValueIncreaseButtonTexts = [];\n this.myValueIncreaseButtonCursorTargets = [];\n\n this.myValueDecreaseButtonPanels = [];\n this.myValueDecreaseButtonBackgrounds = [];\n this.myValueDecreaseButtonTexts = [];\n this.myValueDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i] = WL.scene.addObject(this.myValuesPanel);\n this.myValueTexts[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueCursorTargets[i] = WL.scene.addObject(this.myValuePanels[i]);\n\n //Increase/Decrease\n this.myValueIncreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonTexts[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n\n this.myValueDecreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonTexts[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n }\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n this.myVariableLabelCursorTarget.setTranslationLocal(this._mySetup.myVariableLabelCursorTargetPosition);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValuesPanel.setTranslationLocal(this._mySetup.myValuesPanelPosition);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myValueTexts[i].scale(this._mySetup.myValueTextScale);\n this.myValueCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myValueIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myValueIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValueDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myValueDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.addComponent('cursor-target');\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.addComponent('collision');\n this.myVariableLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myVariableLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myVariableLabelCollisionComponent.extents = this._mySetup.myVariableLabelCollisionExtents;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueTextComponents = [];\n this.myValueCursorTargetComponents = [];\n this.myValueCollisionComponents = [];\n\n this.myValueIncreaseButtonBackgroundComponents = [];\n this.myValueIncreaseButtonTextComponents = [];\n this.myValueIncreaseButtonCursorTargetComponents = [];\n this.myValueIncreaseButtonCollisionComponents = [];\n\n this.myValueDecreaseButtonBackgroundComponents = [];\n this.myValueDecreaseButtonTextComponents = [];\n this.myValueDecreaseButtonCursorTargetComponents = [];\n this.myValueDecreaseButtonCollisionComponents = [];\n\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueTextComponents[i] = this.myValueTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueTextComponents[i]);\n this.myValueTextComponents[i].text = \" \";\n\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].addComponent('cursor-target');\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].addComponent('collision');\n this.myValueCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\n this.myValueIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\n this.myValueDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneBoolArrayWidgetSetup = class EasyTuneBoolArrayWidgetSetup {\n\n constructor(arraySize) {\n this.myArraySize = arraySize;\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00802713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00802713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00802713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let distanceFromValue = 0.055;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [0, 0, -0.00001];\n this.myLeftSideButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myRightSideButtonPosition = [0, 0, -0.00001];\n this.myRightSideButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myIncreaseButtonText = \"+\";\n this.myDecreaseButtonText = \"-\";\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myVariableLabelCursorTargetPosition = [0, 0, 0];\n this.myVariableLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myVariableLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromValue, panelZ];\n\n this.myValueTextScale = [0.4, 0.4, 0.4];\n\n this.myValueCursorTargetPosition = [0, 0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\n\n this.myValuePanelsPositions = [];\n this.myValuePanelsPositions[0] = [0, 0, 0];\n for (let i = 1; i < this.myArraySize; i++) {\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].slice(0);\n this.myValuePanelsPositions[i][1] -= this.myDistanceBetweenValues;\n }\n\n //Background\n {\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myDisplayPanelPosition[1] + this.myValuesPanelPosition[1] + valuePanelLastPosition - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n this.myBackPanelPosition = [0, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [backgroundHalfWidth, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myTextHoverScaleMultiplier = [1.25, 1.25, 1.25];\n\n this.myThumbstickToggleThreshold = 0.6;\n this.myButtonEditDelay = 0;\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "\nPP.EasyTuneBoolWidget = class EasyTuneBoolWidget {\n\n constructor(gamepad) {\n this._myGamepad = gamepad;\n\n this._myParentObject = null;\n this._myAdditionalSetup = null;\n\n this._myWidgets = new Map();\n\n this._myVariable = null;\n this._myIsVisible = true;\n\n this._myAppendToVariableName = null;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myCurrentArraySize = 0;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n this._myCurrentArraySize = this._myVariable.myValue.length;\n this._myAppendToVariableName = appendToVariableName;\n\n if (!this._myWidgets.has(this._myCurrentArraySize)) {\n this._createWidget(this._myCurrentArraySize);\n }\n\n this._myWidgets.get(this._myCurrentArraySize).setEasyTuneVariable(variable, appendToVariableName);\n\n this.setVisible(this._myIsVisible);\n }\n\n setVisible(visible) {\n for (let widget of this._myWidgets.values()) {\n widget.setVisible(false);\n }\n\n if (this._myVariable) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).setVisible(visible);\n }\n\n this._myIsVisible = visible;\n }\n\n isScrollVariableActive() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.isScrollVariableActive();\n }\n\n return false;\n }\n\n getScrollVariableDirection() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.getScrollVariableDirection();\n }\n\n return 0;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n widget.setScrollVariableActive(active, scrollDirection);\n }\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myParentObject = parentObject;\n this._myAdditionalSetup = additionalSetup;\n\n this._createWidget(1);\n\n if (this._myVariable) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n\n update(dt) {\n if (this._isActive()) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).update(dt);\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _scrollVariableRequest(amount) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n\n _createWidget(arraySize) {\n this._myWidgets.set(arraySize, new PP.EasyTuneBoolArrayWidget(arraySize, this._myGamepad));\n this._myWidgets.get(arraySize).start(this._myParentObject, this._myAdditionalSetup);\n this._myWidgets.get(arraySize).setVisible(false);\n this._myWidgets.get(arraySize).registerScrollVariableRequestEventListener(this, this._scrollVariableRequest.bind(this));\n }\n\n _sizeChangedCheck() {\n if (this._myVariable.myValue.length != this._myCurrentArraySize) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n};", "\r\nPP.EasyTuneNoneWidget = class EasyTuneNoneWidget {\r\n\r\n constructor() {\r\n this._mySetup = new PP.EasyTuneNoneWidgetSetup();\r\n this._myUI = new PP.EasyTuneNoneWidgetUI();\r\n\r\n this._myVariable = null;\r\n\r\n this._myIsVisible = true;\r\n\r\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\r\n\r\n this._myAppendToVariableName = \"\";\r\n\r\n this._myScrollVariableActive = false;\r\n this._myScrollDirection = 0;\r\n this._myScrollVariableTimer = 0;\r\n this._myHasScrolled = false;\r\n }\r\n\r\n setEasyTuneVariable(variable, appendToVariableName) {\r\n this._myVariable = variable;\r\n\r\n if ((typeof appendToVariableName) !== 'undefined') {\r\n this._myAppendToVariableName = appendToVariableName;\r\n } else {\r\n this._myAppendToVariableName = \"\";\r\n }\r\n\r\n this._refreshUI();\r\n }\r\n\r\n isScrollVariableActive() {\r\n return this._myScrollVariableActive;\r\n }\r\n\r\n getScrollVariableDirection() {\r\n return this._myScrollDirection;\r\n }\r\n\r\n setScrollVariableActive(active, scrollDirection) {\r\n this._myScrollVariableActive = active;\r\n this._myScrollDirection = scrollDirection;\r\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\r\n this._myHasScrolled = false;\r\n }\r\n\r\n _refreshUI() {\r\n if (this._myVariable) {\r\n if (this._myVariable.myName != null) {\r\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\r\n } else {\r\n let name = \"Unknown\";\r\n this._myUI.myVariableLabelTextComponent.text = name.concat(this._myAppendToVariableName);\r\n }\r\n }\r\n }\r\n\r\n setVisible(visible) {\r\n if (visible) {\r\n this._refreshUI();\r\n }\r\n this._myUI.setVisible(visible);\r\n\r\n this._myIsVisible = visible;\r\n }\r\n\r\n registerScrollVariableRequestEventListener(id, callback) {\r\n this._myScrollVariableRequestCallbacks.set(id, callback);\r\n }\r\n\r\n unregisterScrollVariableRequestEventListener(id) {\r\n this._myScrollVariableRequestCallbacks.delete(id);\r\n }\r\n\r\n start(parentObject, additionalSetup) {\r\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\r\n\r\n this._addListeners();\r\n }\r\n\r\n update(dt) {\r\n if (this._isActive()) {\r\n this._updateScrollVariable(dt);\r\n }\r\n }\r\n\r\n _updateScrollVariable(dt) {\r\n if (this._myScrollVariableActive) {\r\n if (this._myScrollVariableTimer <= 0) {\r\n this._scrollVariableRequest(this._myScrollDirection);\r\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\r\n this._myHasScrolled = true;\r\n } else {\r\n this._myScrollVariableTimer -= dt;\r\n }\r\n }\r\n }\r\n\r\n _isActive() {\r\n return this._myIsVisible && this._myVariable;\r\n }\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n\r\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n }\r\n\r\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\r\n if (this._isActive() || !active) {\r\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\r\n let oldScrollDirection = this._myScrollDirection;\r\n\r\n this.setScrollVariableActive(active, scrollDirection);\r\n\r\n if (forceScroll) {\r\n this._scrollVariableRequest(oldScrollDirection);\r\n }\r\n }\r\n }\r\n\r\n _scrollVariableRequest(amount) {\r\n if (this._isActive() && amount != 0) {\r\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\r\n callback(amount);\r\n }\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._mySetup.myButtonHoverColor;\r\n }\r\n\r\n _genericUnHover(material) {\r\n material.color = this._mySetup.myBackgroundColor;\r\n }\r\n};", "\nPP.EasyTuneNoneWidgetUI = class EasyTuneNoneWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n\n this.myTypeNotSupportedPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myTypeNotSupportedText = WL.scene.addObject(this.myTypeNotSupportedPanel);\n this.myTypeNotSupportedCursorTarget = WL.scene.addObject(this.myTypeNotSupportedPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n\n this.myTypeNotSupportedPanel.setTranslationLocal(this._mySetup.myTypeNotSupportedPanelPosition);\n this.myTypeNotSupportedText.scale(this._mySetup.myTypeNotSupportedTextScale);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myTypeNotSupportedTextComponent = this.myTypeNotSupportedText.addComponent('text');\n this._setupTextComponent(this.myTypeNotSupportedTextComponent);\n this.myTypeNotSupportedTextComponent.text = this._mySetup.myTypeNotSupportedText;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneNoneWidgetSetup = class EasyTuneNoneWidgetSetup {\n\n constructor() {\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00804713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00804713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00804713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [0, 0, -0.00001];\n this.myLeftSideButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myRightSideButtonPosition = [0, 0, -0.00001];\n this.myRightSideButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myTypeNotSupportedPanelPosition = [0, -0.03, panelZ];\n this.myTypeNotSupportedTextScale = [0.275, 0.275, 0.275];\n this.myTypeNotSupportedText = \"Type Not Supported\";\n\n this.myValueCursorTargetPosition = [0, 0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n //Background\n {\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myDisplayPanelPosition[1] + this.myTypeNotSupportedPanelPosition[1] - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n this.myBackPanelPosition = [0, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [backgroundHalfWidth, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "\nPP.EasyTuneNumberArrayWidget = class EasyTuneNumberArrayWidget {\n\n constructor(arraySize, gamepad) {\n this._myGamepad = gamepad;\n\n this._mySetup = new PP.EasyTuneNumberArrayWidgetSetup(arraySize);\n this._myUI = new PP.EasyTuneNumberArrayWidgetUI();\n\n this._myVariable = null;\n\n this._myIsVisible = true;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myAppendToVariableName = \"\";\n\n this._myValueEditIndex = -1;\n\n this._myValueButtonEditIntensity = 0;\n this._myValueButtonEditIntensityTimer = 0;\n this._myStepButtonEditIntensity = 0;\n this._myStepButtonEditIntensityTimer = 0;\n\n this._myValueEditActive = false;\n this._myStepEditActive = false;\n\n this._myValueRealValue = null;\n this._myStepMultiplierValue = null;\n this._myStepFastEdit = false;\n\n this._myScrollVariableActive = false;\n this._myScrollDirection = 0;\n this._myScrollVariableTimer = 0;\n this._myHasScrolled = false;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n\n if ((typeof appendToVariableName) !== 'undefined') {\n this._myAppendToVariableName = appendToVariableName;\n } else {\n this._myAppendToVariableName = \"\";\n }\n\n if (this._myValueEditIndex >= 0) {\n this._myValueRealValue = this._myVariable.myValue[this._myValueEditIndex];\n }\n\n this._refreshUI();\n }\n\n isScrollVariableActive() {\n return this._myScrollVariableActive;\n }\n\n getScrollVariableDirection() {\n return this._myScrollDirection;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n this._myScrollVariableActive = active;\n this._myScrollDirection = scrollDirection;\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = false;\n }\n\n _refreshUI() {\n if (this._myVariable) {\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._myUI.myValueTextComponents[i].text = this._myVariable.myValue[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n\n this._myUI.myStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myStepPerSecond);\n }\n }\n\n setVisible(visible) {\n if (visible) {\n this._refreshUI();\n }\n this._myUI.setVisible(visible);\n\n this._myIsVisible = visible;\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setAdditionalButtonsActive(additionalSetup.myEnableAdditionalButtons);\n\n this._addListeners();\n }\n\n update(dt) {\n if (this._isActive()) {\n this._updateValue(dt);\n this._updateScrollVariable(dt);\n }\n }\n\n _updateValue(dt) {\n let stickVariableIntensity = 0;\n\n if (this._myGamepad) {\n let y = this._myGamepad.getAxesInfo().myAxes[1];\n\n if (Math.abs(y) > this._mySetup.myEditThumbstickMinThreshold) {\n let normalizedEditAmount = (Math.abs(y) - this._mySetup.myEditThumbstickMinThreshold) / (1 - this._mySetup.myEditThumbstickMinThreshold);\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\n }\n }\n\n let valueIntensity = 0;\n if (this._myValueEditActive) {\n valueIntensity = stickVariableIntensity;\n } else if (this._myValueButtonEditIntensity != 0) {\n if (this._myValueButtonEditIntensityTimer <= 0) {\n valueIntensity = this._myValueButtonEditIntensity;\n } else {\n this._myValueButtonEditIntensityTimer -= dt;\n }\n }\n\n if (valueIntensity != 0) {\n let amountToAdd = valueIntensity * this._myVariable.myStepPerSecond * dt;\n\n this._myValueRealValue += amountToAdd;\n\n if (this._myVariable.myMin != null && this._myVariable.myMax != null) {\n this._myValueRealValue = Math.pp_clamp(this._myValueRealValue, this._myVariable.myMin, this._myVariable.myMax);\n } else if (this._myVariable.myMin != null) {\n this._myValueRealValue = Math.max(this._myValueRealValue, this._myVariable.myMin);\n } else if (this._myVariable.myMax != null) {\n this._myValueRealValue = Math.min(this._myValueRealValue, this._myVariable.myMax);\n }\n\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable.myDecimalPlaces);\n\n if (this._myVariable.myEditAllValuesTogether) {\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n let difference = newValue - this._myVariable.myValue[this._myValueEditIndex];\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._myVariable.myValue[i] = Math.round((this._myVariable.myValue[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n\n if (this._myVariable.myMin != null && this._myVariable.myMax != null) {\n this._myVariable.myValue[i] = Math.pp_clamp(this._myVariable.myValue[i], this._myVariable.myMin, this._myVariable.myMax);\n } else if (this._myVariable.myMin != null) {\n this._myVariable.myValue[i] = Math.max(this._myVariable.myValue[i], this._myVariable.myMin);\n } else if (this._myVariable.myMax != null) {\n this._myVariable.myValue[i] = Math.min(this._myVariable.myValue[i], this._myVariable.myMax);\n }\n\n this._myUI.myValueTextComponents[i].text = this._myVariable.myValue[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n\n } else {\n this._myVariable.myValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n\n if (this._myVariable.myMin != null && this._myVariable.myMax != null) {\n this._myVariable.myValue[this._myValueEditIndex] = Math.pp_clamp(this._myVariable.myValue[this._myValueEditIndex], this._myVariable.myMin, this._myVariable.myMax);\n } else if (this._myVariable.myMin != null) {\n this._myVariable.myValue[this._myValueEditIndex] = Math.max(this._myVariable.myValue[this._myValueEditIndex], this._myVariable.myMin);\n } else if (this._myVariable.myMax != null) {\n this._myVariable.myValue[this._myValueEditIndex] = Math.min(this._myVariable.myValue[this._myValueEditIndex], this._myVariable.myMax);\n }\n\n this._myUI.myValueTextComponents[this._myValueEditIndex].text = this._myVariable.myValue[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n }\n } else {\n this._myValueRealValue = this._myVariable.myValue[this._myValueEditIndex];\n }\n\n let stepIntensity = 0;\n if (this._myStepEditActive) {\n stepIntensity = stickVariableIntensity;\n } else if (this._myStepButtonEditIntensity != 0) {\n if (this._myStepButtonEditIntensityTimer <= 0) {\n stepIntensity = this._myStepButtonEditIntensity;\n } else {\n this._myStepButtonEditIntensityTimer -= dt;\n }\n }\n\n if (stepIntensity != 0) {\n let amountToAdd = 0;\n if (this._myStepFastEdit) {\n amountToAdd = Math.sign(stepIntensity) * 1;\n this._myStepFastEdit = false;\n } else {\n amountToAdd = stepIntensity * this._mySetup.myStepMultiplierStepPerSecond * dt;\n }\n\n this._myStepMultiplierValue += amountToAdd;\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\n if (Math.sign(this._myStepMultiplierValue) > 0) {\n this._myStepMultiplierValue -= 1;\n this._changeStep(this._myVariable.myStepPerSecond * 10);\n } else {\n this._myStepMultiplierValue += 1;\n this._changeStep(this._myVariable.myStepPerSecond * 0.1);\n }\n }\n } else {\n this._myStepMultiplierValue = 0;\n this._myStepFastEdit = true;\n }\n }\n\n _updateScrollVariable(dt) {\n if (this._myScrollVariableActive) {\n if (this._myScrollVariableTimer <= 0) {\n this._scrollVariableRequest(this._myScrollDirection);\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = true;\n } else {\n this._myScrollVariableTimer -= dt;\n }\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myVariableLabelCursorTargetComponent.addClickFunction(this._resetAllValues.bind(this));\n ui.myVariableLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myVariableLabelText));\n ui.myVariableLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myVariableLabelText, this._mySetup.myVariableLabelTextScale));\n\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n\n ui.myValueIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n\n ui.myValueCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, i));\n ui.myValueCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], true));\n ui.myValueCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], false));\n }\n\n ui.myStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this));\n ui.myStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, ui.myStepText, true));\n ui.myStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, ui.myStepText, false));\n\n ui.myStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 1));\n ui.myStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 1));\n ui.myStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, -1));\n ui.myStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, -1));\n ui.myStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0));\n\n ui.myStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\n ui.myStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\n ui.myStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\n ui.myStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\n }\n\n _setValueEditIntensity(index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myValueButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n this._myValueRealValue = this._myVariable.myValue[index];\n this._myValueEditIndex = index;\n }\n\n this._myValueButtonEditIntensity = value;\n }\n }\n\n _setStepEditIntensity(value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myStepButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n }\n\n this._myStepButtonEditIntensity = value;\n }\n }\n\n _setValueEditActive(index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n this._myValueRealValue = this._myVariable.myValue[index];\n this._myValueEditIndex = index;\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myValueTextScale;\n }\n\n this._myValueEditActive = active;\n }\n }\n\n _setStepEditActive(text, active) {\n if (this._isActive() || !active) {\n if (active) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myStepTextScale;\n }\n\n this._myStepEditActive = active;\n }\n }\n\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\n if (this._isActive() || !active) {\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\n let oldScrollDirection = this._myScrollDirection;\n\n this.setScrollVariableActive(active, scrollDirection);\n\n if (forceScroll) {\n this._scrollVariableRequest(oldScrollDirection);\n }\n }\n }\n\n _scrollVariableRequest(amount) {\n if (this._isActive() && amount != 0) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n }\n\n _resetValue(index) {\n if (this._isActive()) {\n this._myVariable.myValue[index] = this._myVariable.myInitialValue[index];\n this._myUI.myValueTextComponents[index].text = this._myVariable.myValue[index].toFixed(this._myVariable.myDecimalPlaces);\n }\n }\n\n _resetAllValues() {\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._resetValue(i);\n }\n }\n\n _resetStep() {\n if (this._isActive()) {\n this._changeStep(this._myVariable.myInitialStepPerSecond);\n }\n }\n\n _changeStep(step) {\n step = Math.pp_roundDecimal(step, 10);\n this._myVariable.myStepPerSecond = step;\n this._myUI.myStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myStepPerSecond);\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n _genericTextHover(text) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n }\n\n _genericTextUnHover(text, originalScale) {\n text.scalingWorld = originalScale;\n }\n};", "\nPP.EasyTuneNumberArrayWidgetUI = class EasyTuneNumberArrayWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myAdditionalButtonsActive = true;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n if (visible) {\n this.setAdditionalButtonsActive(this._myAdditionalButtonsActive);\n }\n }\n\n setAdditionalButtonsActive(active) {\n this._myAdditionalButtonsActive = active;\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myValueDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createStepSkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n this.myVariableLabelCursorTarget = WL.scene.addObject(this.myVariableLabelPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n\n this.myValuesPanel = WL.scene.addObject(this.myDisplayPanel);\n\n this.myValuePanels = [];\n this.myValueTexts = [];\n this.myValueCursorTargets = [];\n\n this.myValueIncreaseButtonPanels = [];\n this.myValueIncreaseButtonBackgrounds = [];\n this.myValueIncreaseButtonTexts = [];\n this.myValueIncreaseButtonCursorTargets = [];\n\n this.myValueDecreaseButtonPanels = [];\n this.myValueDecreaseButtonBackgrounds = [];\n this.myValueDecreaseButtonTexts = [];\n this.myValueDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i] = WL.scene.addObject(this.myValuesPanel);\n this.myValueTexts[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueCursorTargets[i] = WL.scene.addObject(this.myValuePanels[i]);\n\n //Increase/Decrease\n this.myValueIncreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonTexts[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n\n this.myValueDecreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonTexts[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n }\n }\n\n _createStepSkeleton() {\n this.myStepPanel = WL.scene.addObject(this.myPivotObject);\n this.myStepText = WL.scene.addObject(this.myStepPanel);\n this.myStepCursorTarget = WL.scene.addObject(this.myStepPanel);\n\n //Increase/Decrease\n this.myStepIncreaseButtonPanel = WL.scene.addObject(this.myStepPanel);\n this.myStepIncreaseButtonBackground = WL.scene.addObject(this.myStepIncreaseButtonPanel);\n this.myStepIncreaseButtonText = WL.scene.addObject(this.myStepIncreaseButtonPanel);\n this.myStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myStepIncreaseButtonPanel);\n\n this.myStepDecreaseButtonPanel = WL.scene.addObject(this.myStepPanel);\n this.myStepDecreaseButtonBackground = WL.scene.addObject(this.myStepDecreaseButtonPanel);\n this.myStepDecreaseButtonText = WL.scene.addObject(this.myStepDecreaseButtonPanel);\n this.myStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myStepDecreaseButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setStepTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n this.myVariableLabelCursorTarget.setTranslationLocal(this._mySetup.myVariableLabelCursorTargetPosition);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValuesPanel.setTranslationLocal(this._mySetup.myValuesPanelPosition);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myValueTexts[i].scale(this._mySetup.myValueTextScale);\n this.myValueCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myValueIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myValueIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValueDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myValueDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n }\n\n _setStepTransforms() {\n this.myStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myStepText.scale(this._mySetup.myStepTextScale);\n this.myStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addStepComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.addComponent('cursor-target');\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.addComponent('collision');\n this.myVariableLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myVariableLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myVariableLabelCollisionComponent.extents = this._mySetup.myVariableLabelCollisionExtents;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueTextComponents = [];\n this.myValueCursorTargetComponents = [];\n this.myValueCollisionComponents = [];\n\n this.myValueIncreaseButtonBackgroundComponents = [];\n this.myValueIncreaseButtonTextComponents = [];\n this.myValueIncreaseButtonCursorTargetComponents = [];\n this.myValueIncreaseButtonCollisionComponents = [];\n\n this.myValueDecreaseButtonBackgroundComponents = [];\n this.myValueDecreaseButtonTextComponents = [];\n this.myValueDecreaseButtonCursorTargetComponents = [];\n this.myValueDecreaseButtonCollisionComponents = [];\n\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueTextComponents[i] = this.myValueTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueTextComponents[i]);\n this.myValueTextComponents[i].text = \" \";\n\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].addComponent('cursor-target');\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].addComponent('collision');\n this.myValueCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\n this.myValueIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\n this.myValueDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n }\n\n _addStepComponents() {\n this.myStepTextComponent = this.myStepText.addComponent('text');\n this._setupTextComponent(this.myStepTextComponent);\n this.myStepTextComponent.text = \" \";\n\n this.myStepCursorTargetComponent = this.myStepCursorTarget.addComponent('cursor-target');\n this.myStepCollisionComponent = this.myStepCursorTarget.addComponent('collision');\n this.myStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myStepIncreaseButtonBackgroundComponent = this.myStepIncreaseButtonBackground.addComponent('mesh');\n this.myStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myStepIncreaseButtonTextComponent = this.myStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myStepIncreaseButtonTextComponent);\n this.myStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myStepIncreaseButtonCursorTargetComponent = this.myStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myStepIncreaseButtonCollisionComponent = this.myStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myStepDecreaseButtonBackgroundComponent = this.myStepDecreaseButtonBackground.addComponent('mesh');\n this.myStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myStepDecreaseButtonTextComponent = this.myStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myStepDecreaseButtonTextComponent);\n this.myStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myStepDecreaseButtonCursorTargetComponent = this.myStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myStepDecreaseButtonCollisionComponent = this.myStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneNumberArrayWidgetSetup = class EasyTuneNumberArrayWidgetSetup {\n\n constructor(arraySize) {\n this.myArraySize = arraySize;\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00803713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00803713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00803713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let distanceFromValue = 0.055;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [0, 0, -0.00001];\n this.myLeftSideButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myRightSideButtonPosition = [0, 0, -0.00001];\n this.myRightSideButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myIncreaseButtonText = \"+\";\n this.myDecreaseButtonText = \"-\";\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myVariableLabelCursorTargetPosition = [0, 0, 0];\n this.myVariableLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myVariableLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromValue, panelZ];\n\n this.myValueTextScale = [0.4, 0.4, 0.4];\n\n this.myValueCursorTargetPosition = [0, 0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\n\n this.myValuePanelsPositions = [];\n this.myValuePanelsPositions[0] = [0, 0, 0];\n for (let i = 1; i < this.myArraySize; i++) {\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].slice(0);\n this.myValuePanelsPositions[i][1] -= this.myDistanceBetweenValues;\n }\n\n //Step\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\n this.myStepPanelPosition = [0, this.myDisplayPanelPosition[1] + this.myValuesPanelPosition[1] + valuePanelLastPosition - distanceFromValue, panelZ];\n this.myStepTextScale = [0.19, 0.19, 0.19];\n this.myStepStartString = \"Step: \";\n\n this.myStepCursorTargetPosition = [0, 0, 0];\n this.myStepCursorTargetPosition[2] = colliderZPosition - this.myStepPanelPosition[2];\n this.myStepCollisionExtents = [0.065, 0.0175, 1];\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n //Background\n {\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myStepPanelPosition[1] - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n this.myBackPanelPosition = [0, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [backgroundHalfWidth, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myTextHoverScaleMultiplier = [1.25, 1.25, 1.25];\n\n this.myEditThumbstickMinThreshold = 0.35;\n this.myStepMultiplierStepPerSecond = 2.25;\n this.myButtonEditDelay = 0;\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "\nPP.EasyTuneNumberWidget = class EasyTuneNumberWidget {\n\n constructor(gamepad) {\n this._myGamepad = gamepad;\n\n this._myParentObject = null;\n this._myAdditionalSetup = null;\n\n this._myWidgets = new Map();\n\n this._myVariable = null;\n this._myIsVisible = true;\n\n this._myAppendToVariableName = null;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myCurrentArraySize = 0;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n this._myCurrentArraySize = this._myVariable.myValue.length;\n this._myAppendToVariableName = appendToVariableName;\n\n if (!this._myWidgets.has(this._myCurrentArraySize)) {\n this._createWidget(this._myCurrentArraySize);\n }\n\n this._myWidgets.get(this._myCurrentArraySize).setEasyTuneVariable(variable, appendToVariableName);\n\n this.setVisible(this._myIsVisible);\n }\n\n setVisible(visible) {\n for (let widget of this._myWidgets.values()) {\n widget.setVisible(false);\n }\n\n if (this._myVariable) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).setVisible(visible);\n }\n\n this._myIsVisible = visible;\n }\n\n isScrollVariableActive() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.isScrollVariableActive();\n }\n\n return false;\n }\n\n getScrollVariableDirection() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.getScrollVariableDirection();\n }\n\n return 0;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n widget.setScrollVariableActive(active, scrollDirection);\n }\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myParentObject = parentObject;\n this._myAdditionalSetup = additionalSetup;\n\n this._createWidget(1);\n\n if (this._myVariable) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n\n update(dt) {\n if (this._isActive()) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).update(dt);\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _scrollVariableRequest(amount) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n\n _createWidget(arraySize) {\n this._myWidgets.set(arraySize, new PP.EasyTuneNumberArrayWidget(arraySize, this._myGamepad));\n this._myWidgets.get(arraySize).start(this._myParentObject, this._myAdditionalSetup);\n this._myWidgets.get(arraySize).setVisible(false);\n this._myWidgets.get(arraySize).registerScrollVariableRequestEventListener(this, this._scrollVariableRequest.bind(this));\n }\n\n _sizeChangedCheck() {\n if (this._myVariable.myValue.length != this._myCurrentArraySize) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n};", "PP.EasyTuneTransformWidget = class EasyTuneTransformWidget {\n\n constructor(gamepad) {\n this._myGamepad = gamepad;\n\n this._mySetup = new PP.EasyTuneTransformWidgetSetup();\n this._myUI = new PP.EasyTuneTransformWidgetUI();\n\n this._myVariable = null;\n\n this._myIsVisible = true;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myAppendToVariableName = \"\";\n\n this._myValueButtonEditIntensity = 0;\n this._myValueButtonEditIntensityTimer = 0;\n this._myStepButtonEditIntensity = 0;\n this._myStepButtonEditIntensityTimer = 0;\n\n this._myValueEditActive = false;\n this._myStepEditActive = false;\n\n this._myValueRealValue = null;\n this._myComponentStepValue = null;\n this._myStepMultiplierValue = null;\n this._myStepFastEdit = false;\n\n this._myValueEditIndex = -1;\n this._myComponentIndex = 0;\n this._myStepIndex = 0;\n\n this._myScrollVariableActive = false;\n this._myScrollDirection = 0;\n this._myScrollVariableTimer = 0;\n this._myHasScrolled = false;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n\n if ((typeof appendToVariableName) !== 'undefined') {\n this._myAppendToVariableName = appendToVariableName;\n } else {\n this._myAppendToVariableName = \"\";\n }\n\n this._refreshUI();\n }\n\n isScrollVariableActive() {\n return this._myScrollVariableActive;\n }\n\n getScrollVariableDirection() {\n return this._myScrollDirection;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n this._myScrollVariableActive = active;\n this._myScrollDirection = scrollDirection;\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = false;\n }\n\n _refreshUI() {\n if (this._myVariable) {\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\n\n for (let i = 0; i < 3; i++) {\n this._myUI.myPositionTextComponents[i].text = this._myVariable.myPosition[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n this._myUI.myPositionStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myPositionStepPerSecond);\n\n for (let i = 0; i < 3; i++) {\n this._myUI.myRotationTextComponents[i].text = this._myVariable.myRotation[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n this._myUI.myRotationStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myRotationStepPerSecond);\n\n for (let i = 0; i < 3; i++) {\n this._myUI.myScaleTextComponents[i].text = this._myVariable.myScale[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n this._myUI.myScaleStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myScaleStepPerSecond);\n }\n }\n\n setVisible(visible) {\n if (visible) {\n this._refreshUI();\n }\n this._myUI.setVisible(visible);\n\n this._myIsVisible = visible;\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setAdditionalButtonsActive(additionalSetup.myEnableAdditionalButtons);\n\n this._addListeners();\n }\n\n update(dt) {\n if (this._isActive()) {\n this._updateValue(dt);\n this._updateScrollVariable(dt);\n }\n }\n\n _updateValue(dt) {\n let stickVariableIntensity = 0;\n\n if (this._myGamepad) {\n let y = this._myGamepad.getAxesInfo().myAxes[1];\n\n if (Math.abs(y) > this._mySetup.myEditThumbstickMinThreshold) {\n let normalizedEditAmount = (Math.abs(y) - this._mySetup.myEditThumbstickMinThreshold) / (1 - this._mySetup.myEditThumbstickMinThreshold);\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\n }\n }\n\n let valueIntensity = 0;\n if (this._myValueEditActive) {\n valueIntensity = stickVariableIntensity;\n } else if (this._myValueButtonEditIntensity != 0) {\n if (this._myValueButtonEditIntensityTimer <= 0) {\n valueIntensity = this._myValueButtonEditIntensity;\n } else {\n this._myValueButtonEditIntensityTimer -= dt;\n }\n }\n\n if (valueIntensity != 0) {\n let amountToAdd = valueIntensity * this._myComponentStepValue * dt;\n\n this._myValueRealValue += amountToAdd;\n\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable.myDecimalPlaces);\n\n switch (this._myComponentIndex) {\n case 0:\n this._myVariable.myPosition[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myUI.myPositionTextComponents[this._myValueEditIndex].text = this._myVariable.myPosition[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 1:\n if (this._myValueRealValue > 180) {\n while (this._myValueRealValue > 180) {\n this._myValueRealValue -= 180;\n }\n this._myValueRealValue = -180 + this._myValueRealValue;\n }\n\n if (this._myValueRealValue < -180) {\n while (this._myValueRealValue < - 180) {\n this._myValueRealValue += 180;\n }\n this._myValueRealValue = 180 - this._myValueRealValue;\n }\n\n this._myVariable.myRotation[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myUI.myRotationTextComponents[this._myValueEditIndex].text = this._myVariable.myRotation[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 2:\n if (this._myValueRealValue <= 0) {\n this._myValueRealValue = 1 / decimalPlacesMultiplier;\n }\n\n if (this._myVariable.myScaleAsOne) {\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n let difference = newValue - this._myVariable.myScale[this._myValueEditIndex];\n\n for (let i = 0; i < 3; i++) {\n this._myVariable.myScale[i] = Math.round((this._myVariable.myScale[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myVariable.myScale[i] = Math.max(this._myVariable.myScale[i], 1 / decimalPlacesMultiplier);\n this._myUI.myScaleTextComponents[i].text = this._myVariable.myScale[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n } else {\n this._myVariable.myScale[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myVariable.myScale[this._myValueEditIndex] = Math.max(this._myVariable.myScale[this._myValueEditIndex], 1 / decimalPlacesMultiplier);\n this._myUI.myScaleTextComponents[this._myValueEditIndex].text = this._myVariable.myScale[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n }\n break;\n }\n } else {\n switch (this._myComponentIndex) {\n case 0:\n this._myValueRealValue = this._myVariable.myPosition[this._myValueEditIndex];\n break;\n case 1:\n this._myValueRealValue = this._myVariable.myRotation[this._myValueEditIndex];\n break;\n case 2:\n this._myValueRealValue = this._myVariable.myScale[this._myValueEditIndex];\n break;\n }\n }\n\n let stepIntensity = 0;\n if (this._myStepEditActive) {\n stepIntensity = stickVariableIntensity;\n } else if (this._myStepButtonEditIntensity != 0) {\n if (this._myStepButtonEditIntensityTimer <= 0) {\n stepIntensity = this._myStepButtonEditIntensity;\n } else {\n this._myStepButtonEditIntensityTimer -= dt;\n }\n }\n\n if (stepIntensity != 0) {\n let amountToAdd = 0;\n if (this._myStepFastEdit) {\n amountToAdd = Math.sign(stepIntensity) * 1;\n this._myStepFastEdit = false;\n } else {\n amountToAdd = stepIntensity * this._mySetup.myStepMultiplierStepPerSecond * dt;\n }\n\n this._myStepMultiplierValue += amountToAdd;\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\n let stepValue = 0;\n switch (this._myStepIndex) {\n case 0:\n stepValue = this._myVariable.myPositionStepPerSecond;\n break;\n case 1:\n stepValue = this._myVariable.myRotationStepPerSecond;\n break;\n case 2:\n stepValue = this._myVariable.myScaleStepPerSecond;\n break;\n default:\n stepValue = 0;\n }\n if (Math.sign(this._myStepMultiplierValue) > 0) {\n this._myStepMultiplierValue -= 1;\n this._changeStep(this._myStepIndex, stepValue * 10);\n } else {\n this._myStepMultiplierValue += 1;\n this._changeStep(this._myStepIndex, stepValue * 0.1);\n }\n }\n } else {\n this._myStepMultiplierValue = 0;\n this._myStepFastEdit = true;\n }\n }\n\n _updateScrollVariable(dt) {\n if (this._myScrollVariableActive) {\n if (this._myScrollVariableTimer <= 0) {\n this._scrollVariableRequest(this._myScrollDirection);\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = true;\n } else {\n this._myScrollVariableTimer -= dt;\n }\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myVariableLabelCursorTargetComponent.addClickFunction(this._resetAllValues.bind(this));\n ui.myVariableLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myVariableLabelText));\n ui.myVariableLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myVariableLabelText, this._mySetup.myVariableLabelTextScale));\n\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n\n ui.myPositionLabelCursorTargetComponent.addClickFunction(this._resetComponentValues.bind(this, 0));\n ui.myPositionLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myPositionLabelText));\n ui.myPositionLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myPositionLabelText, this._mySetup.myComponentLabelTextScale));\n for (let i = 0; i < 3; i++) {\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 0, i, 1));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, 1));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 0, i, -1));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, -1));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\n\n ui.myPositionCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, 0, i));\n ui.myPositionCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, 0, i, ui.myPositionTexts[i], true));\n ui.myPositionCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, 0, i, ui.myPositionTexts[i], false));\n }\n\n ui.myRotationLabelCursorTargetComponent.addClickFunction(this._resetComponentValues.bind(this, 1));\n ui.myRotationLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myRotationLabelText));\n ui.myRotationLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myRotationLabelText, this._mySetup.myComponentLabelTextScale));\n for (let i = 0; i < 3; i++) {\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 1, i, 1));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, 1));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 1, i, -1));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, -1));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\n\n ui.myRotationCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, 1, i));\n ui.myRotationCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, 1, i, ui.myRotationTexts[i], true));\n ui.myRotationCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, 1, i, ui.myRotationTexts[i], false));\n }\n\n ui.myScaleLabelCursorTargetComponent.addClickFunction(this._resetComponentValues.bind(this, 2));\n ui.myScaleLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myScaleLabelText));\n ui.myScaleLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myScaleLabelText, this._mySetup.myComponentLabelTextScale));\n for (let i = 0; i < 3; i++) {\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 2, i, 1));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, 1));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 2, i, -1));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, -1));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\n\n ui.myScaleCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, 2, i));\n ui.myScaleCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, 2, i, ui.myScaleTexts[i], true));\n ui.myScaleCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, 2, i, ui.myScaleTexts[i], false));\n }\n\n ui.myPositionStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this, 0));\n ui.myPositionStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, 0, ui.myPositionStepText, true));\n ui.myPositionStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, 0, ui.myPositionStepText, false));\n\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 0, 1));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 0, 1));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 0, -1));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 0, -1));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0, 0));\n\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\n\n ui.myRotationStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this, 1));\n ui.myRotationStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, 1, ui.myRotationStepText, true));\n ui.myRotationStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, 1, ui.myRotationStepText, false));\n\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 1, 1));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 1, 1));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 1, -1));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 1, -1));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 1, 0));\n\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\n\n ui.myScaleStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this, 2));\n ui.myScaleStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, 2, ui.myScaleStepText, true));\n ui.myScaleStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, 2, ui.myScaleStepText, false));\n\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 2, 1));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 2, 1));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 2, -1));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 2, -1));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 2, 0));\n\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\n\n }\n\n _setValueEditIntensity(componentIndex, index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n switch (componentIndex) {\n case 0:\n this._myValueRealValue = this._myVariable.myPosition[index];\n this._myComponentStepValue = this._myVariable.myPositionStepPerSecond;\n break;\n case 1:\n this._myValueRealValue = this._myVariable.myRotation[index];\n this._myComponentStepValue = this._myVariable.myRotationStepPerSecond;\n break;\n case 2:\n this._myValueRealValue = this._myVariable.myScale[index];\n this._myComponentStepValue = this._myVariable.myScaleStepPerSecond;\n break;\n }\n\n this._myValueButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n this._myValueEditIndex = index;\n this._myComponentIndex = componentIndex;\n }\n\n this._myValueButtonEditIntensity = value;\n }\n }\n\n _setStepEditIntensity(index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myStepButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n }\n\n this._myStepButtonEditIntensity = value;\n\n this._myStepIndex = index;\n }\n }\n\n _setValueEditActive(componentIndex, index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n switch (componentIndex) {\n case 0:\n this._myValueRealValue = this._myVariable.myPosition[index];\n this._myComponentStepValue = this._myVariable.myPositionStepPerSecond;\n break;\n case 1:\n this._myValueRealValue = this._myVariable.myRotation[index];\n this._myComponentStepValue = this._myVariable.myRotationStepPerSecond;\n break;\n case 2:\n this._myValueRealValue = this._myVariable.myScale[index];\n this._myComponentStepValue = this._myVariable.myScaleStepPerSecond;\n break;\n }\n\n this._myValueEditIndex = index;\n this._myComponentIndex = componentIndex;\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myValueTextScale;\n }\n\n this._myValueEditActive = active;\n }\n }\n\n _setStepEditActive(index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myStepTextScale;\n }\n\n this._myStepEditActive = active;\n this._myStepIndex = index;\n }\n }\n\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\n if (this._isActive() || !active) {\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\n let oldScrollDirection = this._myScrollDirection;\n\n this.setScrollVariableActive(active, scrollDirection);\n\n if (forceScroll) {\n this._scrollVariableRequest(oldScrollDirection);\n }\n }\n }\n\n _scrollVariableRequest(amount) {\n if (this._isActive() && amount != 0) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n }\n\n _resetValue(componentIndex, index) {\n if (this._isActive()) {\n switch (componentIndex) {\n case 0:\n this._myVariable.myPosition[index] = this._myVariable.myInitialPosition[index];\n this._myUI.myPositionTextComponents[index].text = this._myVariable.myPosition[index].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 1:\n this._myVariable.myRotation[index] = this._myVariable.myInitialRotation[index];\n this._myUI.myRotationTextComponents[index].text = this._myVariable.myRotation[index].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 2:\n this._myVariable.myScale[index] = this._myVariable.myInitialScale[index];\n this._myUI.myScaleTextComponents[index].text = this._myVariable.myScale[index].toFixed(this._myVariable.myDecimalPlaces);\n break;\n default:\n initialValue = 0;\n }\n }\n }\n\n _resetAllValues() {\n for (let i = 0; i < 3; i++) {\n this._resetComponentValues(i);\n }\n }\n\n _resetComponentValues(index) {\n for (let i = 0; i < 3; i++) {\n this._resetValue(index, i);\n }\n }\n\n _resetStep(index) {\n if (this._isActive()) {\n let initialValue = 0;\n switch (index) {\n case 0:\n initialValue = this._myVariable.myInitialPositionStepPerSecond;\n break;\n case 1:\n initialValue = this._myVariable.myInitialRotationStepPerSecond;\n break;\n case 2:\n initialValue = this._myVariable.myInitialScaleStepPerSecond;\n break;\n default:\n initialValue = 0;\n }\n\n this._changeStep(index, initialValue);\n }\n }\n\n _changeStep(index, step) {\n step = Math.pp_roundDecimal(step, 10);\n\n switch (index) {\n case 0:\n this._myVariable.myPositionStepPerSecond = step;\n this._myUI.myPositionStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myPositionStepPerSecond);\n break;\n case 1:\n this._myVariable.myRotationStepPerSecond = step;\n this._myUI.myRotationStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myRotationStepPerSecond);\n break;\n case 2:\n this._myVariable.myScaleStepPerSecond = step;\n this._myUI.myScaleStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myScaleStepPerSecond);\n break;\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n _genericTextHover(text) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n }\n\n _genericTextUnHover(text, originalScale) {\n text.scalingWorld = originalScale;\n }\n};", "\nPP.EasyTuneTransformWidgetUI = class EasyTuneTransformWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myAdditionalButtonsActive = true;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n if (visible) {\n this.setAdditionalButtonsActive(this._myAdditionalButtonsActive);\n }\n }\n\n setAdditionalButtonsActive(active) {\n this._myAdditionalButtonsActive = active;\n\n for (let i = 0; i < 3; i++) {\n this.myPositionIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myPositionDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myPositionStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myPositionStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n\n for (let i = 0; i < 3; i++) {\n this.myRotationIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myRotationDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myRotationStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myRotationStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n\n for (let i = 0; i < 3; i++) {\n this.myScaleIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myScaleDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myScaleStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myScaleStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createStepSkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n this.myVariableLabelCursorTarget = WL.scene.addObject(this.myVariableLabelPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n\n //Position\n this.myPositionPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myPositionLabelText = WL.scene.addObject(this.myPositionPanel);\n this.myPositionLabelCursorTarget = WL.scene.addObject(this.myPositionPanel);\n\n this.myPositionPanels = [];\n this.myPositionTexts = [];\n this.myPositionCursorTargets = [];\n\n this.myPositionIncreaseButtonPanels = [];\n this.myPositionIncreaseButtonBackgrounds = [];\n this.myPositionIncreaseButtonTexts = [];\n this.myPositionIncreaseButtonCursorTargets = [];\n\n this.myPositionDecreaseButtonPanels = [];\n this.myPositionDecreaseButtonBackgrounds = [];\n this.myPositionDecreaseButtonTexts = [];\n this.myPositionDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < 3; i++) {\n this.myPositionPanels[i] = WL.scene.addObject(this.myPositionPanel);\n this.myPositionTexts[i] = WL.scene.addObject(this.myPositionPanels[i]);\n this.myPositionCursorTargets[i] = WL.scene.addObject(this.myPositionPanels[i]);\n\n //Increase/Decrease\n this.myPositionIncreaseButtonPanels[i] = WL.scene.addObject(this.myPositionPanels[i]);\n this.myPositionIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myPositionIncreaseButtonPanels[i]);\n this.myPositionIncreaseButtonTexts[i] = WL.scene.addObject(this.myPositionIncreaseButtonPanels[i]);\n this.myPositionIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myPositionIncreaseButtonPanels[i]);\n\n this.myPositionDecreaseButtonPanels[i] = WL.scene.addObject(this.myPositionPanels[i]);\n this.myPositionDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myPositionDecreaseButtonPanels[i]);\n this.myPositionDecreaseButtonTexts[i] = WL.scene.addObject(this.myPositionDecreaseButtonPanels[i]);\n this.myPositionDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myPositionDecreaseButtonPanels[i]);\n }\n\n //Rotation\n this.myRotationPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myRotationLabelText = WL.scene.addObject(this.myRotationPanel);\n this.myRotationLabelCursorTarget = WL.scene.addObject(this.myRotationPanel);\n\n this.myRotationPanels = [];\n this.myRotationTexts = [];\n this.myRotationCursorTargets = [];\n\n this.myRotationIncreaseButtonPanels = [];\n this.myRotationIncreaseButtonBackgrounds = [];\n this.myRotationIncreaseButtonTexts = [];\n this.myRotationIncreaseButtonCursorTargets = [];\n\n this.myRotationDecreaseButtonPanels = [];\n this.myRotationDecreaseButtonBackgrounds = [];\n this.myRotationDecreaseButtonTexts = [];\n this.myRotationDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < 3; i++) {\n this.myRotationPanels[i] = WL.scene.addObject(this.myRotationPanel);\n this.myRotationTexts[i] = WL.scene.addObject(this.myRotationPanels[i]);\n this.myRotationCursorTargets[i] = WL.scene.addObject(this.myRotationPanels[i]);\n\n //Increase/Decrease\n this.myRotationIncreaseButtonPanels[i] = WL.scene.addObject(this.myRotationPanels[i]);\n this.myRotationIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myRotationIncreaseButtonPanels[i]);\n this.myRotationIncreaseButtonTexts[i] = WL.scene.addObject(this.myRotationIncreaseButtonPanels[i]);\n this.myRotationIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myRotationIncreaseButtonPanels[i]);\n\n this.myRotationDecreaseButtonPanels[i] = WL.scene.addObject(this.myRotationPanels[i]);\n this.myRotationDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myRotationDecreaseButtonPanels[i]);\n this.myRotationDecreaseButtonTexts[i] = WL.scene.addObject(this.myRotationDecreaseButtonPanels[i]);\n this.myRotationDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myRotationDecreaseButtonPanels[i]);\n }\n\n //Scale\n this.myScalePanel = WL.scene.addObject(this.myDisplayPanel);\n this.myScaleLabelText = WL.scene.addObject(this.myScalePanel);\n this.myScaleLabelCursorTarget = WL.scene.addObject(this.myScalePanel);\n\n this.myScalePanels = [];\n this.myScaleTexts = [];\n this.myScaleCursorTargets = [];\n\n this.myScaleIncreaseButtonPanels = [];\n this.myScaleIncreaseButtonBackgrounds = [];\n this.myScaleIncreaseButtonTexts = [];\n this.myScaleIncreaseButtonCursorTargets = [];\n\n this.myScaleDecreaseButtonPanels = [];\n this.myScaleDecreaseButtonBackgrounds = [];\n this.myScaleDecreaseButtonTexts = [];\n this.myScaleDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < 3; i++) {\n this.myScalePanels[i] = WL.scene.addObject(this.myScalePanel);\n this.myScaleTexts[i] = WL.scene.addObject(this.myScalePanels[i]);\n this.myScaleCursorTargets[i] = WL.scene.addObject(this.myScalePanels[i]);\n\n //Increase/Decrease\n this.myScaleIncreaseButtonPanels[i] = WL.scene.addObject(this.myScalePanels[i]);\n this.myScaleIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myScaleIncreaseButtonPanels[i]);\n this.myScaleIncreaseButtonTexts[i] = WL.scene.addObject(this.myScaleIncreaseButtonPanels[i]);\n this.myScaleIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myScaleIncreaseButtonPanels[i]);\n\n this.myScaleDecreaseButtonPanels[i] = WL.scene.addObject(this.myScalePanels[i]);\n this.myScaleDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myScaleDecreaseButtonPanels[i]);\n this.myScaleDecreaseButtonTexts[i] = WL.scene.addObject(this.myScaleDecreaseButtonPanels[i]);\n this.myScaleDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myScaleDecreaseButtonPanels[i]);\n }\n }\n\n _createStepSkeleton() {\n //Position\n this.myPositionStepPanel = WL.scene.addObject(this.myPositionPanel);\n this.myPositionStepText = WL.scene.addObject(this.myPositionStepPanel);\n this.myPositionStepCursorTarget = WL.scene.addObject(this.myPositionStepPanel);\n\n //Increase/Decrease\n this.myPositionStepIncreaseButtonPanel = WL.scene.addObject(this.myPositionStepPanel);\n this.myPositionStepIncreaseButtonBackground = WL.scene.addObject(this.myPositionStepIncreaseButtonPanel);\n this.myPositionStepIncreaseButtonText = WL.scene.addObject(this.myPositionStepIncreaseButtonPanel);\n this.myPositionStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myPositionStepIncreaseButtonPanel);\n\n this.myPositionStepDecreaseButtonPanel = WL.scene.addObject(this.myPositionStepPanel);\n this.myPositionStepDecreaseButtonBackground = WL.scene.addObject(this.myPositionStepDecreaseButtonPanel);\n this.myPositionStepDecreaseButtonText = WL.scene.addObject(this.myPositionStepDecreaseButtonPanel);\n this.myPositionStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myPositionStepDecreaseButtonPanel);\n\n //Rotation\n this.myRotationStepPanel = WL.scene.addObject(this.myRotationPanel);\n this.myRotationStepText = WL.scene.addObject(this.myRotationStepPanel);\n this.myRotationStepCursorTarget = WL.scene.addObject(this.myRotationStepPanel);\n\n //Increase/Decrease\n this.myRotationStepIncreaseButtonPanel = WL.scene.addObject(this.myRotationStepPanel);\n this.myRotationStepIncreaseButtonBackground = WL.scene.addObject(this.myRotationStepIncreaseButtonPanel);\n this.myRotationStepIncreaseButtonText = WL.scene.addObject(this.myRotationStepIncreaseButtonPanel);\n this.myRotationStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myRotationStepIncreaseButtonPanel);\n\n this.myRotationStepDecreaseButtonPanel = WL.scene.addObject(this.myRotationStepPanel);\n this.myRotationStepDecreaseButtonBackground = WL.scene.addObject(this.myRotationStepDecreaseButtonPanel);\n this.myRotationStepDecreaseButtonText = WL.scene.addObject(this.myRotationStepDecreaseButtonPanel);\n this.myRotationStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myRotationStepDecreaseButtonPanel);\n\n //Scale\n this.myScaleStepPanel = WL.scene.addObject(this.myScalePanel);\n this.myScaleStepText = WL.scene.addObject(this.myScaleStepPanel);\n this.myScaleStepCursorTarget = WL.scene.addObject(this.myScaleStepPanel);\n\n //Increase/Decrease\n this.myScaleStepIncreaseButtonPanel = WL.scene.addObject(this.myScaleStepPanel);\n this.myScaleStepIncreaseButtonBackground = WL.scene.addObject(this.myScaleStepIncreaseButtonPanel);\n this.myScaleStepIncreaseButtonText = WL.scene.addObject(this.myScaleStepIncreaseButtonPanel);\n this.myScaleStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myScaleStepIncreaseButtonPanel);\n\n this.myScaleStepDecreaseButtonPanel = WL.scene.addObject(this.myScaleStepPanel);\n this.myScaleStepDecreaseButtonBackground = WL.scene.addObject(this.myScaleStepDecreaseButtonPanel);\n this.myScaleStepDecreaseButtonText = WL.scene.addObject(this.myScaleStepDecreaseButtonPanel);\n this.myScaleStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myScaleStepDecreaseButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setStepTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n this.myVariableLabelCursorTarget.setTranslationLocal(this._mySetup.myVariableLabelCursorTargetPosition);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myNextButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myPreviousButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n //Position\n this.myPositionPanel.setTranslationLocal(this._mySetup.myPositionPanelPosition);\n this.myPositionLabelText.scale(this._mySetup.myComponentLabelTextScale);\n this.myPositionLabelCursorTarget.setTranslationLocal(this._mySetup.myComponentLabelCursorTargetPosition);\n\n for (let i = 0; i < 3; i++) {\n this.myPositionPanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myPositionTexts[i].scale(this._mySetup.myValueTextScale);\n this.myPositionCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myPositionIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myPositionIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myPositionIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPositionDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPositionDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myPositionDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n\n //Rotation\n this.myRotationPanel.setTranslationLocal(this._mySetup.myRotationPanelPosition);\n this.myRotationLabelText.scale(this._mySetup.myComponentLabelTextScale);\n this.myRotationLabelCursorTarget.setTranslationLocal(this._mySetup.myComponentLabelCursorTargetPosition);\n\n for (let i = 0; i < 3; i++) {\n this.myRotationPanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myRotationTexts[i].scale(this._mySetup.myValueTextScale);\n this.myRotationCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myRotationIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myRotationIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myRotationIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myRotationDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myRotationDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myRotationDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n\n //Scale\n this.myScalePanel.setTranslationLocal(this._mySetup.myScalePanelPosition);\n this.myScaleLabelText.scale(this._mySetup.myComponentLabelTextScale);\n this.myScaleLabelCursorTarget.setTranslationLocal(this._mySetup.myComponentLabelCursorTargetPosition);\n\n for (let i = 0; i < 3; i++) {\n this.myScalePanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myScaleTexts[i].scale(this._mySetup.myValueTextScale);\n this.myScaleCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myScaleIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myScaleIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myScaleIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myScaleDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myScaleDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myScaleDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n }\n\n _setStepTransforms() {\n //Position\n this.myPositionStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myPositionStepText.scale(this._mySetup.myStepTextScale);\n this.myPositionStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myPositionStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myPositionStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPositionStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPositionStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPositionStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPositionStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n //Rotation\n this.myRotationStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myRotationStepText.scale(this._mySetup.myStepTextScale);\n this.myRotationStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myRotationStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myRotationStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myRotationStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myRotationStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myRotationStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myRotationStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n //Scale\n this.myScaleStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myScaleStepText.scale(this._mySetup.myStepTextScale);\n this.myScaleStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myScaleStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myScaleStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myScaleStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myScaleStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myScaleStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myScaleStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addStepComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.addComponent('cursor-target');\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.addComponent('collision');\n this.myVariableLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myVariableLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myVariableLabelCollisionComponent.extents = this._mySetup.myVariableLabelCollisionExtents;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n //Position\n this.myPositionLabelTextComponent = this.myPositionLabelText.addComponent('text');\n this._setupTextComponent(this.myPositionLabelTextComponent);\n this.myPositionLabelTextComponent.text = this._mySetup.myPositionText;\n\n this.myPositionLabelCursorTargetComponent = this.myPositionLabelCursorTarget.addComponent('cursor-target');\n this.myPositionLabelCollisionComponent = this.myPositionLabelCursorTarget.addComponent('collision');\n this.myPositionLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionLabelCollisionComponent.extents = this._mySetup.myComponentLabelCollisionExtents;\n\n this.myPositionTextComponents = [];\n this.myPositionCursorTargetComponents = [];\n this.myPositionCollisionComponents = [];\n\n this.myPositionIncreaseButtonBackgroundComponents = [];\n this.myPositionIncreaseButtonTextComponents = [];\n this.myPositionIncreaseButtonCursorTargetComponents = [];\n this.myPositionIncreaseButtonCollisionComponents = [];\n\n this.myPositionDecreaseButtonBackgroundComponents = [];\n this.myPositionDecreaseButtonTextComponents = [];\n this.myPositionDecreaseButtonCursorTargetComponents = [];\n this.myPositionDecreaseButtonCollisionComponents = [];\n\n for (let i = 0; i < 3; i++) {\n this.myPositionTextComponents[i] = this.myPositionTexts[i].addComponent('text');\n this._setupTextComponent(this.myPositionTextComponents[i]);\n this.myPositionTextComponents[i].text = \" \";\n\n this.myPositionCursorTargetComponents[i] = this.myPositionCursorTargets[i].addComponent('cursor-target');\n this.myPositionCollisionComponents[i] = this.myPositionCursorTargets[i].addComponent('collision');\n this.myPositionCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myPositionIncreaseButtonBackgroundComponents[i] = this.myPositionIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myPositionIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myPositionIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionIncreaseButtonTextComponents[i] = this.myPositionIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myPositionIncreaseButtonTextComponents[i]);\n this.myPositionIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myPositionIncreaseButtonCursorTargetComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myPositionIncreaseButtonCollisionComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myPositionIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPositionDecreaseButtonBackgroundComponents[i] = this.myPositionDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myPositionDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myPositionDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionDecreaseButtonTextComponents[i] = this.myPositionDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myPositionDecreaseButtonTextComponents[i]);\n this.myPositionDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myPositionDecreaseButtonCursorTargetComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myPositionDecreaseButtonCollisionComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myPositionDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n //Rotation\n this.myRotationLabelTextComponent = this.myRotationLabelText.addComponent('text');\n this._setupTextComponent(this.myRotationLabelTextComponent);\n this.myRotationLabelTextComponent.text = this._mySetup.myRotationText;\n\n this.myRotationLabelCursorTargetComponent = this.myRotationLabelCursorTarget.addComponent('cursor-target');\n this.myRotationLabelCollisionComponent = this.myRotationLabelCursorTarget.addComponent('collision');\n this.myRotationLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationLabelCollisionComponent.extents = this._mySetup.myComponentLabelCollisionExtents;\n\n this.myRotationTextComponents = [];\n this.myRotationCursorTargetComponents = [];\n this.myRotationCollisionComponents = [];\n\n this.myRotationIncreaseButtonBackgroundComponents = [];\n this.myRotationIncreaseButtonTextComponents = [];\n this.myRotationIncreaseButtonCursorTargetComponents = [];\n this.myRotationIncreaseButtonCollisionComponents = [];\n\n this.myRotationDecreaseButtonBackgroundComponents = [];\n this.myRotationDecreaseButtonTextComponents = [];\n this.myRotationDecreaseButtonCursorTargetComponents = [];\n this.myRotationDecreaseButtonCollisionComponents = [];\n\n for (let i = 0; i < 3; i++) {\n this.myRotationTextComponents[i] = this.myRotationTexts[i].addComponent('text');\n this._setupTextComponent(this.myRotationTextComponents[i]);\n this.myRotationTextComponents[i].text = \" \";\n\n this.myRotationCursorTargetComponents[i] = this.myRotationCursorTargets[i].addComponent('cursor-target');\n this.myRotationCollisionComponents[i] = this.myRotationCursorTargets[i].addComponent('collision');\n this.myRotationCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myRotationIncreaseButtonBackgroundComponents[i] = this.myRotationIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myRotationIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myRotationIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationIncreaseButtonTextComponents[i] = this.myRotationIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myRotationIncreaseButtonTextComponents[i]);\n this.myRotationIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myRotationIncreaseButtonCursorTargetComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myRotationIncreaseButtonCollisionComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myRotationIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myRotationDecreaseButtonBackgroundComponents[i] = this.myRotationDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myRotationDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myRotationDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationDecreaseButtonTextComponents[i] = this.myRotationDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myRotationDecreaseButtonTextComponents[i]);\n this.myRotationDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myRotationDecreaseButtonCursorTargetComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myRotationDecreaseButtonCollisionComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myRotationDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n //Scale\n this.myScaleLabelTextComponent = this.myScaleLabelText.addComponent('text');\n this._setupTextComponent(this.myScaleLabelTextComponent);\n this.myScaleLabelTextComponent.text = this._mySetup.myScaleText;\n\n this.myScaleLabelCursorTargetComponent = this.myScaleLabelCursorTarget.addComponent('cursor-target');\n this.myScaleLabelCollisionComponent = this.myScaleLabelCursorTarget.addComponent('collision');\n this.myScaleLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleLabelCollisionComponent.extents = this._mySetup.myComponentLabelCollisionExtents;\n\n this.myScaleTextComponents = [];\n this.myScaleCursorTargetComponents = [];\n this.myScaleCollisionComponents = [];\n\n this.myScaleIncreaseButtonBackgroundComponents = [];\n this.myScaleIncreaseButtonTextComponents = [];\n this.myScaleIncreaseButtonCursorTargetComponents = [];\n this.myScaleIncreaseButtonCollisionComponents = [];\n\n this.myScaleDecreaseButtonBackgroundComponents = [];\n this.myScaleDecreaseButtonTextComponents = [];\n this.myScaleDecreaseButtonCursorTargetComponents = [];\n this.myScaleDecreaseButtonCollisionComponents = [];\n\n for (let i = 0; i < 3; i++) {\n this.myScaleTextComponents[i] = this.myScaleTexts[i].addComponent('text');\n this._setupTextComponent(this.myScaleTextComponents[i]);\n this.myScaleTextComponents[i].text = \" \";\n\n this.myScaleCursorTargetComponents[i] = this.myScaleCursorTargets[i].addComponent('cursor-target');\n this.myScaleCollisionComponents[i] = this.myScaleCursorTargets[i].addComponent('collision');\n this.myScaleCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myScaleIncreaseButtonBackgroundComponents[i] = this.myScaleIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myScaleIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myScaleIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleIncreaseButtonTextComponents[i] = this.myScaleIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myScaleIncreaseButtonTextComponents[i]);\n this.myScaleIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myScaleIncreaseButtonCursorTargetComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myScaleIncreaseButtonCollisionComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myScaleIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myScaleDecreaseButtonBackgroundComponents[i] = this.myScaleDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myScaleDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myScaleDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleDecreaseButtonTextComponents[i] = this.myScaleDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myScaleDecreaseButtonTextComponents[i]);\n this.myScaleDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myScaleDecreaseButtonCursorTargetComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myScaleDecreaseButtonCollisionComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myScaleDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n }\n\n _addStepComponents() {\n //Position\n this.myPositionStepTextComponent = this.myPositionStepText.addComponent('text');\n this._setupTextComponent(this.myPositionStepTextComponent);\n this.myPositionStepTextComponent.text = \" \";\n\n this.myPositionStepCursorTargetComponent = this.myPositionStepCursorTarget.addComponent('cursor-target');\n this.myPositionStepCollisionComponent = this.myPositionStepCursorTarget.addComponent('collision');\n this.myPositionStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myPositionStepIncreaseButtonBackgroundComponent = this.myPositionStepIncreaseButtonBackground.addComponent('mesh');\n this.myPositionStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPositionStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionStepIncreaseButtonTextComponent = this.myPositionStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myPositionStepIncreaseButtonTextComponent);\n this.myPositionStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myPositionStepIncreaseButtonCursorTargetComponent = this.myPositionStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myPositionStepIncreaseButtonCollisionComponent = this.myPositionStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myPositionStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPositionStepDecreaseButtonBackgroundComponent = this.myPositionStepDecreaseButtonBackground.addComponent('mesh');\n this.myPositionStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPositionStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionStepDecreaseButtonTextComponent = this.myPositionStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myPositionStepDecreaseButtonTextComponent);\n this.myPositionStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myPositionStepDecreaseButtonCursorTargetComponent = this.myPositionStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myPositionStepDecreaseButtonCollisionComponent = this.myPositionStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myPositionStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n //Rotation\n this.myRotationStepTextComponent = this.myRotationStepText.addComponent('text');\n this._setupTextComponent(this.myRotationStepTextComponent);\n this.myRotationStepTextComponent.text = \" \";\n\n this.myRotationStepCursorTargetComponent = this.myRotationStepCursorTarget.addComponent('cursor-target');\n this.myRotationStepCollisionComponent = this.myRotationStepCursorTarget.addComponent('collision');\n this.myRotationStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myRotationStepIncreaseButtonBackgroundComponent = this.myRotationStepIncreaseButtonBackground.addComponent('mesh');\n this.myRotationStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myRotationStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationStepIncreaseButtonTextComponent = this.myRotationStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myRotationStepIncreaseButtonTextComponent);\n this.myRotationStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myRotationStepIncreaseButtonCursorTargetComponent = this.myRotationStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myRotationStepIncreaseButtonCollisionComponent = this.myRotationStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myRotationStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myRotationStepDecreaseButtonBackgroundComponent = this.myRotationStepDecreaseButtonBackground.addComponent('mesh');\n this.myRotationStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myRotationStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationStepDecreaseButtonTextComponent = this.myRotationStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myRotationStepDecreaseButtonTextComponent);\n this.myRotationStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myRotationStepDecreaseButtonCursorTargetComponent = this.myRotationStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myRotationStepDecreaseButtonCollisionComponent = this.myRotationStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myRotationStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n //Scale\n this.myScaleStepTextComponent = this.myScaleStepText.addComponent('text');\n this._setupTextComponent(this.myScaleStepTextComponent);\n this.myScaleStepTextComponent.text = \" \";\n\n this.myScaleStepCursorTargetComponent = this.myScaleStepCursorTarget.addComponent('cursor-target');\n this.myScaleStepCollisionComponent = this.myScaleStepCursorTarget.addComponent('collision');\n this.myScaleStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myScaleStepIncreaseButtonBackgroundComponent = this.myScaleStepIncreaseButtonBackground.addComponent('mesh');\n this.myScaleStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myScaleStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleStepIncreaseButtonTextComponent = this.myScaleStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myScaleStepIncreaseButtonTextComponent);\n this.myScaleStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myScaleStepIncreaseButtonCursorTargetComponent = this.myScaleStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myScaleStepIncreaseButtonCollisionComponent = this.myScaleStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myScaleStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myScaleStepDecreaseButtonBackgroundComponent = this.myScaleStepDecreaseButtonBackground.addComponent('mesh');\n this.myScaleStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myScaleStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleStepDecreaseButtonTextComponent = this.myScaleStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myScaleStepDecreaseButtonTextComponent);\n this.myScaleStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myScaleStepDecreaseButtonCursorTargetComponent = this.myScaleStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myScaleStepDecreaseButtonCollisionComponent = this.myScaleStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myScaleStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneTransformWidgetSetup = class EasyTuneTransformWidgetSetup {\n\n constructor() {\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00805713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00805713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00805713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let distanceFromValue = 0.055;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [-0.13, 0, 0];\n this.myRightSideButtonPosition = [-this.myLeftSideButtonPosition[0], 0, 0];\n\n this.myPreviousButtonPosition = [0, 0, -0.00001];\n this.myPreviousButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myNextButtonPosition = [0, 0, -0.00001];\n this.myNextButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myIncreaseButtonText = \"+\";\n this.myDecreaseButtonText = \"-\";\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myVariableLabelCursorTargetPosition = [0, 0, 0];\n this.myVariableLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myVariableLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n let distanceBetweenComponents = Math.abs(this.myNextButtonPosition[0]) + Math.abs(this.myRightSideButtonPosition[0]);\n let distanceFromVariableLabel = 0.045;\n this.myPositionPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, panelZ];\n this.myRotationPanelPosition = [this.myPositionPanelPosition[0] + distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, panelZ];\n this.myScalePanelPosition = [this.myPositionPanelPosition[0] - distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, panelZ];\n\n this.myPositionText = \"Position\";\n this.myRotationText = \"Rotation\";\n this.myScaleText = \"Scale\";\n\n this.myComponentLabelTextScale = [0.19, 0.19, 0.19];\n this.myComponentLabelCursorTargetPosition = [0, 0, 0];\n this.myComponentLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myComponentLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myComponentLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myValueTextScale = [0.4, 0.4, 0.4];\n\n this.myValueCursorTargetPosition = [0, 0.0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n let distanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\n\n this.myValuePanelsPositions = [];\n this.myValuePanelsPositions[0] = [0, -distanceFromValue, 0];\n for (let i = 1; i < 3; i++) {\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].slice(0);\n this.myValuePanelsPositions[i][1] -= distanceBetweenValues;\n }\n\n //Step\n let valuePanelLastPosition = this.myValuePanelsPositions[2][1];\n this.myStepPanelPosition = [0, valuePanelLastPosition - distanceFromValue, 0];\n this.myStepTextScale = [0.19, 0.19, 0.19];\n this.myStepStartString = \"Step: \";\n\n this.myStepCursorTargetPosition = [0, 0, 0];\n this.myStepCursorTargetPosition[2] = colliderZPosition - this.myStepPanelPosition[2];\n this.myStepCollisionExtents = [0.065, 0.0175, 1];\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n //Background\n {\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myDisplayPanelPosition[1] + this.myPositionPanelPosition[1] + this.myStepPanelPosition[1] - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n\n let maxX = this.myDisplayPanelPosition[0] + this.myRotationPanelPosition[0] + this.myRightSideButtonPosition[0] + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n let minX = this.myDisplayPanelPosition[0] + this.myScalePanelPosition[0] + this.myLeftSideButtonPosition[0] - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myBackPanelPosition = [(maxX + minX) / 2, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [(maxX - minX) / 2, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myTextHoverScaleMultiplier = [1.25, 1.25, 1.25];\n\n this.myEditThumbstickMinThreshold = 0.35;\n this.myStepMultiplierStepPerSecond = 2.25;\n this.myButtonEditDelay = 0;\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "PP.EasyTuneWidget = class EasyTuneWidget {\n\n constructor() {\n this._myIsStarted = false;\n this._myStartVariable = null;\n\n this._myWidgetFrame = new PP.WidgetFrame(\"E\", 1);\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\n\n this._mySetup = new PP.EasyTuneWidgetSetup();\n this._myAdditionalSetup = null;\n\n this._myWidgets = [];\n\n this._myEasyTuneVariables = null;\n this._myEasyTuneLastSize = 0;\n this._myVariableNames = null;\n\n this._myCurrentWidget = null;\n this._myCurrentVariable = null;\n\n this._myScrollVariableTimer = 0;\n\n this._myGamepad = null;\n\n this._myRefreshVariablesTimer = 0;\n\n this._myDirty = false;\n }\n\n setActiveVariable(variableName) {\n if (!this._myIsStarted) {\n this._myStartVariable = variableName;\n } else if (this._myEasyTuneVariables.has(variableName)) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(variableName);\n this._selectCurrentWidget();\n } else {\n console.log(\"Can't set easy tune active variable\");\n }\n }\n\n refresh() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._myDirty = true;\n }\n }\n\n setVisible(visible) {\n this._myWidgetFrame.setVisible(visible);\n }\n\n isVisible() {\n return this._myWidgetFrame.isVisible();\n }\n\n start(parentObject, additionalSetup, easyTuneVariables) {\n this._myRightGamepad = PP.myRightGamepad; //@EDIT get right gamepad here based on how you store it in your game\n this._myLeftGamepad = PP.myLeftGamepad; //@EDIT get left gamepad here based on how you store it in your game\n if (this._mySetup.myGamepadHandedness == PP.ToolHandedness.RIGHT) {\n this._myGamepad = this._myRightGamepad;\n } else if (this._mySetup.myGamepadHandedness == PP.ToolHandedness.LEFT) {\n this._myGamepad = this._myLeftGamepad;\n }\n\n this._myIsStarted = true;\n\n this._myAdditionalSetup = additionalSetup;\n\n this._myWidgetFrame.start(parentObject, additionalSetup);\n\n this._myEasyTuneVariables = easyTuneVariables;\n this._myEasyTuneLastSize = this._myEasyTuneVariables.size;\n this._myVariableNames = Array.from(this._myEasyTuneVariables.keys());\n\n if (this._myEasyTuneVariables.size > 0) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myVariableNames[0]);\n }\n\n if (this._myStartVariable) {\n if (this._myEasyTuneVariables.has(this._myStartVariable)) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myStartVariable);\n } else {\n console.log(\"Can't set easy tune active variable\");\n }\n }\n\n this._initializeWidgets();\n }\n\n update(dt) {\n this._myWidgetFrame.update(dt);\n\n if (this._myEasyTuneVariables.size != this._myEasyTuneLastSize || this._myDirty) {\n this._refreshEasyTuneVariables();\n }\n\n if (this._myWidgetFrame.myIsWidgetVisible && this._myEasyTuneVariables.size > 0) {\n if (this._mySetup.myRefreshVariablesDelay != null) {\n this._myRefreshVariablesTimer += dt;\n if (this._myRefreshVariablesTimer > this._mySetup.myRefreshVariablesDelay) {\n this._myRefreshVariablesTimer = 0;\n this._refreshEasyTuneVariables();\n }\n }\n\n if (this._myCurrentWidget) {\n this._myCurrentWidget.update(dt);\n }\n\n if (this._myAdditionalSetup.myEnableGamepadScrollVariable) {\n this._updateGamepadScrollVariable(dt);\n }\n }\n\n this._updateGamepadWidgetVisibility();\n\n this._updateActiveVariable();\n }\n\n _initializeWidgets() {\n this._myWidgets[PP.EasyTuneVariableType.NONE] = new PP.EasyTuneNoneWidget();\n this._myWidgets[PP.EasyTuneVariableType.NUMBER] = new PP.EasyTuneNumberWidget(this._myGamepad);\n this._myWidgets[PP.EasyTuneVariableType.BOOL] = new PP.EasyTuneBoolWidget(this._myGamepad);\n this._myWidgets[PP.EasyTuneVariableType.TRANSFORM] = new PP.EasyTuneTransformWidget(this._myGamepad);\n\n for (let item of this._myWidgets) {\n item.start(this._myWidgetFrame.getWidgetObject(), this._myAdditionalSetup);\n item.setVisible(false);\n item.registerScrollVariableRequestEventListener(this, this._scrollVariable.bind(this));\n }\n\n this._selectCurrentWidget();\n }\n\n _selectCurrentWidget() {\n if (this._myEasyTuneVariables.size <= 0) {\n return;\n }\n\n let scrollVariableActive = false;\n let scrollVariableDirection = 0;\n\n if (this._myCurrentWidget) {\n scrollVariableActive = this._myCurrentWidget.isScrollVariableActive();\n scrollVariableDirection = this._myCurrentWidget.getScrollVariableDirection();\n\n this._myCurrentWidget.setVisible(false);\n }\n\n if (this._myCurrentVariable.myType in this._myWidgets) {\n this._myCurrentWidget = this._myWidgets[this._myCurrentVariable.myType];\n } else {\n this._myCurrentWidget = this._myWidgets[PP.EasyTuneVariableType.NONE];\n }\n\n this._myCurrentWidget.setEasyTuneVariable(this._myCurrentVariable, this._createIndexString());\n this._myCurrentWidget.setVisible(this._myWidgetFrame.myIsWidgetVisible);\n this._myCurrentWidget.setScrollVariableActive(scrollVariableActive, scrollVariableDirection);\n }\n\n _refreshEasyTuneVariables() {\n this._myVariableNames = Array.from(this._myEasyTuneVariables.keys());\n this._myEasyTuneLastSize = this._myEasyTuneVariables.size;\n\n if (this._myEasyTuneVariables.size > 0) {\n if (this._myCurrentVariable && this._myEasyTuneVariables.has(this._myCurrentVariable.myName)) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myCurrentVariable.myName);\n } else {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myVariableNames[0]);\n }\n\n this._selectCurrentWidget();\n } else {\n this._myCurrentVariable = null;\n if (this._myCurrentWidget) {\n this._myCurrentWidget.setVisible(false);\n this._myCurrentWidget = null;\n }\n }\n\n this._myDirty = false;\n }\n\n _updateGamepadWidgetVisibility() {\n if (this._myGamepad) {\n if ((this._myGamepad.getButtonInfo(PP.ButtonType.BOTTOM_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed) ||\n (this._myGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(PP.ButtonType.BOTTOM_BUTTON).myIsPressed)) {\n this._toggleVisibility();\n }\n }\n }\n\n _toggleVisibility() {\n this._myWidgetFrame.toggleVisibility();\n }\n\n _widgetVisibleChanged(visible) {\n for (let widget of this._myWidgets) {\n widget.setVisible(false);\n }\n\n if (this._myCurrentWidget) {\n if (this._myEasyTuneVariables.size > 0) {\n this._myCurrentWidget.setVisible(visible);\n } else {\n this._myCurrentWidget.setVisible(false);\n }\n }\n\n if (visible) {\n this._refreshEasyTuneVariables();\n }\n }\n\n _updateGamepadScrollVariable(dt) {\n if (this._myGamepad && (!this._mySetup.myScrollVariableButtonType || this._myGamepad.getButtonInfo(this._mySetup.myScrollVariableButtonType).myIsPressed)) {\n let x = this._myGamepad.getAxesInfo().myAxes[0];\n let y = this._myGamepad.getAxesInfo().myAxes[1];\n if (Math.abs(x) > this._mySetup.myScrollVariableMinXThreshold && Math.abs(y) < this._mySetup.myScrollVariableMaxYThreshold) {\n this._myScrollVariableTimer += dt;\n while (this._myScrollVariableTimer > this._mySetup.myScrollVariableDelay) {\n this._myScrollVariableTimer -= this._mySetup.myScrollVariableDelay;\n this._scrollVariable(Math.sign(x));\n }\n } else {\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n }\n } else {\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n }\n }\n\n _scrollVariable(amount) {\n if (this._myEasyTuneVariables.size <= 0) {\n return;\n }\n\n let variableIndex = this._getVariableIndex(this._myCurrentVariable);\n if (variableIndex >= 0) {\n let newIndex = (((variableIndex + amount) % this._myVariableNames.length) + this._myVariableNames.length) % this._myVariableNames.length; //manage negative numbers\n if (this._myEasyTuneVariables.has(this._myVariableNames[newIndex])) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myVariableNames[newIndex]);\n this._selectCurrentWidget();\n } else {\n this._refreshEasyTuneVariables();\n }\n } else {\n this._refreshEasyTuneVariables();\n }\n }\n\n _createIndexString() {\n let indexString = \" (\";\n let index = (this._getVariableIndex(this._myCurrentVariable) + 1).toString();\n let length = (this._myEasyTuneVariables.size).toString();\n while (index.length < length.length) {\n index = \"0\".concat(index);\n }\n\n indexString = indexString.concat(index).concat(\" - \").concat(length).concat(\")\");\n\n return indexString;\n }\n\n _getVariableIndex(variable) {\n let variableIndex = this._myVariableNames.indexOf(variable.myName);\n return variableIndex;\n }\n\n _updateActiveVariable() {\n this._myEasyTuneVariables.forEach(function (value) {\n value.myIsActive = false;\n });\n\n if (this._myWidgetFrame.myIsWidgetVisible && this._myCurrentVariable) {\n this._myCurrentVariable.myIsActive = true;\n }\n }\n};", "PP.EasyTuneWidgetSetup = class EasyTuneWidgetSetup {\n\n constructor() {\n this._initializeRuntimeSetup();\n }\n\n _initializeRuntimeSetup() {\n this.myGamepadHandedness = PP.ToolHandedness.RIGHT;\n\n this.myScrollVariableDelay = 0.5;\n this.myScrollVariableMinXThreshold = 0.6;\n this.myScrollVariableMaxYThreshold = 0.25;\n this.myScrollVariableButtonType = null;\n\n this.myRefreshVariablesDelay = null;\n }\n};", "//Variable Map\nPP.EasyTuneVariables = class EasyTuneVariables {\n constructor() {\n this._myMap = new Map();\n }\n\n add(variable) {\n this._myMap.set(variable.myName, variable);\n }\n\n remove(variableName) {\n this._myMap.delete(variableName);\n }\n\n get(variableName) {\n let variable = this._myMap.get(variableName);\n if (variable) {\n return variable.getValue();\n }\n\n return null;\n }\n\n set(variableName, value, resetInitialValue = false) {\n let variable = this._myMap.get(variableName);\n if (variable) {\n variable.setValue(value, resetInitialValue);\n }\n }\n\n isActive(variableName) {\n let variable = this._myMap.get(variableName);\n if (variable) {\n return variable.myIsActive;\n }\n\n return false;\n }\n\n getEasyTuneVariable(variableName) {\n return this._myMap.get(variableName);\n }\n\n _getInternalMap() {\n return this._myMap;\n }\n\n registerValueChangedEventListener(variableName, callbackID, callback) {\n this._myMap.get(variableName).registerValueChangedEventListener(callbackID, callback);\n }\n\n unregisterValueChangedEventListener(variableName, callbackID, callback) {\n this._myMap.get(variableName).unregisterValueChangedEventListener(callbackID);\n }\n};\n\n//Variable Types\nPP.EasyTuneVariableType = {\n NONE: 0,\n NUMBER: 1,\n BOOL: 2,\n TRANSFORM: 3\n};\n\nPP.EasyTuneVariable = class EasyTuneVariable {\n constructor(name, type) {\n this.myName = name.slice(0);\n this.myType = type;\n\n this.myValue = null;\n this.myInitialValue = null;\n\n this.myIsActive = false;\n\n this._myValueChangedCallbacks = new Map(); // Signature: callback(name, value)\n }\n\n getValue() {\n return this.myValue;\n }\n\n setValue(value, resetInitialValue = false) {\n let oldValue = this.myValue;\n this.myValue = value;\n\n if (resetInitialValue) {\n PP.EasyTuneVariable.prototype.setInitialValue.call(this, value);\n }\n\n PP.refreshEasyTuneWidget();\n\n if (oldValue != value) {\n this._triggerValueChangedCallback();\n }\n }\n\n setInitialValue(value) {\n this.myInitialValue = value;\n }\n\n registerValueChangedEventListener(id, callback) {\n this._myValueChangedCallbacks.set(id, callback);\n }\n\n unregisterValueChangedEventListener(id) {\n this._myValueChangedCallbacks.delete(id);\n }\n\n _triggerValueChangedCallback() {\n if (this._myValueChangedCallbacks.size > 0) {\n this._myValueChangedCallbacks.forEach(function (callback) { callback(this.myName, this.getValue()); }.bind(this));\n }\n }\n};\n\nPP.EasyTuneVariableArray = class EasyTuneVariableArray extends PP.EasyTuneVariable {\n constructor(name, type, value) {\n super(name, type);\n\n PP.EasyTuneVariableArray.prototype.setValue.call(this, value, true);\n }\n\n getValue() {\n return this.myValue.slice(0);\n }\n\n setValue(value, resetInitialValue = false) {\n let oldValue = this.myValue;\n this.myValue = value.slice(0);\n\n if (resetInitialValue) {\n PP.EasyTuneVariableArray.prototype.setInitialValue.call(this, value);\n }\n\n PP.refreshEasyTuneWidget();\n\n if (oldValue == null || !oldValue.pp_equals(value)) {\n this._triggerValueChangedCallback();\n }\n }\n\n setInitialValue(value) {\n this.myInitialValue = value.slice(0);\n }\n};\n\n//NUMBER\n\nPP.EasyTuneNumberArray = class EasyTuneNumberArray extends PP.EasyTuneVariableArray {\n constructor(name, value, stepPerSecond, decimalPlaces, min = null, max = null, editAllValuesTogether = false) {\n super(name, PP.EasyTuneVariableType.NUMBER, value);\n\n this.myDecimalPlaces = decimalPlaces;\n this.myStepPerSecond = stepPerSecond;\n\n this.myInitialStepPerSecond = this.myStepPerSecond;\n\n this.myMin = min;\n this.myMax = max;\n\n this.myEditAllValuesTogether = editAllValuesTogether;\n\n this._clampValue(true);\n }\n\n setMax(max) {\n this.myMax = max;\n this._clampValue(false);\n }\n\n setMin(min) {\n this.myMin = min;\n this._clampValue(false);\n }\n\n _clampValue(resetInitialValue) {\n let clampedValue = this.myValue.vec_clamp(this.myMin, this.myMax);\n\n if (!resetInitialValue) {\n let clampedInitialValue = this.myInitialValue.vec_clamp(this.myMin, this.myMax);\n let initialValueChanged = !clampedInitialValue.vec_equals(this.myInitialValue, 0.00001);\n if (initialValueChanged) {\n PP.EasyTuneVariableArray.prototype.setInitialValue.call(this, clampedInitialValue);\n }\n }\n\n PP.EasyTuneVariableArray.prototype.setValue.call(this, clampedValue, resetInitialValue);\n }\n};\n\nPP.EasyTuneNumber = class EasyTuneNumber extends PP.EasyTuneNumberArray {\n constructor(name, value, stepPerSecond, decimalPlaces, min, max) {\n super(name, [value], stepPerSecond, decimalPlaces, min, max);\n }\n\n getValue() {\n return this.myValue[0];\n }\n\n setValue(value, resetInitialValue = false) {\n super.setValue([value], resetInitialValue);\n }\n\n setInitialValue(value) {\n super.setValue([value]);\n }\n};\n\nPP.EasyTuneInt = class EasyTuneInt extends PP.EasyTuneNumber {\n constructor(name, value, stepPerSecond, min, max) {\n super(name, value, stepPerSecond, 0, min, max);\n }\n};\n\nPP.EasyTuneIntArray = class EasyTuneIntArray extends PP.EasyTuneNumberArray {\n constructor(name, value, stepPerSecond, min, max) {\n let tempValue = value.slice(0);\n\n for (let i = 0; i < value.length; i++) {\n tempValue[i] = Math.round(tempValue[i]);\n }\n\n super(name, tempValue, stepPerSecond, 0, Math.round(min), Math.round(max));\n }\n};\n\n//BOOL\n\nPP.EasyTuneBoolArray = class EasyTuneBoolArray extends PP.EasyTuneVariableArray {\n constructor(name, value) {\n super(name, PP.EasyTuneVariableType.BOOL, value);\n }\n};\n\nPP.EasyTuneBool = class EasyTuneBool extends PP.EasyTuneBoolArray {\n constructor(name, value) {\n super(name, [value]);\n }\n\n getValue() {\n return this.myValue[0];\n }\n\n setValue(value, resetInitialValue = false) {\n super.setValue([value], resetInitialValue);\n }\n\n setInitialValue(value) {\n super.setValue([value]);\n }\n};\n\n//EASY TUNE EASY TRANSFORM\n\nPP.EasyTuneTransform = class EasyTuneTransform extends PP.EasyTuneVariable {\n constructor(name, value, scaleAsOne = true, positionStepPerSecond = 1, rotationStepPerSecond = 50, scaleStepPerSecond = 1) {\n super(name, PP.EasyTuneVariableType.TRANSFORM);\n\n this.myDecimalPlaces = 3;\n\n this.myPosition = value.mat4_getPosition();\n this.myRotation = value.mat4_getRotationDegrees();\n this.myScale = value.mat4_getScale();\n\n let decimalPlacesMultiplier = Math.pow(10, this.myDecimalPlaces);\n for (let i = 0; i < 3; i++) {\n this.myScale[i] = Math.max(this.myScale[i], 1 / decimalPlacesMultiplier);\n }\n\n this.myScaleAsOne = scaleAsOne;\n\n this.myPositionStepPerSecond = positionStepPerSecond;\n this.myRotationStepPerSecond = rotationStepPerSecond;\n this.myScaleStepPerSecond = scaleStepPerSecond;\n\n this.myInitialPosition = this.myPosition.vec3_clone();\n this.myInitialRotation = this.myRotation.vec3_clone();\n this.myInitialScale = this.myScale.vec3_clone();\n\n this.myInitialPositionStepPerSecond = this.myPositionStepPerSecond;\n this.myInitialRotationStepPerSecond = this.myRotationStepPerSecond;\n this.myInitialScaleStepPerSecond = this.myScaleStepPerSecond;\n\n this.myTransform = PP.mat4_create();\n this.myTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n\n this.myTempTransform = PP.mat4_create();\n }\n\n getValue() {\n this.myTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n return this.myTransform.slice(0);\n }\n\n setValue(value, resetInitialValue = false) {\n this.myTempTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n\n value.mat4_getPosition(this.myPosition);\n value.mat4_getRotationDegrees(this.myRotation);\n value.mat4_getScale(this.myScale);\n\n this.myTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n\n if (resetInitialValue) {\n PP.EasyTuneTransform.prototype.setInitialValue.call(this, value);\n }\n\n PP.refreshEasyTuneWidget();\n\n if (!this.myTempTransform.pp_equals(this.myTransform)) {\n this._triggerValueChangedCallback();\n }\n }\n\n setInitialValue(value) {\n this.myInitialPosition = value.mat4_getPosition();\n this.myInitialRotation = value.mat4_getRotationDegrees();\n this.myInitialScale = value.mat4_getScale();\n }\n};", "WL.registerComponent('pp-easy-tune', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['none', 'left', 'right'], default: 'none' },\r\n _myShowOnStart: { type: WL.Type.Bool, default: false },\r\n _myShowVisibilityButton: { type: WL.Type.Bool, default: false },\r\n _myEnableGamepadScrollVariable: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n //Examples\r\n //Number: PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"Float\", 1.00, 0.1, 3));\r\n //Number Array: PP.myEasyTuneVariables.add(new PP.EasyTuneNumberArray(\"Float Array\", [1.00,2.00,3.00], 0.1, 3));\r\n //Int: PP.myEasyTuneVariables.add(new PP.EasyTuneInt(\"Int\", 1, 1));\r\n //Int Array: PP.myEasyTuneVariables.add(new PP.EasyTuneIntArray(\"Int Array\", [1,2,3], 1));\r\n //Bool: PP.myEasyTuneVariables.add(new PP.EasyTuneBool(\"Bool\", false));\r\n //Bool Array: PP.myEasyTuneVariables.add(new PP.EasyTuneBoolArray(\"Bool Array\", [false, true, false]));\r\n //Transform: PP.myEasyTuneVariables.add(new PP.EasyTuneTransform(\"Transform\", PP.mat4_create(), true));\r\n\r\n PP.myEasyTuneVariables = new PP.EasyTuneVariables();\r\n\r\n this._myWidget = new PP.EasyTuneWidget();\r\n\r\n PP._setEasyTuneWidgetActiveVariableCallbacks.push(function (variableName) {\r\n this._myWidget.setActiveVariable(variableName);\r\n }.bind(this));\r\n\r\n PP._refreshEasyTuneWidgetCallbacks.push(function () {\r\n this._myWidget.refresh();\r\n }.bind(this));\r\n\r\n this._myStarted = false;\r\n },\r\n start: function () {\r\n\r\n let additionalSetup = {};\r\n additionalSetup.myHandedness = [null, 'left', 'right'][this._myHandedness];\r\n additionalSetup.myShowOnStart = this._myShowOnStart;\r\n additionalSetup.myShowVisibilityButton = this._myShowVisibilityButton;\r\n additionalSetup.myEnableAdditionalButtons = true;\r\n additionalSetup.myEnableGamepadScrollVariable = this._myEnableGamepadScrollVariable;\r\n additionalSetup.myPlaneMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque;\r\n additionalSetup.myTextMaterial = PP.myDefaultResources.myMaterials.myText;\r\n\r\n this._myWidget.start(this.object, additionalSetup, PP.myEasyTuneVariables._getInternalMap());\r\n\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._myStarted = true;\r\n },\r\n update: function (dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this._myWidget.setVisible(false);\r\n this._myWidget.setVisible(this._myWidgetVisibleBackup);\r\n }\r\n\r\n this._myWidget.update(dt);\r\n },\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n },\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n\r\n this._myWidget.setVisible(false);\r\n }\r\n },\r\n});\r\n\r\nPP.myEasyTuneVariables = null;\r\n\r\nPP.myEasyTuneTarget = null;\r\n\r\nPP.setEasyTuneWidgetActiveVariable = function (variableName) {\r\n for (let callback of PP._setEasyTuneWidgetActiveVariableCallbacks) {\r\n callback(variableName);\r\n }\r\n};\r\n\r\nPP._setEasyTuneWidgetActiveVariableCallbacks = [];\r\n\r\nPP.refreshEasyTuneWidget = function () {\r\n for (let callback of PP._refreshEasyTuneWidgetCallbacks) {\r\n callback();\r\n }\r\n};\r\n\r\nPP._refreshEasyTuneWidgetCallbacks = [];", "PP.WidgetFrameSetup = class WidgetFrameSetup {\r\n\r\n constructor(widgetLetterID, buttonsColumnIndex) {\r\n\r\n this._initializeBuildSetup(widgetLetterID, buttonsColumnIndex);\r\n this._initializeRuntimeSetup();\r\n }\r\n\r\n _initializeBuildSetup(widgetLetterID, buttonsColumnIndex) {\r\n //General\r\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\r\n\r\n this.myCursorTargetCollisionCollider = 2; // box\r\n this.myCursorTargetCollisionGroup = 7;\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\r\n\r\n this.myTextAlignment = 2; // center\r\n this.myTextJustification = 2; // middle\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myVisibilityButtonBackgroundScale = [0.015, 0.015, 1];\r\n this.myVisibilityButtonTextPosition = [0, 0, 0.007];\r\n this.myVisibilityButtonTextScale = [0.18, 0.18, 0.18];\r\n\r\n let distanceBetweenToolsVisibilityButtons = 0.01;\r\n let buttonXOffset = this.myVisibilityButtonBackgroundScale[0] * (2 * buttonsColumnIndex) + distanceBetweenToolsVisibilityButtons * buttonsColumnIndex;\r\n\r\n this.myVisibilityButtonPosition = [];\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.NONE] = {};\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.NONE].myPosition = [-0.3 + buttonXOffset, -0.205, 0.035];\r\n\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.LEFT] = {};\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.LEFT].myPosition = [-0.2 + buttonXOffset, 0.025, 0.015];\r\n\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.RIGHT] = {};\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.RIGHT].myPosition = [0.2 - buttonXOffset, 0.025, 0.015];\r\n\r\n this.myVisibilityButtonText = widgetLetterID;\r\n\r\n this.myVisibilityButtonCursorTargetPosition = [0, 0, 0];\r\n this.myVisibilityButtonCursorTargetPosition[2] = this.myVisibilityButtonTextPosition[2];\r\n this.myVisibilityButtonCollisionExtents = this.myVisibilityButtonBackgroundScale.slice(0);\r\n this.myVisibilityButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myFlagButtonBackgroundScale = [0.0125, 0.0125, 1];\r\n this.myFlagButtonTextPosition = [0, 0, 0.007];\r\n this.myFlagButtonTextScale = [0.15, 0.15, 0.15];\r\n\r\n let distanceBetweenFlagButtons = 0.0075;\r\n let pinFlagIndex = 0;\r\n let pinButtonYOffset = this.myVisibilityButtonBackgroundScale[1] + this.myFlagButtonBackgroundScale[1] + distanceBetweenFlagButtons +\r\n this.myFlagButtonBackgroundScale[1] * (2 * pinFlagIndex) + distanceBetweenFlagButtons * pinFlagIndex;\r\n\r\n this.myPinButtonPosition = [];\r\n this.myPinButtonPosition[PP.ToolHandedness.NONE] = {};\r\n this.myPinButtonPosition[PP.ToolHandedness.NONE].myPosition = this.myVisibilityButtonPosition[PP.ToolHandedness.NONE].myPosition.slice(0);\r\n this.myPinButtonPosition[PP.ToolHandedness.NONE].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[PP.ToolHandedness.LEFT] = {};\r\n this.myPinButtonPosition[PP.ToolHandedness.LEFT].myPosition = this.myVisibilityButtonPosition[PP.ToolHandedness.LEFT].myPosition.slice(0);\r\n this.myPinButtonPosition[PP.ToolHandedness.LEFT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[PP.ToolHandedness.RIGHT] = {};\r\n this.myPinButtonPosition[PP.ToolHandedness.RIGHT].myPosition = this.myVisibilityButtonPosition[PP.ToolHandedness.RIGHT].myPosition.slice(0);\r\n this.myPinButtonPosition[PP.ToolHandedness.RIGHT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonText = \"P\";\r\n\r\n this.myPinButtonCursorTargetPosition = [0, 0, 0];\r\n this.myPinButtonCursorTargetPosition[2] = this.myFlagButtonTextPosition[2];\r\n this.myPinButtonCollisionExtents = this.myFlagButtonBackgroundScale.slice(0);\r\n this.myPinButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _initializeRuntimeSetup() {\r\n this._initializeObjectsTransforms();\r\n\r\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\r\n this.myButtonDisabledTextColor = this.myBackgroundColor;\r\n this.myButtonDisabledBackgroundColor = [110 / 255, 110 / 255, 110 / 255, 1];\r\n }\r\n\r\n _initializeObjectsTransforms() {\r\n this.myPivotObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation = [-0.645, 0.425, 0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation = [-0.645, -0.425, -0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation = [-0.645, 0.425, 0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation = [-0.645, -0.425, -0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation);\r\n\r\n /*\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myPosition = [-0.04, 0.045, -0.055];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation = [0, 0.536, -0.43, 0.727];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myPosition = [0.04, 0.045, -0.055];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation = [0, -0.536, 0.43, 0.727];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation);\r\n */\r\n\r\n this.myWidgetObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myPosition = [0.1, 0.23, -0.02];\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myPosition = [0.07, 0.23, -0.02];\r\n\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myPosition = [0.1, 0.23, -0.02];\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myPosition = [0.07, 0.23, -0.02];\r\n\r\n this._myPivotObjectDistanceFromNonVRHead = 0.6;\r\n }\r\n\r\n _createDefaultObjectTransforms() {\r\n let defaultObjectTransforms = [];\r\n\r\n for (let inputSourceTypeKey in PP.ToolInputSourceType) {\r\n let inputSourceType = PP.ToolInputSourceType[inputSourceTypeKey];\r\n defaultObjectTransforms[inputSourceType] = [];\r\n for (let handednessKey in PP.ToolHandedness) {\r\n let handedness = PP.ToolHandedness[handednessKey];\r\n defaultObjectTransforms[inputSourceType][handedness] = {};\r\n defaultObjectTransforms[inputSourceType][handedness].myPosition = [0, 0, 0];\r\n defaultObjectTransforms[inputSourceType][handedness].myRotation = [0, 0, 0, 1];\r\n }\r\n }\r\n\r\n return defaultObjectTransforms;\r\n }\r\n};", "\r\nPP.WidgetFrameUI = class WidgetFrameUI {\r\n\r\n constructor() {\r\n this._myInputSourceType = null;\r\n\r\n this._myParentObject = null;\r\n this._myIsPinned = false;\r\n\r\n this._myWidgetVisible = true;\r\n this._myVisibilityButtonVisible = true;\r\n }\r\n\r\n build(parentObject, setup, additionalSetup) {\r\n this._myParentObject = parentObject;\r\n this._mySetup = setup;\r\n this._myAdditionalSetup = additionalSetup;\r\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonVR();\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n }\r\n\r\n setWidgetVisible(visible) {\r\n this._myWidgetVisible = visible;\r\n this.myFlagsButtonPanel.pp_setActiveHierarchy(visible);\r\n if (visible) {\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n\r\n setVisibilityButtonVisible(visible) {\r\n this._myVisibilityButtonVisible = visible;\r\n this.myVisibilityButtonPanel.pp_setActiveHierarchy(visible);\r\n }\r\n\r\n setPinned(pinned) {\r\n if (pinned != this._myIsPinned) {\r\n this._myIsPinned = pinned;\r\n if (this._myIsPinned) {\r\n this.myPivotObject.pp_setParent(null);\r\n } else {\r\n this.myPivotObject.pp_setParent(this.myFixForwardObject);\r\n\r\n if (!PP.XRUtils.isXRSessionActive()) {\r\n this._setTransformForNonVR();\r\n }\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n }\r\n\r\n update(dt) {\r\n this._updateObjectsTransforms(false);\r\n }\r\n\r\n _updateObjectsTransforms(forceRefreshObjectsTransforms) {\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n let inputSourceType = PP.InputUtils.getInputSourceTypeByHandedness(this._myAdditionalSetup.myHandedness);\r\n\r\n if (inputSourceType != this._myInputSourceType || forceRefreshObjectsTransforms) {\r\n this._myInputSourceType = inputSourceType;\r\n\r\n if (!this._myIsPinned) {\r\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myPivotObject.resetRotation();\r\n this.myPivotObject.rotateObject(this._mySetup.myPivotObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myRotation);\r\n\r\n this.myWidgetObject.setTranslationLocal(this._mySetup.myWidgetObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myWidgetObject.resetRotation();\r\n this.myWidgetObject.rotateObject(this._mySetup.myWidgetObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myRotation);\r\n\r\n this.myVisibilityButtonPanel.setTranslationLocal(this._mySetup.myVisibilityButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myPinButtonPanel.setTranslationLocal(this._mySetup.myPinButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n }\r\n }\r\n } else {\r\n this.myVisibilityButtonPanel.pp_setActiveHierarchy(this._myWidgetVisible || this._myVisibilityButtonVisible);\r\n }\r\n }\r\n\r\n //Skeleton\r\n _createSkeleton() {\r\n this.myFixForwardObject = WL.scene.addObject(this._myParentObject);\r\n this.myFixForwardObject.pp_rotateObject([0, 180, 0]);\r\n this.myPivotObject = WL.scene.addObject(this.myFixForwardObject);\r\n this.myWidgetObject = WL.scene.addObject(this.myPivotObject);\r\n\r\n this.myVisibilityButtonPanel = WL.scene.addObject(this.myPivotObject);\r\n this.myVisibilityButtonBackground = WL.scene.addObject(this.myVisibilityButtonPanel);\r\n this.myVisibilityButtonText = WL.scene.addObject(this.myVisibilityButtonPanel);\r\n this.myVisibilityButtonCursorTarget = WL.scene.addObject(this.myVisibilityButtonPanel);\r\n\r\n this.myFlagsButtonPanel = WL.scene.addObject(this.myPivotObject);\r\n\r\n this.myPinButtonPanel = WL.scene.addObject(this.myFlagsButtonPanel);\r\n this.myPinButtonBackground = WL.scene.addObject(this.myPinButtonPanel);\r\n this.myPinButtonText = WL.scene.addObject(this.myPinButtonPanel);\r\n this.myPinButtonCursorTarget = WL.scene.addObject(this.myPinButtonPanel);\r\n\r\n this.myNonVRParentObject = WL.scene.addObject(PP.myPlayerObjects.myNonVRCamera);\r\n this.myNonVRParentObject.pp_translateLocal([0, 0, -this._mySetup._myPivotObjectDistanceFromNonVRHead]);\r\n this.myNonVRParentObject.pp_lookToLocal([0, 0, 1], [0, 1, 0]);\r\n\r\n }\r\n\r\n //Transforms\r\n _setTransforms() {\r\n this.myPivotObject.setDirty();\r\n\r\n this.myVisibilityButtonPanel.setTranslationLocal(this._mySetup.myVisibilityButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myVisibilityButtonBackground.scale(this._mySetup.myVisibilityButtonBackgroundScale);\r\n this.myVisibilityButtonText.setTranslationLocal(this._mySetup.myVisibilityButtonTextPosition);\r\n this.myVisibilityButtonText.scale(this._mySetup.myVisibilityButtonTextScale);\r\n this.myVisibilityButtonCursorTarget.setTranslationLocal(this._mySetup.myVisibilityButtonCursorTargetPosition);\r\n\r\n this.myPinButtonPanel.setTranslationLocal(this._mySetup.myPinButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n\r\n this.myPinButtonBackground.scale(this._mySetup.myFlagButtonBackgroundScale);\r\n this.myPinButtonText.setTranslationLocal(this._mySetup.myFlagButtonTextPosition);\r\n this.myPinButtonText.scale(this._mySetup.myFlagButtonTextScale);\r\n this.myPinButtonCursorTarget.setTranslationLocal(this._mySetup.myPinButtonCursorTargetPosition);\r\n }\r\n\r\n //Components\r\n _addComponents() {\r\n this.myVisibilityButtonBackgroundComponent = this.myVisibilityButtonBackground.addComponent('mesh');\r\n this.myVisibilityButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myVisibilityButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\r\n this.myVisibilityButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\r\n\r\n this.myVisibilityButtonTextComponent = this.myVisibilityButtonText.addComponent('text');\r\n this._setupButtonTextComponent(this.myVisibilityButtonTextComponent);\r\n this.myVisibilityButtonTextComponent.text = this._mySetup.myVisibilityButtonText;\r\n\r\n this.myVisibilityButtonCursorTargetComponent = this.myVisibilityButtonCursorTarget.addComponent('cursor-target');\r\n this.myVisibilityButtonCollisionComponent = this.myVisibilityButtonCursorTarget.addComponent('collision');\r\n this.myVisibilityButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\r\n this.myVisibilityButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\r\n this.myVisibilityButtonCollisionComponent.extents = this._mySetup.myVisibilityButtonCollisionExtents;\r\n\r\n this.myPinButtonBackgroundComponent = this.myPinButtonBackground.addComponent('mesh');\r\n this.myPinButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPinButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\r\n this.myPinButtonBackgroundComponent.material.color = this._mySetup.myButtonDisabledBackgroundColor;\r\n\r\n this.myPinButtonTextComponent = this.myPinButtonText.addComponent('text');\r\n this._setupButtonTextComponent(this.myPinButtonTextComponent);\r\n this.myPinButtonTextComponent.material.color = this._mySetup.myButtonDisabledTextColor;\r\n this.myPinButtonTextComponent.text = this._mySetup.myPinButtonText;\r\n\r\n this.myPinButtonCursorTargetComponent = this.myPinButtonCursorTarget.addComponent('cursor-target');\r\n\r\n this.myPinButtonCollisionComponent = this.myPinButtonCursorTarget.addComponent('collision');\r\n this.myPinButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\r\n this.myPinButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\r\n this.myPinButtonCollisionComponent.extents = this._mySetup.myPinButtonCollisionExtents;\r\n }\r\n\r\n _setupButtonTextComponent(textComponent) {\r\n textComponent.alignment = this._mySetup.myTextAlignment;\r\n textComponent.justification = this._mySetup.myTextJustification;\r\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\r\n textComponent.material.color = this._mySetup.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this.myVisibilityButtonPanel.pp_setActiveHierarchy(this._myVisibilityButtonVisible);\r\n\r\n this._setTransformForVR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonVR();\r\n }\r\n\r\n _setTransformForVR() {\r\n this.myFixForwardObject.pp_setParent(this._myParentObject);\r\n\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n this.myFixForwardObject.pp_rotateObject([0, 180, 0]);\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n\r\n _setTransformForNonVR() {\r\n if (!this._myIsPinned) {\r\n this.myFixForwardObject.pp_setParent(this.myNonVRParentObject);\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n\r\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myPosition);\r\n this.myPivotObject.resetRotation();\r\n this.myPivotObject.rotateObject(this._mySetup.myPivotObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myRotation);\r\n\r\n this.myWidgetObject.setTranslationLocal(this._mySetup.myWidgetObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myPosition);\r\n this.myWidgetObject.resetRotation();\r\n this.myWidgetObject.rotateObject(this._mySetup.myWidgetObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myRotation);\r\n\r\n this.myVisibilityButtonPanel.setTranslationLocal(this._mySetup.myVisibilityButtonPosition[PP.ToolHandedness.NONE].myPosition);\r\n this.myPinButtonPanel.setTranslationLocal(this._mySetup.myPinButtonPosition[PP.ToolHandedness.NONE].myPosition);\r\n }\r\n }\r\n};", "\nPP.WidgetFrame = class WidgetFrame {\n\n constructor(widgetLetterID, buttonsColumnIndex) {\n this.myIsWidgetVisible = true;\n this.myIsPinned = false;\n\n this._mySetup = new PP.WidgetFrameSetup(widgetLetterID, buttonsColumnIndex);\n this._myAdditionalSetup = null;\n\n this._myUI = new PP.WidgetFrameUI();\n this._myShowVisibilityButton = false;\n\n this._myWidgetVisibleChangedCallbacks = new Map(); // Signature: callback(isWidgetVisible)\n this._myPinChangedCallbacks = new Map(); // Signature: callback(isPinned)\n }\n\n getWidgetObject() {\n return this._myUI.myWidgetObject;\n }\n\n setVisible(visible) {\n this.myIsWidgetVisible = !visible;\n this._toggleVisibility(false, true);\n }\n\n isVisible() {\n return this.myIsWidgetVisible;\n }\n\n toggleVisibility() {\n this._toggleVisibility(false, true);\n }\n\n togglePin() {\n this._togglePin(false);\n }\n\n registerWidgetVisibleChangedEventListener(id, callback) {\n this._myWidgetVisibleChangedCallbacks.set(id, callback);\n }\n\n unregisterWidgetVisibleChangedEventListener(id) {\n this._myWidgetVisibleChangedCallbacks.delete(id);\n }\n\n registerPinChangedEventListener(id, callback) {\n this._myPinChangedCallbacks.set(id, callback);\n }\n\n unregisterPinChangedEventListener(id) {\n this._myPinChangedCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myAdditionalSetup = additionalSetup;\n\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setVisibilityButtonVisible(additionalSetup.myShowVisibilityButton);\n this._myShowVisibilityButton = additionalSetup.myShowVisibilityButton;\n if (!additionalSetup.myShowOnStart) {\n this._toggleVisibility(false, false);\n }\n\n this._addListeners();\n }\n\n update(dt) {\n this._myUI.update(dt);\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myPinButtonCursorTargetComponent.addClickFunction(this._togglePin.bind(this, true));\n ui.myPinButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPinButtonBackgroundComponent.material));\n ui.myPinButtonCursorTargetComponent.addUnHoverFunction(this._pinUnHover.bind(this, ui.myPinButtonBackgroundComponent.material));\n\n ui.myVisibilityButtonCursorTargetComponent.addClickFunction(this._toggleVisibility.bind(this, true, true));\n ui.myVisibilityButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\n ui.myVisibilityButtonCursorTargetComponent.addUnHoverFunction(this._visibilityUnHover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\n }\n\n _toggleVisibility(isButton, notify) {\n this.myIsWidgetVisible = !this.myIsWidgetVisible;\n\n this._myUI.setWidgetVisible(this.myIsWidgetVisible);\n\n let textMaterial = this._myUI.myVisibilityButtonTextComponent.material;\n let backgroundMaterial = this._myUI.myVisibilityButtonBackgroundComponent.material;\n if (this.myIsWidgetVisible) {\n textMaterial.color = this._mySetup.myDefaultTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myBackgroundColor;\n }\n } else {\n textMaterial.color = this._mySetup.myButtonDisabledTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n\n if (notify) {\n for (let callback of this._myWidgetVisibleChangedCallbacks.values()) {\n callback(this.myIsWidgetVisible);\n }\n }\n\n this._myUI.setVisibilityButtonVisible(this._myShowVisibilityButton);\n }\n\n _togglePin(isButton) {\n if (this.myIsWidgetVisible) {\n this.myIsPinned = !this.myIsPinned;\n\n this._myUI.setPinned(this.myIsPinned);\n\n let textMaterial = this._myUI.myPinButtonTextComponent.material;\n let backgroundMaterial = this._myUI.myPinButtonBackgroundComponent.material;\n if (this.myIsPinned) {\n textMaterial.color = this._mySetup.myDefaultTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myBackgroundColor;\n }\n } else {\n textMaterial.color = this._mySetup.myButtonDisabledTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n\n for (let callback of this._myPinChangedCallbacks.values()) {\n callback(this.myIsPinned);\n }\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _visibilityUnHover(material) {\n if (this.myIsWidgetVisible) {\n material.color = this._mySetup.myBackgroundColor;\n } else {\n material.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n\n _pinUnHover(material) {\n if (this.myIsPinned) {\n material.color = this._mySetup.myBackgroundColor;\n } else {\n material.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n};", "//PP\r\n\r\nrequire('./pp/pp');\r\n\r\n//\tPLUGIN\r\nrequire('./pp/plugin/component_mods/clone_component_mod');\r\nrequire('./pp/plugin/component_mods/cursor_component_mod');\r\nrequire('./pp/plugin/component_mods/cursor_target_component_mod');\r\nrequire('./pp/plugin/component_mods/mouse_look_component_mod');\r\n\r\nrequire('./pp/plugin/extensions/array_extension');\r\nrequire('./pp/plugin/extensions/object_extension');\r\nrequire('./pp/plugin/extensions/math_extension');\r\n\r\n//\tAUDIO\r\nrequire('./pp/audio/spatial_audio_listener');\r\nrequire('./pp/audio/audio_manager_component');\r\nrequire('./pp/audio/audio_manager');\r\nrequire('./pp/audio/audio_player');\r\nrequire('./pp/audio/audio_setup');\r\nrequire('./pp/audio/mute_everything');\r\n\r\n//\tCAULDRON\r\nrequire('./pp/cauldron/benchmarks/max_physx');\r\nrequire('./pp/cauldron/benchmarks/max_visible_triangles');\r\n\r\nrequire('./pp/cauldron/cauldron/number_over_value');\r\nrequire('./pp/cauldron/cauldron/object_pool_manager');\r\nrequire('./pp/cauldron/cauldron/physx_collision_collector');\r\nrequire('./pp/cauldron/cauldron/save_manager');\r\nrequire('./pp/cauldron/cauldron/timer');\r\n\r\nrequire('./pp/cauldron/components/clear_console_on_xr_session_start');\r\nrequire('./pp/cauldron/components/set_active');\r\nrequire('./pp/cauldron/components/adjust_hierarchy_physx_scale');\r\nrequire('./pp/cauldron/components/get_player_objects');\r\nrequire('./pp/cauldron/components/get_default_resources');\r\nrequire('./pp/cauldron/components/show_fps');\r\n\r\nrequire('./pp/cauldron/fsm/fsm');\r\nrequire('./pp/cauldron/fsm/state');\r\nrequire('./pp/cauldron/fsm/transition');\r\nrequire('./pp/cauldron/fsm/states/timer_state');\r\n\r\nrequire('./pp/cauldron/utils/ca_utils');\r\nrequire('./pp/cauldron/utils/color_utils');\r\nrequire('./pp/cauldron/utils/mesh_utils');\r\nrequire('./pp/cauldron/utils/save_utils');\r\nrequire('./pp/cauldron/utils/text_utils');\r\nrequire('./pp/cauldron/utils/xr_utils');\r\n\r\nrequire('./pp/cauldron/physics/physics_utils');\r\nrequire('./pp/cauldron/physics/physics_raycast_data');\r\nrequire('./pp/cauldron/physics/physics_layer_flags');\r\n\r\nrequire('./pp/cauldron/visual/visual_manager');\r\n\r\nrequire('./pp/cauldron/visual/elements/visual_element_types');\r\nrequire('./pp/cauldron/visual/elements/visual_line');\r\nrequire('./pp/cauldron/visual/elements/visual_mesh');\r\nrequire('./pp/cauldron/visual/elements/visual_point');\r\nrequire('./pp/cauldron/visual/elements/visual_arrow');\r\nrequire('./pp/cauldron/visual/elements/visual_text');\r\nrequire('./pp/cauldron/visual/elements/visual_transform');\r\nrequire('./pp/cauldron/visual/elements/visual_raycast');\r\nrequire('./pp/cauldron/visual/elements/visual_torus');\r\n\r\nrequire('./pp/cauldron/visual/components/visual_manager_component');\r\n\r\n//\tDEBUG\r\nrequire('./pp/debug/debug_manager');\r\nrequire('./pp/debug/debug_visual_manager');\r\n\r\nrequire('./pp/debug/components/debug_transform_component');\r\nrequire('./pp/debug/components/debug_manager_component');\r\n\r\n//\tGAMEPLAY\r\nrequire('./pp/gameplay/cauldron/direction_2D_to_3D_converter');\r\n\r\nrequire('./pp/gameplay/grab_throw/grabbable');\r\nrequire('./pp/gameplay/grab_throw/grabber_hand');\r\n\r\n//\tINPUT\r\nrequire('./pp/input/cauldron/finger_cursor');\r\nrequire('./pp/input/cauldron/input_types');\r\nrequire('./pp/input/cauldron/input_utils');\r\nrequire('./pp/input/cauldron/keyboard');\r\nrequire('./pp/input/cauldron/mouse');\r\nrequire('./pp/input/cauldron/input_manager');\r\nrequire('./pp/input/cauldron/input_manager_component');\r\nrequire('./pp/input/cauldron/switch_hand_object');\r\nrequire('./pp/input/cauldron/tracked_hand_draw_joint');\r\nrequire('./pp/input/cauldron/tracked_hand_draw_all_joints');\r\nrequire('./pp/input/cauldron/tracked_hand_draw_skin');\r\n\r\nrequire('./pp/input/gamepad/gamepad_buttons');\r\nrequire('./pp/input/gamepad/base_gamepad');\r\nrequire('./pp/input/gamepad/universal_gamepad');\r\nrequire('./pp/input/gamepad/gamepad_cores/gamepad_core');\r\nrequire('./pp/input/gamepad/gamepad_cores/xr_gamepad_core');\r\nrequire('./pp/input/gamepad/gamepad_cores/keyboard_gamepad_core');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_mesh_animator');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_manager');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_utils');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_control_scheme');\r\n\r\nrequire('./pp/input/pose/base_pose.js');\r\nrequire('./pp/input/pose/hand_pose');\r\nrequire('./pp/input/pose/head_pose');\r\nrequire('./pp/input/pose/tracked_hand_joint_pose');\r\nrequire('./pp/input/pose/tracked_hand_pose');\r\nrequire('./pp/input/pose/components/set_player_height');\r\nrequire('./pp/input/pose/components/set_hand_local_transform');\r\nrequire('./pp/input/pose/components/set_head_local_transform');\r\nrequire('./pp/input/pose/components/set_vr_head_local_transform');\r\nrequire('./pp/input/pose/components/set_non_vr_head_local_transform');\r\nrequire('./pp/input/pose/components/set_tracked_hand_joint_local_transform');\r\nrequire('./pp/input/pose/components/copy_hand_transform');\r\nrequire('./pp/input/pose/components/copy_head_transform');\r\nrequire('./pp/input/pose/components/copy_player_transform');\r\nrequire('./pp/input/pose/components/copy_player_pivot_transform');\r\n\r\n//\tTOOL\r\nrequire('./pp/tool/cauldron/cauldron/tool_types');\r\nrequire('./pp/tool/cauldron/components/tool_cursor');\r\n\r\nrequire('./pp/tool/console_vr/console_vr_widget_setup');\r\nrequire('./pp/tool/console_vr/console_vr_widget_ui');\r\nrequire('./pp/tool/console_vr/console_vr_widget');\r\nrequire('./pp/tool/console_vr/console_vr');\r\n\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_object_tuner');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_light_attenuation');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_light_color');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_mesh_color');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_scale');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_set_tune_target_child_number');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_set_tune_target_grab');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_transform');\r\n\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget_setup');\r\n\r\nrequire('./pp/tool/easy_tune/easy_tune_variables');\r\nrequire('./pp/tool/easy_tune/easy_tune');\r\n\r\nrequire('./pp/tool/widget_frame/widget_frame_setup');\r\nrequire('./pp/tool/widget_frame/widget_frame_ui');\r\nrequire('./pp/tool/widget_frame/widget_frame');"], - "mappings": "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", - "names": ["require_pp", "__commonJSMin", "require_clone_component_mod", "__commonJSMin", "clonedObject", "deepCloneParams", "extraData", "clonedComponent", "common_exports", "__export", "ARRAY_TYPE", "EPSILON", "RANDOM", "equals", "setMatrixArrayType", "toRadian", "type", "a", "degree", "b", "init_common", "__esmMin", "y", "i", "mat3_exports", "__export", "add", "adjoint", "clone", "copy", "create", "determinant", "equals", "exactEquals", "frob", "fromMat2d", "fromMat4", "fromQuat", "fromRotation", "fromScaling", "fromTranslation", "fromValues", "identity", "invert", "mul", "multiply", "multiplyScalar", "multiplyScalarAndAdd", "normalFromMat4", "projection", "rotate", "scale", "set", "str", "sub", "subtract", "translate", "transpose", "out", "ARRAY_TYPE", "a", "m00", "m01", "m02", "m10", "m11", "m12", "m20", "m21", "m22", "a01", "a02", "a12", "a00", "a10", "a11", "a20", "a21", "a22", "b01", "b11", "b21", "det", "b", "b00", "b02", "b10", "b12", "b20", "b22", "v", "x", "y", "rad", "s", "c", "q", "z", "w", "x2", "y2", "z2", "xx", "yx", "yy", "zx", "zy", "zz", "wx", "wy", "wz", "a03", "a13", "a23", "a30", "a31", "a32", "a33", "b03", "b04", "b05", "b06", "b07", "b08", "b09", "width", "height", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "EPSILON", "init_mat3", "__esmMin", "init_common", "mat4_exports", "__export", "add", "adjoint", "clone", "copy", "create", "determinant", "equals", "exactEquals", "frob", "fromQuat", "fromQuat2", "fromRotation", "fromRotationTranslation", "fromRotationTranslationScale", "fromRotationTranslationScaleOrigin", "fromScaling", "fromTranslation", "fromValues", "fromXRotation", "fromYRotation", "fromZRotation", "frustum", "getRotation", "getScaling", "getTranslation", "identity", "invert", "lookAt", "mul", "multiply", "multiplyScalar", "multiplyScalarAndAdd", "ortho", "orthoNO", "orthoZO", "perspective", "perspectiveFromFieldOfView", "perspectiveNO", "perspectiveZO", "rotate", "rotateX", "rotateY", "rotateZ", "scale", "set", "str", "sub", "subtract", "targetTo", "translate", "transpose", "out", "ARRAY_TYPE", "a", "m00", "m01", "m02", "m03", "m10", "m11", "m12", "m13", "m20", "m21", "m22", "m23", "m30", "m31", "m32", "m33", "a01", "a02", "a03", "a12", "a13", "a23", "a00", "a10", "a11", "a20", "a21", "a22", "a30", "a31", "a32", "a33", "b00", "b01", "b02", "b03", "b04", "b05", "b06", "b07", "b08", "b09", "b10", "b11", "det", "b", "b0", "b1", "b2", "b3", "v", "x", "y", "z", "rad", "axis", "len", "s", "t", "b12", "b20", "b21", "b22", "EPSILON", "c", "q", "w", "x2", "y2", "z2", "xx", "xy", "xz", "yy", "yz", "zz", "wx", "wy", "wz", "translation", "bx", "by", "bz", "bw", "ax", "ay", "az", "aw", "magnitude", "mat", "scaling", "is1", "is2", "is3", "sm11", "sm12", "sm13", "sm21", "sm22", "sm23", "sm31", "sm32", "sm33", "trace", "S", "sx", "sy", "sz", "o", "ox", "oy", "oz", "out0", "out1", "out2", "out4", "out5", "out6", "out8", "out9", "out10", "yx", "zx", "zy", "left", "right", "bottom", "top", "near", "far", "rl", "tb", "nf", "fovy", "aspect", "f", "fov", "upTan", "downTan", "leftTan", "rightTan", "xScale", "yScale", "lr", "bt", "eye", "center", "up", "x0", "x1", "y0", "y1", "z0", "z1", "eyex", "eyey", "eyez", "upx", "upy", "upz", "centerx", "centery", "centerz", "target", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a14", "a15", "b4", "b5", "b6", "b7", "b8", "b9", "b13", "b14", "b15", "init_mat4", "__esmMin", "init_common", "vec3_exports", "__export", "add", "angle", "bezier", "ceil", "clone", "copy", "create", "cross", "dist", "distance", "div", "divide", "dot", "equals", "exactEquals", "floor", "forEach", "fromValues", "hermite", "inverse", "len", "length", "lerp", "max", "min", "mul", "multiply", "negate", "normalize", "random", "rotateX", "rotateY", "rotateZ", "round", "scale", "scaleAndAdd", "set", "sqrDist", "sqrLen", "squaredDistance", "squaredLength", "str", "sub", "subtract", "transformMat3", "transformMat4", "transformQuat", "zero", "out", "ARRAY_TYPE", "a", "x", "y", "z", "b", "ax", "ay", "az", "bx", "by", "bz", "t", "c", "d", "factorTimes2", "factor1", "factor2", "factor3", "factor4", "inverseFactor", "inverseFactorTimesTwo", "r", "RANDOM", "zScale", "m", "w", "q", "qx", "qy", "qz", "qw", "uvx", "uvy", "uvz", "uuvx", "uuvy", "uuvz", "w2", "rad", "p", "mag1", "mag2", "mag", "cosine", "a0", "a1", "a2", "b0", "b1", "b2", "EPSILON", "init_vec3", "__esmMin", "init_common", "vec", "stride", "offset", "count", "fn", "arg", "i", "l", "vec4_exports", "__export", "add", "ceil", "clone", "copy", "create", "cross", "dist", "distance", "div", "divide", "dot", "equals", "exactEquals", "floor", "forEach", "fromValues", "inverse", "len", "length", "lerp", "max", "min", "mul", "multiply", "negate", "normalize", "random", "round", "scale", "scaleAndAdd", "set", "sqrDist", "sqrLen", "squaredDistance", "squaredLength", "str", "sub", "subtract", "transformMat4", "transformQuat", "zero", "out", "ARRAY_TYPE", "a", "x", "y", "z", "w", "b", "u", "v", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "t", "ax", "ay", "az", "aw", "v1", "v2", "v3", "v4", "s1", "s2", "RANDOM", "d", "m", "q", "qx", "qy", "qz", "qw", "ix", "iy", "iz", "iw", "a0", "a1", "a2", "a3", "b0", "b1", "b2", "b3", "EPSILON", "init_vec4", "__esmMin", "init_common", "vec", "stride", "offset", "count", "fn", "arg", "i", "l", "quat_exports", "__export", "add", "calculateW", "clone", "conjugate", "copy", "create", "dot", "equals", "exactEquals", "exp", "fromEuler", "fromMat3", "fromValues", "getAngle", "getAxisAngle", "identity", "invert", "len", "length", "lerp", "ln", "mul", "multiply", "normalize", "pow", "random", "rotateX", "rotateY", "rotateZ", "rotationTo", "scale", "set", "setAxes", "setAxisAngle", "slerp", "sqlerp", "sqrLen", "squaredLength", "str", "out", "ARRAY_TYPE", "axis", "rad", "out_axis", "q", "EPSILON", "a", "b", "dotproduct", "ax", "ay", "az", "aw", "bx", "by", "bz", "bw", "x", "y", "z", "w", "et", "s", "t", "omega", "cosom", "sinom", "scale0", "scale1", "u1", "RANDOM", "u2", "u3", "sqrt1MinusU1", "sqrtU1", "a0", "a1", "a2", "a3", "invDot", "m", "fTrace", "fRoot", "i", "j", "k", "halfToRad", "sx", "cx", "sy", "cy", "sz", "cz", "init_quat", "__esmMin", "init_common", "init_mat3", "init_vec3", "init_vec4", "tmpvec3", "xUnitVec3", "yUnitVec3", "cross", "temp1", "temp2", "c", "d", "matr", "view", "right", "up", "quat2_exports", "__export", "add", "clone", "conjugate", "copy", "create", "dot", "equals", "exactEquals", "fromMat4", "fromRotation", "fromRotationTranslation", "fromRotationTranslationValues", "fromTranslation", "fromValues", "getDual", "getReal", "getTranslation", "identity", "invert", "len", "length", "lerp", "mul", "multiply", "normalize", "rotateAroundAxis", "rotateByQuatAppend", "rotateByQuatPrepend", "rotateX", "rotateY", "rotateZ", "scale", "set", "setDual", "setReal", "sqrLen", "squaredLength", "str", "translate", "dq", "ARRAY_TYPE", "a", "x1", "y1", "z1", "w1", "x2", "y2", "z2", "w2", "ax", "ay", "az", "out", "q", "t", "bx", "by", "bz", "bw", "outer", "getRotation", "aw", "v", "ax1", "ay1", "az1", "aw1", "bx1", "by1", "bz1", "ax2", "ay2", "az2", "aw2", "rad", "qx", "qy", "qz", "qw", "axis", "EPSILON", "axisLength", "s", "b", "ax0", "ay0", "az0", "aw0", "bw1", "bx0", "by0", "bz0", "bw0", "mt", "sqlen", "magnitude", "a0", "a1", "a2", "a3", "b0", "b1", "b2", "b3", "a_dot_b", "a4", "a5", "a6", "a7", "b4", "b5", "b6", "b7", "init_quat2", "__esmMin", "init_common", "init_quat", "init_mat4", "vec2_exports", "__export", "add", "angle", "ceil", "clone", "copy", "create", "cross", "dist", "distance", "div", "divide", "dot", "equals", "exactEquals", "floor", "forEach", "fromValues", "inverse", "len", "length", "lerp", "max", "min", "mul", "multiply", "negate", "normalize", "random", "rotate", "round", "scale", "scaleAndAdd", "set", "sqrDist", "sqrLen", "squaredDistance", "squaredLength", "str", "sub", "subtract", "transformMat2", "transformMat2d", "transformMat3", "transformMat4", "zero", "out", "ARRAY_TYPE", "a", "x", "y", "b", "z", "t", "ax", "ay", "r", "RANDOM", "m", "rad", "p0", "p1", "sinC", "cosC", "x1", "y1", "x2", "y2", "mag", "cosine", "a0", "a1", "b0", "b1", "EPSILON", "init_vec2", "__esmMin", "init_common", "vec", "stride", "offset", "count", "fn", "arg", "i", "l", "init_esm", "__esmMin", "init_common", "init_mat3", "init_mat4", "init_quat", "init_quat2", "init_vec2", "init_vec3", "init_vec4", "cursor_component_mod_exports", "init_cursor_component_mod", "__esmMin", "init_esm", "sceneLoaded", "index", "inputComp", "onXRSessionStart", "viewComponent", "onClick", "onPointerMove", "onPointerDown", "onPointerUp", "mat4_exports", "onViewportResize", "hitPosition", "dist", "vec3_exports", "visible", "dt", "doClick", "p", "rayHit", "cursorTarget", "s", "onSessionEnd", "e", "onSelect", "onSelectStart", "onSelectEnd", "bounds", "clientX", "clientY", "w", "h", "left", "top", "f", "require_cursor_target_component_mod", "__commonJSMin", "object", "cursor", "f", "arr", "value", "index", "dt", "require_mouse_look_component_mod", "__commonJSMin", "viewForward", "viewUp", "referenceUp", "referenceUpNegate", "referenceRight", "newUp", "e", "minAngle", "maxVerticalAngle", "angleWithUp", "fixAngle", "array_extension_exports", "init_array_extension", "__esmMin", "init_esm", "callback", "elementToFind", "elementsEqualCallback", "elementFound", "index", "indexes", "element", "elementRemoved", "arrayRemoved", "elementsRemoved", "currentElement", "elementToRemove", "length", "array", "copyCallback", "cloneCallback", "clone", "equals", "i", "decimalPlaces", "message", "value", "out", "start", "end", "fixedStart", "fixedEnd", "min", "max", "vector", "epsilon", "x", "y", "vec2_exports", "vec3_exports", "z", "quat", "mat4", "positiveDirection", "signedLength", "upAxis", "crossAxis", "angle", "common_exports", "quat_exports", "axis", "componentAlong", "thisAxisLength", "thisAxisLengthSigned", "vectorAxisLength", "vectorAxisLengthSigned", "componentAlongThis", "componentAlongVector", "zeroSign", "angleSigned", "up", "thisToAxis", "fixedProjectAlongAxis", "projectAlongAxis", "angleWithAlongAxis", "lengthToRemove", "planeNormal", "thisToPlane", "rotation", "zero", "origin", "parentTransform", "inverse", "mat4_exports", "parentTransformMatrix", "position", "one", "mat3_exports", "direction", "rotationQuat", "rotationAxis", "signedAngle", "pivotAxis", "thisFlat", "directionFlat", "to", "interpolationValue", "easingFunction", "lerpValue", "w", "vec4_exports", "rotationMatrix", "left", "forward", "backward", "down", "right", "parentQuat", "invertQuat", "mat3", "leftAxis", "forwardAxis", "radiansRotation", "degreesRotation", "quat2_exports", "quat2", "parentTransformQuat", "transformMatrix", "scale", "transformMatrixNoScale", "inverseScale", "tempScale", "convertTransform", "transformQuat", "fixedAxes", "fixedAxesFixSignMap", "fixedLeft", "fixedUp", "fixedForward", "currentAxis", "rotationMat", "axes", "priority", "firstAxis", "secondAxis", "thirdAxis", "secondAxisValid", "thirdAxisValid", "secondAxisIndex", "thirdAxisIndex", "fixSignMap", "key", "prefixes", "found", "prefix", "object_extension_exports", "init_object_extension", "__esmMin", "init_esm", "position", "vec3_exports", "rotation", "value", "index", "array", "quat", "quat_exports", "mat3_exports", "scale", "transform", "transformQuat", "quat2_exports", "mat4_exports", "axes", "forward", "backward", "up", "down", "left", "right", "degreesRotation", "vector", "transformMatrixNoScale", "inverseScale", "one", "zero", "identity", "translation", "amount", "direction", "rotationQuat", "currentRotationQuat", "angle", "axis", "common_exports", "origin", "transformToRotate", "transformToRotateConjugate", "defaultQuat", "convertedPosition", "convertedAxis", "internalUp", "newParent", "keepTransform", "matrix", "resultPosition", "resultDirection", "resultTransform", "convertTransform", "type", "paramsOrActive", "active", "params", "component", "descendants", "descendant", "object", "children", "child", "components", "descendantsComponents", "descendantComponents", "childComponents", "applyToHierarchy", "deepClone", "componentName", "variableName", "componentMap", "overrideValue", "clonedObject", "objectsToCloneData", "objectsToCloneComponentsData", "cloneData", "parent", "objectToClone", "currentClonedObject", "cloneChild", "childToInclude", "childToIgnore", "componentsToCloneData", "cloneComponent", "componentsToPostProcessData", "componentToClone", "clonedComponent", "currentClonedComponent", "isCloneable", "objects", "tab", "newLine", "startObject", "endObject", "nameLabel", "idLabel", "componentsLabel", "typeLabel", "childrenLabel", "startComponents", "endComponents", "startChildren", "endChildren", "separator", "newLineTab", "objectString", "i", "childString", "emptyName", "name", "hierarchy", "descendantsQueue", "otherObject", "count", "componentAmountMap", "amountMap", "objectAmount", "typeAmount", "mat3", "quatRotation", "radiansRotation", "min", "max", "objectsToReserve", "componentsToReserve", "componentCount", "fixedAxes", "fixedAxesFixSignMap", "fixedLeft", "fixedUp", "fixedForward", "currentAxis", "rotationAxis", "rotationMat", "priority", "isLocal", "firstAxis", "secondAxis", "thirdAxis", "secondAxisValid", "thirdAxisValid", "crossAxis", "secondAxisIndex", "thirdAxisIndex", "fixSignMap", "key", "prefixes", "found", "prefix", "require_math_extension", "__commonJSMin", "value", "start", "end", "fixedStart", "fixedEnd", "min", "max", "zeroSign", "sign", "angle", "number", "decimalPlaces", "factor", "originRangeStart", "originRangeEnd", "newRangeStart", "newRangeEnd", "clampedValue", "newValue", "args", "random", "randomIndex", "from", "to", "interpolationValue", "t", "easingFunction", "lerpValue", "clampedFrom", "clampedTo", "distance", "usePositiveRange", "clampedAngle", "useShortestAngle", "isInside", "anglePositive", "startPositive", "endPositive", "temp", "key", "prefixes", "found", "prefix", "require_howler", "__commonJSMin", "exports", "HowlerGlobal", "self", "Howler", "vol", "setupAudioContext", "i", "ids", "j", "sound", "muted", "ext", "test", "audioTest", "mpegTest", "ua", "checkOpera", "isOldOpera", "checkSafari", "safariVersion", "isOldSafari", "unlock", "e", "audioNode", "source", "testPlay", "audio", "handleSuspension", "Howl", "o", "url", "str", "Sound", "loadBuffer", "sprite", "internal", "id", "num", "soundId", "seek", "duration", "timeout", "start", "stop", "setParams", "node", "playWebAudio", "playHtml5", "play", "err", "loadedNoReadyState", "listener", "args", "index", "from", "to", "len", "currentTime", "end", "isGroup", "diff", "steps", "stepLen", "lastTick", "tick", "loop", "rate", "playing", "seekAndEmit", "emitSeek", "realTime", "rateSeek", "sounds", "remCache", "cache", "event", "fn", "once", "events", "isId", "keys", "msg", "task", "limit", "cnt", "isIOS", "checkIE", "howl", "parent", "volume", "loadSound", "data", "dataView", "decodeAudioData", "xhr", "key", "code", "safeXhrSend", "arraybuffer", "error", "success", "buffer", "iOS", "appVersion", "version", "safari", "pan", "x", "y", "z", "xUp", "yUp", "zUp", "or", "_super", "pannerType", "setupPanner", "pa", "panner", "type", "spatial_audio_listener_exports", "import_howler", "init_spatial_audio_listener", "__esmMin", "require_audio_manager_component", "__commonJSMin", "dt", "audio_manager_exports", "import_howler", "init_audio_manager", "__esmMin", "audioSetupID", "id", "audioSetup", "preload", "volume", "mute", "require_audio_player", "__commonJSMin", "audioSetupOrAudioFilePath", "eventKey", "audioID", "checkOnlyLast", "isPlaying", "fromVolume", "toVolume", "duration", "updateOnlyLast", "position", "pitch", "rate", "volume", "spatial", "audioEvent", "listenerID", "callback", "event", "callbacks", "require_audio_setup", "__commonJSMin", "audioFilePath", "audioSetup", "pitch", "rate", "mute_everything_exports", "import_howler", "init_mute_everything", "__esmMin", "dt", "max_physx_exports", "init_max_physx", "__esmMin", "init_esm", "i", "dt", "debugActive", "staticCollisions", "collector", "dynamicCollisions", "kinematicCollisions", "totalCollisions", "fpsString", "fps", "physX", "strength", "raycastCount", "distance", "origin", "direction", "raycastResult", "isStatic", "isDynamic", "maxCount", "physXList", "cloves", "angleForClove", "minDistance", "maxDistance", "minExtraRotation", "maxExtraRotation", "upDirection", "horizontalDirection", "verticalDirection", "rotationAxis", "vec3_exports", "j", "extraAxisRotation", "extraUpRotation", "physXDirection", "position", "scale", "shape", "physXComponent", "require_max_visible_triangles", "__commonJSMin", "dt", "frameRate", "isLagging", "reset", "count", "plane", "gridSize", "spaceBetween", "totalSpaceBetween", "planeSize", "currentCount", "i", "j", "position", "meshComponent", "poolParams", "isStart", "elementToRemove", "averageDT", "trianglesAmount", "squaresAmount", "row", "column", "closestSqrt", "meshParams", "x", "y", "vertexParams", "firstTriangle", "secondTriangle", "require_number_over_value", "__commonJSMin", "startNumber", "endNumber", "startInterpolationValue", "endInterpolationValue", "easingFunction", "roundingFunction", "interpolationValue", "lerpInterpolationValue", "lerpNumber", "number", "currentNumber", "clampedNumber", "clampedCurrentNumber", "numberToRound", "roundedNumber", "startRange", "endRange", "randomValue", "average", "min", "max", "require_object_pool_manager", "__commonJSMin", "poolID", "poolObject", "objectPoolParams", "pool", "amount", "percentage", "object", "amountToAdd", "released", "size", "log", "i", "clone", "active", "first", "second", "equals", "require_physx_collision_collector", "__commonJSMin", "physXComponent", "isTrigger", "active", "dt", "callbackID", "callback", "type", "objectFound", "object", "element", "collisionsToEnd", "physX", "collision", "require_save_manager", "__commonJSMin", "delay", "delayed", "cache", "dt", "id", "value", "overrideDelaySavesCommit", "sameValue", "failed", "isCommitSaveDelayed", "callback", "callbackMap", "result", "isCommitSavesDelayed", "defaultValue", "functionName", "loadFromCache", "saveResult", "session", "event", "callbackID", "valueID", "valueIDMap", "require_timer", "__commonJSMin", "duration", "autoStart", "dt", "percentage", "callback", "id", "require_clear_console_on_xr_session_start", "__commonJSMin", "dt", "require_set_active", "__commonJSMin", "dt", "require_adjust_hierarchy_physx_scale", "__commonJSMin", "dt", "scale", "physXComponents", "physX", "require_get_player_objects", "__commonJSMin", "require_get_default_resources", "__commonJSMin", "require_show_fps", "__commonJSMin", "visualParams", "playerTransformQuat", "dt", "fps", "require_fsm", "__commonJSMin", "stateID", "stateObject", "transitionID", "fromStateData", "toStateData", "transitionObject", "skipStateFunction", "args", "performType", "performDelayedType", "state", "cloneObject", "stateData", "fromStateID", "toStateID", "transition", "fromMap", "transitionData", "initStateID", "initTransition", "initTransitionObject", "initStateData", "callback", "callbackMap", "dt", "i", "performDelayed", "transitions", "transitionsPerStateMap", "transitionMap", "transitionsToState", "toDelete", "fromTransitions", "hasTransition", "deepClone", "cloneFSM", "entry", "fromStateMap", "tEntry", "fromState", "toState", "isDeepCloneable", "active", "debugLogName", "showDelayedInfo", "callbackID", "iniStateID", "iniStateIDMap", "transitionIDMap", "value", "transitionMapValue", "element", "currentlyPerformedTransition", "consoleArguments", "transitionToPerform", "transitionIDMaps", "require_state", "__commonJSMin", "dt", "fsm", "args", "state", "transition", "require_transition", "__commonJSMin", "fsm", "initState", "args", "transition", "require_timer_state", "__commonJSMin", "duration", "transitionToPerformOnEnd", "transitionArgs", "callback", "id", "dt", "fsm", "transition", "state", "require_ca_utils", "__commonJSMin", "useDummyServer", "dummyServer", "leaderboardID", "isAscending", "isAroundPlayer", "scoresAmount", "callbackOnDone", "callbackOnError", "overrideUseDummyServer", "user", "userName", "result", "userValid", "value", "error", "scoreToSubmit", "leaderboard", "require_color_utils", "__commonJSMin", "rgb", "hsv", "r", "g", "b", "max", "min", "d", "h", "s", "v", "i", "f", "p", "q", "t", "color", "result", "require_mesh_utils", "__commonJSMin", "vertexCount", "meshParams", "i", "vertexParams", "firstTriangle", "secondTriangle", "meshCreationParams", "indexData", "triangle", "indexDataUnsignedInt", "mesh", "positionAttribute", "textureCoordinatesAttribute", "normalAttribute", "colorAttribute", "vertex", "position", "textureCoordinates", "normal", "color", "clonedIndexData", "clonedMesh", "clonedPositionAttribute", "clonedTextureCoordinatesAttribute", "clonedNormalAttribute", "clonedColorAttribute", "invertedIndexData", "invertedMesh", "invertedPositionAttribute", "invertedTextureCoordinatesAttribute", "invertedNormalAttribute", "invertedColorAttribute", "object", "alpha", "meshComponents", "meshComponent", "material", "cloneMaterial", "require_save_utils", "__commonJSMin", "id", "value", "defaultValue", "item", "require_text_utils", "__commonJSMin", "object", "textComponents", "textComponent", "require_xr_utils", "__commonJSMin", "require_physics_utils", "__commonJSMin", "layerFlagAmount", "layerFlagNames", "objectsEqualCallback", "first", "second", "raycastSetup", "raycastResult", "internalRaycastResult", "currentValidHitIndex", "validHitsCount", "i", "isHitValid", "isHitInsideCollision", "hit", "hitsToRemove", "require_physics_raycast_data", "__commonJSMin", "setup", "ignoreHitsInsideCollision", "firstHit", "hit", "hits", "hitIndex", "removedHit", "result", "copyHitCallback", "currentElement", "elementToCopy", "i", "length", "require_physics_layer_flags", "__commonJSMin", "indexOrName", "active", "index", "mask", "isActive", "layerMask", "layerFlags", "require_visual_manager", "__commonJSMin", "active", "dt", "visualElementParams", "lifetimeSeconds", "idToReuse", "visualElement", "idReused", "visualElementMap", "elementID", "visualElementPair", "visualElementType", "amount", "pool", "difference", "idsToRemove", "visualElementMapEntry", "id", "params", "element", "type", "objectPoolParams", "object", "require_visual_element_types", "__commonJSMin", "require_visual_line", "__commonJSMin", "start", "end", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "scaleLine", "translateLine", "forward", "require_visual_mesh", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "require_visual_point", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "require_visual_arrow", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "end", "translateRoot", "scaleArrow", "direction", "forward", "visualLineParams", "require_visual_text", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "require_visual_transform", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "axes", "scale", "position", "maxValue", "value", "visualLineParams", "require_visual_raycast", "__commonJSMin", "result", "params", "visible", "hitsToShow", "i", "visualRaycastHit", "autoRefresh", "dt", "raycastDistance", "visualRaycastParams", "visualRaycastHitParams", "clonedParams", "clone", "require_visual_torus", "__commonJSMin", "params", "visible", "segmentToShow", "i", "visualSegment", "autoRefresh", "dt", "clonedParams", "clone", "segmentStart", "segmentEnd", "segmentDirection", "fixedSegmentStart", "fixedSegmentEnd", "up", "sliceAngle", "extraLength", "visualSegmentParams", "require_visual_manager_component", "__commonJSMin", "dt", "require_debug_manager", "__commonJSMin", "dt", "require_debug_visual_manager", "__commonJSMin", "lifetimeSeconds", "start", "direction", "length", "color", "thickness", "visualParams", "end", "position", "radius", "text", "transform", "alignment", "justification", "raycastResult", "showOnlyFirstHit", "hitNormalLength", "require_debug_transform_component", "__commonJSMin", "dt", "require_debug_manager_component", "__commonJSMin", "dt", "require_direction_2D_to_3D_converter", "__commonJSMin", "params", "direction2D", "referenceTransformQuat", "directionUp", "outDirection3D", "forward", "right", "directionUpNegate", "forwardScaled", "rightScaled", "angleForwardWithDirectionUp", "angleRightWithDirectionUp", "require_grabbable", "__commonJSMin", "grabber", "callback", "linearVelocity", "angularVelocity", "angularVelocityDegrees", "angularVelocityRadians", "id", "require_grabber_hand", "__commonJSMin", "dt", "grabButton", "throwButton", "id", "callback", "grabbablesToGrab", "collisions", "i", "grabbable", "grabberPosition", "first", "second", "firstPosition", "secondPosition", "firstDistance", "secondDistance", "grabbableToGrab", "grabbableData", "linearVelocity", "angularVelocity", "grabber", "element", "handPose", "linearVelocityHistory", "speed", "speedEaseMultiplier", "directionCurrentWeight", "lastDirectionIndex", "direction", "currentDirection", "angularVelocityHistory", "j", "color", "useGrabbableAsVelocitySource", "linearVelocityHistorySize", "angularVelocityHistorySize", "require_finger_cursor", "__commonJSMin", "dt", "overlaps", "overlapTarget", "i", "target", "tip", "session", "referenceSpace", "require_input_types", "__commonJSMin", "require_input_utils", "__commonJSMin", "index", "handedness", "inputSourceType", "inputSource", "i", "input", "oppositeHandedness", "jointType", "jointTypeKey", "jointTypeIndexKey", "require_keyboard", "__commonJSMin", "keyType", "isPressed", "isPressStart", "isPressEnd", "dt", "keyInfo", "event", "require_mouse", "__commonJSMin", "typeKey", "dt", "buttonInfo", "buttonInfoType", "isPressed", "isPressStart", "isPressEnd", "active", "out", "mousePosition", "distanceFromCamera", "originWorld", "directionWorld", "right", "up", "directionLocal", "projectionMatrixInvert", "raycastSetup", "raycastResult", "delay", "event", "bounds", "require_input_manager", "__commonJSMin", "dt", "require_input_manager_component", "__commonJSMin", "dt", "handPoseParams", "leftXRGamepadCore", "rightXRGamepadCore", "leftKeyboardGamepadCore", "rightKeyboardGamepadCore", "require_switch_hand_object", "__commonJSMin", "dt", "inputSourceType", "require_tracked_hand_draw_joint", "__commonJSMin", "dt", "mesh", "require_tracked_hand_draw_all_joints", "__commonJSMin", "dt", "jointTypeKey", "jointType", "jointObject", "require_tracked_hand_draw_skin", "__commonJSMin", "dt", "jointObject", "jointType", "jointPose", "skinJointIDs", "i", "require_gamepad_buttons", "__commonJSMin", "ButtonInfo", "type", "handedness", "multiplePressCount", "multipleTouchCount", "value", "AxesInfo", "PulseInfo", "require_base_gamepad", "__commonJSMin", "handedness", "key", "typeKey", "eventKey", "buttonType", "buttonEvent", "id", "callback", "axesEvent", "intensity", "duration", "maxDelay", "dt", "item", "button", "buttonData", "buttonInfo", "buttonCallbacks", "callbacksMap", "hapticActuators", "hapticActuator", "info", "require_universal_gamepad", "__commonJSMin", "handedness", "id", "gamepadCore", "handPose", "core", "isActive", "dt", "buttonType", "buttonData", "coreButtonData", "axesData", "coreAxesData", "hapticActuators", "require_gamepad_core", "__commonJSMin", "handedness", "dt", "buttonType", "require_xr_gamepad_core", "__commonJSMin", "handedness", "handPoseParams", "dt", "buttonType", "buttonData", "gamepadButton", "touchButton", "axes", "internalAxes", "hapticActuators", "isPressed", "session", "event", "require_keyboard_gamepad_core", "__commonJSMin", "handedness", "handPose", "active", "dt", "buttonType", "buttonData", "axes", "require_gamepad_mesh_animator", "__commonJSMin", "gamepad", "upTranslation", "buttonInfo", "translation", "rotation", "axesInfo", "leftRotation", "forwardRotation", "require_gamepad_manager", "__commonJSMin", "dt", "handedness", "gamepad", "gamepads", "require_gamepad_utils", "__commonJSMin", "simultaneousPressMaxDelay", "simultaneousTouchMaxDelay", "gamepadButtonTypesList", "multiplePressCount", "realGamepadButtonTypesList", "gamepadButtonTypes", "key", "isOnePressStart", "gamepad", "i", "buttonType", "areButtonPressedRecently", "button", "isOnePressEnd", "areButtonNotPressedRecently", "isOneTouchStart", "multipleTouchCount", "areButtonTouchedRecently", "isOneTouchEnd", "areButtonNotTouchedRecently", "require_gamepad_control_scheme", "__commonJSMin", "dt", "backupVisible", "visible", "text", "objectScale", "distanceFromButton", "lineLength", "referenceObject", "buttonObject", "startOffset", "endOffset", "parentObject", "buttonPosition", "referenceForward", "referenceRight", "referenceUp", "lineStart", "lineEnd", "textOffset", "textPosition", "start", "end", "lineDirection", "length", "lineMesh", "thickness", "position", "forward", "up", "textObject", "textComponent", "require_base_pose", "__commonJSMin", "basePoseParams", "referenceObject", "fixForward", "forceEmulatedVelocities", "dt", "xrFrame", "xrPose", "manualStart", "session", "referenceSpace", "position", "transform", "rotationQuat", "playerRotationQuat", "up", "transformQuat", "playerTransformQuat", "rotationDegrees", "rotationRadians", "prevRotationRadians", "require_hand_pose", "__commonJSMin", "handedness", "handPoseParams", "fixTrackedHandRotation", "xrFrame", "manualStart", "session", "event", "item", "rotationQuat", "playerRotationQuat", "up", "right", "forward", "forwardRotation", "require_head_pose", "__commonJSMin", "xrFrame", "require_tracked_hand_joint_pose", "__commonJSMin", "handedness", "trackedHandJointType", "basePoseParams", "xrFrame", "dt", "xrPose", "manualStart", "session", "event", "item", "require_tracked_hand_pose", "__commonJSMin", "addAllJointTypes", "typeKey", "handedness", "trackedHandPoseParams", "jointType", "trackedHandJointPose", "jointPoseKey", "dt", "jointPoseTypeIndex", "element", "referenceObject", "fixForward", "forceEmulatedVelocities", "require_set_player_height", "__commonJSMin", "localPosition", "require_set_hand_local_transform", "__commonJSMin", "handPoseTransform", "dt", "require_set_head_local_transform", "__commonJSMin", "headPoseTransform", "nonVRCameraRotation", "nonVRCameraUp", "nonVRCameraPosition", "dt", "require_set_vr_head_local_transform", "__commonJSMin", "headPoseTransform", "dt", "require_set_non_vr_head_local_transform", "__commonJSMin", "dt", "nonVRCameraRotation", "nonVRCameraUp", "nonVRCameraPosition", "require_set_tracked_hand_joint_local_transform", "__commonJSMin", "dt", "require_copy_hand_transform", "__commonJSMin", "dt", "hand", "require_copy_head_transform", "__commonJSMin", "dt", "head", "require_copy_player_transform", "__commonJSMin", "dt", "player", "require_copy_player_pivot_transform", "__commonJSMin", "dt", "playerPivot", "require_tool_types", "__commonJSMin", "require_tool_cursor", "__commonJSMin", "cursorMeshObject", "cursorMeshComponent", "cursorComponent", "fingerCursorObject", "fingerCollisionSize", "meshComponent", "transformQuat", "dt", "isUsingHand", "i", "input", "object", "targetComponent", "require_console_vr_widget_setup", "__commonJSMin", "xPaddingPercentage", "yPaddingPercentage", "xPosition", "yPosition", "numberOfButtons", "buttonsHorizontalSpace", "numberOfSpacesBetweenButtons", "spaceWidth", "halfButtonWidth", "initialPosition", "spaceBetweenMessagesAndButtons", "pointerCollisionHalfHeight", "require_console_vr_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "key", "messagesBackgroundMeshComp", "textComp", "buttonBackgroundMeshComp", "buttonTextComp", "buttonCursorTargetComp", "buttonCollisionComp", "collisionComp", "textComponent", "require_console_vr_widget", "__commonJSMin", "key", "visible", "parentObject", "additionalSetup", "errorEvent", "dt", "messageType", "consoleText", "linesCount", "i", "scrollLinesToSkip", "message", "messageLines", "linesToSkip", "additionalEmptyLines", "emptyLinesToSkip", "emptyLinesToShow", "j", "linesToShow", "consoleFunction", "sender", "args", "formattedText", "lines", "stringifiedArgs", "item", "stringifiedItem", "linesBetweenItems", "cache", "value", "messageText", "linesToSplit", "lineToSplit", "spacesAtStart", "spaceToAdd", "lineSplits", "firstSub", "secondSub", "text", "spaces", "hasSameInfoAsPrev", "lastMessage", "maxScroll", "ui", "cursorTarget", "backgroundMaterial", "textMaterial", "filterTextMaterial", "codeDrivenClear", "active", "material", "axes", "normalizedScrollAmount", "pulseType", "array", "isBuiltIn", "element", "arrayCopy", "stringifiedArray", "countString", "forwardToBrowserConsole", "require_console_vr", "__commonJSMin", "additionalSetup", "dt", "require_easy_object_tuner", "__commonJSMin", "object", "variableName", "setAsDefault", "useTuneTarget", "variableNamePrefix", "easyTuneVariable", "dt", "value", "require_easy_light_attenuation", "__commonJSMin", "dt", "object", "variableName", "setAsDefault", "useTuneTarget", "value", "attenuation", "light", "require_easy_light_color", "__commonJSMin", "dt", "colorModel", "object", "variableName", "setAsDefault", "useTuneTarget", "nameFirstPart", "color", "lightColor", "value", "light", "hsvColor", "rgbColor", "require_easy_mesh_color", "__commonJSMin", "dt", "colorModel", "colorType", "object", "variableName", "setAsDefault", "useTuneTarget", "nameFirstPart", "color", "meshMaterial", "value", "hsvColor", "rgbColor", "material", "mesh", "require_easy_scale", "__commonJSMin", "dt", "isLocal", "scaleAsOne", "object", "variableName", "setAsDefault", "useTuneTarget", "value", "require_easy_set_tune_target_child_number", "__commonJSMin", "childrenCount", "min", "max", "easyTuneVariable", "childIndex", "require_easy_set_tune_target_grab", "__commonJSMin", "grabber", "grabbable", "require_easy_transform", "__commonJSMin", "dt", "isLocal", "scaleAsOne", "object", "variableName", "setAsDefault", "useTuneTarget", "value", "require_easy_tune_bool_array_widget", "__commonJSMin", "arraySize", "gamepad", "variable", "appendToVariableName", "active", "scrollDirection", "i", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "stickVariableIntensity", "valueIntensity", "ui", "index", "value", "text", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "material", "originalScale", "require_easy_tune_bool_array_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "active", "i", "textComponent", "require_easy_tune_bool_array_widget_setup", "__commonJSMin", "arraySize", "panelZ", "distanceFromBorder", "distanceFromValue", "colliderZPosition", "backgroundHalfWidth", "i", "valuePanelLastPosition", "maxY", "minY", "require_easy_tune_bool_widget", "__commonJSMin", "gamepad", "variable", "appendToVariableName", "visible", "widget", "active", "scrollDirection", "id", "callback", "parentObject", "additionalSetup", "dt", "amount", "arraySize", "require_easy_tune_none_widget", "__commonJSMin", "variable", "appendToVariableName", "active", "scrollDirection", "name", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "ui", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "material", "require_easy_tune_none_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "textComponent", "require_easy_tune_none_widget_setup", "__commonJSMin", "panelZ", "distanceFromBorder", "colliderZPosition", "backgroundHalfWidth", "maxY", "minY", "require_easy_tune_number_array_widget", "__commonJSMin", "arraySize", "gamepad", "variable", "appendToVariableName", "active", "scrollDirection", "i", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "stickVariableIntensity", "y", "normalizedEditAmount", "valueIntensity", "amountToAdd", "decimalPlacesMultiplier", "difference", "stepIntensity", "ui", "index", "value", "text", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "step", "material", "originalScale", "require_easy_tune_number_array_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "active", "i", "textComponent", "require_easy_tune_number_array_widget_setup", "__commonJSMin", "arraySize", "panelZ", "distanceFromBorder", "distanceFromValue", "colliderZPosition", "backgroundHalfWidth", "i", "valuePanelLastPosition", "maxY", "minY", "require_easy_tune_number_widget", "__commonJSMin", "gamepad", "variable", "appendToVariableName", "visible", "widget", "active", "scrollDirection", "id", "callback", "parentObject", "additionalSetup", "dt", "amount", "arraySize", "require_easy_tune_transform_widget", "__commonJSMin", "gamepad", "variable", "appendToVariableName", "active", "scrollDirection", "i", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "stickVariableIntensity", "y", "normalizedEditAmount", "valueIntensity", "amountToAdd", "decimalPlacesMultiplier", "difference", "stepIntensity", "stepValue", "ui", "componentIndex", "index", "value", "text", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "initialValue", "step", "material", "originalScale", "require_easy_tune_transform_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "active", "i", "textComponent", "require_easy_tune_transform_widget_setup", "__commonJSMin", "panelZ", "distanceFromBorder", "distanceFromValue", "colliderZPosition", "backgroundHalfWidth", "distanceBetweenComponents", "distanceFromVariableLabel", "distanceBetweenValues", "i", "valuePanelLastPosition", "maxY", "minY", "maxX", "minX", "require_easy_tune_widget", "__commonJSMin", "variableName", "visible", "parentObject", "additionalSetup", "easyTuneVariables", "dt", "item", "scrollVariableActive", "scrollVariableDirection", "widget", "x", "y", "amount", "variableIndex", "newIndex", "indexString", "index", "length", "variable", "value", "require_easy_tune_widget_setup", "__commonJSMin", "require_easy_tune_variables", "__commonJSMin", "variable", "variableName", "value", "resetInitialValue", "callbackID", "callback", "name", "type", "oldValue", "id", "stepPerSecond", "decimalPlaces", "min", "max", "editAllValuesTogether", "clampedValue", "clampedInitialValue", "tempValue", "i", "scaleAsOne", "positionStepPerSecond", "rotationStepPerSecond", "scaleStepPerSecond", "decimalPlacesMultiplier", "require_easy_tune", "__commonJSMin", "variableName", "additionalSetup", "dt", "callback", "require_widget_frame_setup", "__commonJSMin", "widgetLetterID", "buttonsColumnIndex", "distanceBetweenToolsVisibilityButtons", "buttonXOffset", "distanceBetweenFlagButtons", "pinFlagIndex", "pinButtonYOffset", "defaultObjectTransforms", "inputSourceTypeKey", "inputSourceType", "handednessKey", "handedness", "require_widget_frame_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "pinned", "dt", "forceRefreshObjectsTransforms", "inputSourceType", "textComponent", "require_widget_frame", "__commonJSMin", "widgetLetterID", "buttonsColumnIndex", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "ui", "isButton", "notify", "textMaterial", "backgroundMaterial", "material"] + "sourcesContent": ["PP = {};", "if (WL && WL.Object) {\r\n\r\n WL.MeshComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type);\r\n clonedComponent.active = this.active;\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(\"mesh\", \"material\")) {\r\n clonedComponent.material = this.material.clone();\r\n } else {\r\n clonedComponent.material = this.material;\r\n }\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(\"mesh\", \"mesh\")) {\r\n clonedComponent.mesh = PP.MeshUtils.cloneMesh(this.mesh);\r\n } else {\r\n clonedComponent.mesh = this.mesh;\r\n }\r\n\r\n clonedComponent.skin = this.skin;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n WL.CollisionComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type);\r\n clonedComponent.active = this.active;\r\n\r\n clonedComponent.collider = this.collider;\r\n clonedComponent.extents = this.extents.slice(0);\r\n clonedComponent.group = this.group;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n WL.TextComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type);\r\n clonedComponent.active = this.active;\r\n\r\n if (deepCloneParams.isDeepCloneComponent(\"text\")) {\r\n clonedComponent.text = this.text.slice(0);\r\n } else {\r\n clonedComponent.text = this.text;\r\n }\r\n\r\n if (deepCloneParams.isDeepCloneComponentVariable(\"text\", \"material\")) {\r\n clonedComponent.material = this.material.clone();\r\n } else {\r\n clonedComponent.material = this.material;\r\n }\r\n\r\n clonedComponent.alignment = this.alignment;\r\n clonedComponent.justification = this.justification;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n // #TODO not completed, missing flags like gravity or groups\r\n WL.PhysXComponent.prototype.pp_clone = function (clonedObject, deepCloneParams, extraData) {\r\n let clonedComponent = clonedObject.pp_addComponent(this.type, {\r\n \"angularDamping\": this.angularDamping,\r\n \"angularVelocity\": this.angularVelocity,\r\n \"dynamicFriction\": this.dynamicFriction,\r\n \"extents\": this.extents,\r\n \"kinematic\": this.kinematic,\r\n \"linearDamping\": this.linearDamping,\r\n \"linearVelocity\": this.linearVelocity,\r\n \"mass\": this.mass,\r\n \"restituition\": this.restituition,\r\n \"shape\": this.shape,\r\n \"shapeData\": this.shapeData,\r\n \"static\": this.static,\r\n \"staticFriction\": this.staticFriction,\r\n });\r\n\r\n clonedComponent.active = this.active;\r\n\r\n return clonedComponent;\r\n };\r\n\r\n\r\n\r\n Object.defineProperty(WL.MeshComponent.prototype, \"pp_clone\", { enumerable: false });\r\n Object.defineProperty(WL.CollisionComponent.prototype, \"pp_clone\", { enumerable: false });\r\n Object.defineProperty(WL.TextComponent.prototype, \"pp_clone\", { enumerable: false });\r\n Object.defineProperty(WL.PhysXComponent.prototype, \"pp_clone\", { enumerable: false });\r\n\r\n}", "/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexport var RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nexport function toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nexport function equals(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};", "import * as glMatrix from \"./common.js\";\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(9);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nexport function fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nexport function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nexport function translate(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function rotate(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nexport function fromRotation(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nexport function fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nexport function normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nexport function projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexport var sub = subtract;", "import * as glMatrix from \"./common.js\";\n/**\n * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < glMatrix.EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nexport var perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nexport var ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nexport function frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexport var sub = subtract;", "import * as glMatrix from \"./common.js\";\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nexport function transformQuat(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();", "import * as glMatrix from \"./common.js\";\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nexport function fromValues(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nexport function set(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nexport function cross(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = glMatrix.RANDOM() * 2 - 1;\n v2 = glMatrix.RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = glMatrix.RANDOM() * 2 - 1;\n v4 = glMatrix.RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nexport function transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();", "import * as glMatrix from \"./common.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(4);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nexport function setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nexport function getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > glMatrix.EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nexport function getAngle(a, b) {\n var dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nexport function multiply(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateX(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateY(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nexport function rotateZ(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nexport function calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nexport function ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nexport function pow(out, a, b) {\n ln(out, a);\n scale(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport function slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > glMatrix.EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nexport function random(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = glMatrix.RANDOM();\n var u2 = glMatrix.RANDOM();\n var u3 = glMatrix.RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nexport function invert(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nexport function fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nexport function fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexport var fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexport var copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexport var set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexport var add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexport var scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexport var lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport var length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexport var normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport var equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nexport var rotationTo = function () {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1, 0, 0);\n var yUnitVec3 = vec3.fromValues(0, 1, 0);\n return function (out, a, b) {\n var dot = vec3.dot(a, b);\n\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nexport var sqlerp = function () {\n var temp1 = create();\n var temp2 = create();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nexport var setAxes = function () {\n var matr = mat3.create();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize(out, fromMat3(out, matr));\n };\n}();", "import * as glMatrix from \"./common.js\";\nimport * as quat from \"./quat.js\";\nimport * as mat4 from \"./mat4.js\";\n/**\n * Dual Quaternion
\n * Format: [real, dual]
\n * Quaternion format: XYZW
\n * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
\n * @module quat2\n */\n\n/**\n * Creates a new identity dual quat\n *\n * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]\n */\n\nexport function create() {\n var dq = new glMatrix.ARRAY_TYPE(8);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n dq[0] = 0;\n dq[1] = 0;\n dq[2] = 0;\n dq[4] = 0;\n dq[5] = 0;\n dq[6] = 0;\n dq[7] = 0;\n }\n\n dq[3] = 1;\n return dq;\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat2} a dual quaternion to clone\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nexport function clone(a) {\n var dq = new glMatrix.ARRAY_TYPE(8);\n dq[0] = a[0];\n dq[1] = a[1];\n dq[2] = a[2];\n dq[3] = a[3];\n dq[4] = a[4];\n dq[5] = a[5];\n dq[6] = a[6];\n dq[7] = a[7];\n return dq;\n}\n/**\n * Creates a new dual quat initialized with the given values\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nexport function fromValues(x1, y1, z1, w1, x2, y2, z2, w2) {\n var dq = new glMatrix.ARRAY_TYPE(8);\n dq[0] = x1;\n dq[1] = y1;\n dq[2] = z1;\n dq[3] = w1;\n dq[4] = x2;\n dq[5] = y2;\n dq[6] = z2;\n dq[7] = w2;\n return dq;\n}\n/**\n * Creates a new dual quat from the given values (quat and translation)\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component (translation)\n * @param {Number} y2 Y component (translation)\n * @param {Number} z2 Z component (translation)\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nexport function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {\n var dq = new glMatrix.ARRAY_TYPE(8);\n dq[0] = x1;\n dq[1] = y1;\n dq[2] = z1;\n dq[3] = w1;\n var ax = x2 * 0.5,\n ay = y2 * 0.5,\n az = z2 * 0.5;\n dq[4] = ax * w1 + ay * z1 - az * y1;\n dq[5] = ay * w1 + az * x1 - ax * z1;\n dq[6] = az * w1 + ax * y1 - ay * x1;\n dq[7] = -ax * x1 - ay * y1 - az * z1;\n return dq;\n}\n/**\n * Creates a dual quat from a quaternion and a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q a normalized quaternion\n * @param {ReadonlyVec3} t tranlation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nexport function fromRotationTranslation(out, q, t) {\n var ax = t[0] * 0.5,\n ay = t[1] * 0.5,\n az = t[2] * 0.5,\n bx = q[0],\n by = q[1],\n bz = q[2],\n bw = q[3];\n out[0] = bx;\n out[1] = by;\n out[2] = bz;\n out[3] = bw;\n out[4] = ax * bw + ay * bz - az * by;\n out[5] = ay * bw + az * bx - ax * bz;\n out[6] = az * bw + ax * by - ay * bx;\n out[7] = -ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Creates a dual quat from a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyVec3} t translation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nexport function fromTranslation(out, t) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = t[0] * 0.5;\n out[5] = t[1] * 0.5;\n out[6] = t[2] * 0.5;\n out[7] = 0;\n return out;\n}\n/**\n * Creates a dual quat from a quaternion\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q the quaternion\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nexport function fromRotation(out, q) {\n out[0] = q[0];\n out[1] = q[1];\n out[2] = q[2];\n out[3] = q[3];\n out[4] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n return out;\n}\n/**\n * Creates a new dual quat from a matrix (4x4)\n *\n * @param {quat2} out the dual quaternion\n * @param {ReadonlyMat4} a the matrix\n * @returns {quat2} dual quat receiving operation result\n * @function\n */\n\nexport function fromMat4(out, a) {\n //TODO Optimize this\n var outer = quat.create();\n mat4.getRotation(outer, a);\n var t = new glMatrix.ARRAY_TYPE(3);\n mat4.getTranslation(t, a);\n fromRotationTranslation(out, outer, t);\n return out;\n}\n/**\n * Copy the values from one dual quat to another\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the source dual quaternion\n * @returns {quat2} out\n * @function\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n return out;\n}\n/**\n * Set a dual quat to the identity dual quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @returns {quat2} out\n */\n\nexport function identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n return out;\n}\n/**\n * Set the components of a dual quat to the given values\n *\n * @param {quat2} out the receiving quaternion\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} out\n * @function\n */\n\nexport function set(out, x1, y1, z1, w1, x2, y2, z2, w2) {\n out[0] = x1;\n out[1] = y1;\n out[2] = z1;\n out[3] = w1;\n out[4] = x2;\n out[5] = y2;\n out[6] = z2;\n out[7] = w2;\n return out;\n}\n/**\n * Gets the real part of a dual quat\n * @param {quat} out real part\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} real part\n */\n\nexport var getReal = quat.copy;\n/**\n * Gets the dual part of a dual quat\n * @param {quat} out dual part\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} dual part\n */\n\nexport function getDual(out, a) {\n out[0] = a[4];\n out[1] = a[5];\n out[2] = a[6];\n out[3] = a[7];\n return out;\n}\n/**\n * Set the real component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the real part\n * @returns {quat2} out\n * @function\n */\n\nexport var setReal = quat.copy;\n/**\n * Set the dual component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the dual part\n * @returns {quat2} out\n * @function\n */\n\nexport function setDual(out, q) {\n out[4] = q[0];\n out[5] = q[1];\n out[6] = q[2];\n out[7] = q[3];\n return out;\n}\n/**\n * Gets the translation of a normalized dual quat\n * @param {vec3} out translation\n * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed\n * @return {vec3} translation\n */\n\nexport function getTranslation(out, a) {\n var ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3];\n out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n return out;\n}\n/**\n * Translates a dual quat by the given vector\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {quat2} out\n */\n\nexport function translate(out, a, v) {\n var ax1 = a[0],\n ay1 = a[1],\n az1 = a[2],\n aw1 = a[3],\n bx1 = v[0] * 0.5,\n by1 = v[1] * 0.5,\n bz1 = v[2] * 0.5,\n ax2 = a[4],\n ay2 = a[5],\n az2 = a[6],\n aw2 = a[7];\n out[0] = ax1;\n out[1] = ay1;\n out[2] = az1;\n out[3] = aw1;\n out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;\n out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;\n out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;\n out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;\n return out;\n}\n/**\n * Rotates a dual quat around the X axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nexport function rotateX(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n quat.rotateX(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat around the Y axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nexport function rotateY(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n quat.rotateY(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat around the Z axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nexport function rotateZ(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n quat.rotateZ(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (a * q)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @returns {quat2} out\n */\n\nexport function rotateByQuatAppend(out, a, q) {\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n out[0] = ax * qw + aw * qx + ay * qz - az * qy;\n out[1] = ay * qw + aw * qy + az * qx - ax * qz;\n out[2] = az * qw + aw * qz + ax * qy - ay * qx;\n out[3] = aw * qw - ax * qx - ay * qy - az * qz;\n ax = a[4];\n ay = a[5];\n az = a[6];\n aw = a[7];\n out[4] = ax * qw + aw * qx + ay * qz - az * qy;\n out[5] = ay * qw + aw * qy + az * qx - ax * qz;\n out[6] = az * qw + aw * qz + ax * qy - ay * qx;\n out[7] = aw * qw - ax * qx - ay * qy - az * qz;\n return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (q * a)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @returns {quat2} out\n */\n\nexport function rotateByQuatPrepend(out, q, a) {\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n bx = a[0],\n by = a[1],\n bz = a[2],\n bw = a[3];\n out[0] = qx * bw + qw * bx + qy * bz - qz * by;\n out[1] = qy * bw + qw * by + qz * bx - qx * bz;\n out[2] = qz * bw + qw * bz + qx * by - qy * bx;\n out[3] = qw * bw - qx * bx - qy * by - qz * bz;\n bx = a[4];\n by = a[5];\n bz = a[6];\n bw = a[7];\n out[4] = qx * bw + qw * bx + qy * bz - qz * by;\n out[5] = qy * bw + qw * by + qz * bx - qx * bz;\n out[6] = qz * bw + qw * bz + qx * by - qy * bx;\n out[7] = qw * bw - qx * bx - qy * by - qz * bz;\n return out;\n}\n/**\n * Rotates a dual quat around a given axis. Does the normalisation automatically\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @param {Number} rad how far the rotation should be\n * @returns {quat2} out\n */\n\nexport function rotateAroundAxis(out, a, axis, rad) {\n //Special case for rad = 0\n if (Math.abs(rad) < glMatrix.EPSILON) {\n return copy(out, a);\n }\n\n var axisLength = Math.hypot(axis[0], axis[1], axis[2]);\n rad = rad * 0.5;\n var s = Math.sin(rad);\n var bx = s * axis[0] / axisLength;\n var by = s * axis[1] / axisLength;\n var bz = s * axis[2] / axisLength;\n var bw = Math.cos(rad);\n var ax1 = a[0],\n ay1 = a[1],\n az1 = a[2],\n aw1 = a[3];\n out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n var ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n out[4] = ax * bw + aw * bx + ay * bz - az * by;\n out[5] = ay * bw + aw * by + az * bx - ax * bz;\n out[6] = az * bw + aw * bz + ax * by - ay * bx;\n out[7] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Adds two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n * @function\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n return out;\n}\n/**\n * Multiplies two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n */\n\nexport function multiply(out, a, b) {\n var ax0 = a[0],\n ay0 = a[1],\n az0 = a[2],\n aw0 = a[3],\n bx1 = b[4],\n by1 = b[5],\n bz1 = b[6],\n bw1 = b[7],\n ax1 = a[4],\n ay1 = a[5],\n az1 = a[6],\n aw1 = a[7],\n bx0 = b[0],\n by0 = b[1],\n bz0 = b[2],\n bw0 = b[3];\n out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;\n out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;\n out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;\n out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;\n out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;\n out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;\n out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;\n out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;\n return out;\n}\n/**\n * Alias for {@link quat2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Scales a dual quat by a scalar number\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the dual quat to scale\n * @param {Number} b amount to scale the dual quat by\n * @returns {quat2} out\n * @function\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n return out;\n}\n/**\n * Calculates the dot product of two dual quat's (The dot product of the real parts)\n *\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexport var dot = quat.dot;\n/**\n * Performs a linear interpolation between two dual quats's\n * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat2} out\n */\n\nexport function lerp(out, a, b, t) {\n var mt = 1 - t;\n if (dot(a, b) < 0) t = -t;\n out[0] = a[0] * mt + b[0] * t;\n out[1] = a[1] * mt + b[1] * t;\n out[2] = a[2] * mt + b[2] * t;\n out[3] = a[3] * mt + b[3] * t;\n out[4] = a[4] * mt + b[4] * t;\n out[5] = a[5] * mt + b[5] * t;\n out[6] = a[6] * mt + b[6] * t;\n out[7] = a[7] * mt + b[7] * t;\n return out;\n}\n/**\n * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quat to calculate inverse of\n * @returns {quat2} out\n */\n\nexport function invert(out, a) {\n var sqlen = squaredLength(a);\n out[0] = -a[0] / sqlen;\n out[1] = -a[1] / sqlen;\n out[2] = -a[2] / sqlen;\n out[3] = a[3] / sqlen;\n out[4] = -a[4] / sqlen;\n out[5] = -a[5] / sqlen;\n out[6] = -a[6] / sqlen;\n out[7] = a[7] / sqlen;\n return out;\n}\n/**\n * Calculates the conjugate of a dual quat\n * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat2} a quat to calculate conjugate of\n * @returns {quat2} out\n */\n\nexport function conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n out[4] = -a[4];\n out[5] = -a[5];\n out[6] = -a[6];\n out[7] = a[7];\n return out;\n}\n/**\n * Calculates the length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate length of\n * @returns {Number} length of a\n * @function\n */\n\nexport var length = quat.length;\n/**\n * Alias for {@link quat2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Calculates the squared length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexport var squaredLength = quat.squaredLength;\n/**\n * Alias for {@link quat2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Normalize a dual quat\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quaternion to normalize\n * @returns {quat2} out\n * @function\n */\n\nexport function normalize(out, a) {\n var magnitude = squaredLength(a);\n\n if (magnitude > 0) {\n magnitude = Math.sqrt(magnitude);\n var a0 = a[0] / magnitude;\n var a1 = a[1] / magnitude;\n var a2 = a[2] / magnitude;\n var a3 = a[3] / magnitude;\n var b0 = a[4];\n var b1 = a[5];\n var b2 = a[6];\n var b3 = a[7];\n var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;\n out[0] = a0;\n out[1] = a1;\n out[2] = a2;\n out[3] = a3;\n out[4] = (b0 - a0 * a_dot_b) / magnitude;\n out[5] = (b1 - a1 * a_dot_b) / magnitude;\n out[6] = (b2 - a2 * a_dot_b) / magnitude;\n out[7] = (b3 - a3 * a_dot_b) / magnitude;\n }\n\n return out;\n}\n/**\n * Returns a string representation of a dual quatenion\n *\n * @param {ReadonlyQuat2} a dual quaternion to represent as a string\n * @returns {String} string representation of the dual quat\n */\n\nexport function str(a) {\n return \"quat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \")\";\n}\n/**\n * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat2} a the first dual quaternion.\n * @param {ReadonlyQuat2} b the second dual quaternion.\n * @returns {Boolean} true if the dual quaternions are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7];\n}\n/**\n * Returns whether or not the dual quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat2} a the first dual quat.\n * @param {ReadonlyQuat2} b the second dual quat.\n * @returns {Boolean} true if the dual quats are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7));\n}", "import * as glMatrix from \"./common.js\";\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(2);\n\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nexport function fromValues(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nexport function set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nexport function round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nexport function distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexport function length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nexport function squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nexport function normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nexport function cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nexport function lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nexport function random(out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nexport function transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nexport function rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nexport function angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nexport function str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nexport var len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexport var sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexport var mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexport var div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexport var dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexport var sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexport var sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();", "import * as glMatrix from \"./common.js\";\nimport * as mat2 from \"./mat2.js\";\nimport * as mat2d from \"./mat2d.js\";\nimport * as mat3 from \"./mat3.js\";\nimport * as mat4 from \"./mat4.js\";\nimport * as quat from \"./quat.js\";\nimport * as quat2 from \"./quat2.js\";\nimport * as vec2 from \"./vec2.js\";\nimport * as vec3 from \"./vec3.js\";\nimport * as vec4 from \"./vec4.js\";\nexport { glMatrix, mat2, mat2d, mat3, mat4, quat, quat2, vec2, vec3, vec4 };", "import { vec3, mat4 } from 'gl-matrix';\r\n\r\nif (_WL && _WL._componentTypes && _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]]) {\r\n\r\n // Modified Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.init = function () {\r\n /* VR session cache, in case in VR */\r\n this.session = null;\r\n this.collisionMask = (1 << this.collisionGroup);\r\n this.maxDistance = 100;\r\n\r\n this.doubleClickTimer = 0;\r\n this.tripleClickTimer = 0;\r\n this.multipleClickObject = null;\r\n this.multipleClickDelay = 0.3;\r\n\r\n this.visible = false;\r\n\r\n const sceneLoaded = this.onDestroy.bind(this);\r\n WL.onSceneLoaded.push(sceneLoaded);\r\n this.onDestroyCallbacks = [() => {\r\n const index = WL.onSceneLoaded.indexOf(sceneLoaded);\r\n if (index >= 0) WL.onSceneLoaded.splice(index, 1);\r\n }];\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.start = function () {\r\n if (this.handedness == 0) {\r\n const inputComp = this.object.getComponent('input');\r\n if (!inputComp) {\r\n console.warn('cursor component on object', this.object.name,\r\n 'was configured with handedness \"input component\", ' +\r\n 'but object has no input component.');\r\n } else {\r\n this.handedness = inputComp.handedness;\r\n this.input = inputComp;\r\n }\r\n } else {\r\n this.handedness = ['left', 'right'][this.handedness - 1];\r\n }\r\n\r\n this.globalTarget = this.object.addComponent('cursor-target');\r\n\r\n this.origin = new Float32Array(3);\r\n this.cursorObjScale = new Float32Array(3);\r\n this.direction = [0, 0, 0];\r\n this.tempQuat = new Float32Array(4);\r\n this.setViewComponent(this.object.getComponent(\"view\"));\r\n this.isHovering = false;\r\n this.visible = true;\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n this.isUpWithNoDown = false;\r\n this.isRealDown = false;\r\n\r\n this.cursorPos = new Float32Array(3);\r\n this.hoveringObject = null;\r\n\r\n const onXRSessionStart = this.setupVREvents.bind(this);\r\n WL.onXRSessionStart.push(onXRSessionStart);\r\n\r\n this.onDestroyCallbacks.push(() => {\r\n const index = WL.onXRSessionStart.indexOf(onXRSessionStart);\r\n if (index >= 0) WL.onXRSessionStart.splice(index, 1);\r\n });\r\n\r\n this.showRay = true;\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(true);\r\n this.showRay = false;\r\n this.cursorRayOrigin = new Float32Array(3);\r\n this.cursorRayScale = new Float32Array(3);\r\n this.cursorRayScale.set(this.cursorRayObject.scalingLocal);\r\n\r\n /* Set ray to a good default distance of the cursor of 1m */\r\n this._setCursorRayTransform(null);\r\n }\r\n\r\n this._setCursorVisibility(false);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.setViewComponent = function (viewComponent) {\r\n this.viewComponent = viewComponent;\r\n /* If this object also has a view component, we will enable inverse-projected mouse clicks,\r\n * otherwise just use the objects transformation */\r\n if (this.viewComponent != null) {\r\n const onClick = this.onClick.bind(this);\r\n WL.canvas.addEventListener(\"click\", onClick);\r\n const onPointerMove = this.onPointerMove.bind(this);\r\n WL.canvas.addEventListener(\"pointermove\", onPointerMove);\r\n const onPointerDown = this.onPointerDown.bind(this);\r\n WL.canvas.addEventListener(\"pointerdown\", onPointerDown);\r\n const onPointerUp = this.onPointerUp.bind(this);\r\n WL.canvas.addEventListener(\"pointerup\", onPointerUp);\r\n\r\n this.projectionMatrix = new Float32Array(16);\r\n mat4.invert(this.projectionMatrix, this.viewComponent.projectionMatrix);\r\n const onViewportResize = this.onViewportResize.bind(this);\r\n window.addEventListener(\"resize\", onViewportResize);\r\n\r\n this.onDestroyCallbacks.push(() => {\r\n WL.canvas.removeEventListener(\"click\", onClick);\r\n WL.canvas.removeEventListener(\"pointermove\", onPointerMove);\r\n WL.canvas.removeEventListener(\"pointerdown\", onPointerDown);\r\n WL.canvas.removeEventListener(\"pointerup\", onPointerUp);\r\n window.removeEventListener(\"resize\", onViewportResize);\r\n });\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onViewportResize = function () {\r\n if (!this.viewComponent) return;\r\n /* Projection matrix will change if the viewport is resized, which will affect the\r\n * projection matrix because of the aspect ratio. */\r\n mat4.invert(this.projectionMatrix, this.viewComponent.projectionMatrix);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto._setCursorRayTransform = function (hitPosition) {\r\n if (!this.cursorRayObject) return;\r\n if (this.cursorRayScalingAxis != 4) {\r\n this.cursorRayObject.resetScaling();\r\n\r\n if (hitPosition != null) {\r\n this.cursorRayObject.getTranslationWorld(this.cursorRayOrigin);\r\n let dist = vec3.dist(this.cursorRayOrigin, hitPosition);\r\n this.cursorRayScale[this.cursorRayScalingAxis] = dist;\r\n this.cursorRayObject.scale(this.cursorRayScale);\r\n }\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto._setCursorVisibility = function (visible) {\r\n this.visible = visible;\r\n if (!this.cursorObject) return;\r\n\r\n this.cursorObject.pp_setActive(visible);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.update = function (dt) {\r\n if (this.doubleClickTimer > 0) {\r\n this.doubleClickTimer -= dt;\r\n }\r\n\r\n if (this.tripleClickTimer > 0) {\r\n this.tripleClickTimer -= dt;\r\n }\r\n\r\n this.doUpdate(false);\r\n\r\n this.isUpWithNoDown = false;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.doUpdate = function (doClick) {\r\n /* If in VR, set the cursor ray based on object transform */\r\n if (this.session) {\r\n /* Since Google Cardboard tap is registered as arTouchDown without a gamepad, we need to check for gamepad presence */\r\n if (this.arTouchDown && this.input && WL.xrSession.inputSources[0].handedness === 'none' && WL.xrSession.inputSources[0].gamepad) {\r\n const p = WL.xrSession.inputSources[0].gamepad.axes;\r\n /* Screenspace Y is inverted */\r\n this.direction = [p[0], -p[1], -1.0];\r\n this.updateDirection();\r\n } else {\r\n this.object.getTranslationWorld(this.origin);\r\n this.object.getForward(this.direction);\r\n }\r\n const rayHit = this.rayHit = (this.rayCastMode == 0) ?\r\n WL.scene.rayCast(this.origin, this.direction, this.collisionMask) :\r\n WL.physics.rayCast(this.origin, this.direction, this.collisionMask, this.maxDistance);\r\n\r\n if (rayHit.hitCount > 0) {\r\n this.cursorPos.set(rayHit.locations[0]);\r\n } else {\r\n this.cursorPos.fill(0);\r\n }\r\n\r\n this.hoverBehaviour(rayHit, doClick);\r\n }\r\n\r\n if (this.cursorObject) {\r\n if (this.hoveringObject && (this.cursorPos[0] != 0 || this.cursorPos[1] != 0 || this.cursorPos[2] != 0)) {\r\n this._setCursorVisibility(true);\r\n this.cursorObject.setTranslationWorld(this.cursorPos);\r\n this._setCursorRayTransform(this.cursorPos);\r\n } else {\r\n if (this.visible && this.cursorRayObject) {\r\n this._setCursorRayTransform(null);\r\n }\r\n\r\n this._setCursorVisibility(false);\r\n }\r\n }\r\n\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(true);\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.hoverBehaviour = function (rayHit, doClick) {\r\n if (rayHit.hitCount > 0) {\r\n if (!this.hoveringObject || !this.hoveringObject.equals(rayHit.objects[0])) {\r\n /* Unhover previous, if exists */\r\n if (this.hoveringObject) {\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n if (cursorTarget) cursorTarget.onUnhover(this.hoveringObject, this);\r\n this.globalTarget.onUnhover(this.hoveringObject, this);\r\n }\r\n\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n\r\n /* Hover new object */\r\n this.hoveringObject = rayHit.objects[0];\r\n if (this.styleCursor) WL.canvas.style.cursor = \"pointer\";\r\n\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n if (cursorTarget) {\r\n this.hoveringObjectTarget = cursorTarget;\r\n cursorTarget.onHover(this.hoveringObject, this);\r\n }\r\n this.globalTarget.onHover(this.hoveringObject, this);\r\n\r\n if (this.isRealDown) {\r\n if (cursorTarget) cursorTarget.onDownOnHover(this.hoveringObject, this);\r\n this.globalTarget.onDownOnHover(this.hoveringObject, this);\r\n }\r\n }\r\n\r\n if (this.hoveringObjectTarget) {\r\n this.hoveringObjectTarget.onMove(this.hoveringObject, this);\r\n }\r\n\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n\r\n /* Cursor down */\r\n if (this.isDown !== this.lastIsDown && this.isDown) {\r\n if (cursorTarget) cursorTarget.onDown(this.hoveringObject, this);\r\n this.globalTarget.onDown(this.hoveringObject, this);\r\n }\r\n\r\n /* Click */\r\n if (this.isDown !== this.lastIsDown && !this.isDown) {\r\n if (this.tripleClickTimer > 0 && this.multipleClickObject && this.multipleClickObject.equals(this.hoveringObject)) {\r\n if (cursorTarget) cursorTarget.onTripleClick(this.hoveringObject, this);\r\n this.globalTarget.onTripleClick(this.hoveringObject, this);\r\n\r\n this.tripleClickTimer = 0;\r\n } else if (this.doubleClickTimer > 0 && this.multipleClickObject && this.multipleClickObject.equals(this.hoveringObject)) {\r\n if (cursorTarget) cursorTarget.onDoubleClick(this.hoveringObject, this);\r\n this.globalTarget.onDoubleClick(this.hoveringObject, this);\r\n\r\n this.tripleClickTimer = this.multipleClickDelay;\r\n this.doubleClickTimer = 0;\r\n } else {\r\n if (cursorTarget) cursorTarget.onClick(this.hoveringObject, this);\r\n this.globalTarget.onClick(this.hoveringObject, this);\r\n\r\n this.tripleClickTimer = 0;\r\n this.doubleClickTimer = this.multipleClickDelay;\r\n this.multipleClickObject = this.hoveringObject;\r\n }\r\n }\r\n\r\n /* Cursor up */\r\n if (this.isDown !== this.lastIsDown && !this.isDown) {\r\n if (cursorTarget) cursorTarget.onUp(this.hoveringObject, this);\r\n this.globalTarget.onUp(this.hoveringObject, this);\r\n } else if (this.isUpWithNoDown) {\r\n if (cursorTarget) cursorTarget.onUpWithNoDown(this.hoveringObject, this);\r\n this.globalTarget.onUpWithNoDown(this.hoveringObject, this);\r\n }\r\n } else if (this.hoveringObject && rayHit.hitCount == 0) {\r\n let cursorTarget = this.hoveringObject.getComponent(\"cursor-target\");\r\n if (cursorTarget) cursorTarget.onUnhover(this.hoveringObject, this);\r\n this.globalTarget.onUnhover(this.hoveringObject, this);\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n if (this.styleCursor) WL.canvas.style.cursor = \"default\";\r\n }\r\n\r\n if (this.hoveringObject) {\r\n this.lastIsDown = this.isDown;\r\n } else {\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.setupVREvents = function (s) {\r\n /* If in VR, one-time bind the listener */\r\n this.session = s;\r\n const onSessionEnd = function (e) {\r\n /* Reset cache once the session ends to rebind select etc, in case\r\n * it starts again */\r\n this.session = null;\r\n }.bind(this);\r\n s.addEventListener('end', onSessionEnd);\r\n\r\n const onSelect = this.onSelect.bind(this);\r\n s.addEventListener('select', onSelect);\r\n const onSelectStart = this.onSelectStart.bind(this);\r\n s.addEventListener('selectstart', onSelectStart);\r\n const onSelectEnd = this.onSelectEnd.bind(this);\r\n s.addEventListener('selectend', onSelectEnd);\r\n\r\n this.onDestroyCallbacks.push(() => {\r\n if (!this.session) return;\r\n s.removeEventListener('end', onSessionEnd);\r\n s.removeEventListener('select', onSelect);\r\n s.removeEventListener('selectstart', onSelectStart);\r\n s.removeEventListener('selectend', onSelectEnd);\r\n });\r\n\r\n /* After AR session was entered, the projection matrix changed */\r\n this.onViewportResize();\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onSelect = function (e) {\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onSelectStart = function (e) {\r\n if (this.active) {\r\n this.arTouchDown = true;\r\n if (e.inputSource.handedness == this.handedness) {\r\n this.isDown = true;\r\n }\r\n }\r\n this.isRealDown = true;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onSelectEnd = function (e) {\r\n if (this.active) {\r\n this.arTouchDown = false;\r\n if (e.inputSource.handedness == this.handedness) {\r\n if (!this.isDown) {\r\n this.isUpWithNoDown = true;\r\n }\r\n this.isDown = false;\r\n }\r\n }\r\n this.isRealDown = false;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onPointerMove = function (e) {\r\n /* Don't care about secondary pointers */\r\n if (!e.isPrimary) return;\r\n const bounds = e.target.getBoundingClientRect();\r\n const rayHit = this.updateMousePos(e.clientX, e.clientY, bounds.width, bounds.height);\r\n\r\n this.hoverBehaviour(rayHit, false);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onClick = function (e) {\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onPointerDown = function (e) {\r\n if (this.active) {\r\n /* Don't care about secondary pointers or non-left clicks */\r\n if (!e.isPrimary || e.button !== 0) return;\r\n const bounds = e.target.getBoundingClientRect();\r\n const rayHit = this.updateMousePos(e.clientX, e.clientY, bounds.width, bounds.height);\r\n\r\n this.hoverBehaviour(rayHit, false); //simulate a move before the click, to clean previous hover/unhover\r\n\r\n this.isDown = true;\r\n this.isRealDown = true;\r\n\r\n this.hoverBehaviour(rayHit, false);\r\n } else {\r\n this.isRealDown = true;\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onPointerUp = function (e) {\r\n if (this.active) {\r\n /* Don't care about secondary pointers or non-left clicks */\r\n if (!e.isPrimary || e.button !== 0) return;\r\n const bounds = e.target.getBoundingClientRect();\r\n const rayHit = this.updateMousePos(e.clientX, e.clientY, bounds.width, bounds.height);\r\n\r\n this.hoverBehaviour(rayHit, false); //simulate a move before the click, to clean previous hover/unhover\r\n\r\n if (!this.isDown) {\r\n this.isUpWithNoDown = true;\r\n }\r\n\r\n this.isDown = false;\r\n this.isRealDown = false;\r\n\r\n this.hoverBehaviour(rayHit, false);\r\n } else {\r\n this.isRealDown = false;\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.updateMousePos = function (clientX, clientY, w, h) {\r\n /* Get direction in normalized device coordinate space from mouse position */\r\n const left = clientX / w;\r\n const top = clientY / h;\r\n this.direction = [left * 2 - 1, -top * 2 + 1, -1.0];\r\n return this.updateDirection();\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.updateDirection = function () {\r\n this.object.getTranslationWorld(this.origin);\r\n\r\n /* Reverse-project the direction into view space */\r\n vec3.transformMat4(this.direction, this.direction, this.projectionMatrix);\r\n vec3.normalize(this.direction, this.direction);\r\n vec3.transformQuat(this.direction, this.direction, this.object.transformWorld);\r\n const rayHit = this.rayHit = (this.rayCastMode == 0) ?\r\n WL.scene.rayCast(this.origin, this.direction, this.collisionMask) :\r\n WL.physics.rayCast(this.origin, this.direction, this.collisionMask, this.maxDistance);\r\n\r\n if (rayHit.hitCount > 0) {\r\n this.cursorPos.set(rayHit.locations[0]);\r\n } else {\r\n this.cursorPos.fill(0);\r\n }\r\n\r\n return rayHit;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onDeactivate = function () {\r\n if (this.hoveringObject) {\r\n const cursorTarget = this.hoveringObject.getComponent('cursor-target');\r\n if (cursorTarget) cursorTarget.onUnhover(this.hoveringObject, this);\r\n this.globalTarget.onUnhover(this.hoveringObject, this);\r\n }\r\n\r\n this.hoveringObject = null;\r\n this.hoveringObjectTarget = null;\r\n if (this.styleCursor) WL.canvas.style.cursor = \"default\";\r\n\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n this.isUpWithNoDown = false;\r\n\r\n this._setCursorVisibility(false);\r\n if (this.cursorRayObject) {\r\n this.cursorRayObject.pp_setActive(false);\r\n }\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onActivate = function () {\r\n this.showRay = true;\r\n\r\n this.isDown = false;\r\n this.lastIsDown = false;\r\n this.isUpWithNoDown = false;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor\"]].proto.onDestroy = function () {\r\n for (const f of this.onDestroyCallbacks) f();\r\n };\r\n\r\n} else {\r\n console.error(\"Wonderland Engine \\\"cursor\\\" component not found.\\n Add the component to your project to avoid any issue with the PP bundle.\");\r\n}", "if (_WL && _WL._componentTypes && _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]]) {\r\n\r\n // Modified Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.init = function () {\r\n this.hoverFunctions = [];\r\n this.unHoverFunctions = [];\r\n this.clickFunctions = [];\r\n this.doubleClickFunctions = [];\r\n this.tripleClickFunctions = [];\r\n this.moveFunctions = [];\r\n this.downFunctions = [];\r\n this.upFunctions = [];\r\n this.downOnHoverFunctions = [];\r\n this.upWithNoDownFunctions = [];\r\n\r\n this.isSurface = false; // just a way to specify if this target is just used as a surface between buttons\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onHover = function (object, cursor) {\r\n for (let f of this.hoverFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onUnhover = function (object, cursor) {\r\n for (let f of this.unHoverFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onClick = function (object, cursor) {\r\n for (let f of this.clickFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onMove = function (object, cursor) {\r\n for (let f of this.moveFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDown = function (object, cursor) {\r\n for (let f of this.downFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onUp = function (object, cursor) {\r\n for (let f of this.upFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this.hoverFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.hoverFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addUnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this.unHoverFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeUnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.unHoverFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this.clickFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.clickFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addMoveFunction = function (f) {\r\n this._validateCallback(f);\r\n this.moveFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeMoveFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.moveFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this.downFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.downFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addUpFunction = function (f) {\r\n this._validateCallback(f);\r\n this.upFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeUpFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.upFunctions, f);\r\n };\r\n\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto._removeItemOnce = function (arr, value) {\r\n var index = arr.indexOf(value);\r\n if (index > -1) arr.splice(index, 1);\r\n return arr;\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto._validateCallback = function (f) {\r\n if (typeof f !== \"function\") {\r\n throw new TypeError(this.object.name + \".cursor-target: Argument needs to be a function\");\r\n }\r\n };\r\n\r\n // New Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDoubleClick = function (object, cursor) {\r\n for (let f of this.doubleClickFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addDoubleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this.doubleClickFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeDoubleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.doubleClickFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onTripleClick = function (object, cursor) {\r\n for (let f of this.tripleClickFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addTripleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this.tripleClickFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeTripleClickFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.tripleClickFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDownOnHover = function (object, cursor) {\r\n for (let f of this.downOnHoverFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addDownOnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this.downOnHoverFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeDownOnHoverFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.downOnHoverFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onUpWithNoDown = function (object, cursor) {\r\n for (let f of this.upWithNoDownFunctions) f(object, cursor);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.addUpWithNoDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this.upWithNoDownFunctions.push(f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.removeUpWithNoDownFunction = function (f) {\r\n this._validateCallback(f);\r\n this._removeItemOnce(this.upWithNoDownFunctions, f);\r\n };\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.start = function () { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.update = function (dt) { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onActivate = function () { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDeactivate = function () { };\r\n _WL._componentTypes[_WL._componentTypeIndices[\"cursor-target\"]].proto.onDestroy = function () { };\r\n\r\n} else {\r\n console.error(\"Wonderland Engine \\\"cursor-target\\\" component not found.\\n Add the component to your project to avoid any issue with the PP bundle.\");\r\n}", "if (_WL && _WL._componentTypes && _WL._componentTypes[_WL._componentTypeIndices[\"mouse-look\"]]) {\r\n\r\n // Modified Functions\r\n\r\n _WL._componentTypes[_WL._componentTypeIndices[\"mouse-look\"]].proto.init = function () {\r\n document.addEventListener('mousemove', function () {\r\n let viewForward = PP.vec3_create();\r\n let viewUp = PP.vec3_create();\r\n\r\n let referenceUp = PP.vec3_create();\r\n let referenceUpNegate = PP.vec3_create();\r\n let referenceRight = PP.vec3_create();\r\n\r\n let newUp = PP.vec3_create();\r\n return function (e) {\r\n if (this.active && (this.mouseDown || !this.requireMouseDown)) {\r\n\r\n viewForward = this.object.pp_getBackward(viewForward); // the view \"real\" forward is actually the backward\r\n viewUp = this.object.pp_getUp(viewUp);\r\n\r\n referenceUp.vec3_set(0, 1, 0);\r\n if (this.object.pp_getParent() != null) {\r\n referenceUp = this.object.pp_getParent().pp_getUp(referenceUp);\r\n }\r\n\r\n referenceRight = viewForward.vec3_cross(referenceUp, referenceRight);\r\n\r\n let minAngle = 1;\r\n if (viewForward.vec3_angle(referenceUp) < minAngle) {\r\n referenceRight = viewUp.vec3_negate(referenceRight).vec3_cross(referenceUp, referenceRight);\r\n } else if (viewForward.vec3_angle(referenceUp.vec3_negate(referenceUpNegate)) < minAngle) {\r\n referenceRight = viewUp.vec3_cross(referenceUp, referenceRight);\r\n } else if (!viewUp.vec3_isConcordant(referenceUp)) {\r\n referenceRight.vec3_negate(referenceRight);\r\n }\r\n referenceRight.vec3_normalize(referenceRight);\r\n\r\n this.rotationX = -this.sensitity * e.movementX;\r\n this.rotationY = -this.sensitity * e.movementY;\r\n\r\n this.object.pp_rotateAxis(this.rotationY, referenceRight);\r\n\r\n let maxVerticalAngle = 90 - 0.001;\r\n newUp = this.object.pp_getUp(newUp);\r\n let angleWithUp = Math.pp_angleClamp(newUp.vec3_angleSigned(referenceUp, referenceRight));\r\n if (Math.abs(angleWithUp) > maxVerticalAngle) {\r\n let fixAngle = (Math.abs(angleWithUp) - maxVerticalAngle) * Math.pp_sign(angleWithUp);\r\n this.object.pp_rotateAxis(fixAngle, referenceRight);\r\n }\r\n\r\n this.object.pp_rotateAxis(this.rotationX, referenceUp);\r\n }\r\n };\r\n }().bind(this));\r\n\r\n if (this.requireMouseDown) {\r\n if (this.mouseButtonIndex == 2) {\r\n WL.canvas.addEventListener(\"contextmenu\", function (e) {\r\n e.preventDefault();\r\n }, false);\r\n }\r\n WL.canvas.addEventListener('mousedown', function (e) {\r\n if (e.button == this.mouseButtonIndex) {\r\n this.mouseDown = true;\r\n document.body.style.cursor = \"grabbing\";\r\n if (e.button == 1) {\r\n e.preventDefault();\r\n /* Prevent scrolling */\r\n return false;\r\n }\r\n }\r\n }.bind(this));\r\n WL.canvas.addEventListener('mouseup', function (e) {\r\n if (e.button == this.mouseButtonIndex) {\r\n this.mouseDown = false;\r\n document.body.style.cursor = \"initial\";\r\n }\r\n }.bind(this));\r\n WL.canvas.addEventListener('mouseleave', function (e) {\r\n this.mouseDown = false;\r\n document.body.style.cursor = \"initial\";\r\n }.bind(this));\r\n\r\n WL.canvas.addEventListener('touchstart', function (e) {\r\n this.mouseDown = true;\r\n document.body.style.cursor = \"grabbing\";\r\n }.bind(this));\r\n WL.canvas.addEventListener('touchend', function (e) {\r\n this.mouseDown = false;\r\n document.body.style.cursor = \"initial\";\r\n }.bind(this));\r\n }\r\n };\r\n} else {\r\n console.error(\"Wonderland Engine \\\"mouse-look\\\" component not found.\\n Add the component to your project to avoid any issue with the PP bundle.\");\r\n}", "/*\r\n How to use\r\n\r\n Warning: The extension is a WIP so not all the functions are available for all kinds of vector.\r\n\r\n By default rotations are in Degrees and transforms are Matrix 4 (and not Quat 2) \r\n For functions that work with rotations, Matrix means Matrix 3 and Quat means Quat\r\n For functions that work with transforms, Matrix means Matrix 4 and Quat means Quat 2\r\n \r\n For rotations u can add a suffix like Degrees/Radians/Quat/Matrix to use a specific version, example:\r\n - vec3_rotateAroundRadians\r\n - vec3_degreesAddRotationDegrees\r\n \r\n For transform u can add a suffix like Quat/Matrix to use a specific version, example:\r\n - vec3_convertPositionToWorldMatrix\r\n - vec3_convertDirectionToWorldQuat\r\n\r\n Some vec3 functions let u add a prefix to specify if the vec3 represent a rotation in degrees or radians, where degrees is the default:\r\n - vec3_toQuat\r\n - vec3_degreesToQuat\r\n - vec3_radiansToQuat\r\n - vec3_degreesAddRotation\r\n\r\n Rotation operations return a rotation of the same kind of the starting variable:\r\n - vec3_degreesAddRotationQuat -> returns a rotation in degrees\r\n - quat_addRotationDegrees -> returns a rotation in quat\r\n\r\n The functions leave u the choice of forwarding an out parameter or just get the return value, example:\r\n - let quat = this.vec3_toQuat()\r\n - this.vec3_toQuat(quat)\r\n - the out parameter is always the last one\r\n\r\n List of functions:\r\n Notes:\r\n - If a group of functions starts with \u25CB it means it modifies the variable itself\r\n - The suffixes (like Matrix or Radians) or prefixes (like degrees) are omitted \r\n\r\n CREATION (u can call these functions without any object):\r\n - PP.vec2_create\r\n\r\n - PP.vec3_create\r\n\r\n - PP.vec4_create\r\n\r\n - PP.quat_create\r\n\r\n - PP.quat2_create\r\n - PP.quat2_fromPositionRotation\r\n\r\n - PP.mat4_create\r\n - PP.mat4_fromPositionRotation / PP.mat4_fromPositionRotationScale\r\n\r\n ARRAY:\r\n - pp_first / pp_last\r\n - pp_has / pp_hasEqual\r\n - pp_find / pp_findIndex / pp_findAll / pp_findAllIndexes / pp_findEqual / pp_findAllEqual / pp_findIndexEqual / pp_findAllIndexesEqual\r\n \u25CB pp_remove / pp_removeIndex / pp_removeAll / pp_removeEqual / pp_removeAllEqual\r\n \u25CB pp_pushUnique / pp_unshiftUnique\r\n \u25CB pp_copy \r\n - pp_clone \r\n - pp_equals \r\n \u25CB pp_clear \r\n\r\n GENERIC VECTOR (array with only numbers):\r\n - vec_scale\r\n - vec_round / vec_floor / vec_ceil / vec_clamp\r\n - vec_log / vec_error / vec_warn \r\n - vec_equals \r\n\r\n VECTOR 2:\r\n \u25CB vec2_set\r\n - vec2_length\r\n - vec2_isZero\r\n\r\n VECTOR 3:\r\n \u25CB vec3_set / vec3_copy / vec3_zero\r\n - vec3_clone \r\n - vec3_normalize / vec3_negate\r\n - vec3_isNormalized / vec3_isZero\r\n - vec3_length / vec3_lengthSigned\r\n - vec3_distance\r\n - vec3_add / vec3_sub / vec3_mul / vec3_div / vec3_scale\r\n - vec3_transformQuat / vec3_transformMat4\r\n - vec3_componentAlongAxis / vec3_removeComponentAlongAxis / vec3_copyComponentAlongAxis / vec3_valueAlongAxis \r\n - vec3_isConcordant\r\n - vec3_isFurtherAlongAxis\r\n - vec3_isToTheRight\r\n - vec3_isOnAxis\r\n - vec3_isOnPlane\r\n - vec3_signTo\r\n - vec3_projectOnAxis / vec3_projectOnAxisAlongAxis\r\n - vec3_projectOnPlane / vec3_projectOnPlaneAlongAxis\r\n - vec3_convertPositionToWorld / vec3_convertPositionToLocal \r\n - vec3_convertDirectionToWorld / vec3_convertDirectionToLocal \r\n - vec3_angle\r\n - vec3_rotate / vec3_rotateAxis / vec3_rotateAround / vec3_rotateAroundAxis\r\n - vec3_rotationTo / vec3_rotationToPivoted\r\n - vec3_toRadians / vec3_toDegrees / vec3_toQuat / vec3_toMatrix\r\n - vec3_addRotation\r\n - vec3_log / vec3_error / vec3_warn \r\n - vec3_lerp / vec3_interpolate \r\n \r\n VECTOR 4:\r\n \u25CB vec4_set / vec4_copy\r\n\r\n QUAT:\r\n \u25CB quat_set / quat_copy / quat_identity\r\n - quat_clone \r\n - quat_normalize / quat_invert\r\n - quat_isNormalized\r\n - quat_length\r\n - quat_mul\r\n - quat_getAxis / quat_getAngle\r\n - quat_getAxes / quat_getRight / quat_getUp / quat_getForward / quat_getLeft / quat_getDown / quat_getBackward\r\n \u25CB quat_setAxes / quat_setRight / quat_setUp / quat_setForward / quat_setLeft / quat_setDown / quat_setBackward\r\n - quat_toWorld / quat_toLocal\r\n - quat_rotate / quat_rotateAxis \r\n - quat_rotationTo \r\n \u25CB quat_fromRadians / quat_fromDegrees / quat_fromAxis / quat_fromAxes\r\n - quat_toRadians / quat_toDegrees / quat_toMatrix\r\n - quat_addRotation / quat_subRotation\r\n - quat_lerp / quat_interpolate / quat_slerp / quat_sinterpolate\r\n\r\n QUAT 2:\r\n \u25CB quat2_copy / quat2_identity\r\n - quat2_normalize\r\n - quat2_getPosition / quat2_getRotation\r\n \u25CB quat2_setPositionRotation\r\n - quat2_getAxes / quat2_getRight / quat2_getUp / quat2_getForward / quat2_getLeft / quat2_getDown / quat2_getBackward\r\n - quat2_toWorld / quat2_toLocal\r\n - quat2_toMatrix\r\n \u25CB quat2_fromMatrix\r\n - quat2_lerp / quat2_interpolate\r\n\r\n MATRIX 3:\r\n - mat3_toDegrees / mat3_toRadians / mat3_toQuat\r\n - mat3_fromAxes\r\n\r\n MATRIX 4:\r\n \u25CB mat4_copy / mat4_identity\r\n - mat4_clone\r\n - mat4_invert\r\n - mat4_getPosition / mat4_getRotation / mat4_getScale\r\n \u25CB mat4_setPosition / mat4_setRotation / mat4_setScale\r\n \u25CB mat4_setPositionRotation / mat4_setPositionRotationScale\r\n - mat4_getAxes / mat4_getRight / mat4_getUp / mat4_getForward / mat4_getLeft / mat4_getDown / mat4_getBackward\r\n - mat4_toWorld / mat4_toLocal\r\n - mat4_hasUniformScale\r\n - mat4_toQuat\r\n \u25CB mat4_fromQuat\r\n*/\r\n\r\nimport * as glMatrix from 'gl-matrix';\r\n\r\n//ARRAY\r\n\r\n//New Functions\r\n\r\nArray.prototype.pp_first = function () {\r\n return this.length > 0 ? this[0] : undefined;\r\n};\r\n\r\nArray.prototype.pp_last = function () {\r\n return this.length > 0 ? this[this.length - 1] : undefined;\r\n};\r\n\r\nArray.prototype.pp_has = function (callback) {\r\n return this.pp_find(callback) != undefined;\r\n};\r\n\r\nArray.prototype.pp_hasEqual = function (elementToFind, elementsEqualCallback = null) {\r\n return this.pp_findEqual(elementToFind, elementsEqualCallback) != undefined;\r\n};\r\n\r\nArray.prototype.pp_find = function (callback) {\r\n let elementFound = undefined;\r\n\r\n let index = this.findIndex(callback);\r\n if (index >= 0) {\r\n elementFound = this[index];\r\n }\r\n\r\n return elementFound;\r\n};\r\n\r\nArray.prototype.pp_findIndex = function (callback) {\r\n return this.findIndex(callback);\r\n};\r\n\r\nArray.prototype.pp_findAll = function (callback) {\r\n let elementsFound = this.filter(callback);\r\n\r\n return elementsFound;\r\n};\r\n\r\nArray.prototype.pp_findAllIndexes = function (callback) {\r\n let indexes = [];\r\n for (let i = 0; i < this.length; i++) {\r\n let element = this[i];\r\n if (callback(element)) {\r\n indexes.push(i);\r\n }\r\n }\r\n return indexes;\r\n};\r\n\r\nArray.prototype.pp_findEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_find(element => element === elementToFind);\r\n }\r\n return this.pp_find(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_findAllEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_findAll(element => element === elementToFind);\r\n }\r\n return this.pp_findAll(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_findIndexEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.findIndex(element => element === elementToFind);\r\n }\r\n return this.findIndex(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_findAllIndexesEqual = function (elementToFind, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_findAllIndexes(element => element === elementToFind);\r\n }\r\n return this.pp_findAllIndexes(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_removeIndex = function (index) {\r\n let elementRemoved = undefined;\r\n\r\n if (index >= 0 && index < this.length) {\r\n let arrayRemoved = this.splice(index, 1);\r\n if (arrayRemoved.length == 1) {\r\n elementRemoved = arrayRemoved[0];\r\n }\r\n }\r\n\r\n return elementRemoved;\r\n};\r\n\r\nArray.prototype.pp_remove = function (callback) {\r\n let elementRemoved = undefined;\r\n\r\n let index = this.findIndex(callback);\r\n if (index >= 0) {\r\n elementRemoved = this.pp_removeIndex(index);\r\n }\r\n\r\n return elementRemoved;\r\n};\r\n\r\nArray.prototype.pp_removeAll = function (callback) {\r\n let elementsRemoved = [];\r\n\r\n let currentElement = undefined;\r\n do {\r\n currentElement = this.pp_remove(callback);\r\n if (currentElement !== undefined) {\r\n elementsRemoved.push(currentElement);\r\n }\r\n } while (currentElement !== undefined);\r\n\r\n return elementsRemoved;\r\n};\r\n\r\nArray.prototype.pp_removeEqual = function (elementToRemove, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_remove(element => element === elementToFind);\r\n }\r\n return this.pp_remove(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_removeAllEqual = function (elementToRemove, elementsEqualCallback = null) {\r\n if (elementsEqualCallback == null) {\r\n return this.pp_removeAll(element => element === elementToFind);\r\n }\r\n return this.pp_removeAll(element => elementsEqualCallback(element, elementToFind));\r\n};\r\n\r\nArray.prototype.pp_pushUnique = function (element, elementsEqualCallback = null) {\r\n let length = this.length;\r\n\r\n let hasElement = this.pp_hasEqual(element, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = this.push(element);\r\n }\r\n\r\n return length;\r\n};\r\n\r\nArray.prototype.pp_unshiftUnique = function (element, elementsEqualCallback = null) {\r\n let length = this.length;\r\n\r\n let hasElement = this.pp_hasEqual(element, elementsEqualCallback);\r\n\r\n if (!hasElement) {\r\n length = this.unshift(element);\r\n }\r\n\r\n return length;\r\n};\r\n\r\nArray.prototype.pp_copy = function (array, copyCallback = null) {\r\n while (this.length > array.length) {\r\n this.pop();\r\n }\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n if (copyCallback == null) {\r\n this[i] = array[i];\r\n } else {\r\n this[i] = copyCallback(this[i], array[i]);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\nArray.prototype.pp_clone = function (cloneCallback = null) {\r\n if (cloneCallback == null) {\r\n return this.slice(0);\r\n }\r\n\r\n let clone = null;\r\n switch (this.constructor.name) {\r\n case \"Array\":\r\n clone = new Array(this.length);\r\n break;\r\n case \"Uint32Array\":\r\n clone = new Uint32Array(this.length);\r\n break;\r\n case \"Int32Array\":\r\n clone = new Int32Array(this.length);\r\n break;\r\n case \"Float32Array\":\r\n clone = new Float32Array(this.length);\r\n break;\r\n case \"Float64Array\":\r\n clone = new Float64Array(this.length);\r\n break;\r\n default:\r\n clone = new Array(this.length);\r\n console.error(\"Cloned array type not supported!\");\r\n break;\r\n }\r\n\r\n for (let i = 0; i < this.length; i++) {\r\n clone[i] = cloneCallback(this[i]);\r\n }\r\n\r\n return clone;\r\n};\r\n\r\nArray.prototype.pp_equals = function (array, elementsEqualCallback = null) {\r\n let equals = true;\r\n\r\n if (array != null && this.length == array.length) {\r\n for (let i = 0; i < this.length; i++) {\r\n if ((elementsEqualCallback != null && !elementsEqualCallback(this[i], array[i])) ||\r\n (elementsEqualCallback == null && this[i] != array[i])) {\r\n equals = false;\r\n break;\r\n }\r\n }\r\n } else {\r\n equals = false;\r\n }\r\n\r\n return equals;\r\n};\r\n\r\nArray.prototype.pp_clear = function () {\r\n this.length = 0;\r\n\r\n return this;\r\n};\r\n\r\n// GENERIC VECTOR\r\n\r\n//New Functions\r\n\r\nArray.prototype.vec_toString = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n return message;\r\n};\r\n\r\nArray.prototype.vec_log = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n console.log(message);\r\n};\r\n\r\nArray.prototype.vec_error = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n console.error(message);\r\n};\r\n\r\nArray.prototype.vec_warn = function (decimalPlaces = 4) {\r\n let message = this._vec_buildConsoleMessage(decimalPlaces);\r\n console.warn(message);\r\n};\r\n\r\nArray.prototype.vec_scale = function (value, out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = out[i] * value;\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_round = function (out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.round(out[i]);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_floor = function (out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.floor(out[i]);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_ceil = function (out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.ceil(out[i]);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_clamp = function (start, end, out = null) {\r\n out = this._vec_prepareOut(out);\r\n\r\n let fixedStart = (start != null) ? start : -Number.MAX_VALUE;\r\n let fixedEnd = (end != null) ? end : Number.MAX_VALUE;\r\n let min = Math.min(fixedStart, fixedEnd);\r\n let max = Math.max(fixedStart, fixedEnd);\r\n\r\n for (let i = 0; i < out.length; i++) {\r\n out[i] = Math.min(Math.max(out[i], min), max);\r\n }\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.vec_equals = function (vector, epsilon = 0) {\r\n let equals = this.length == vector.length;\r\n\r\n for (let i = 0; i < this.length && equals; i++) {\r\n equals = equals && (Math.abs(this[i] - vector[i]) <= epsilon);\r\n }\r\n\r\n return equals;\r\n};\r\n\r\n// VECTOR 2\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.vec2_set = function (x, y = null) {\r\n if (y == null) {\r\n glMatrix.vec2.set(this, x, x);\r\n } else {\r\n glMatrix.vec2.set(this, x, y);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.vec2_length = function () {\r\n return glMatrix.vec2.length(this);\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.vec2_isZero = function () {\r\n return this.vec2_length() == 0;\r\n};\r\n\r\n// VECTOR 3\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.vec3_normalize = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.normalize(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_copy = function (vector) {\r\n glMatrix.vec3.copy(this, vector);\r\n return this;\r\n};\r\n\r\nArray.prototype.vec3_clone = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_set = function (x, y = null, z = null) {\r\n if (y == null) {\r\n glMatrix.vec3.set(this, x, x, x);\r\n } else {\r\n glMatrix.vec3.set(this, x, y, z);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.vec3_zero = function () {\r\n glMatrix.vec3.zero(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.vec3_angle = function (vector) {\r\n return this.vec3_angleDegrees(vector);\r\n};\r\n\r\nArray.prototype.vec3_angleDegrees = function (vector) {\r\n return this.vec3_angleRadians(vector) * (180 / Math.PI);\r\n};\r\n\r\nArray.prototype.vec3_angleRadians = function (vector) {\r\n return (this.vec3_isZero() || vector.vec3_isZero()) ? 0 : glMatrix.vec3.angle(this, vector);\r\n};\r\n\r\nArray.prototype.vec3_length = function () {\r\n return glMatrix.vec3.length(this);\r\n};\r\n\r\nArray.prototype.vec3_distance = function (vector) {\r\n return glMatrix.vec3.dist(this, vector);\r\n};\r\n\r\nArray.prototype.vec3_add = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.add(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_sub = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.sub(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_mul = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.mul(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_div = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.div(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_scale = function (value, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.scale(out, this, value);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_negate = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.negate(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_cross = function (vector, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.cross(out, this, vector);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_transformQuat = function (quat, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.transformQuat(out, this, quat);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_transformMat4 = function (mat4, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.transformMat4(out, this, mat4);\r\n return out;\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.vec3_lengthSigned = function (positiveDirection) {\r\n let signedLength = glMatrix.vec3.length(this);\r\n if (!this.vec3_isConcordant(positiveDirection)) {\r\n signedLength *= -1;\r\n }\r\n\r\n return signedLength;\r\n};\r\n\r\nArray.prototype.vec3_angleSigned = function (vector, upAxis) {\r\n return this.vec3_angleSignedDegrees(vector, upAxis);\r\n};\r\n\r\nArray.prototype.vec3_angleSignedDegrees = function (vector, upAxis) {\r\n return this.vec3_angleSignedRadians(vector, upAxis) * (180 / Math.PI);\r\n};\r\n\r\nArray.prototype.vec3_angleSignedRadians = function () {\r\n let crossAxis = glMatrix.vec3.create();\r\n return function vec3_angleSignedRadians(vector, upAxis) {\r\n this.vec3_cross(vector, crossAxis);\r\n let angle = this.vec3_angleRadians(vector);\r\n if (!crossAxis.vec3_isConcordant(upAxis)) {\r\n angle = -angle;\r\n }\r\n\r\n return angle;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_toRadians = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, glMatrix.glMatrix.toRadian(this[0]), glMatrix.glMatrix.toRadian(this[1]), glMatrix.glMatrix.toRadian(this[2]));\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_toDegrees = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[0] * (180 / Math.PI), this[1] * (180 / Math.PI), this[2] * (180 / Math.PI));\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_toQuat = function (out) {\r\n return this.vec3_degreesToQuat(out);\r\n};\r\n\r\nArray.prototype.vec3_radiansToQuat = function (out = glMatrix.quat.create()) {\r\n out.quat_fromRadians(this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_degreesToQuat = function (out = glMatrix.quat.create()) {\r\n out.quat_fromDegrees(this);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_isNormalized = function () {\r\n return Math.abs(glMatrix.vec3.length(this) - 1) < this._pp_epsilon;\r\n};\r\n\r\nArray.prototype.vec3_isZero = function (epsilon = 0) {\r\n return this.vec3_length() <= epsilon;\r\n};\r\n\r\nArray.prototype.vec3_componentAlongAxis = function (axis, out = glMatrix.vec3.create()) {\r\n let angle = glMatrix.vec3.angle(this, axis);\r\n let length = Math.cos(angle) * glMatrix.vec3.length(this);\r\n\r\n glMatrix.vec3.copy(out, axis);\r\n glMatrix.vec3.scale(out, out, length);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_valueAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_valueAlongAxis(axis) {\r\n this.vec3_componentAlongAxis(axis, componentAlong);\r\n let value = componentAlong.vec3_length();\r\n if (!componentAlong.vec3_isConcordant(axis)) {\r\n value = -value;\r\n }\r\n return value;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_removeComponentAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_removeComponentAlongAxis(axis, out = glMatrix.vec3.create()) {\r\n this.vec3_componentAlongAxis(axis, componentAlong);\r\n glMatrix.vec3.sub(out, this, componentAlong);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_copyComponentAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_copyComponentAlongAxis(vector, axis, out = glMatrix.vec3.create()) {\r\n this.vec3_removeComponentAlongAxis(axis, out);\r\n vector.vec3_componentAlongAxis(axis, componentAlong);\r\n out.vec3_add(componentAlong, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_isConcordant = function (vector) {\r\n return glMatrix.vec3.angle(this, vector) <= Math.PI / 2;\r\n};\r\n\r\nArray.prototype.vec3_isFurtherAlongAxis = function () {\r\n let componentAlong = glMatrix.vec3.create();\r\n return function vec3_isFurtherAlongAxis(vector, axis) {\r\n let thisAxisLength = this.vec3_componentAlongAxis(axis, componentAlong).vec3_length();\r\n let thisAxisLengthSigned = this.vec3_isConcordant(axis) ? thisAxisLength : -thisAxisLength;\r\n\r\n let vectorAxisLength = vector.vec3_componentAlongAxis(axis, componentAlong).vec3_length();\r\n let vectorAxisLengthSigned = vector.vec3_isConcordant(axis) ? vectorAxisLength : -vectorAxisLength;\r\n\r\n return thisAxisLengthSigned > vectorAxisLengthSigned;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_isToTheRight = function (vector, upAxis) {\r\n return this.vec3_signTo(vector, upAxis) >= 0;\r\n};\r\n\r\nArray.prototype.vec3_signTo = function () {\r\n let componentAlongThis = glMatrix.vec3.create();\r\n let componentAlongVector = glMatrix.vec3.create();\r\n return function vec3_signTo(vector, upAxis, zeroSign = 1) {\r\n this.vec3_removeComponentAlongAxis(upAxis, componentAlongThis);\r\n vector.vec3_removeComponentAlongAxis(upAxis, componentAlongVector);\r\n\r\n let angleSigned = this.vec3_angleSigned(vector, upAxis);\r\n return angleSigned > 0 ? 1 : (angleSigned == 0 ? zeroSign : -1);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_projectOnAxis = function (axis, out = glMatrix.vec3.create()) {\r\n this.vec3_componentAlongAxis(axis, out);\r\n return out;\r\n};\r\n\r\n// the result can easily be not 100% exact due to precision errors\r\nArray.prototype.vec3_projectOnAxisAlongAxis = function () {\r\n let up = glMatrix.vec3.create();\r\n\r\n let thisToAxis = glMatrix.vec3.create();\r\n\r\n let fixedProjectAlongAxis = glMatrix.vec3.create();\r\n return function vec3_projectOnAxisAlongAxis(axis, projectAlongAxis, out = glMatrix.vec3.create()) {\r\n\r\n if (this.vec3_isOnAxis(axis) || projectAlongAxis.vec3_isOnAxis(axis)) {\r\n out.vec3_copy(this);\r\n } else {\r\n projectAlongAxis.vec3_cross(axis, up);\r\n up.vec3_normalize(up);\r\n\r\n this.vec3_removeComponentAlongAxis(up, out);\r\n if (!out.vec3_isOnAxis(axis)) {\r\n out.vec3_projectOnAxis(axis, thisToAxis);\r\n thisToAxis.vec3_sub(out, thisToAxis);\r\n\r\n if (thisToAxis.vec3_isConcordant(projectAlongAxis)) {\r\n fixedProjectAlongAxis.vec3_copy(projectAlongAxis);\r\n } else {\r\n projectAlongAxis.vec3_negate(fixedProjectAlongAxis);\r\n }\r\n\r\n let angleWithAlongAxis = fixedProjectAlongAxis.vec3_angleRadians(thisToAxis);\r\n let lengthToRemove = thisToAxis.vec3_length() / Math.cos(angleWithAlongAxis);\r\n\r\n fixedProjectAlongAxis.vec3_normalize(fixedProjectAlongAxis);\r\n fixedProjectAlongAxis.vec3_scale(lengthToRemove, fixedProjectAlongAxis);\r\n out.vec3_add(fixedProjectAlongAxis, out);\r\n\r\n out.vec3_projectOnAxis(axis, out); // snap on the axis, due to float precision error\r\n }\r\n }\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_projectOnPlane = function (planeNormal, out = glMatrix.vec3.create()) {\r\n this.vec3_removeComponentAlongAxis(planeNormal, out);\r\n return out;\r\n};\r\n\r\n// the result can easily be not 100% exact due to precision errors\r\nArray.prototype.vec3_projectOnPlaneAlongAxis = function () {\r\n let thisToPlane = glMatrix.vec3.create();\r\n\r\n let fixedProjectAlongAxis = glMatrix.vec3.create();\r\n return function vec3_projectOnPlaneAlongAxis(planeNormal, projectAlongAxis, out = glMatrix.vec3.create()) {\r\n if (this.vec3_isOnPlane(planeNormal) || projectAlongAxis.vec3_isOnPlane(planeNormal)) {\r\n out.vec3_copy(this);\r\n } else {\r\n out.vec3_copy(this);\r\n\r\n out.vec3_projectOnPlane(planeNormal, thisToPlane);\r\n thisToPlane.vec3_sub(out, thisToPlane);\r\n\r\n if (thisToPlane.vec3_isConcordant(projectAlongAxis)) {\r\n fixedProjectAlongAxis.vec3_copy(projectAlongAxis);\r\n } else {\r\n projectAlongAxis.vec3_negate(fixedProjectAlongAxis);\r\n }\r\n\r\n let angleWithAlongAxis = fixedProjectAlongAxis.vec3_angleRadians(thisToPlane);\r\n let lengthToRemove = thisToPlane.vec3_length() / Math.cos(angleWithAlongAxis);\r\n\r\n fixedProjectAlongAxis.vec3_normalize(fixedProjectAlongAxis);\r\n fixedProjectAlongAxis.vec3_scale(lengthToRemove, fixedProjectAlongAxis);\r\n out.vec3_add(fixedProjectAlongAxis, out);\r\n\r\n out.vec3_projectOnPlane(planeNormal, out); // snap on the axis, due to float precision error\r\n }\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_isOnAxis = function (axis) {\r\n let angle = this.vec3_angle(axis);\r\n return Math.abs(angle) < this._pp_degreesEpsilon || Math.abs(angle - 180) < this._pp_degreesEpsilon;\r\n};\r\n\r\nArray.prototype.vec3_isOnPlane = function (planeNormal) {\r\n let angle = this.vec3_angle(planeNormal);\r\n return Math.abs(angle - 90) < this._pp_degreesEpsilon;\r\n};\r\n\r\nArray.prototype.vec3_rotate = function (rotation, out) {\r\n return this.vec3_rotateDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateDegrees = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateDegrees(rotation, out) {\r\n return this.vec3_rotateAroundDegrees(rotation, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateRadians = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateRadians(rotation, out) {\r\n return this.vec3_rotateAroundRadians(rotation, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateQuat = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateQuat(rotation, out) {\r\n return this.vec3_rotateAroundQuat(rotation, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAxis = function (angle, axis, out) {\r\n return this.vec3_rotateAxisDegrees(angle, axis, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAxisDegrees = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateAxisDegrees(angle, axis, out) {\r\n return this.vec3_rotateAroundAxisDegrees(angle, axis, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAxisRadians = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function vec3_rotateAxisRadians(angle, axis, out) {\r\n return this.vec3_rotateAroundAxisRadians(angle, axis, zero, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAround = function (rotation, origin, out) {\r\n return this.vec3_rotateAroundDegrees(rotation, origin, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_rotateAroundDegrees(rotation, origin, out = glMatrix.vec3.create()) {\r\n rotation.vec3_degreesToQuat(quat);\r\n return this.vec3_rotateAroundQuat(quat, origin, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAroundRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_rotateAroundRadians(rotation, origin, out = glMatrix.vec3.create()) {\r\n rotation.vec3_radiansToQuat(quat);\r\n return this.vec3_rotateAroundQuat(quat, origin, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotateAroundQuat = function (rotation, origin, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.sub(out, this, origin);\r\n glMatrix.vec3.transformQuat(out, out, rotation);\r\n glMatrix.vec3.add(out, out, origin);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundAxis = function (angle, axis, origin, out) {\r\n return this.vec3_rotateAroundAxisDegrees(angle, axis, origin, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundAxisDegrees = function (angle, axis, origin, out) {\r\n return this.vec3_rotateAroundAxisRadians(glMatrix.glMatrix.toRadian(angle), axis, origin, out);\r\n};\r\n\r\nArray.prototype.vec3_rotateAroundAxisRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_rotateAroundAxisRadians(angle, axis, origin, out = glMatrix.vec3.create()) {\r\n glMatrix.quat.setAxisAngle(quat, axis, angle);\r\n return this.vec3_rotateAroundQuat(quat, origin, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertPositionToWorld = function (parentTransform, out) {\r\n return this.vec3_convertPositionToWorldMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertPositionToLocal = function (parentTransform, out) {\r\n return this.vec3_convertPositionToLocalMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertPositionToWorldMatrix = function (parentTransform, out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.transformMat4(out, this, parentTransform);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_convertPositionToLocalMatrix = function () {\r\n let inverse = glMatrix.mat4.create();\r\n return function vec3_convertPositionToLocalMatrix(parentTransform, out = glMatrix.vec3.create()) {\r\n glMatrix.mat4.invert(inverse, parentTransform);\r\n glMatrix.vec3.transformMat4(out, this, inverse);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertPositionToWorldQuat = function () {\r\n let parentTransformMatrix = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function vec3_convertPositionToWorldQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getPosition(position);\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n parentTransformMatrix.mat4_setPositionRotationQuatScale(position, rotation, one);\r\n return this.vec3_convertPositionToWorldMatrix(parentTransformMatrix, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertPositionToLocalQuat = function () {\r\n let parentTransformMatrix = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function vec3_convertPositionToLocalQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getPosition(position);\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n parentTransformMatrix.mat4_setPositionRotationQuatScale(position, rotation, one);\r\n return this.vec3_convertPositionToLocalMatrix(parentTransformMatrix, out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertDirectionToWorld = function (parentTransform, out) {\r\n return this.vec3_convertDirectionToWorldMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertDirectionToLocal = function (parentTransform, out) {\r\n return this.vec3_convertDirectionToLocalMatrix(parentTransform, out);\r\n};\r\n\r\nArray.prototype.vec3_convertDirectionToWorldMatrix = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToWorldMatrix(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.mat4_getRotationQuat(rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertDirectionToLocalMatrix = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToLocalMatrix(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.mat4_getRotationQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\n\r\nArray.prototype.vec3_convertDirectionToWorldQuat = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToWorldQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_convertDirectionToLocalQuat = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function vec3_convertDirectionToLocalQuat(parentTransform, out = glMatrix.vec3.create()) {\r\n parentTransform.quat2_getRotationQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.vec3.transformQuat(out, this, rotation);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_log = function (decimalPlaces = 4) {\r\n this.vec_log(decimalPlaces);\r\n};\r\n\r\nArray.prototype.vec3_error = function (decimalPlaces = 4) {\r\n this.vec_error(decimalPlaces);\r\n};\r\n\r\nArray.prototype.vec3_warn = function (decimalPlaces = 4) {\r\n this.vec_warn(decimalPlaces);\r\n};\r\n\r\nArray.prototype.vec3_addRotation = function (rotation, out) {\r\n return this.vec3_degreesAddRotation(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_addRotationDegrees = function (rotation, out) {\r\n return quat.vec3_degreesAddRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_addRotationRadians = function (rotation, out) {\r\n return quat.vec3_degreesAddRotationRadians(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_addRotationQuat = function (rotation, out) {\r\n return quat.vec3_degreesAddRotationQuat(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_degreesAddRotation = function (rotation, out) {\r\n return this.vec3_degreesAddRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_degreesAddRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesAddRotationDegrees(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_addRotationDegrees(rotation, quat).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_degreesAddRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesAddRotationRadians(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_addRotationRadians(rotation, quat).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_degreesAddRotationQuat = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesAddRotationQuat(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_addRotationQuat(rotation, quat).quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansAddRotation = function (rotation, out) {\r\n return this.vec3_radiansAddRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.vec3_radiansAddRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansAddRotationDegrees(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_addRotationDegrees(rotation, quat).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansAddRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansAddRotationRadians(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_addRotationRadians(rotation, quat).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansAddRotationQuat = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansAddRotationQuat(rotation, out = glMatrix.vec3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_addRotationQuat(rotation, quat).quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_toMatrix = function (out = glMatrix.mat3.create()) {\r\n return this.vec3_degreesToMatrix(out);\r\n};\r\n\r\nArray.prototype.vec3_degreesToMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_degreesToMatrix(out = glMatrix.mat3.create()) {\r\n this.vec3_degreesToQuat(quat);\r\n return quat.quat_toMatrix(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_radiansToMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function vec3_radiansToMatrix(out = glMatrix.mat3.create()) {\r\n this.vec3_radiansToQuat(quat);\r\n return quat.quat_toMatrix(out);\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationTo = function (direction, out) {\r\n return this.vec3_rotationToDegrees(direction, out);\r\n};\r\n\r\nArray.prototype.vec3_rotationToDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToDegrees(direction, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToQuat(direction, rotationQuat);\r\n rotationQuat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToRadians(direction, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToQuat(direction, rotationQuat);\r\n rotationQuat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToQuat = function () {\r\n let rotationAxis = glMatrix.vec3.create();\r\n return function vec3_rotationToQuat(direction, out = glMatrix.quat.create()) {\r\n this.vec3_cross(direction, rotationAxis);\r\n rotationAxis.vec3_normalize(rotationAxis);\r\n let signedAngle = this.vec3_angleSigned(direction, rotationAxis);\r\n out.quat_fromAxis(signedAngle, rotationAxis);\r\n out.quat_normalize(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToPivoted = function (direction, pivotAxis, out) {\r\n return this.vec3_rotationToPivotedDegrees(direction, pivotAxis, out);\r\n};\r\n\r\nArray.prototype.vec3_rotationToPivotedDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToPivotedDegrees(direction, pivotAxis, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToPivotedQuat(direction, pivotAxis, rotationQuat);\r\n rotationQuat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToPivotedRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function vec3_rotationToPivotedRadians(direction, pivotAxis, out = glMatrix.vec3.create()) {\r\n this.vec3_rotationToPivotedQuat(direction, pivotAxis, rotationQuat);\r\n rotationQuat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_rotationToPivotedQuat = function () {\r\n let thisFlat = glMatrix.vec3.create();\r\n let directionFlat = glMatrix.vec3.create();\r\n let rotationAxis = glMatrix.vec3.create();\r\n return function vec3_rotationToPivotedQuat(direction, pivotAxis, out = glMatrix.quat.create()) {\r\n this.vec3_removeComponentAlongAxis(pivotAxis, thisFlat);\r\n direction.vec3_removeComponentAlongAxis(pivotAxis, directionFlat);\r\n\r\n thisFlat.vec3_cross(directionFlat, rotationAxis);\r\n rotationAxis.vec3_normalize(rotationAxis);\r\n let signedAngle = thisFlat.vec3_angleSigned(directionFlat, rotationAxis);\r\n out.quat_fromAxis(signedAngle, rotationAxis);\r\n out.quat_normalize(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.vec3_lerp = function (to, interpolationValue, out = glMatrix.vec3.create()) {\r\n if (interpolationValue <= 0) {\r\n out.vec3_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.vec3_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.vec3.lerp(out, this, to, interpolationValue);\r\n return out;\r\n};\r\n\r\nArray.prototype.vec3_interpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.vec3.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.vec3_lerp(to, lerpValue, out);\r\n};\r\n\r\n// VECTOR 4\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.vec4_set = function (x, y = null, z = null, w = null) {\r\n if (y == null) {\r\n glMatrix.vec4.set(this, x, x, x, x);\r\n } else {\r\n glMatrix.vec4.set(this, x, y, z, w);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.vec4_copy = function (vector) {\r\n glMatrix.vec4.copy(this, vector);\r\n return this;\r\n};\r\n\r\n//QUAT\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.quat_normalize = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.normalize(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_copy = function (quat) {\r\n glMatrix.quat.copy(this, quat);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_clone = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_set = function (x, y = null, z = null, w = null) {\r\n if (y == null) {\r\n glMatrix.quat.set(this, x, x, x, x);\r\n } else {\r\n glMatrix.quat.set(this, x, y, z, w);\r\n }\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_identity = function () {\r\n glMatrix.quat.identity(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_length = function () {\r\n return glMatrix.quat.length(this);\r\n};\r\n\r\nArray.prototype.quat_invert = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.invert(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_mul = function (rotation, out = glMatrix.quat.create()) {\r\n glMatrix.quat.mul(out, this, rotation);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getAxis = function (out = glMatrix.vec3.create()) {\r\n glMatrix.quat.getAxisAngle(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getAngle = function () {\r\n return this.quat_getAngleDegrees();\r\n};\r\n\r\n\r\nArray.prototype.quat_getAngleDegrees = function () {\r\n let angle = this.quat_getAngleRadians();\r\n return angle * (180 / Math.PI);\r\n};\r\n\r\nArray.prototype.quat_getAngleRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function quat_getAngleRadians() {\r\n let angle = glMatrix.quat.getAxisAngle(vector, this);\r\n return angle;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getAxes = function (out = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.quat_getLeft(out[0]);\r\n this.quat_getUp(out[1]);\r\n this.quat_getForward(out[2]);\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getForward = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat_getForward(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getBackward = function (out) {\r\n out = this.quat_getForward(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getLeft = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat_getLeft(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getRight = function (out) {\r\n out = this.quat_getLeft(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_getUp = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat_getUp(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_getDown = function (out) {\r\n out = this.quat_getUp(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_setAxes = function (left, up, forward) {\r\n if (forward != null) {\r\n return this.quat_setForward(forward, up, left);\r\n } else if (up != null) {\r\n return this.quat_setUp(up, forward, left);\r\n } else {\r\n return this.quat_setLeft(left, up, forward);\r\n }\r\n};\r\n\r\nArray.prototype.quat_setForward = function (forward, up = null, left = null) {\r\n return this._quat_setAxes([left, up, forward], [2, 1, 0]);\r\n};\r\n\r\nArray.prototype.quat_setBackward = function () {\r\n let forward = glMatrix.vec3.create();\r\n return function quat_setBackward(backward, up = null, left = null) {\r\n backward.vec3_negate(forward);\r\n return this._quat_setAxes([left, up, forward], [2, 1, 0]);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_setUp = function (up, forward = null, left = null) {\r\n return this._quat_setAxes([left, up, forward], [1, 2, 0]);\r\n};\r\n\r\nArray.prototype.quat_setDown = function () {\r\n let up = glMatrix.vec3.create();\r\n return function quat_setDown(down, forward = null, left = null) {\r\n down.vec3_negate(up);\r\n return this._quat_setAxes([left, up, forward], [1, 2, 0]);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_setLeft = function (left, up = null, forward = null) {\r\n return this._quat_setAxes([left, up, forward], [0, 1, 2]);\r\n};\r\n\r\nArray.prototype.quat_setRight = function () {\r\n let left = glMatrix.vec3.create();\r\n return function quat_setRight(right, up = null, forward = null) {\r\n right.vec3_negate(left);\r\n return this._quat_setAxes([left, up, forward], [0, 1, 2]);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_toWorld = function (parentQuat, out = glMatrix.quat.create()) {\r\n glMatrix.quat.mul(out, parentQuat, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_toLocal = function () {\r\n let invertQuat = glMatrix.quat.create();\r\n return function quat_toLocal(parentQuat, out = glMatrix.quat.create()) {\r\n glMatrix.quat.conjugate(invertQuat, parentQuat);\r\n glMatrix.quat.mul(out, invertQuat, this);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_fromAxis = function (angle, axis) {\r\n return this.quat_fromAxisDegrees(angle, axis);\r\n};\r\n\r\nArray.prototype.quat_fromAxisDegrees = function (angle, axis) {\r\n glMatrix.quat.setAxisAngle(this, axis, glMatrix.glMatrix.toRadian(angle));\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_fromAxisRadians = function (angle, axis) {\r\n glMatrix.quat.setAxisAngle(this, axis, angle);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_fromAxes = function () {\r\n let mat3 = glMatrix.mat3.create();\r\n return function quat_fromAxes(leftAxis, upAxis, forwardAxis) {\r\n mat3.mat3_fromAxes(leftAxis, upAxis, forwardAxis);\r\n return mat3.mat3_toQuat(this);\r\n };\r\n}();\r\n\r\n// New Functions\r\n\r\nArray.prototype.quat_fromRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function quat_fromRadians(radiansRotation) {\r\n radiansRotation.vec3_toDegrees(vector);\r\n return this.quat_fromDegrees(vector);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_fromDegrees = function (degreesRotation) {\r\n glMatrix.quat.fromEuler(this, degreesRotation[0], degreesRotation[1], degreesRotation[2]);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat_toRadians = function () {\r\n let mat3 = glMatrix.mat3.create();\r\n return function quat_toRadians(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(mat3, this);\r\n\r\n //Rotation order is ZYX \r\n out[1] = Math.asin(-this._pp_clamp(mat3[2], -1, 1));\r\n\r\n if (Math.abs(mat3[2]) < (1 - this._pp_epsilon)) {\r\n out[0] = Math.atan2(mat3[5], mat3[8]);\r\n out[2] = Math.atan2(mat3[1], mat3[0]);\r\n } else {\r\n out[0] = 0;\r\n out[2] = Math.atan2(-mat3[3], mat3[4]);\r\n }\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_toDegrees = function (out = glMatrix.vec3.create()) {\r\n this.quat_toRadians(out);\r\n out.vec3_toDegrees(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_isNormalized = function () {\r\n return Math.abs(glMatrix.quat.length(this) - 1) < this._pp_epsilon;\r\n};\r\n\r\nArray.prototype.quat_addRotation = function (rotation, out) {\r\n return this.quat_addRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_addRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_addRotationDegrees(rotation, out) {\r\n rotation.vec3_degreesToQuat(quat);\r\n return this.quat_addRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_addRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_addRotationRadians(rotation, out) {\r\n rotation.vec3_radiansToQuat(quat);\r\n return this.quat_addRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_addRotationQuat = function (rotation, out = glMatrix.quat.create()) {\r\n rotation.quat_mul(this, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_subRotation = function (rotation, out) {\r\n return this.quat_subRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_subRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_subRotationDegrees(rotation, out) {\r\n rotation.vec3_degreesToQuat(quat);\r\n return this.quat_subRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_subRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function quat_subRotationRadians(rotation, out) {\r\n rotation.vec3_radiansToQuat(quat);\r\n return this.quat_subRotationQuat(quat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_subRotationQuat = function () {\r\n let inverse = glMatrix.quat.create();\r\n return function quat_subRotationQuat(rotation, out = glMatrix.quat.create()) {\r\n rotation.quat_invert(inverse);\r\n this.quat_mul(inverse, out);\r\n out.quat_normalize(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotationTo = function (quat, out) {\r\n return this.quat_rotationToDegrees(quat, out);\r\n};\r\n\r\nArray.prototype.quat_rotationToDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotationToDegrees(quat, out) {\r\n this.quat_rotationToQuat(quat, rotationQuat);\r\n return rotationQuat.quat_toDegrees(out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotationToRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotationToRadians(quat, out) {\r\n this.quat_rotationToQuat(quat, rotationQuat);\r\n return rotationQuat.quat_toRadians(out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotationToQuat = function (quat, out) {\r\n return quat.quat_subRotationQuat(this, out);\r\n};\r\n\r\nArray.prototype.quat_toMatrix = function (out = glMatrix.mat3.create()) {\r\n glMatrix.mat3.fromQuat(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_rotate = function (rotation, out) {\r\n return this.quat_rotateDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateDegrees = function (rotation, out) {\r\n return this.quat_addRotationDegrees(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateRadians = function (rotation, out) {\r\n return this.quat_addRotationRadians(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateQuat = function (rotation, out) {\r\n return this.quat_addRotationQuat(rotation, out);\r\n};\r\n\r\nArray.prototype.quat_rotateAxis = function (angle, axis, out) {\r\n return this.quat_rotateAxisDegrees(angle, axis, out);\r\n};\r\n\r\nArray.prototype.quat_rotateAxisDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotateAxisDegrees(angle, axis, out) {\r\n rotationQuat.quat_fromAxisDegrees(angle, axis);\r\n return this.quat_rotateQuat(rotationQuat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_rotateAxisRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat_rotateAxisRadians(angle, axis, out) {\r\n rotationQuat.quat_fromAxisRadians(angle, axis);\r\n return this.quat_rotateQuat(rotationQuat, out);\r\n };\r\n}();\r\n\r\nArray.prototype.quat_lerp = function (to, interpolationValue, out = glMatrix.quat.create()) {\r\n if (interpolationValue <= 0) {\r\n out.quat_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.quat_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.quat.lerp(out, this, to, interpolationValue);\r\n out.quat_normalize(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_interpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.quat.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.quat_lerp(to, lerpValue, out);\r\n};\r\n\r\nArray.prototype.quat_slerp = function (to, interpolationValue, out = glMatrix.quat.create()) {\r\n if (interpolationValue <= 0) {\r\n out.quat_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.quat_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.quat.slerp(out, this, to, interpolationValue);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat_sinterpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.quat.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.quat_slerp(to, lerpValue, out);\r\n};\r\n\r\n//QUAT 2\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.quat2_normalize = function (out = glMatrix.quat2.create()) {\r\n glMatrix.quat2.normalize(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_copy = function (quat2) {\r\n glMatrix.quat2.copy(this, quat2);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat2_identity = function () {\r\n glMatrix.quat2.identity(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat2_getPosition = function (out = glMatrix.vec3.create()) {\r\n glMatrix.quat2.getTranslation(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getRotation = function (out) {\r\n return this.quat2_getRotationDegrees(out);\r\n};\r\nArray.prototype.quat2_getRotationDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_getRotationDegrees(out = glMatrix.vec3.create()) {\r\n this.quat2_getRotationQuat(rotationQuat).quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getRotationRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_getRotationRadians(out = glMatrix.vec3.create()) {\r\n this.quat2_getRotationQuat(rotationQuat).quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getRotationQuat = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_setPositionRotation = function (position, rotation) {\r\n return this.quat2_setPositionRotationDegrees(position, rotation);\r\n};\r\n\r\nArray.prototype.quat2_setPositionRotationDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_setPositionRotationDegrees(position, rotation) {\r\n rotation.vec3_degreesToQuat(rotationQuat);\r\n glMatrix.quat2.fromRotationTranslation(this, rotationQuat, position);\r\n\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_setPositionRotationRadians = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function quat2_setPositionRotationRadians(position, rotation) {\r\n rotation.vec3_radiansToQuat(rotationQuat);\r\n glMatrix.quat2.fromRotationTranslation(this, rotationQuat, position);\r\n\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_setPositionRotationQuat = function (position, rotation) {\r\n glMatrix.quat2.fromRotationTranslation(this, rotation, position);\r\n return this;\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.quat2_getAxes = function (out = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.quat2_getLeft(out[0]);\r\n this.quat2_getUp(out[1]);\r\n this.quat2_getForward(out[2]);\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getForward = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat2_getForward(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[6], rotationMatrix[7], rotationMatrix[8]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getBackward = function (out) {\r\n out = this.quat2_getForward(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getLeft = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat2_getLeft(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[0], rotationMatrix[1], rotationMatrix[2]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getRight = function (out) {\r\n out = this.quat2_getLeft(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_getUp = function () {\r\n let rotationMatrix = glMatrix.mat3.create();\r\n return function quat2_getUp(out = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(rotationMatrix, this);\r\n\r\n glMatrix.vec3.set(out, rotationMatrix[3], rotationMatrix[4], rotationMatrix[5]);\r\n glMatrix.vec3.normalize(out, out);\r\n\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_getDown = function (out) {\r\n out = this.quat2_getUp(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_toWorld = function (parentTransformQuat, out = glMatrix.quat2.create()) {\r\n glMatrix.quat2.mul(out, parentTransformQuat, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_toLocal = function () {\r\n let invertQuat = glMatrix.quat2.create();\r\n return function quat2_toLocal(parentTransformQuat, out = glMatrix.quat2.create()) {\r\n glMatrix.quat2.conjugate(invertQuat, parentTransformQuat);\r\n glMatrix.quat2.mul(out, invertQuat, this);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.quat2_toMatrix = function (out = glMatrix.mat4.create()) {\r\n glMatrix.mat4.fromQuat2(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_fromMatrix = function (transformMatrix) {\r\n transformMatrix.mat4_toQuat(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.quat2_lerp = function (to, interpolationValue, out = glMatrix.quat2.create()) {\r\n if (interpolationValue <= 0) {\r\n out.quat2_copy(this);\r\n return out;\r\n } else if (interpolationValue >= 1) {\r\n out.quat2_copy(to);\r\n return out;\r\n }\r\n\r\n glMatrix.quat2.lerp(out, this, to, interpolationValue);\r\n out.quat2_normalize(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.quat2_interpolate = function (to, interpolationValue, easingFunction = PP.EasingFunction.linear, out = glMatrix.quat2.create()) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return this.quat2_lerp(to, lerpValue, out);\r\n};\r\n\r\n//MATRIX 3\r\n\r\n// glMatrix Bridge\r\n\r\n// New Functions\r\n\r\nArray.prototype.mat3_toDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat3_toDegrees(out = glMatrix.vec3.create()) {\r\n this.mat3_toQuat(quat);\r\n quat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat3_toRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat3_toRadians(out = glMatrix.vec3.create()) {\r\n this.mat3_toQuat(quat);\r\n quat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat3_toQuat = function (out = glMatrix.quat.create()) {\r\n glMatrix.quat.fromMat3(out, this);\r\n out.quat_normalize(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat3_fromAxes = function (leftAxis, upAxis, forwardAxis) {\r\n glMatrix.mat3.set(this,\r\n leftAxis[0], leftAxis[1], leftAxis[2],\r\n upAxis[0], upAxis[1], upAxis[2],\r\n forwardAxis[0], forwardAxis[1], forwardAxis[2]);\r\n return this;\r\n};\r\n\r\n//MATRIX 4\r\n\r\n// glMatrix Bridge\r\n\r\nArray.prototype.mat4_copy = function (mat4) {\r\n glMatrix.mat4.copy(this, mat4);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_identity = function () {\r\n glMatrix.mat4.identity(this);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_invert = function (out = glMatrix.mat4.create()) {\r\n glMatrix.mat4.invert(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_clone = function (out = glMatrix.mat4.create()) {\r\n glMatrix.mat4.copy(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getPosition = function (out = glMatrix.vec3.create()) {\r\n glMatrix.mat4.getTranslation(out, this);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getRotation = function (out = glMatrix.vec3.create()) {\r\n return this.mat4_getRotationDegrees(out);\r\n};\r\n\r\nArray.prototype.mat4_getRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_getRotationDegrees(out = glMatrix.vec3.create()) {\r\n this.mat4_getRotationQuat(quat);\r\n quat.quat_toDegrees(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_getRotationRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_getRotationRadians(out = glMatrix.vec3.create()) {\r\n this.mat4_getRotationQuat(quat);\r\n quat.quat_toRadians(out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_getRotationQuat = function () {\r\n let scale = glMatrix.vec3.create();\r\n let transformMatrixNoScale = glMatrix.mat4.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function mat4_getRotationQuat(out = glMatrix.quat.create()) {\r\n glMatrix.mat4.getScaling(scale, this);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(transformMatrixNoScale, this, inverseScale);\r\n glMatrix.mat4.getRotation(out, transformMatrixNoScale);\r\n glMatrix.quat.normalize(out, out);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_getScale = function (out = glMatrix.vec3.create()) {\r\n glMatrix.mat4.getScaling(out, this);\r\n return out;\r\n};\r\n\r\n// New Functions\r\n\r\nArray.prototype.mat4_setPosition = function (position) {\r\n this[12] = position[0];\r\n this[13] = position[1];\r\n this[14] = position[2];\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setRotation = function (rotation) {\r\n this.mat4_setRotationDegrees(rotation);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_setRotationDegrees(rotation) {\r\n this.mat4_setRotationQuat(rotation.vec3_degreesToQuat(quat));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setRotationRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function mat4_setRotationRadians(rotation) {\r\n this.mat4_setRotationDegrees(rotation.vec3_toDegrees(vector));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setRotationQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n return function mat4_setRotationQuat(rotation) {\r\n this.mat4_getPosition(position);\r\n this.mat4_getScale(scale);\r\n this.mat4_setPositionRotationQuatScale(position, rotation, scale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setScale = function () {\r\n let tempScale = glMatrix.vec3.create();\r\n return function mat4_setScale(scale) {\r\n glMatrix.mat4.getScaling(tempScale, this);\r\n glMatrix.vec3.divide(tempScale, scale, tempScale);\r\n glMatrix.mat4.scale(this, this, tempScale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationScale = function (position, rotation, scale) {\r\n this.mat4_setPositionRotationDegreesScale(position, rotation, scale);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setPositionRotationDegreesScale = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_setPositionRotationDegreesScale(position, rotation, scale) {\r\n this.mat4_setPositionRotationQuatScale(position, rotation.vec3_degreesToQuat(quat), scale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationRadiansScale = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function mat4_setPositionRotationRadiansScale(position, rotation, scale) {\r\n this.mat4_setPositionRotationDegreesScale(position, rotation.vec3_toDegrees(vector), scale);\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationQuatScale = function (position, rotation, scale) {\r\n glMatrix.mat4.fromRotationTranslationScale(this, rotation, position, scale);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setPositionRotation = function (position, rotation) {\r\n this.mat4_setPositionRotationDegrees(position, rotation);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_setPositionRotationDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function mat4_setPositionRotationDegrees(position, rotation) {\r\n this.mat4_setPositionRotationQuat(position, rotation.vec3_degreesToQuat(quat));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationRadians = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function mat4_setPositionRotationRadians(position, rotation) {\r\n this.mat4_setPositionRotationDegrees(position, rotation.vec3_toDegrees(vector));\r\n return this;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_setPositionRotationQuat = function (position, rotation) {\r\n glMatrix.mat4.fromRotationTranslation(this, rotation, position);\r\n return this;\r\n};\r\n\r\nArray.prototype.mat4_getAxes = function (out = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.mat4_getLeft(out[0]);\r\n this.mat4_getUp(out[1]);\r\n this.mat4_getForward(out[2]);\r\n\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getForward = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[8], this[9], this[10]);\r\n glMatrix.vec3.normalize(out, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getBackward = function (out) {\r\n out = this.mat4_getForward(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getLeft = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[0], this[1], this[2]);\r\n glMatrix.vec3.normalize(out, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getRight = function (out) {\r\n out = this.mat4_getLeft(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getUp = function (out = glMatrix.vec3.create()) {\r\n glMatrix.vec3.set(out, this[4], this[5], this[6]);\r\n glMatrix.vec3.normalize(out, out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_getDown = function (out) {\r\n out = this.mat4_getUp(out);\r\n out.vec3_negate(out);\r\n return out;\r\n};\r\n\r\nArray.prototype.mat4_toWorld = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function mat4_toWorld(parentTransformMatrix, out = glMatrix.mat4.create()) {\r\n if (parentTransformMatrix.mat4_hasUniformScale()) {\r\n glMatrix.mat4.mul(out, parentTransformMatrix, this);\r\n } else {\r\n glMatrix.vec3.set(position, this[12], this[13], this[14]);\r\n position.vec3_convertPositionToWorldMatrix(parentTransformMatrix, position);\r\n\r\n glMatrix.mat4.getScaling(scale, parentTransformMatrix);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, parentTransformMatrix, inverseScale);\r\n\r\n glMatrix.mat4.mul(out, convertTransform, this);\r\n glMatrix.mat4.scale(out, out, scale);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_toLocal = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function mat4_toLocal(parentTransformMatrix, out = glMatrix.mat4.create()) {\r\n if (parentTransformMatrix.mat4_hasUniformScale()) {\r\n glMatrix.mat4.invert(convertTransform, parentTransformMatrix);\r\n glMatrix.mat4.mul(out, convertTransform, this);\r\n } else {\r\n glMatrix.vec3.set(position, this[12], this[13], this[14]);\r\n position.vec3_convertPositionToLocalMatrix(parentTransformMatrix, position);\r\n\r\n glMatrix.mat4.getScaling(scale, parentTransformMatrix);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, parentTransformMatrix, inverseScale);\r\n\r\n glMatrix.mat4.invert(convertTransform, convertTransform);\r\n glMatrix.mat4.mul(out, convertTransform, this);\r\n glMatrix.mat4.scale(out, out, inverseScale);\r\n\r\n out[12] = position[0];\r\n out[13] = position[1];\r\n out[14] = position[2];\r\n out[15] = 1;\r\n }\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_hasUniformScale = function () {\r\n let scale = glMatrix.vec3.create();\r\n return function mat4_hasUniformScale() {\r\n glMatrix.mat4.getScaling(scale, this);\r\n return Math.abs(scale[0] - scale[1]) < this._pp_epsilon && Math.abs(scale[1] - scale[2]) < this._pp_epsilon && Math.abs(scale[0] - scale[2]) < this._pp_epsilon;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_toQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n return function mat4_toQuat(out = glMatrix.quat2.create()) {\r\n glMatrix.mat4.getTranslation(position, this);\r\n this.mat4_getRotationQuat(rotation);\r\n glMatrix.quat2.fromRotationTranslation(out, rotation, position);\r\n return out;\r\n };\r\n}();\r\n\r\nArray.prototype.mat4_fromQuat = function (transformQuat) {\r\n transformQuat.quat2_toMatrix(this);\r\n return this;\r\n};\r\n\r\n//CREATION\r\n\r\nPP.vec2_create = function (x = null, y = null) {\r\n let out = glMatrix.vec2.create();\r\n if (x != null) {\r\n out.vec2_set(x, y);\r\n }\r\n return out;\r\n};\r\n\r\nPP.vec3_create = function (x = null, y = null, z = null) {\r\n let out = glMatrix.vec3.create();\r\n if (x != null) {\r\n out.vec3_set(x, y, z);\r\n }\r\n return out;\r\n};\r\n\r\nPP.vec4_create = function (x = null, y = null, z = null, w = null) {\r\n let out = glMatrix.vec4.create();\r\n if (x != null) {\r\n out.vec4_set(x, y, z, w);\r\n }\r\n return out;\r\n};\r\n\r\nPP.quat_create = function (x = null, y = null, z = null, w = null) {\r\n let out = glMatrix.quat.create();\r\n if (x != null) {\r\n out.quat_set(x, y, z, w);\r\n }\r\n return out;\r\n};\r\n\r\nPP.quat2_create = function () {\r\n let out = glMatrix.quat2.create();\r\n return out;\r\n};\r\n\r\nPP.quat2_fromPositionRotation = function (position, rotation) {\r\n return quat2_fromPositionRotationDegrees(position, rotation);\r\n};\r\n\r\nPP.quat2_fromPositionRotationDegrees = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.quat2_setPositionRotationDegrees(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.quat2_fromPositionRotationRadians = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.quat2_setPositionRotationRadians(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.quat2_fromPositionRotationQuat = function (position, rotation) {\r\n let out = glMatrix.quat2.create();\r\n out.quat2_setPositionRotationQuat(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_create = function () {\r\n let out = glMatrix.mat4.create();\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotation = function (position, rotation) {\r\n return mat4_fromPositionRotationDegrees(position, rotation);\r\n};\r\n\r\nPP.mat4_fromPositionRotationDegrees = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationDegrees(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationRadians = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationRadians(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationQuat = function (position, rotation) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationQuat(position, rotation);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationScale = function (position, rotation, scale) {\r\n return mat4_fromPositionRotationDegreesScale(position, rotation, scale);\r\n};\r\n\r\nPP.mat4_fromPositionRotationDegreesScale = function (position, rotation, scale) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationDegreesScale(position, rotation, scale);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationRadiansScale = function (position, rotation, scale) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationRadiansScale(position, rotation, scale);\r\n return out;\r\n};\r\n\r\nPP.mat4_fromPositionRotationQuatScale = function (position, rotation, scale) {\r\n let out = glMatrix.mat4.create();\r\n out.mat4_setPositionRotationQuatScale(position, rotation, scale);\r\n return out;\r\n};\r\n\r\n//UTILS\r\n\r\nArray.prototype._pp_epsilon = 0.000001;\r\nArray.prototype._pp_degreesEpsilon = 0.00001;\r\n\r\nArray.prototype._pp_clamp = function (value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n};\r\n\r\nArray.prototype._vec_buildConsoleMessage = function (decimalPlaces) {\r\n let message = \"[\";\r\n\r\n for (let i = 0; i < this.length; i++) {\r\n if (i != 0) {\r\n message = message.concat(\", \");\r\n }\r\n\r\n message = message.concat(this[i].toFixed(decimalPlaces));\r\n }\r\n\r\n message = message.concat(\"]\");\r\n return message;\r\n};\r\n\r\nArray.prototype._vec_prepareOut = function (out) {\r\n if (out == null) {\r\n out = this.pp_clone();\r\n } else if (out != this) {\r\n out.pp_copy(this);\r\n }\r\n\r\n return out;\r\n};\r\n\r\n\r\nArray.prototype._quat_setAxes = function () {\r\n let fixedAxes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()];\r\n\r\n let fixedAxesFixSignMap = [\r\n [1, -1, 1],\r\n [1, 1, -1],\r\n [-1, 1, -1]\r\n ];\r\n\r\n let fixedLeft = glMatrix.vec3.create();\r\n let fixedUp = glMatrix.vec3.create();\r\n let fixedForward = glMatrix.vec3.create();\r\n\r\n let currentAxis = glMatrix.vec3.create();\r\n\r\n let rotationAxis = glMatrix.vec3.create();\r\n let rotationMat = glMatrix.mat3.create();\r\n let rotationQuat = glMatrix.quat.create();\r\n return function _quat_setAxes(axes, priority) {\r\n let firstAxis = axes[priority[0]];\r\n let secondAxis = axes[priority[1]];\r\n let thirdAxis = axes[priority[2]];\r\n\r\n if (firstAxis == null) {\r\n return this;\r\n }\r\n\r\n let secondAxisValid = false;\r\n if (secondAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, secondAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n secondAxisValid = true;\r\n }\r\n }\r\n\r\n let thirdAxisValid = false;\r\n if (thirdAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, thirdAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n thirdAxisValid = true;\r\n }\r\n }\r\n\r\n if (secondAxisValid || thirdAxisValid) {\r\n\r\n let crossAxis = null;\r\n let secondAxisIndex = null;\r\n let thirdAxisIndex = null;\r\n if (secondAxisValid) {\r\n crossAxis = secondAxis;\r\n secondAxisIndex = 1;\r\n thirdAxisIndex = 2;\r\n } else {\r\n crossAxis = thirdAxis;\r\n secondAxisIndex = 2;\r\n thirdAxisIndex = 1;\r\n }\r\n\r\n let fixSignMap = fixedAxesFixSignMap[priority[0]];\r\n\r\n glMatrix.vec3.cross(fixedAxes[thirdAxisIndex], firstAxis, crossAxis);\r\n glMatrix.vec3.scale(fixedAxes[thirdAxisIndex], fixedAxes[thirdAxisIndex], fixSignMap[priority[thirdAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[secondAxisIndex], firstAxis, fixedAxes[thirdAxisIndex]);\r\n glMatrix.vec3.scale(fixedAxes[secondAxisIndex], fixedAxes[secondAxisIndex], fixSignMap[priority[secondAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[0], fixedAxes[1], fixedAxes[2]);\r\n glMatrix.vec3.scale(fixedAxes[0], fixedAxes[0], fixSignMap[priority[0]]);\r\n\r\n glMatrix.vec3.normalize(fixedLeft, fixedAxes[priority.pp_findIndexEqual(0)]);\r\n glMatrix.vec3.normalize(fixedUp, fixedAxes[priority.pp_findIndexEqual(1)]);\r\n glMatrix.vec3.normalize(fixedForward, fixedAxes[priority.pp_findIndexEqual(2)]);\r\n\r\n glMatrix.mat3.set(rotationMat,\r\n fixedLeft[0], fixedLeft[1], fixedLeft[2],\r\n fixedUp[0], fixedUp[1], fixedUp[2],\r\n fixedForward[0], fixedForward[1], fixedForward[2]\r\n );\r\n\r\n glMatrix.quat.fromMat3(rotationQuat, rotationMat);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n\r\n this.quat_copy(rotationQuat);\r\n } else {\r\n if (priority[0] == 0) {\r\n this.quat_getLeft(currentAxis);\r\n } else if (priority[0] == 1) {\r\n this.quat_getUp(currentAxis);\r\n } else {\r\n this.quat_getForward(currentAxis);\r\n }\r\n\r\n let angle = glMatrix.vec3.angle(firstAxis, currentAxis);\r\n if (angle != 0) {\r\n glMatrix.vec3.cross(rotationAxis, currentAxis, firstAxis);\r\n glMatrix.vec3.normalize(rotationAxis, rotationAxis);\r\n glMatrix.quat.setAxisAngle(rotationQuat, rotationAxis, angle);\r\n\r\n this.quat_rotateQuat(rotationQuat, this);\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n}();\r\n\r\n\r\n\r\n\r\nfor (let key in Array.prototype) {\r\n let prefixes = [\"pp_\", \"vec_\", \"vec2_\", \"vec3_\", \"vec4_\", \"quat_\", \"quat2_\", \"mat3_\", \"mat4_\", \"_pp_\", \"_vec_\", \"_quat_\",];\r\n\r\n let found = false;\r\n for (let prefix of prefixes) {\r\n if (key.startsWith(prefix)) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n Object.defineProperty(Array.prototype, key, { enumerable: false });\r\n\r\n Uint8ClampedArray.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint8ClampedArray.prototype, key, { enumerable: false });\r\n\r\n Uint8ClampedArray.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint8ClampedArray.prototype, key, { enumerable: false });\r\n\r\n Uint8Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint8Array.prototype, key, { enumerable: false });\r\n\r\n Uint16Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint16Array.prototype, key, { enumerable: false });\r\n\r\n Uint32Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Uint32Array.prototype, key, { enumerable: false });\r\n\r\n Int8Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Int8Array.prototype, key, { enumerable: false });\r\n\r\n Int16Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Int16Array.prototype, key, { enumerable: false });\r\n\r\n Int32Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Int32Array.prototype, key, { enumerable: false });\r\n\r\n Float32Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Float32Array.prototype, key, { enumerable: false });\r\n\r\n Float64Array.prototype[key] = Array.prototype[key];\r\n Object.defineProperty(Float64Array.prototype, key, { enumerable: false });\r\n }\r\n}", "/*\r\n How to use\r\n\r\n By default the functions work on World space, rotations are in Degrees and transforms are Matrix (and not Quat 2) \r\n For functions that work with rotations, Matrix means Matrix 3 and Quat means Quat\r\n For functions that work with transforms, Matrix means Matrix 4 and Quat means Quat 2\r\n\r\n You can add a suffix like World/Local/Object at the end of some functions to specify the space, example:\r\n - pp_getPositionLocal to get the position in local space (parent space)\r\n - pp_translateObject to translate in object space\r\n\r\n For rotations u can add a suffix like Degrees/Radians/Quat/Matrix to use a specific version, example:\r\n - pp_getRotationDegrees\r\n - pp_setRotationLocalMatrix\r\n - pp_rotateWorldQuat\r\n \r\n For transform u can add a suffix like Quat/Matrix to use a specific version, example:\r\n - pp_getTransformQuat\r\n - pp_setTransformWorldMatrix\r\n \r\n Some functions let you specify if u want them to work on the Hierarchy/Descendants/Children where:\r\n - Children: direct children of the object\r\n - Descendants: all the children of the object, including child of child and so on \r\n - Hierarchy: Descendants plus the current object\r\n By default the functions work on the current object alone:\r\n - pp_getComponent\r\n - pp_getComponentHierarchy\r\n - pp_getComponentAmountMapDescendants\r\n - pp_setActiveChildren\r\n\r\n The functions leave u the choice of forwarding an out parameter or just get the return value, example:\r\n - let position = this.object.pp_getPosition()\r\n - this.object.pp_getPosition(position)\r\n - the out parameter is always the last one\r\n\r\n List of functions:\r\n Notes:\r\n - The suffixes (like World or Radians) are omitted \r\n\r\n - pp_getPosition / pp_setPosition / pp_resetPosition\r\n - pp_getRotation / pp_setRotation / pp_resetRotation\r\n - pp_getScale / pp_setScale (u can specify a single number instead of a vector to uniform scale easily) / pp_resetScale \r\n - pp_getTransform / pp_setTransform / pp_resetTransform\r\n\r\n - pp_getAxes / pp_setAxes\r\n - pp_getLeft / pp_getRight / pp_setLeft / pp_setRight\r\n - pp_getUp / pp_getDown / pp_setUp / pp_setDown\r\n - pp_getForward / pp_getBackward / pp_setForward / pp_setBackward\r\n\r\n - pp_translate / pp_translateAxis\r\n - pp_rotate / pp_rotateAxis / pp_rotateAround / pp_rotateAroundAxis\r\n - pp_scaleObject (for now scale only have this variant) (u can specify a single number instead of a vector to uniform scale easily)\r\n\r\n - pp_lookAt / pp_lookTo (u can avoid to specify up and the function will pickup the object up by default)\r\n\r\n - pp_getParent / pp_setParent (let u specify if u want to keep the transform or not)\r\n\r\n - pp_convertPositionObjectToWorld (you can use all the combinations between Object/Local/World)\r\n - pp_convertDirectionObjectToWorld (you can use all the combinations between Object/Local/World)\r\n - pp_convertTransformObjectToWorld (you can use all the combinations between Object/Local/World) (u also have Quat and Matrix version)\r\n\r\n - pp_hasUniformScale\r\n\r\n - pp_addComponent / pp_getComponent / pp_getComponentHierarchy / pp_getComponentDescendants / pp_getComponentChildren\r\n - pp_getComponents / pp_getComponentsHierarchy / pp_getComponentsDescendants / pp_getComponentsChildren\r\n\r\n - pp_setActive / pp_setActiveSelf / pp_setActiveHierarchy / pp_setActiveDescendants / pp_setActiveChildren\r\n\r\n - pp_clone / pp_isCloneable\r\n \r\n - pp_toString / pp_toStringCompact / pp_toStringExtended\r\n\r\n - pp_addObject\r\n - pp_getName / pp_setName\r\n - pp_getID\r\n - pp_getHierarchy / pp_getDescendants / pp_getChildren\r\n - pp_reserveObjects / pp_reserveObjectsHierarchy / pp_reserveObjectsDescendants / pp_reserveObjectsChildren\r\n - pp_getComponentAmountMap / pp_getComponentAmountMapHierarchy / pp_getComponentAmountMapDescendants / pp_getComponentAmountMapChildren\r\n - pp_markDirty\r\n - pp_equals\r\n - pp_destroy\r\n*/\r\n\r\nimport * as glMatrix from 'gl-matrix';\r\n\r\nif (WL && WL.Object) {\r\n\r\n //GETTER\r\n\r\n //Position\r\n\r\n WL.Object.prototype.pp_getPosition = function (position) {\r\n return this.pp_getPositionWorld(position);\r\n };\r\n\r\n WL.Object.prototype.pp_getPositionWorld = function (position = glMatrix.vec3.create()) {\r\n this.getTranslationWorld(position);\r\n return position;\r\n };\r\n\r\n WL.Object.prototype.pp_getPositionLocal = function (position = glMatrix.vec3.create()) {\r\n this.getTranslationLocal(position);\r\n return position;\r\n };\r\n\r\n //Rotation\r\n\r\n WL.Object.prototype.pp_getRotation = function (rotation) {\r\n return this.pp_getRotationWorld(rotation);\r\n };\r\n WL.Object.prototype.pp_getRotationDegrees = function (rotation) {\r\n return this.pp_getRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationRadians = function (rotation) {\r\n return this.pp_getRotationWorldRadians(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationMatrix = function (rotation) {\r\n return this.pp_getRotationWorldMatrix(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationQuat = function (rotation) {\r\n return this.pp_getRotationWorldQuat(rotation);\r\n };\r\n\r\n //Rotation World\r\n\r\n WL.Object.prototype.pp_getRotationWorld = function (rotation) {\r\n return this.pp_getRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationWorldDegrees = function (rotation) {\r\n rotation = this.pp_getRotationWorldRadians(rotation);\r\n rotation.forEach(function (value, index, array) {\r\n array[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n return rotation;\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationWorldRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationWorldRadians(rotation = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldQuat(quat);\r\n this._pp_quaternionToRadians(quat, rotation);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationWorldMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationWorldMatrix(rotation = glMatrix.mat3.create()) {\r\n this.pp_getRotationWorldQuat(quat);\r\n glMatrix.mat3.fromQuat(rotation, quat);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationWorldQuat = function (rotation = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(rotation, this.rotationWorld);\r\n return rotation;\r\n };\r\n\r\n //Rotation Local\r\n\r\n WL.Object.prototype.pp_getRotationLocal = function (rotation) {\r\n return this.pp_getRotationLocalDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationLocalDegrees = function (rotation) {\r\n rotation = this.pp_getRotationLocalRadians(rotation);\r\n rotation.forEach(function (value, index, array) {\r\n array[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n return rotation;\r\n };\r\n\r\n WL.Object.prototype.pp_getRotationLocalRadians = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationLocalRadians(rotation = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalQuat(quat);\r\n this._pp_quaternionToRadians(quat, rotation);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationLocalMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_getRotationLocalMatrix(rotation = glMatrix.mat3.create()) {\r\n this.pp_getRotationLocalQuat(quat);\r\n glMatrix.mat3.fromQuat(rotation, quat);\r\n return rotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRotationLocalQuat = function (rotation = glMatrix.quat.create()) {\r\n glMatrix.quat.copy(rotation, this.rotationLocal);\r\n return rotation;\r\n };\r\n\r\n //Scale\r\n\r\n WL.Object.prototype.pp_getScale = function (scale) {\r\n return this.pp_getScaleWorld(scale);\r\n };\r\n\r\n WL.Object.prototype.pp_getScaleWorld = function (scale = glMatrix.vec3.create()) {\r\n glMatrix.vec3.copy(scale, this.scalingWorld);\r\n return scale;\r\n };\r\n\r\n WL.Object.prototype.pp_getScaleLocal = function (scale = glMatrix.vec3.create()) {\r\n glMatrix.vec3.copy(scale, this.scalingLocal);\r\n return scale;\r\n };\r\n\r\n //Transform\r\n\r\n WL.Object.prototype.pp_getTransform = function (transform) {\r\n return this.pp_getTransformWorld(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformMatrix = function (transform) {\r\n return this.pp_getTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformQuat = function (transform) {\r\n return this.pp_getTransformWorldQuat(transform);\r\n };\r\n\r\n //Transform World\r\n\r\n WL.Object.prototype.pp_getTransformWorld = function (transform) {\r\n return this.pp_getTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformWorldMatrix = function () {\r\n let transformQuat = glMatrix.quat2.create();\r\n let scale = glMatrix.vec3.create();\r\n return function pp_getTransformWorldMatrix(transform = glMatrix.mat4.create()) {\r\n this.pp_getTransformWorldQuat(transformQuat);\r\n this.pp_getScaleWorld(scale);\r\n glMatrix.mat4.fromQuat2(transform, transformQuat);\r\n glMatrix.mat4.scale(transform, transform, scale);\r\n return transform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getTransformWorldQuat = function (transform = glMatrix.quat2.create()) {\r\n glMatrix.quat2.copy(transform, this.transformWorld);\r\n return transform;\r\n };\r\n\r\n //Transform Local\r\n\r\n WL.Object.prototype.pp_getTransformLocal = function (transform) {\r\n return this.pp_getTransformLocalMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_getTransformLocalMatrix = function () {\r\n let transformQuat = glMatrix.quat2.create();\r\n let scale = glMatrix.vec3.create();\r\n return function pp_getTransformLocal(transform = glMatrix.mat4.create()) {\r\n this.pp_getTransformLocalQuat(transformQuat);\r\n this.pp_getScaleLocal(scale);\r\n glMatrix.mat4.fromQuat2(transform, transformQuat);\r\n glMatrix.mat4.scale(transform, transform, scale);\r\n return transform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getTransformLocalQuat = function (transform = glMatrix.quat2.create()) {\r\n glMatrix.quat2.copy(transform, this.transformLocal);\r\n return transform;\r\n };\r\n\r\n //Axes\r\n\r\n WL.Object.prototype.pp_getAxes = function (axes) {\r\n return this.pp_getAxesWorld(axes);\r\n };\r\n\r\n WL.Object.prototype.pp_getAxesWorld = function (axes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.pp_getLeftWorld(axes[0]);\r\n this.pp_getUpWorld(axes[1]);\r\n this.pp_getForwardWorld(axes[2]);\r\n return axes;\r\n };\r\n\r\n WL.Object.prototype.pp_getAxesLocal = function (axes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()]) {\r\n this.pp_getLeftLocal(axes[0]);\r\n this.pp_getUpLocal(axes[1]);\r\n this.pp_getForwardLocal(axes[2]);\r\n return axes;\r\n };\r\n\r\n //Forward\r\n\r\n WL.Object.prototype.pp_getForward = function (forward) {\r\n return this.pp_getForwardWorld(forward);\r\n };\r\n\r\n WL.Object.prototype.pp_getForwardWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getForwardWorld(forward = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n forward[0] = rotation[6];\r\n forward[1] = rotation[7];\r\n forward[2] = rotation[8];\r\n return forward;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getForwardLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getForwardLocal(forward = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n forward[0] = rotation[6];\r\n forward[1] = rotation[7];\r\n forward[2] = rotation[8];\r\n return forward;\r\n };\r\n }();\r\n\r\n //Backward\r\n\r\n WL.Object.prototype.pp_getBackward = function (backward) {\r\n return this.pp_getBackwardWorld(backward);\r\n };\r\n\r\n WL.Object.prototype.pp_getBackwardWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getBackwardWorld(backward = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n backward[0] = -rotation[6];\r\n backward[1] = -rotation[7];\r\n backward[2] = -rotation[8];\r\n return backward;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getBackwardLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getBackwardLocal(backward = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n backward[0] = -rotation[6];\r\n backward[1] = -rotation[7];\r\n backward[2] = -rotation[8];\r\n return backward;\r\n };\r\n }();\r\n\r\n //Up\r\n\r\n WL.Object.prototype.pp_getUp = function (up) {\r\n return this.pp_getUpWorld(up);\r\n };\r\n\r\n WL.Object.prototype.pp_getUpWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getUpWorld(up = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n up[0] = rotation[3];\r\n up[1] = rotation[4];\r\n up[2] = rotation[5];\r\n return up;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getUpLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getUpLocal(up = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n up[0] = rotation[3];\r\n up[1] = rotation[4];\r\n up[2] = rotation[5];\r\n return up;\r\n };\r\n }();\r\n\r\n //Down\r\n\r\n WL.Object.prototype.pp_getDown = function (down) {\r\n return this.pp_getDownWorld(down);\r\n };\r\n\r\n WL.Object.prototype.pp_getDownWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getDownWorld(down = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n down[0] = -rotation[3];\r\n down[1] = -rotation[4];\r\n down[2] = -rotation[5];\r\n return down;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getDownLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getDownLocal(down = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n down[0] = -rotation[3];\r\n down[1] = -rotation[4];\r\n down[2] = -rotation[5];\r\n return down;\r\n };\r\n }();\r\n\r\n //Left\r\n\r\n WL.Object.prototype.pp_getLeft = function (left) {\r\n return this.pp_getLeftWorld(left);\r\n };\r\n\r\n WL.Object.prototype.pp_getLeftWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getLeftWorld(left = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n left[0] = rotation[0];\r\n left[1] = rotation[1];\r\n left[2] = rotation[2];\r\n return left;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getLeftLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getLeftLocal(left = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n left[0] = rotation[0];\r\n left[1] = rotation[1];\r\n left[2] = rotation[2];\r\n return left;\r\n };\r\n }();\r\n\r\n //Right\r\n\r\n WL.Object.prototype.pp_getRight = function (right) {\r\n return this.pp_getRightWorld(right);\r\n };\r\n\r\n WL.Object.prototype.pp_getRightWorld = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getRightWorld(right = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldMatrix(rotation);\r\n right[0] = -rotation[0];\r\n right[1] = -rotation[1];\r\n right[2] = -rotation[2];\r\n return right;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getRightLocal = function () {\r\n let rotation = glMatrix.mat3.create();\r\n return function pp_getRightLocal(right = glMatrix.vec3.create()) {\r\n this.pp_getRotationLocalMatrix(rotation);\r\n right[0] = -rotation[0];\r\n right[1] = -rotation[1];\r\n right[2] = -rotation[2];\r\n return right;\r\n };\r\n }();\r\n\r\n //SETTER\r\n\r\n //Position\r\n\r\n WL.Object.prototype.pp_setPosition = function (position) {\r\n this.pp_setPositionWorld(position);\r\n };\r\n\r\n WL.Object.prototype.pp_setPositionWorld = function (position) {\r\n this.setTranslationWorld(position);\r\n };\r\n\r\n WL.Object.prototype.pp_setPositionLocal = function (position) {\r\n this.setTranslationLocal(position);\r\n };\r\n\r\n //Rotation\r\n\r\n WL.Object.prototype.pp_setRotation = function (rotation) {\r\n this.pp_setRotationWorld(rotation);\r\n };\r\n WL.Object.prototype.pp_setRotationDegrees = function (rotation) {\r\n this.pp_setRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationRadians = function (rotation) {\r\n this.pp_setRotationWorldRadians(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationMatrix = function (rotation) {\r\n this.pp_setRotationWorldMatrix(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationQuat = function (rotation) {\r\n this.pp_setRotationWorldQuat(rotation);\r\n };\r\n\r\n //Rotation World\r\n\r\n WL.Object.prototype.pp_setRotationWorld = function (rotation) {\r\n this.pp_setRotationWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationWorldDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationWorldDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, quat);\r\n this.pp_setRotationWorldQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationWorldRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_setRotationWorldRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_setRotationWorldDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationWorldMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationWorldMatrix(rotation) {\r\n glMatrix.quat.fromMat3(quat, rotation);\r\n this.pp_setRotationWorldQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationWorldQuat = function (rotation) {\r\n this.rotationWorld = rotation;\r\n };\r\n\r\n //Rotation Local\r\n\r\n WL.Object.prototype.pp_setRotationLocal = function (rotation) {\r\n this.pp_setRotationLocalDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_setRotationLocalDegrees = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationLocalDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, quat);\r\n this.pp_setRotationLocalQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationLocalRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_setRotationLocalRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_setRotationLocalDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationLocalMatrix = function () {\r\n let quat = glMatrix.quat.create();\r\n return function pp_setRotationLocalMatrix(rotation) {\r\n glMatrix.quat.fromMat3(quat, rotation);\r\n this.pp_setRotationLocalQuat(quat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRotationLocalQuat = function (rotation) {\r\n this.rotationLocal = rotation;\r\n };\r\n\r\n //Scale\r\n\r\n WL.Object.prototype.pp_setScale = function (scale) {\r\n this.pp_setScaleWorld(scale);\r\n };\r\n\r\n WL.Object.prototype.pp_setScaleWorld = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function pp_setScaleWorld(scale) {\r\n if (isNaN(scale)) {\r\n this.scalingWorld = scale;\r\n } else {\r\n glMatrix.vec3.set(vector, scale, scale, scale);\r\n this.scalingWorld = vector;\r\n }\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setScaleLocal = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function pp_setScaleLocal(scale) {\r\n if (isNaN(scale)) {\r\n this.scalingLocal = scale;\r\n } else {\r\n glMatrix.vec3.set(vector, scale, scale, scale);\r\n this.scalingLocal = vector;\r\n }\r\n };\r\n }();\r\n\r\n //Axes \r\n\r\n WL.Object.prototype.pp_setAxes = function (left, up, forward) {\r\n this.pp_setAxesWorld(left, up, forward);\r\n };\r\n\r\n WL.Object.prototype.pp_setAxesWorld = function (left, up, forward) {\r\n if (forward != null) {\r\n this.pp_setForwardWorld(forward, up, left);\r\n } else if (up != null) {\r\n this.pp_setUpWorld(up, forward, left);\r\n } else {\r\n this.pp_setLeftWorld(left, up, forward);\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_setAxesLocal = function (left, up, forward) {\r\n if (forward != null) {\r\n this.pp_setForwardLocal(forward, up, left);\r\n } else if (up != null) {\r\n this.pp_setUpLocal(up, forward, left);\r\n } else {\r\n this.pp_setLeftLocal(left, up, forward);\r\n }\r\n };\r\n\r\n //Forward\r\n\r\n WL.Object.prototype.pp_setForward = function (forward, up, left) {\r\n this.pp_setForwardWorld(forward, up, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setForwardWorld = function (forward, up = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], false);\r\n };\r\n\r\n WL.Object.prototype.pp_setForwardLocal = function (forward, up = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], true);\r\n };\r\n\r\n //Backward\r\n\r\n WL.Object.prototype.pp_setBackward = function (backward, up, left) {\r\n this.pp_setBackwardWorld(backward, up, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setBackwardWorld = function () {\r\n let forward = glMatrix.vec3.create();\r\n return function pp_setBackwardWorld(backward, up = null, left = null) {\r\n glMatrix.vec3.negate(forward, backward);\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], false);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setBackwardLocal = function () {\r\n let forward = glMatrix.vec3.create();\r\n return function pp_setBackwardLocal(backward, up = null, left = null) {\r\n glMatrix.vec3.negate(forward, backward);\r\n this._pp_setAxes([left, up, forward], [2, 1, 0], true);\r\n };\r\n }();\r\n\r\n //Up\r\n\r\n WL.Object.prototype.pp_setUp = function (up, forward, left) {\r\n this.pp_setUpWorld(up, forward, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setUpWorld = function (up, forward = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], false);\r\n };\r\n\r\n WL.Object.prototype.pp_setUpLocal = function (up, forward = null, left = null) {\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], true);\r\n };\r\n\r\n //Down\r\n\r\n WL.Object.prototype.pp_setDown = function (down, forward, left) {\r\n this.pp_setDownWorld(down, forward, left);\r\n };\r\n\r\n WL.Object.prototype.pp_setDownWorld = function () {\r\n let up = glMatrix.vec3.create();\r\n return function pp_setDownWorld(down, forward = null, left = null) {\r\n glMatrix.vec3.negate(up, down);\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], false);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setDownLocal = function () {\r\n let up = glMatrix.vec3.create();\r\n return function pp_setDownLocal(down, forward = null, left = null) {\r\n glMatrix.vec3.negate(up, down);\r\n this._pp_setAxes([left, up, forward], [1, 2, 0], true);\r\n };\r\n }();\r\n\r\n //Left\r\n\r\n WL.Object.prototype.pp_setLeft = function (left, up, forward) {\r\n this.pp_setLeftWorld(left, up, forward);\r\n };\r\n\r\n WL.Object.prototype.pp_setLeftWorld = function (left, up = null, forward = null) {\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], false);\r\n };\r\n\r\n WL.Object.prototype.pp_setLeftLocal = function (left, up = null, forward = null) {\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], true);\r\n };\r\n\r\n //Right\r\n\r\n WL.Object.prototype.pp_setRight = function (right, up, forward) {\r\n this.pp_setRightWorld(right, up, forward);\r\n };\r\n\r\n WL.Object.prototype.pp_setRightWorld = function () {\r\n let left = glMatrix.vec3.create();\r\n return function pp_setRightWorld(right, up = null, forward = null) {\r\n glMatrix.vec3.negate(left, right);\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], false);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setRightLocal = function () {\r\n let left = glMatrix.vec3.create();\r\n return function pp_setRightLocal(right, up = null, forward = null) {\r\n glMatrix.vec3.negate(left, right);\r\n this._pp_setAxes([left, up, forward], [0, 1, 2], true);\r\n };\r\n }();\r\n\r\n //Transform\r\n\r\n WL.Object.prototype.pp_setTransform = function (transform) {\r\n this.pp_setTransformWorld(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformMatrix = function (transform) {\r\n this.pp_setTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformQuat = function (transform) {\r\n this.pp_setTransformWorldQuat(transform);\r\n };\r\n\r\n //Transform World\r\n\r\n WL.Object.prototype.pp_setTransformWorld = function (transform) {\r\n return this.pp_setTransformWorldMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformWorldMatrix = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let scale = glMatrix.vec3.create();\r\n let transformMatrixNoScale = glMatrix.mat4.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_setTransformWorldMatrix(transform) {\r\n glMatrix.mat4.getTranslation(position, transform);\r\n glMatrix.mat4.getScaling(scale, transform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(transformMatrixNoScale, transform, inverseScale);\r\n glMatrix.mat4.getRotation(rotation, transformMatrixNoScale);\r\n glMatrix.quat.normalize(rotation, rotation);\r\n this.pp_setScaleWorld(scale);\r\n this.pp_setRotationWorldQuat(rotation);\r\n this.pp_setPositionWorld(position);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setTransformWorldQuat = function (transform) {\r\n this.transformWorld = transform;\r\n };\r\n\r\n //Transform Local\r\n\r\n WL.Object.prototype.pp_setTransformLocal = function (transform) {\r\n return this.pp_setTransformLocalMatrix(transform);\r\n };\r\n\r\n WL.Object.prototype.pp_setTransformLocalMatrix = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let scale = glMatrix.vec3.create();\r\n let transformMatrixNoScale = glMatrix.mat4.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_setTransformLocalMatrix(transform) {\r\n glMatrix.mat4.getTranslation(position, transform);\r\n glMatrix.mat4.getScaling(scale, transform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(transformMatrixNoScale, transform, inverseScale);\r\n glMatrix.mat4.getRotation(rotation, transformMatrixNoScale);\r\n glMatrix.quat.normalize(rotation, rotation);\r\n this.pp_setScaleLocal(scale);\r\n this.pp_setRotationLocalQuat(rotation);\r\n this.pp_setPositionLocal(position);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_setTransformLocalQuat = function (transform) {\r\n this.transformLocal = transform;\r\n };\r\n\r\n //RESET\r\n\r\n //Position\r\n\r\n WL.Object.prototype.pp_resetPosition = function () {\r\n this.pp_resetPositionWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetPositionWorld = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function pp_resetPositionWorld() {\r\n this.pp_setPositionWorld(zero);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_resetPositionLocal = function () {\r\n let zero = glMatrix.vec3.create();\r\n return function pp_resetPositionLocal() {\r\n this.pp_setPositionLocal(zero);\r\n };\r\n }();\r\n\r\n //Rotation\r\n\r\n WL.Object.prototype.pp_resetRotation = function () {\r\n this.pp_resetRotationWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetRotationWorld = function () {\r\n let identity = glMatrix.quat.create();\r\n return function pp_resetRotationWorld() {\r\n this.pp_setRotationWorldQuat(identity);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_resetRotationLocal = function () {\r\n let identity = glMatrix.quat.create();\r\n return function pp_resetRotationLocal() {\r\n this.pp_setRotationLocalQuat(identity);\r\n };\r\n }();\r\n\r\n //Scale\r\n\r\n WL.Object.prototype.pp_resetScale = function () {\r\n this.pp_resetScaleWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetScaleWorld = function () {\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_resetScaleWorld() {\r\n this.pp_setScaleWorld(one);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_resetScaleLocal = function () {\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_resetScaleLocal() {\r\n this.pp_setScaleLocal(one);\r\n };\r\n }();\r\n\r\n //Transform\r\n\r\n WL.Object.prototype.pp_resetTransform = function () {\r\n this.pp_resetTransformWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetTransformWorld = function () {\r\n this.pp_resetScaleWorld();\r\n this.pp_resetRotationWorld();\r\n this.pp_resetPositionWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_resetTransformLocal = function () {\r\n this.pp_resetScaleLocal();\r\n this.pp_resetRotationLocal();\r\n this.pp_resetPositionLocal();\r\n };\r\n\r\n //TRANSFORMATIONS\r\n\r\n //Translate\r\n\r\n WL.Object.prototype.pp_translate = function (translation) {\r\n this.pp_translateWorld(translation);\r\n };\r\n\r\n WL.Object.prototype.pp_translateWorld = function (translation) {\r\n this.translateWorld(translation);\r\n };\r\n\r\n WL.Object.prototype.pp_translateLocal = function (translation) {\r\n this.translate(translation);\r\n };\r\n\r\n WL.Object.prototype.pp_translateObject = function (translation) {\r\n this.translateObject(translation);\r\n };\r\n\r\n //Translate Axis\r\n\r\n WL.Object.prototype.pp_translateAxis = function (amount, direction) {\r\n this.pp_translateAxisWorld(amount, direction);\r\n };\r\n\r\n WL.Object.prototype.pp_translateAxisWorld = function () {\r\n let translation = glMatrix.vec3.create();\r\n return function pp_translateAxisWorld(amount, direction) {\r\n glMatrix.vec3.scale(translation, direction, amount);\r\n this.pp_translateWorld(translation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_translateAxisLocal = function () {\r\n let translation = glMatrix.vec3.create();\r\n return function pp_translateAxisLocal(amount, direction) {\r\n glMatrix.vec3.scale(translation, direction, amount);\r\n this.pp_translateLocal(translation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_translateAxisObject = function () {\r\n let translation = glMatrix.vec3.create();\r\n return function pp_translateAxisObject(amount, direction) {\r\n glMatrix.vec3.scale(translation, direction, amount);\r\n this.pp_translateObject(translation);\r\n };\r\n }();\r\n\r\n //Rotate\r\n\r\n WL.Object.prototype.pp_rotate = function (rotation) {\r\n this.pp_rotateWorld(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateDegrees = function (rotation) {\r\n this.pp_rotateWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateRadians = function (rotation) {\r\n this.pp_rotateWorldRadians(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateMatrix = function (rotation) {\r\n this.pp_rotateWorldMatrix(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateQuat = function (rotation) {\r\n this.pp_rotateWorldQuat(rotation);\r\n };\r\n\r\n //Rotate World\r\n\r\n WL.Object.prototype.pp_rotateWorld = function (rotation) {\r\n this.pp_rotateWorldDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateWorldDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateWorldDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateWorldQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateWorldRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateWorldRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateWorldDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateWorldMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateWorldMatrix(rotation) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateWorldQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateWorldQuat = function () {\r\n let currentRotationQuat = glMatrix.quat.create();\r\n return function pp_rotateWorldQuat(rotation) {\r\n this.pp_getRotationWorldQuat(currentRotationQuat);\r\n glMatrix.quat.mul(currentRotationQuat, rotation, currentRotationQuat);\r\n glMatrix.quat.normalize(currentRotationQuat, currentRotationQuat);\r\n this.pp_setRotationWorldQuat(currentRotationQuat);\r\n };\r\n }();\r\n\r\n //Rotate Local\r\n\r\n WL.Object.prototype.pp_rotateLocal = function (rotation) {\r\n this.pp_rotateLocalDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateLocalDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateLocalDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateLocalQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateLocalRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateLocalRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateLocalDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateLocalMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateLocalMatrix(rotation) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateLocalQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateLocalQuat = function () {\r\n let currentRotationQuat = glMatrix.quat.create();\r\n return function pp_rotateLocalQuat(rotation) {\r\n this.pp_getRotationLocalQuat(currentRotationQuat);\r\n glMatrix.quat.mul(currentRotationQuat, rotation, currentRotationQuat);\r\n glMatrix.quat.normalize(currentRotationQuat, currentRotationQuat);\r\n this.pp_setRotationLocalQuat(currentRotationQuat);\r\n };\r\n }();\r\n\r\n //Rotate Object\r\n\r\n WL.Object.prototype.pp_rotateObject = function (rotation) {\r\n this.pp_rotateObjectDegrees(rotation);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateObjectDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateObjectDegrees(rotation) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateObjectQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateObjectRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateObjectRadians(rotation) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateObjectDegrees(degreesRotation);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateObjectMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateObjectMatrix(rotation) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateObjectQuat(rotationQuat);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateObjectQuat = function (rotation) {\r\n this.rotateObject(rotation);\r\n };\r\n\r\n //Rotate Axis\r\n\r\n WL.Object.prototype.pp_rotateAxis = function (angle, axis) {\r\n this.pp_rotateAxisWorld(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisDegrees = function (angle, axis) {\r\n this.pp_rotateAxisWorldDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisRadians = function (angle, axis) {\r\n this.pp_rotateAxisWorldRadians(angle, axis);\r\n };\r\n\r\n //Rotate Axis World\r\n\r\n WL.Object.prototype.pp_rotateAxisWorld = function (angle, axis) {\r\n this.pp_rotateAxisWorldDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisWorldDegrees = function (angle, axis) {\r\n this.pp_rotateAxisWorldRadians(glMatrix.glMatrix.toRadian(angle), axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisWorldRadians = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_rotateAxisWorldRadians(angle, axis) {\r\n glMatrix.quat.setAxisAngle(rotation, axis, angle);\r\n this.pp_rotateWorldQuat(rotation);\r\n };\r\n }();\r\n\r\n //Rotate Axis Local\r\n\r\n WL.Object.prototype.pp_rotateAxisLocal = function (angle, axis) {\r\n this.pp_rotateAxisLocalDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisLocalDegrees = function (angle, axis) {\r\n this.pp_rotateAxisLocalRadians(glMatrix.glMatrix.toRadian(angle), axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisLocalRadians = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_rotateAxisLocalRadians(angle, axis) {\r\n glMatrix.quat.setAxisAngle(rotation, axis, angle);\r\n this.pp_rotateLocalQuat(rotation);\r\n };\r\n }();\r\n\r\n //Rotate Axis Object\r\n\r\n WL.Object.prototype.pp_rotateAxisObject = function (angle, axis) {\r\n this.pp_rotateAxisObjectDegrees(angle, axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisObjectDegrees = function (angle, axis) {\r\n this.pp_rotateAxisObjectRadians(glMatrix.glMatrix.toRadian(angle), axis);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAxisObjectRadians = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_rotateAxisObjectRadians(angle, axis) {\r\n glMatrix.quat.setAxisAngle(rotation, axis, angle);\r\n this.pp_rotateObjectQuat(rotation);\r\n };\r\n }();\r\n\r\n //Rotate Around\r\n\r\n WL.Object.prototype.pp_rotateAround = function (rotation, origin) {\r\n this.pp_rotateAroundWorld(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundDegrees = function (rotation, origin) {\r\n this.pp_rotateAroundWorldDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundRadians = function (rotation, origin) {\r\n this.pp_rotateAroundWorldRadians(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundMatrix = function (rotation, origin) {\r\n this.pp_rotateAroundWorldMatrix(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundQuat = function (rotation, origin) {\r\n this.pp_rotateAroundWorldQuat(rotation, origin);\r\n };\r\n\r\n //Rotate Around World\r\n\r\n WL.Object.prototype.pp_rotateAroundWorld = function (rotation, origin) {\r\n this.pp_rotateAroundWorldDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundWorldDegrees(rotation, origin) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateAroundWorldQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateAroundWorldRadians(rotation, origin) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateAroundWorldDegrees(degreesRotation, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundWorldMatrix(rotation, origin) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateAroundWorldQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundWorldQuat = function () {\r\n let axis = glMatrix.vec3.create();\r\n return function pp_rotateAroundWorldQuat(rotation, origin) {\r\n let angle = glMatrix.quat.getAxisAngle(axis, rotation);\r\n this.pp_rotateAroundAxisWorldRadians(angle, axis, origin);\r\n };\r\n }();\r\n\r\n //Rotate Around Local\r\n\r\n WL.Object.prototype.pp_rotateAroundLocal = function (rotation, origin) {\r\n this.pp_rotateAroundLocalDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundLocalDegrees(rotation, origin) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateAroundLocalQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateAroundLocalRadians(rotation, origin) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateAroundLocalDegrees(degreesRotation, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundLocalMatrix(rotation, origin) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateAroundLocalQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundLocalQuat = function () {\r\n let axis = glMatrix.vec3.create();\r\n return function pp_rotateAroundLocalQuat(rotation, origin) {\r\n let angle = glMatrix.quat.getAxisAngle(axis, rotation);\r\n this.pp_rotateAroundAxisLocalRadians(angle, axis, origin);\r\n };\r\n }();\r\n\r\n //Rotate Around Object\r\n\r\n WL.Object.prototype.pp_rotateAroundObject = function (rotation, origin) {\r\n this.pp_rotateAroundObjectDegrees(rotation, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectDegrees = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundObjectDegrees(rotation, origin) {\r\n this._pp_degreesToQuaternion(rotation, rotationQuat);\r\n this.pp_rotateAroundObjectQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectRadians = function () {\r\n let degreesRotation = glMatrix.vec3.create();\r\n return function pp_rotateAroundObjectRadians(rotation, origin) {\r\n rotation.forEach(function (value, index, array) {\r\n degreesRotation[index] = this._pp_toDegrees(value);\r\n }.bind(this));\r\n this.pp_rotateAroundObjectDegrees(degreesRotation, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectMatrix = function () {\r\n let rotationQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundObjectMatrix(rotation, origin) {\r\n glMatrix.quat.fromMat3(rotationQuat, rotation);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n this.pp_rotateAroundObjectQuat(rotationQuat, origin);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_rotateAroundObjectQuat = function () {\r\n let axis = glMatrix.vec3.create();\r\n return function pp_rotateAroundObjectQuat(rotation, origin) {\r\n let angle = glMatrix.quat.getAxisAngle(axis, rotation);\r\n this.pp_rotateAroundAxisObjectRadians(angle, axis, origin);\r\n };\r\n }();\r\n\r\n //Rotate Around Axis\r\n\r\n WL.Object.prototype.pp_rotateAroundAxis = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorld(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisRadians = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldRadians(angle, axis, origin);\r\n };\r\n\r\n //Rotate Around Axis World\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisWorld = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisWorldDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisWorldRadians(glMatrix.glMatrix.toRadian(angle), axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisWorldRadians = function () {\r\n let transformToRotate = glMatrix.quat2.create();\r\n let transformToRotateConjugate = glMatrix.quat2.create();\r\n let transformQuat = glMatrix.quat2.create();\r\n let defaultQuat = glMatrix.quat.create();\r\n return function pp_rotateAroundAxisWorldRadians(angle, axis, origin) {\r\n glMatrix.quat2.fromRotationTranslation(transformToRotate, defaultQuat, origin);\r\n this.pp_getTransformWorldQuat(transformQuat);\r\n glMatrix.quat2.conjugate(transformToRotateConjugate, transformToRotate);\r\n glMatrix.quat2.mul(transformQuat, transformToRotateConjugate, transformQuat);\r\n glMatrix.quat2.rotateAroundAxis(transformToRotate, transformToRotate, axis, angle);\r\n glMatrix.quat2.mul(transformQuat, transformToRotate, transformQuat);\r\n this.pp_setTransformWorldQuat(transformQuat);\r\n };\r\n }();\r\n\r\n //Rotate Around Axis Local\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisLocal = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisLocalDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisLocalDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisLocalRadians(glMatrix.glMatrix.toRadian(angle), axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisLocalRadians = function () {\r\n let convertedPosition = glMatrix.vec3.create();\r\n let convertedAxis = glMatrix.vec3.create();\r\n return function pp_rotateAroundAxisLocalRadians(angle, axis, origin) {\r\n this.pp_convertPositionLocalToWorld(origin, convertedPosition);\r\n this.pp_convertDirectionLocalToWorld(axis, convertedAxis);\r\n this.pp_rotateAroundAxisWorldRadians(angle, convertedAxis, convertedPosition);\r\n };\r\n }();\r\n\r\n //Rotate Around Axis Object\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisObject = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisObjectDegrees(angle, axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisObjectDegrees = function (angle, axis, origin) {\r\n this.pp_rotateAroundAxisObjectRadians(glMatrix.glMatrix.toRadian(angle), axis, origin);\r\n };\r\n\r\n WL.Object.prototype.pp_rotateAroundAxisObjectRadians = function () {\r\n let convertedPosition = glMatrix.vec3.create();\r\n let convertedAxis = glMatrix.vec3.create();\r\n return function pp_rotateAroundAxisObjectRadians(angle, axis, origin) {\r\n this.pp_convertPositionObjectToWorld(origin, convertedPosition);\r\n this.pp_convertDirectionObjectToWorld(axis, convertedAxis);\r\n this.pp_rotateAroundAxisWorldRadians(angle, convertedAxis, convertedPosition);\r\n };\r\n }();\r\n\r\n //Scale\r\n\r\n //For now it does not really make sense in wle to scale in world space or parent space\r\n //so there is no pp_scale default function\r\n\r\n WL.Object.prototype.pp_scaleObject = function () {\r\n let vector = glMatrix.vec3.create();\r\n return function pp_scaleObject(scale) {\r\n if (isNaN(scale)) {\r\n this.scale(scale);\r\n } else {\r\n glMatrix.vec3.set(vector, scale, scale, scale);\r\n this.scale(vector);\r\n }\r\n };\r\n }();\r\n\r\n //Look At\r\n\r\n WL.Object.prototype.pp_lookAt = function (position, up) {\r\n this.pp_lookAtWorld(position, up);\r\n };\r\n\r\n WL.Object.prototype.pp_lookAtWorld = function () {\r\n let direction = glMatrix.vec3.create();\r\n return function pp_lookAtWorld(position, up) {\r\n this.pp_getPositionWorld(direction);\r\n glMatrix.vec3.sub(direction, position, direction);\r\n this.pp_lookToWorld(direction, up);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_lookAtLocal = function () {\r\n let direction = glMatrix.vec3.create();\r\n return function pp_lookAtLocal(position, up) {\r\n this.pp_getPositionLocal(direction);\r\n glMatrix.vec3.sub(direction, position, direction);\r\n this.pp_lookToLocal(direction, up);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_lookTo = function (direction, up) {\r\n this.pp_lookToWorld(direction, up);\r\n };\r\n\r\n WL.Object.prototype.pp_lookToWorld = function () {\r\n let internalUp = glMatrix.vec3.create();\r\n return function pp_lookToWorld(direction, up = this.pp_getUpWorld(internalUp)) {\r\n this.pp_setForwardWorld(direction, up);\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_lookToLocal = function () {\r\n let internalUp = glMatrix.vec3.create();\r\n return function pp_lookToLocal(direction, up = this.pp_getUpLocal(internalUp)) {\r\n this.pp_setForwardLocal(direction, up);\r\n };\r\n }();\r\n\r\n //EXTRA\r\n\r\n //Parent\r\n\r\n WL.Object.prototype.pp_setParent = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n let scale = glMatrix.vec3.create();\r\n return function pp_setParent(newParent, keepTransform = true) {\r\n if (!keepTransform) {\r\n this.parent = newParent;\r\n } else {\r\n this.pp_getPositionWorld(position);\r\n this.pp_getRotationWorldQuat(rotation);\r\n this.pp_getScaleWorld(scale);\r\n this.parent = newParent;\r\n this.pp_setScaleWorld(scale);\r\n this.pp_setRotationWorldQuat(rotation);\r\n this.pp_setPositionWorld(position);\r\n }\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_getParent = function () {\r\n return this.parent;\r\n };\r\n\r\n //Convert Vector Object World\r\n\r\n WL.Object.prototype.pp_convertPositionObjectToWorld = function () {\r\n let matrix = glMatrix.mat4.create();\r\n return function pp_convertPositionObjectToWorld(position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_getTransformWorldMatrix(matrix);\r\n glMatrix.vec3.transformMat4(resultPosition, position, matrix);\r\n return resultPosition;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertDirectionObjectToWorld = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertDirectionObjectToWorld(direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.vec3.transformQuat(resultDirection, direction, rotation);\r\n return resultDirection;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertPositionWorldToObject = function () {\r\n let matrix = glMatrix.mat4.create();\r\n return function pp_convertPositionWorldToObject(position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_getTransformWorldMatrix(matrix);\r\n glMatrix.mat4.invert(matrix, matrix);\r\n glMatrix.vec3.transformMat4(resultPosition, position, matrix);\r\n return resultPosition;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertDirectionWorldToObject = function () {\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertDirectionWorldToObject(direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.vec3.transformQuat(resultDirection, direction, rotation);\r\n return resultDirection;\r\n };\r\n }();\r\n\r\n //Convert Vector Local World\r\n\r\n WL.Object.prototype.pp_convertPositionLocalToWorld = function (position, resultPosition = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertPositionObjectToWorld(position, resultPosition);\r\n } else {\r\n glMatrix.vec3.copy(resultPosition, position);\r\n }\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionLocalToWorld = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertDirectionObjectToWorld(direction, resultDirection);\r\n } else {\r\n glMatrix.vec3.copy(resultDirection, direction);\r\n }\r\n return resultDirection;\r\n };\r\n\r\n WL.Object.prototype.pp_convertPositionWorldToLocal = function (position, resultPosition = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertPositionWorldToObject(position, resultPosition);\r\n } else {\r\n glMatrix.vec3.copy(resultPosition, position);\r\n }\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionWorldToLocal = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertDirectionWorldToObject(direction, resultDirection);\r\n } else {\r\n glMatrix.vec3.copy(resultDirection, direction);\r\n }\r\n return resultDirection;\r\n };\r\n\r\n //Convert Vector Local Object\r\n\r\n //I need to use the converson to world and then local also use the parent scale that changes the position in local space\r\n\r\n WL.Object.prototype.pp_convertPositionObjectToLocal = function (position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_convertPositionObjectToWorld(position, resultPosition);\r\n this.pp_convertPositionWorldToLocal(resultPosition, resultPosition);\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionObjectToLocal = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_convertDirectionObjectToWorld(direction, resultDirection);\r\n this.pp_convertDirectionWorldToLocal(resultDirection, resultDirection);\r\n return resultDirection;\r\n };\r\n\r\n WL.Object.prototype.pp_convertPositionLocalToObject = function (position, resultPosition = glMatrix.vec3.create()) {\r\n this.pp_convertPositionLocalToWorld(position, resultPosition);\r\n this.pp_convertPositionWorldToObject(resultPosition, resultPosition);\r\n return resultPosition;\r\n };\r\n\r\n WL.Object.prototype.pp_convertDirectionLocalToObject = function (direction, resultDirection = glMatrix.vec3.create()) {\r\n this.pp_convertDirectionLocalToWorld(direction, resultDirection);\r\n this.pp_convertDirectionWorldToObject(resultDirection, resultDirection);\r\n return resultDirection;\r\n };\r\n\r\n //Convert Transform Object World\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToWorld = function (transform, resultTransform) {\r\n return this.pp_convertTransformObjectToWorldMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToWorldMatrix = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_convertTransformObjectToWorldMatrix(transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_getTransformWorldMatrix(convertTransform);\r\n if (this.pp_hasUniformScaleWorld()) {\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n } else {\r\n glMatrix.vec3.set(position, transform[12], transform[13], transform[14]);\r\n this.pp_convertPositionObjectToWorld(position, position);\r\n\r\n glMatrix.mat4.getScaling(scale, convertTransform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, convertTransform, inverseScale);\r\n\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n glMatrix.mat4.scale(resultTransform, resultTransform, scale);\r\n\r\n resultTransform[12] = position[0];\r\n resultTransform[13] = position[1];\r\n resultTransform[14] = position[2];\r\n resultTransform[15] = 1;\r\n }\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToWorldQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertTransformObjectToWorldQuat(transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.quat.mul(rotation, rotation, transform);\r\n glMatrix.quat2.getTranslation(position, transform);\r\n this.pp_convertPositionObjectToWorld(position, position);\r\n glMatrix.quat2.fromRotationTranslation(resultTransform, rotation, position);\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToObject = function (transform, resultTransform) {\r\n return this.pp_convertTransformWorldToObjectMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToObjectMatrix = function () {\r\n let convertTransform = glMatrix.mat4.create();\r\n let position = glMatrix.vec3.create();\r\n let scale = glMatrix.vec3.create();\r\n let inverseScale = glMatrix.vec3.create();\r\n let one = glMatrix.vec3.create();\r\n glMatrix.vec3.set(one, 1, 1, 1);\r\n return function pp_convertTransformWorldToObjectMatrix(transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_getTransformWorldMatrix(convertTransform);\r\n if (this.pp_hasUniformScaleWorld()) {\r\n glMatrix.mat4.invert(convertTransform, convertTransform);\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n } else {\r\n glMatrix.vec3.set(position, transform[12], transform[13], transform[14]);\r\n this.pp_convertPositionWorldToObject(position, position);\r\n\r\n glMatrix.mat4.getScaling(scale, convertTransform);\r\n glMatrix.vec3.divide(inverseScale, one, scale);\r\n glMatrix.mat4.scale(convertTransform, convertTransform, inverseScale);\r\n\r\n glMatrix.mat4.invert(convertTransform, convertTransform);\r\n glMatrix.mat4.mul(resultTransform, convertTransform, transform);\r\n glMatrix.mat4.scale(resultTransform, resultTransform, inverseScale);\r\n\r\n resultTransform[12] = position[0];\r\n resultTransform[13] = position[1];\r\n resultTransform[14] = position[2];\r\n resultTransform[15] = 1;\r\n }\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToObjectQuat = function () {\r\n let position = glMatrix.vec3.create();\r\n let rotation = glMatrix.quat.create();\r\n return function pp_convertTransformWorldToObjectQuat(transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_getRotationWorldQuat(rotation);\r\n glMatrix.quat.conjugate(rotation, rotation);\r\n glMatrix.quat.mul(rotation, rotation, transform);\r\n glMatrix.quat2.getTranslation(position, transform);\r\n this.pp_convertPositionWorldToObject(position, position);\r\n glMatrix.quat2.fromRotationTranslation(resultTransform, rotation, position);\r\n return resultTransform;\r\n };\r\n }();\r\n\r\n //Convert Transform Local World\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToWorld = function (transform, resultTransform) {\r\n return this.pp_convertTransformLocalToWorldMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToWorldMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformObjectToWorldMatrix(transform, resultTransform);\r\n } else {\r\n glMatrix.mat4.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToWorldQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformObjectToWorldQuat(transform, resultTransform);\r\n } else {\r\n glMatrix.quat2.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToLocal = function (transform, resultTransform) {\r\n return this.pp_convertTransformWorldToLocalMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToLocalMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformWorldToObjectMatrix(transform, resultTransform);\r\n } else {\r\n glMatrix.mat4.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformWorldToLocalQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n if (this.pp_getParent()) {\r\n this.pp_getParent().pp_convertTransformWorldToObjectQuat(transform, resultTransform);\r\n } else {\r\n glMatrix.quat2.copy(resultTransform, transform);\r\n }\r\n return resultTransform;\r\n };\r\n\r\n //Convert Transform Object Local\r\n\r\n //I need to use the converson to world and then local also use the parent scale that changes the position in local space\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToLocal = function (transform, resultTransform) {\r\n return this.pp_convertTransformObjectToLocalMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToLocalMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_convertTransformObjectToWorldMatrix(transform, resultTransform);\r\n this.pp_convertTransformWorldToLocalMatrix(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformObjectToLocalQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_convertTransformObjectToWorldQuat(transform, resultTransform);\r\n this.pp_convertTransformWorldToLocalQuat(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToObject = function (transform, resultTransform) {\r\n return this.pp_convertTransformLocalToObjectMatrix(transform, resultTransform);\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToObjectMatrix = function (transform, resultTransform = glMatrix.mat4.create()) {\r\n this.pp_convertTransformLocalToWorldMatrix(transform, resultTransform);\r\n this.pp_convertTransformWorldToObjectMatrix(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n WL.Object.prototype.pp_convertTransformLocalToObjectQuat = function (transform, resultTransform = glMatrix.quat2.create()) {\r\n this.pp_convertTransformLocalToWorldQuat(transform, resultTransform);\r\n this.pp_convertTransformWorldToObjectQuat(resultTransform, resultTransform);\r\n return resultTransform;\r\n };\r\n\r\n //Component\r\n\r\n WL.Object.prototype.pp_addComponent = function (type, paramsOrActive, active = null) {\r\n let params = null;\r\n\r\n if (typeof paramsOrActive == \"boolean\") {\r\n params = {};\r\n params[\"active\"] = paramsOrActive;\r\n } else {\r\n params = paramsOrActive;\r\n\r\n if (active != null) {\r\n if (params == null) {\r\n params = {};\r\n }\r\n params[\"active\"] = active;\r\n }\r\n }\r\n\r\n return this.addComponent(type, params);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponent = function (type, index) {\r\n return this.getComponent(type, index);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponents = function (type) {\r\n return this.getComponents(type);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentHierarchy = function (type, index) {\r\n let component = this.getComponent(type, index);\r\n\r\n if (!component) {\r\n component = this.pp_getComponentDescendants(type, index);\r\n }\r\n\r\n return component;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentDescendants = function (type, index) {\r\n let component = null;\r\n\r\n let descendants = this.children;\r\n while (!component && descendants.length > 0) {\r\n let descendant = descendants.shift();\r\n component = descendant.getComponent(type, index);\r\n if (!component) {\r\n for (let object of descendant.children) {\r\n descendants.push(object);\r\n }\r\n }\r\n }\r\n\r\n return component;\r\n };\r\n WL.Object.prototype.pp_getComponentChildren = function (type, index) {\r\n let component = null;\r\n\r\n let children = this.children;\r\n for (let child of children) {\r\n component = child.getComponent(type, index);\r\n if (component) {\r\n break;\r\n }\r\n }\r\n\r\n return component;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentsHierarchy = function (type) {\r\n let components = this.getComponents(type);\r\n\r\n let descendantsComponents = this.pp_getComponentsDescendants(type);\r\n for (let component of descendantsComponents) {\r\n components.push(component);\r\n }\r\n\r\n return components;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentsDescendants = function (type) {\r\n let components = [];\r\n\r\n let descendants = this.children;\r\n while (descendants.length > 0) {\r\n let descendant = descendants.shift();\r\n let descendantComponents = descendant.getComponents(type);\r\n for (let component of descendantComponents) {\r\n components.push(component);\r\n }\r\n for (let object of descendant.children) {\r\n descendants.push(object);\r\n }\r\n }\r\n\r\n return components;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentsChildren = function (type) {\r\n let components = [];\r\n\r\n let children = this.children;\r\n for (let child of children) {\r\n let childComponents = child.getComponents(type);\r\n for (let component of childComponents) {\r\n components.push(component);\r\n }\r\n }\r\n\r\n return components;\r\n };\r\n\r\n //Active\r\n\r\n WL.Object.prototype.pp_setActive = function (active, applyToHierarchy = true) {\r\n if (applyToHierarchy) {\r\n this.pp_setActiveHierarchy(active);\r\n } else {\r\n this.active = active;\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveSelf = function (active) {\r\n this.pp_setActive(active, false);\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveHierarchy = function (active) {\r\n this.active = active;\r\n this.pp_setActiveDescendants(active);\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveDescendants = function (active) {\r\n let descendants = this.children;\r\n while (descendants.length > 0) {\r\n let descendant = descendants.shift();\r\n descendant.active = active;\r\n for (let object of descendant.children) {\r\n descendants.push(object);\r\n }\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_setActiveChildren = function (active) {\r\n let children = this.children;\r\n for (let child of children) {\r\n child.active = active;\r\n }\r\n };\r\n\r\n //Uniform Scale\r\n\r\n WL.Object.prototype.pp_hasUniformScale = function () {\r\n return this.pp_hasUniformScaleWorld();\r\n };\r\n\r\n WL.Object.prototype.pp_hasUniformScaleWorld = function () {\r\n let scale = glMatrix.vec3.create();\r\n return function pp_hasUniformScaleWorld() {\r\n this.pp_getScaleWorld(scale);\r\n return Math.abs(scale[0] - scale[1]) < this._pp_epsilon && Math.abs(scale[1] - scale[2]) < this._pp_epsilon && Math.abs(scale[0] - scale[2]) < this._pp_epsilon;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_hasUniformScaleLocal = function () {\r\n let scale = glMatrix.vec3.create();\r\n return function pp_hasUniformScaleLocal() {\r\n this.pp_getScaleLocal(scale);\r\n return Math.abs(scale[0] - scale[1]) < this._pp_epsilon && Math.abs(scale[1] - scale[2]) < this._pp_epsilon && Math.abs(scale[0] - scale[2]) < this._pp_epsilon;\r\n };\r\n }();\r\n\r\n //Clone\r\n\r\n PP.CloneParams = class CloneParams {\r\n constructor() {\r\n this.myIgnoreNonCloneable = false; // Ignores components that are not clonable\r\n this.myIgnoreComponents = false; // All components are ignored, cloning only the object hierarchy\r\n this.myIgnoreChildren = false; // Clones only the given object without the children\r\n\r\n this.myComponentsToIgnore = []; // Ignores all component types in this list (example: \"mesh\"), has lower priority over myComponentsToInclude\r\n this.myComponentsToInclude = []; // Clones only the component types in this list (example: \"mesh\"), has higher priority over myComponentsToIgnore, if empty it's ignored\r\n this.myIgnoreComponentCallback = null; // Signature: callback(component) returns true if the component must be ignored, it is called after the previous filters\r\n\r\n this.myChildrenToIgnore = []; // Ignores all the objects in this list (example: \"mesh\"), has lower priority over myChildrenToInclude\r\n this.myChildrenToInclude = []; // Clones only the objects in this list (example: \"mesh\"), has higher priority over myChildrenToIgnore, if empty it's ignored\r\n this.myIgnoreChildCallback = null; // Signature: callback(object) returns true if the object must be ignored, it is called after the previous filters\r\n\r\n this.myDeepCloneParams = new PP.DeepCloneParams(); // Used to specify if the object must be deep cloned or not, you can also override the behavior for specific components and variables\r\n\r\n this.myExtraData = new Map(); // This map can be filled with whatever extra data the component clone function could need\r\n }\r\n };\r\n\r\n PP.DeepCloneParams = class DeepCloneParams {\r\n constructor() {\r\n this._myDeepCloneObject = false;\r\n this._myOverrideDeepCloneComponentMap = new Map();\r\n this._myOverrideDeepCloneComponentVariableMap = new Map();\r\n }\r\n\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneObject(deepClone) {\r\n this._myDeepCloneObject = deepClone;\r\n }\r\n\r\n // This value override the deep clone object value\r\n // The implementation is component dependant, not every component implements the deep clone\r\n setDeepCloneComponent(componentName, deepClone) {\r\n this._myOverrideDeepCloneComponentMap.set(componentName, deepClone);\r\n }\r\n\r\n // This value override both the deep clone object value and the deep clone component one\r\n // The implementation is component dependant, not every component variable override is taken into consideration\r\n setDeepCloneComponentVariable(componentName, variableName, deepClone) {\r\n let componentMap = null;\r\n\r\n if (!this._myOverrideDeepCloneComponentVariableMap.has(componentName)) {\r\n this._myOverrideDeepCloneComponentVariableMap.set(componentName, new Map());\r\n }\r\n\r\n componentMap = this._myOverrideDeepCloneComponentVariableMap.get(componentName);\r\n\r\n componentMap.set(variableName, deepClone);\r\n }\r\n\r\n isDeepCloneComponent(componentName) {\r\n let overrideValue = this._myOverrideDeepCloneComponentMap.get(componentName);\r\n\r\n if (overrideValue != null) {\r\n return overrideValue;\r\n }\r\n\r\n return this._myDeepCloneObject;\r\n }\r\n\r\n isDeepCloneComponentVariable(componentName, variableName) {\r\n let componentMap = this._myOverrideDeepCloneComponentVariableMap.get(componentName);\r\n if (componentMap != null) {\r\n let overrideValue = componentMap.get(variableName);\r\n if (overrideValue != null) {\r\n return overrideValue;\r\n }\r\n }\r\n\r\n return this.isDeepCloneComponent(componentName);\r\n }\r\n };\r\n\r\n WL.Object.prototype.pp_clone = function () {\r\n let scale = glMatrix.vec3.create();\r\n let transformQuat = glMatrix.quat2.create();\r\n return function pp_clone(params = new PP.CloneParams()) {\r\n let clonedObject = null;\r\n\r\n if (this.pp_isCloneable(params)) {\r\n let objectsToCloneData = [];\r\n objectsToCloneData.push([this.parent, this]);\r\n\r\n // Create the object hierarchy\r\n let objectsToCloneComponentsData = [];\r\n while (objectsToCloneData.length > 0) {\r\n let cloneData = objectsToCloneData.shift();\r\n let parent = cloneData[0];\r\n let objectToClone = cloneData[1];\r\n\r\n let currentClonedObject = WL.scene.addObject(parent);\r\n currentClonedObject.name = objectToClone.name;\r\n\r\n currentClonedObject.pp_setScaleLocal(objectToClone.pp_getScaleLocal(scale));\r\n currentClonedObject.pp_setTransformLocalQuat(objectToClone.pp_getTransformLocalQuat(transformQuat));\r\n\r\n if (!params.myIgnoreComponents) {\r\n objectsToCloneComponentsData.push([objectToClone, currentClonedObject]);\r\n }\r\n\r\n if (!params.myIgnoreChildren) {\r\n for (let child of objectToClone.children) {\r\n let cloneChild = false;\r\n if (params.myChildrenToInclude.length > 0) {\r\n cloneChild = params.myChildrenToInclude.find(childToInclude => childToInclude.pp_equals(child)) != null;\r\n } else {\r\n cloneChild = params.myChildrenToIgnore.find(childToIgnore => childToIgnore.pp_equals(child)) == null;\r\n }\r\n\r\n if (cloneChild && params.myIgnoreChildCallback != null) {\r\n cloneChild = !params.myIgnoreChildCallback(child);\r\n }\r\n\r\n if (cloneChild) {\r\n objectsToCloneData.push([currentClonedObject, child]);\r\n }\r\n }\r\n }\r\n\r\n if (clonedObject == null) {\r\n clonedObject = currentClonedObject;\r\n }\r\n }\r\n\r\n // Get the components to clone\r\n let componentsToCloneData = [];\r\n while (objectsToCloneComponentsData.length > 0) {\r\n let cloneData = objectsToCloneComponentsData.shift();\r\n let objectToClone = cloneData[0];\r\n let currentClonedObject = cloneData[1];\r\n\r\n let components = objectToClone.pp_getComponents();\r\n for (let component of components) {\r\n if (component.pp_clone != null) {\r\n let cloneComponent = false;\r\n if (params.myComponentsToInclude.length > 0) {\r\n cloneComponent = params.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = params.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && params.myIgnoreComponentCallback != null) {\r\n cloneComponent = !params.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent) {\r\n componentsToCloneData.push([component, currentClonedObject]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Clone the components\r\n let componentsToPostProcessData = [];\r\n while (componentsToCloneData.length > 0) {\r\n let cloneData = componentsToCloneData.shift();\r\n let componentToClone = cloneData[0];\r\n let currentClonedObject = cloneData[1];\r\n\r\n let clonedComponent = componentToClone.pp_clone(currentClonedObject, params.myDeepCloneParams, params.myExtraData);\r\n if (componentToClone.pp_clonePostProcess != null) {\r\n componentsToPostProcessData.push([componentToClone, clonedComponent]);\r\n }\r\n }\r\n\r\n // Clone post process\r\n // Can be useful if you have to get some data from other components in the hierarchy which have now been created\r\n while (componentsToCloneData.length > 0) {\r\n let cloneData = componentsToCloneData.shift();\r\n let componentToClone = cloneData[0];\r\n let currentClonedComponent = cloneData[1];\r\n\r\n componentToClone.pp_clonePostProcess(currentClonedComponent, params.myDeepCloneParams, params.myExtraData);\r\n }\r\n }\r\n\r\n return clonedObject;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_isCloneable = function (params = new PP.CloneParams()) {\r\n if (params.myIgnoreNonCloneable || params.myIgnoreComponents) {\r\n return true;\r\n }\r\n\r\n let isCloneable = true;\r\n\r\n let objects = [];\r\n objects.push(this);\r\n\r\n while (isCloneable && objects.length > 0) {\r\n let object = objects.shift();\r\n\r\n let components = this.pp_getComponents();\r\n for (let component of components) {\r\n let cloneComponent = false;\r\n if (params.myComponentsToInclude.length > 0) {\r\n cloneComponent = params.myComponentsToInclude.indexOf(component.type) != -1;\r\n } else {\r\n cloneComponent = params.myComponentsToIgnore.indexOf(component.type) == -1;\r\n }\r\n\r\n if (cloneComponent && params.myIgnoreComponentCallback != null) {\r\n cloneComponent = !params.myIgnoreComponentCallback(component);\r\n }\r\n\r\n if (cloneComponent && component.pp_clone == null) {\r\n isCloneable = false;\r\n break;\r\n }\r\n }\r\n\r\n if (isCloneable && !params.myIgnoreChildren) {\r\n for (let child of object.children) {\r\n let cloneChild = false;\r\n if (params.myChildrenToInclude.length > 0) {\r\n cloneChild = params.myChildrenToInclude.find(childToInclude => childToInclude.pp_equals(child)) != null;\r\n } else {\r\n cloneChild = params.myChildrenToIgnore.find(childToInclude => childToInclude.pp_equals(child)) == null;\r\n }\r\n\r\n if (cloneChild && params.myIgnoreChildCallback != null) {\r\n cloneChild = !params.myIgnoreChildCallback(child);\r\n }\r\n\r\n if (cloneChild) {\r\n objects.push(child);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return isCloneable;\r\n };\r\n\r\n //To String\r\n\r\n WL.Object.prototype.pp_toString = function () {\r\n return this.pp_toStringCompact();\r\n }\r\n\r\n WL.Object.prototype.pp_toStringExtended = function () {\r\n let tab = \" \";\r\n let newLine = \"\\n\";\r\n let startObject = \"{\";\r\n let endObject = \"}\";\r\n let nameLabel = \"name: \";\r\n let idLabel = \"id: \";\r\n let componentsLabel = \"components: \";\r\n let typeLabel = \"type: \";\r\n let childrenLabel = \"children: \";\r\n let startComponents = \"[\";\r\n let endComponents = \"]\";\r\n let startChildren = startComponents;\r\n let endChildren = endComponents;\r\n let separator = \",\";\r\n let newLineTab = newLine.concat(tab, tab);\r\n return function pp_toString() {\r\n let objectString = \"\";\r\n objectString = objectString.concat(startObject, newLine);\r\n let name = this.pp_getName();\r\n if (name.length > 0) {\r\n objectString = objectString.concat(tab, nameLabel, this.pp_getName(), separator, newLine);\r\n }\r\n objectString = objectString.concat(tab, idLabel, this.pp_getID(), separator, newLine);\r\n\r\n let components = this.pp_getComponents();\r\n if (components.length > 0) {\r\n objectString = objectString.concat(tab, componentsLabel, newLine, tab, startComponents, newLine);\r\n for (let i = 0; i < components.length; i++) {\r\n let component = components[i];\r\n\r\n objectString = objectString.concat(tab, tab, startObject, newLine);\r\n objectString = objectString.concat(tab, tab, tab, typeLabel, component.type, separator, newLine);\r\n objectString = objectString.concat(tab, tab, tab, idLabel, component._id, separator, newLine);\r\n objectString = objectString.concat(tab, tab, endObject);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n\r\n objectString = objectString.concat(tab, endComponents, separator, newLine);\r\n }\r\n\r\n let children = this.pp_getChildren();\r\n if (children.length > 0) {\r\n objectString = objectString.concat(tab, childrenLabel, newLine, tab, startChildren, newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n let child = children[i];\r\n\r\n let childString = child.pp_toStringExtended();\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(tab, childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(separator, newLine);\r\n } else {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n objectString = objectString.concat(tab, endChildren, separator, newLine);\r\n }\r\n\r\n objectString = objectString.concat(endObject);\r\n\r\n return objectString;\r\n };\r\n }();\r\n\r\n WL.Object.prototype.pp_toStringCompact = function () {\r\n let tab = \" \";\r\n let newLine = \"\\n\";\r\n let emptyName = \"\";\r\n let nameLabel = \"name: \";\r\n let componentsLabel = \"components: \";\r\n let separator = \", \";\r\n let newLineTab = newLine.concat(tab);\r\n return function pp_toString() {\r\n let objectString = \"\";\r\n\r\n let name = this.pp_getName();\r\n if (name.length > 0) {\r\n objectString = objectString.concat(nameLabel, name);\r\n } else {\r\n objectString = objectString.concat(nameLabel, emptyName);\r\n }\r\n\r\n let components = this.pp_getComponents();\r\n if (components.length > 0) {\r\n objectString = objectString.concat(separator, componentsLabel);\r\n for (let i = 0; i < components.length; i++) {\r\n let component = components[i];\r\n\r\n objectString = objectString.concat(component.type);\r\n\r\n if (i != components.length - 1) {\r\n objectString = objectString.concat(separator);\r\n }\r\n }\r\n }\r\n\r\n let children = this.pp_getChildren();\r\n if (children.length > 0) {\r\n objectString = objectString.concat(newLine);\r\n for (let i = 0; i < children.length; i++) {\r\n let child = children[i];\r\n\r\n let childString = child.pp_toStringCompact();\r\n childString = childString.replaceAll(newLine, newLineTab);\r\n childString = tab.concat(childString);\r\n objectString = objectString.concat(childString);\r\n\r\n if (i != children.length - 1) {\r\n objectString = objectString.concat(newLine);\r\n }\r\n }\r\n }\r\n\r\n return objectString;\r\n };\r\n }();\r\n\r\n //Cauldron\r\n\r\n WL.Object.prototype.pp_addObject = function () {\r\n return WL.scene.addObject(this);\r\n };\r\n\r\n WL.Object.prototype.pp_getName = function () {\r\n return this.name;\r\n };\r\n\r\n WL.Object.prototype.pp_setName = function (name) {\r\n this.name = name;\r\n };\r\n\r\n WL.Object.prototype.pp_getID = function () {\r\n return this.objectId;\r\n };\r\n\r\n WL.Object.prototype.pp_getHierarchy = function () {\r\n let hierarchy = this.pp_getDescendants();\r\n\r\n hierarchy.unshift(this);\r\n\r\n return hierarchy;\r\n };\r\n\r\n WL.Object.prototype.pp_getDescendants = function () {\r\n let descendants = [];\r\n\r\n let descendantsQueue = this.children;\r\n\r\n while (descendantsQueue.length > 0) {\r\n let descendant = descendantsQueue.shift();\r\n descendants.push(descendant);\r\n for (let object of descendant.children) {\r\n descendantsQueue.push(object);\r\n }\r\n }\r\n\r\n return descendants;\r\n };\r\n\r\n WL.Object.prototype.pp_getChildren = function () {\r\n return this.children;\r\n };\r\n\r\n WL.Object.prototype.pp_markDirty = function () {\r\n return this.setDirty();\r\n };\r\n\r\n WL.Object.prototype.pp_equals = function (otherObject) {\r\n return this.equals(otherObject);\r\n };\r\n\r\n WL.Object.prototype.pp_destroy = function () {\r\n return this.destroy();\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjects = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMap();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjectsHierarchy = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMapHierarchy();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjectsDescendants = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMapDescendants();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_reserveObjectsChildren = function (count) {\r\n let componentAmountMap = this.pp_getComponentAmountMapChildren();\r\n this._pp_reserveObjects(count, componentAmountMap);\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMap = function (amountMap = new Map()) {\r\n let objectAmount = amountMap.get(\"object\");\r\n if (objectAmount == null) {\r\n objectAmount = 0;\r\n }\r\n objectAmount += 1;\r\n amountMap.set(\"object\", objectAmount);\r\n\r\n let components = this.pp_getComponents();\r\n for (let component of components) {\r\n let type = component.type;\r\n let typeAmount = amountMap.get(type);\r\n if (typeAmount == null) {\r\n typeAmount = 0;\r\n }\r\n typeAmount += 1;\r\n amountMap.set(type, typeAmount);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMapHierarchy = function (amountMap = new Map()) {\r\n let hierarchy = this.pp_getHierarchy();\r\n\r\n for (let object of hierarchy) {\r\n object.pp_getComponentAmountMap(amountMap);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMapDescendants = function (amountMap = new Map()) {\r\n let descendants = this.pp_getDescendants();\r\n\r\n for (let object of descendants) {\r\n object.pp_getComponentAmountMap(amountMap);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n WL.Object.prototype.pp_getComponentAmountMapChildren = function (amountMap = new Map()) {\r\n let children = this.children;\r\n\r\n for (let object of children) {\r\n object.pp_getComponentAmountMap(amountMap);\r\n }\r\n\r\n return amountMap;\r\n };\r\n\r\n //Private Utils\r\n\r\n WL.Object.prototype._pp_epsilon = 0.000001;\r\n\r\n WL.Object.prototype._pp_quaternionToRadians = function () {\r\n let mat3 = glMatrix.mat3.create();\r\n return function _pp_quaternionToRadians(quatRotation, radiansRotation = glMatrix.vec3.create()) {\r\n glMatrix.mat3.fromQuat(mat3, quatRotation);\r\n\r\n //Rotation order is ZYX\r\n radiansRotation[1] = Math.asin(-this._pp_clamp(mat3[2], -1, 1));\r\n\r\n if (Math.abs(mat3[2]) < 0.9999999) {\r\n\r\n radiansRotation[0] = Math.atan2(mat3[5], mat3[8]);\r\n radiansRotation[2] = Math.atan2(mat3[1], mat3[0]);\r\n\r\n } else {\r\n\r\n radiansRotation[0] = 0;\r\n radiansRotation[2] = Math.atan2(-mat3[3], mat3[4]);\r\n }\r\n\r\n return radiansRotation;\r\n };\r\n }();\r\n\r\n WL.Object.prototype._pp_degreesToQuaternion = function (degreesRotation, quatRotation = glMatrix.quat.create()) {\r\n glMatrix.quat.fromEuler(quatRotation, degreesRotation[0], degreesRotation[1], degreesRotation[2]);\r\n return quatRotation;\r\n };\r\n\r\n WL.Object.prototype._pp_toDegrees = function (angle) {\r\n return angle * (180 / Math.PI);\r\n };\r\n\r\n WL.Object.prototype._pp_clamp = function (value, min, max) {\r\n return Math.min(Math.max(value, min), max);\r\n };\r\n\r\n WL.Object.prototype._pp_reserveObjects = function (count, componentAmountMap) {\r\n let objectsToReserve = componentAmountMap.get(\"object\") * count;\r\n componentAmountMap.delete(\"object\");\r\n\r\n let componentsToReserve = {};\r\n for (let [componentName, componentCount] of componentAmountMap.entries()) {\r\n componentsToReserve[componentName] = componentCount * count;\r\n }\r\n\r\n WL.scene.reserveObjects(objectsToReserve, componentsToReserve);\r\n };\r\n\r\n WL.Object.prototype._pp_setAxes = function () {\r\n let fixedAxes = [glMatrix.vec3.create(), glMatrix.vec3.create(), glMatrix.vec3.create()];\r\n\r\n let fixedAxesFixSignMap = [\r\n [1, -1, 1],\r\n [1, 1, -1],\r\n [-1, 1, -1]\r\n ];\r\n\r\n let fixedLeft = glMatrix.vec3.create();\r\n let fixedUp = glMatrix.vec3.create();\r\n let fixedForward = glMatrix.vec3.create();\r\n\r\n let currentAxis = glMatrix.vec3.create();\r\n\r\n let rotationAxis = glMatrix.vec3.create();\r\n let rotationMat = glMatrix.mat3.create();\r\n let rotationQuat = glMatrix.quat.create();\r\n return function _pp_setAxes(axes, priority, isLocal) {\r\n let firstAxis = axes[priority[0]];\r\n let secondAxis = axes[priority[1]];\r\n let thirdAxis = axes[priority[2]];\r\n\r\n if (firstAxis == null) {\r\n return;\r\n }\r\n\r\n let secondAxisValid = false;\r\n if (secondAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, secondAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n secondAxisValid = true;\r\n }\r\n }\r\n\r\n let thirdAxisValid = false;\r\n if (thirdAxis != null) {\r\n let angleBetween = glMatrix.vec3.angle(firstAxis, thirdAxis);\r\n if (angleBetween > this._pp_epsilon) {\r\n thirdAxisValid = true;\r\n }\r\n }\r\n\r\n if (secondAxisValid || thirdAxisValid) {\r\n\r\n let crossAxis = null;\r\n let secondAxisIndex = null;\r\n let thirdAxisIndex = null;\r\n if (secondAxisValid) {\r\n crossAxis = secondAxis;\r\n secondAxisIndex = 1;\r\n thirdAxisIndex = 2;\r\n } else {\r\n crossAxis = thirdAxis;\r\n secondAxisIndex = 2;\r\n thirdAxisIndex = 1;\r\n }\r\n\r\n let fixSignMap = fixedAxesFixSignMap[priority[0]];\r\n\r\n glMatrix.vec3.cross(fixedAxes[thirdAxisIndex], firstAxis, crossAxis);\r\n glMatrix.vec3.scale(fixedAxes[thirdAxisIndex], fixedAxes[thirdAxisIndex], fixSignMap[priority[thirdAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[secondAxisIndex], firstAxis, fixedAxes[thirdAxisIndex]);\r\n glMatrix.vec3.scale(fixedAxes[secondAxisIndex], fixedAxes[secondAxisIndex], fixSignMap[priority[secondAxisIndex]]);\r\n\r\n glMatrix.vec3.cross(fixedAxes[0], fixedAxes[1], fixedAxes[2]);\r\n glMatrix.vec3.scale(fixedAxes[0], fixedAxes[0], fixSignMap[priority[0]]);\r\n\r\n glMatrix.vec3.normalize(fixedLeft, fixedAxes[priority.pp_findIndexEqual(0)]);\r\n glMatrix.vec3.normalize(fixedUp, fixedAxes[priority.pp_findIndexEqual(1)]);\r\n glMatrix.vec3.normalize(fixedForward, fixedAxes[priority.pp_findIndexEqual(2)]);\r\n\r\n glMatrix.mat3.set(rotationMat,\r\n fixedLeft[0], fixedLeft[1], fixedLeft[2],\r\n fixedUp[0], fixedUp[1], fixedUp[2],\r\n fixedForward[0], fixedForward[1], fixedForward[2]\r\n );\r\n\r\n glMatrix.quat.fromMat3(rotationQuat, rotationMat);\r\n glMatrix.quat.normalize(rotationQuat, rotationQuat);\r\n\r\n if (isLocal) {\r\n this.pp_setRotationLocalQuat(rotationQuat);\r\n } else {\r\n this.pp_setRotationWorldQuat(rotationQuat);\r\n }\r\n } else {\r\n if (priority[0] == 0) {\r\n if (isLocal) {\r\n this.pp_getLeftLocal(currentAxis);\r\n } else {\r\n this.pp_getLeftWorld(currentAxis);\r\n }\r\n } else if (priority[0] == 1) {\r\n if (isLocal) {\r\n this.pp_getUpLocal(currentAxis);\r\n } else {\r\n this.pp_getUpWorld(currentAxis);\r\n }\r\n } else {\r\n if (isLocal) {\r\n this.pp_getForwardLocal(currentAxis);\r\n } else {\r\n this.pp_getForwardWorld(currentAxis);\r\n }\r\n }\r\n\r\n let angle = glMatrix.vec3.angle(firstAxis, currentAxis);\r\n if (angle != 0) {\r\n glMatrix.vec3.cross(rotationAxis, currentAxis, firstAxis);\r\n glMatrix.vec3.normalize(rotationAxis, rotationAxis);\r\n glMatrix.quat.setAxisAngle(rotationQuat, rotationAxis, angle);\r\n\r\n if (isLocal) {\r\n this.pp_rotateLocalQuat(rotationQuat);\r\n } else {\r\n this.pp_rotateWorldQuat(rotationQuat);\r\n }\r\n }\r\n }\r\n };\r\n }();\r\n\r\n\r\n\r\n\r\n for (let key in WL.Object.prototype) {\r\n let prefixes = [\"pp_\", \"_pp_\"];\r\n\r\n let found = false;\r\n for (let prefix of prefixes) {\r\n if (key.startsWith(prefix)) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n Object.defineProperty(WL.Object.prototype, key, { enumerable: false });\r\n }\r\n }\r\n\r\n}", "/*\r\n How to use\r\n\r\n By default the rotations are in Degrees\r\n\r\n For rotations u can add a suffix like Degrees/Radians to use a specific version, example:\r\n - pp_angleDistanceSignedDegrees\r\n - pp_isInsideAngleRangeRadians\r\n \r\n List of constants:\r\n - PP_EPSILON_NUMBER / PP_EPSILON_DEGREES\r\n\r\n List of functions:\r\n Notes:\r\n - The suffixes (like Degrees or Radians) are omitted \r\n\r\n - pp_clamp\r\n - pp_sign\r\n - pp_toDegrees / pp_toRadians\r\n - pp_roundDecimal\r\n - pp_mapToRange\r\n - pp_random / pp_randomInt / pp_randomInt / pp_randomSign / pp_randomPick\r\n - pp_lerp / pp_interpolate / PP.EasingFunction\r\n - pp_angleDistance / pp_angleDistanceSigned\r\n - pp_angleClamp\r\n - pp_isInsideAngleRange\r\n*/\r\n\r\nMath.PP_EPSILON_NUMBER = 0.00001;\r\nMath.PP_EPSILON_DEGREES = 0.0001;\r\n\r\nMath.pp_clamp = function (value, start, end) {\r\n let fixedStart = (start != null) ? start : -Number.MAX_VALUE;\r\n let fixedEnd = (end != null) ? end : Number.MAX_VALUE;\r\n\r\n let min = Math.min(fixedStart, fixedEnd);\r\n let max = Math.max(fixedStart, fixedEnd);\r\n return Math.min(Math.max(value, min), max);\r\n};\r\n\r\nMath.pp_sign = function (value, zeroSign = 1) {\r\n let sign = Math.sign(value);\r\n if (sign == 0) {\r\n sign = Math.sign(zeroSign);\r\n }\r\n return sign;\r\n};\r\n\r\nMath.pp_toDegrees = function (angle) {\r\n return angle * (180 / Math.PI);\r\n};\r\n\r\nMath.pp_toRadians = function (angle) {\r\n return angle * (Math.PI / 180);\r\n};\r\n\r\nMath.pp_roundDecimal = function (number, decimalPlaces) {\r\n let factor = Math.pow(10, decimalPlaces);\r\n number = Math.round(number * factor) / factor;\r\n\r\n return number;\r\n};\r\n\r\n// Start range value doesn't need to be lower than the end one, so you can map from [0,1] to [3,2], where 3 is greater than 2\r\nMath.pp_mapToRange = function (value, originRangeStart, originRangeEnd, newRangeStart, newRangeEnd) {\r\n if (originRangeStart == originRangeEnd) {\r\n return newRangeStart;\r\n }\r\n\r\n let clampedValue = Math.pp_clamp(value, originRangeStart, originRangeEnd);\r\n\r\n if (clampedValue == originRangeStart) {\r\n return newRangeStart;\r\n } else if (clampedValue == originRangeEnd) {\r\n return newRangeEnd;\r\n }\r\n\r\n let newValue = newRangeStart + ((newRangeEnd - newRangeStart) / (originRangeEnd - originRangeStart)) * (clampedValue - originRangeStart);\r\n let clampedNewValue = Math.pp_clamp(newValue, newRangeStart, newRangeEnd);\r\n return clampedNewValue;\r\n};\r\n\r\n//Range is [start, end)\r\nMath.pp_random = function (start = 0, end = 1) {\r\n return Math.random() * (end - start) + start;\r\n};\r\n\r\n//Range is [start, end]\r\nMath.pp_randomInt = function (start, end) {\r\n let min = Math.min(start, end);\r\n let max = Math.max(start, end);\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n};\r\n\r\nMath.pp_randomBool = function () {\r\n return Math.pp_randomInt(0, 1) == 0;\r\n};\r\n\r\n//Return 1 or -1\r\nMath.pp_randomSign = function () {\r\n return (Math.random() < 0.5) ? 1 : -1;\r\n};\r\n\r\n//You give it a list of parameters and returns one\r\nMath.pp_randomPick = function (...args) {\r\n let random = null;\r\n\r\n if (args.length > 0) {\r\n if (args.length == 1 && args[0].length != null) {\r\n if (args[0].length > 0) {\r\n let randomIndex = Math.pp_randomInt(0, args[0].length - 1);\r\n random = args[0][randomIndex];\r\n }\r\n } else {\r\n let randomIndex = Math.pp_randomInt(0, args.length - 1);\r\n random = args[randomIndex];\r\n }\r\n }\r\n\r\n return random;\r\n};\r\n\r\nMath.pp_lerp = function (from, to, interpolationValue) {\r\n if (interpolationValue <= 0) {\r\n return from;\r\n } else if (interpolationValue >= 1) {\r\n return to;\r\n }\r\n\r\n return interpolationValue * (to - from) + from;\r\n};\r\n\r\nPP.EasingFunction = {\r\n linear: t => t,\r\n easeIn: t => t * t * t,\r\n easeOut: t => (t - 1) * (t - 1) * (t - 1) + 1,\r\n easeInOut: t => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1\r\n};\r\n\r\nMath.pp_interpolate = function (from, to, interpolationValue, easingFunction = PP.EasingFunction.linear) {\r\n let lerpValue = easingFunction(interpolationValue);\r\n return Math.pp_lerp(from, to, lerpValue);\r\n};\r\n\r\nMath.pp_angleDistance = function (from, to) {\r\n return Math.pp_angleDistanceDegrees(from, to);\r\n};\r\n\r\nMath.pp_angleDistanceDegrees = function (from, to) {\r\n return Math.abs(Math.pp_angleDistanceSignedDegrees(from, to));\r\n};\r\n\r\nMath.pp_angleDistanceRadians = function (from, to) {\r\n return Math.abs(Math.pp_angleDistanceSignedRadians(from, to));\r\n};\r\n\r\nMath.pp_angleDistanceSigned = function (from, to) {\r\n return Math.pp_angleDistanceSignedDegrees(from, to);\r\n};\r\n\r\nMath.pp_angleDistanceSignedDegrees = function (from, to) {\r\n let clampedFrom = Math.pp_angleClampDegrees(from, true);\r\n let clampedTo = Math.pp_angleClampDegrees(to, true);\r\n\r\n let distance = clampedTo - clampedFrom;\r\n if (clampedTo - clampedFrom > 180) {\r\n distance = (clampedTo - clampedFrom) - 360;\r\n } else if (clampedTo - clampedFrom < -180) {\r\n distance = (clampedTo - clampedFrom) + 360;\r\n }\r\n\r\n return distance;\r\n};\r\n\r\nMath.pp_angleDistanceSignedRadians = function (from, to) {\r\n return Math.pp_toRadians(Math.pp_angleDistanceSignedDegrees(Math.pp_toDegrees(from), Math.pp_toDegrees(to)));\r\n};\r\n\r\n//Clamp the angle to -180/+180, so that, for example, 270 will be -90\r\n//if usePositiveRange is true, the angle will be clamped to 0/360\r\nMath.pp_angleClamp = function (angle, usePositiveRange = false) {\r\n return Math.pp_angleClampDegrees(angle, usePositiveRange);\r\n};\r\n\r\n//Clamp the angle to -180/+180, so that, for example, 270 will be -90\r\n//if usePositiveRange is true, the angle will be clamped to 0/360\r\nMath.pp_angleClampDegrees = function (angle, usePositiveRange = false) {\r\n let clampedAngle = angle % 360;\r\n\r\n if (clampedAngle < 0) {\r\n clampedAngle += 360;\r\n }\r\n\r\n if (!usePositiveRange) {\r\n if (clampedAngle > 180) {\r\n clampedAngle -= 360;\r\n }\r\n }\r\n\r\n return clampedAngle;\r\n};\r\n\r\n//Clamp the angle to -Pi/+Pi, so that, for example, 270 will be -90\r\n//if usePositiveRange is true, the angle will be clamped to 0/2Pi\r\nMath.pp_angleClampRadians = function (angle, usePositiveRange = false) {\r\n return Math.pp_toRadians(Math.pp_angleClampDegrees(Math.pp_toDegrees(angle), usePositiveRange));\r\n};\r\n\r\n//The range goes from start to end by going toward the positive direction (if useShortestAngle is false)\r\n//[20,300] is a 280 degrees range, [300, 20] is an 80 degrees range, [-150,-170] = [210, 190] is a 240 degrees range, [0, -10] = [0, 350] is a 350 degrees range\r\nMath.pp_isInsideAngleRange = function (angle, start, end, useShortestAngle = false) {\r\n return Math.pp_isInsideAngleRangeDegrees(angle, start, end, useShortestAngle);\r\n};\r\n\r\nMath.pp_isInsideAngleRangeDegrees = function (angle, start, end, useShortestAngle = false) {\r\n let isInside = false;\r\n\r\n let anglePositive = Math.pp_angleClampDegrees(angle, true);\r\n let startPositive = Math.pp_angleClampDegrees(start, true);\r\n let endPositive = Math.pp_angleClampDegrees(end, true);\r\n\r\n if (useShortestAngle) {\r\n if (Math.pp_angleDistanceSignedDegrees(startPositive, endPositive) < 0) {\r\n let temp = startPositive;\r\n startPositive = endPositive;\r\n endPositive = temp;\r\n }\r\n }\r\n\r\n if (startPositive < endPositive) {\r\n isInside = anglePositive >= startPositive && anglePositive <= endPositive;\r\n } else {\r\n isInside = anglePositive >= startPositive || anglePositive <= endPositive;\r\n }\r\n\r\n return isInside;\r\n};\r\n\r\nMath.pp_isInsideAngleRangeRadians = function (angle, start, end, useShortestAngle = false) {\r\n return Math.pp_isInsideAngleRangeDegrees(Math.pp_toDegrees(angle), Math.pp_toDegrees(start), Math.pp_toDegrees(end), useShortestAngle);\r\n};\r\n\r\n\r\n\r\n\r\nfor (let key in Math) {\r\n let prefixes = [\"pp_\", \"_pp_\"];\r\n\r\n let found = false;\r\n for (let prefix of prefixes) {\r\n if (key.startsWith(prefix)) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (found) {\r\n Object.defineProperty(Math, key, { enumerable: false });\r\n }\r\n}", "/*!\n * howler.js v2.2.3\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Create the global controller. All contained methods and properties apply\n * to all sounds that are currently playing or will be in the future.\n */\n var HowlerGlobal = function() {\n this.init();\n };\n HowlerGlobal.prototype = {\n /**\n * Initialize the global Howler object.\n * @return {Howler}\n */\n init: function() {\n var self = this || Howler;\n\n // Create a global ID counter.\n self._counter = 1000;\n\n // Pool of unlocked HTML5 Audio objects.\n self._html5AudioPool = [];\n self.html5PoolSize = 10;\n\n // Internal properties.\n self._codecs = {};\n self._howls = [];\n self._muted = false;\n self._volume = 1;\n self._canPlayEvent = 'canplaythrough';\n self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n // Public properties.\n self.masterGain = null;\n self.noAudio = false;\n self.usingWebAudio = true;\n self.autoSuspend = true;\n self.ctx = null;\n\n // Set to false to disable the auto audio unlocker.\n self.autoUnlock = true;\n\n // Setup the various state values for global tracking.\n self._setup();\n\n return self;\n },\n\n /**\n * Get/set the global volume for all sounds.\n * @param {Float} vol Volume from 0.0 to 1.0.\n * @return {Howler/Float} Returns self or current volume.\n */\n volume: function(vol) {\n var self = this || Howler;\n vol = parseFloat(vol);\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n self._volume = vol;\n\n // Don't update any of the nodes if we are muted.\n if (self._muted) {\n return self;\n }\n\n // When using Web Audio, we just need to adjust the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n }\n\n // Loop through and change volume for all HTML5 audio nodes.\n for (var i=0; i=0; i--) {\n self._howls[i].unload();\n }\n\n // Create a new AudioContext to make sure it is fully reset.\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n self.ctx.close();\n self.ctx = null;\n setupAudioContext();\n }\n\n return self;\n },\n\n /**\n * Check for codec support of specific extension.\n * @param {String} ext Audio file extention.\n * @return {Boolean}\n */\n codecs: function(ext) {\n return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n },\n\n /**\n * Setup various state values for global tracking.\n * @return {Howler}\n */\n _setup: function() {\n var self = this || Howler;\n\n // Keeps track of the suspend/resume state of the AudioContext.\n self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n // Automatically begin the 30-second suspend process\n self._autoSuspend();\n\n // Check if audio is available.\n if (!self.usingWebAudio) {\n // No audio is available on this system if noAudio is set to true.\n if (typeof Audio !== 'undefined') {\n try {\n var test = new Audio();\n\n // Check if the canplaythrough event is available.\n if (typeof test.oncanplaythrough === 'undefined') {\n self._canPlayEvent = 'canplay';\n }\n } catch(e) {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n // Test to make sure audio isn't disabled in Internet Explorer.\n try {\n var test = new Audio();\n if (test.muted) {\n self.noAudio = true;\n }\n } catch (e) {}\n\n // Check for supported codecs.\n if (!self.noAudio) {\n self._setupCodecs();\n }\n\n return self;\n },\n\n /**\n * Check for browser support for various codecs and cache the results.\n * @return {Howler}\n */\n _setupCodecs: function() {\n var self = this || Howler;\n var audioTest = null;\n\n // Must wrap in a try/catch because IE11 in server mode throws an error.\n try {\n audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n } catch (err) {\n return self;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n return self;\n }\n\n var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n var ua = self._navigator ? self._navigator.userAgent : '';\n var checkOpera = ua.match(/OPR\\/([0-6].)/g);\n var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n var checkSafari = ua.indexOf('Safari') !== -1 && ua.indexOf('Chrome') === -1;\n var safariVersion = ua.match(/Version\\/(.*?) /);\n var isOldSafari = (checkSafari && safariVersion && parseInt(safariVersion[1], 10) < 15);\n\n self._codecs = {\n mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n mpeg: !!mpegTest,\n opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n wav: !!(audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType('audio/wav')).replace(/^no$/, ''),\n aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n m4b: !!(audioTest.canPlayType('audio/x-m4b;') || audioTest.canPlayType('audio/m4b;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n weba: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n webm: !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')),\n dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n };\n\n return self;\n },\n\n /**\n * Some browsers/devices will only allow audio to be played after a user interaction.\n * Attempt to automatically unlock audio on the first user interaction.\n * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n * @return {Howler}\n */\n _unlockAudio: function() {\n var self = this || Howler;\n\n // Only run this if Web Audio is supported and it hasn't already been unlocked.\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n // http://stackoverflow.com/questions/24119684\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n // Call this method on touch start to create and play a buffer,\n // then check if the audio actually played to determine if\n // audio has now been unlocked on iOS, Android, etc.\n var unlock = function(e) {\n // Create a pool of unlocked HTML5 Audio objects that can\n // be used for playing sounds without user interaction. HTML5\n // Audio objects must be individually unlocked, as opposed\n // to the WebAudio API which only needs a single activation.\n // This must occur before WebAudio setup or the source.onended\n // event will not fire.\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n var audioNode = new Audio();\n\n // Mark this Audio object as unlocked to ensure it can get returned\n // to the unlocked pool when released.\n audioNode._unlocked = true;\n\n // Add the audio node to the pool.\n self._releaseHtml5Audio(audioNode);\n } catch (e) {\n self.noAudio = true;\n break;\n }\n }\n\n // Loop through any assigned audio nodes and unlock them.\n for (var i=0; i= 55.\n if (typeof self.ctx.resume === 'function') {\n self.ctx.resume();\n }\n\n // Setup a timeout to check that we are unlocked on the next event loop.\n source.onended = function() {\n source.disconnect(0);\n\n // Update the unlocked state and prevent this check from happening again.\n self._audioUnlocked = true;\n\n // Remove the touch start listener.\n document.removeEventListener('touchstart', unlock, true);\n document.removeEventListener('touchend', unlock, true);\n document.removeEventListener('click', unlock, true);\n document.removeEventListener('keydown', unlock, true);\n\n // Let all sounds know that audio has been unlocked.\n for (var i=0; i 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n var start = self._sprite[sprite][0] / 1000;\n var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n sound._sprite = sprite;\n\n // Mark the sound as ended instantly so that this async playback\n // doesn't get grabbed by another call to play while this one waits to start.\n sound._ended = false;\n\n // Update the parameters of the sound.\n var setParams = function() {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || self._sprite[sprite][2]);\n };\n\n // End the sound instantly if seek is at the end.\n if (seek >= stop) {\n self._ended(sound);\n return;\n }\n\n // Begin the actual playback.\n var node = sound._node;\n if (self._webAudio) {\n // Fire this when the sound is ready to play to begin Web Audio playback.\n var playWebAudio = function() {\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n // Setup the playback params.\n var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n sound._playStart = Howler.ctx.currentTime;\n\n // Play the sound using the supported method.\n if (typeof node.bufferSource.start === 'undefined') {\n sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n }\n\n // Start a new timer if none is present.\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n if (!internal) {\n setTimeout(function() {\n self._emit('play', sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (Howler.state === 'running' && Howler.ctx.state !== 'interrupted') {\n playWebAudio();\n } else {\n self._playLock = true;\n\n // Wait for the audio context to resume before playing.\n self.once('resume', playWebAudio);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n } else {\n // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n var playHtml5 = function() {\n node.currentTime = seek;\n node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n node.volume = sound._volume * Howler.volume();\n node.playbackRate = sound._rate;\n\n // Some browsers will throw an error if this is called without user interaction.\n try {\n var play = node.play();\n\n // Support older browsers that don't support promises, and thus don't have this issue.\n if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n self._playLock = true;\n\n // Set param values immediately.\n setParams();\n\n // Releases the lock and executes queued actions.\n play\n .then(function() {\n self._playLock = false;\n node._unlocked = true;\n if (!internal) {\n self._emit('play', sound._id);\n } else {\n self._loadQueue();\n }\n })\n .catch(function() {\n self._playLock = false;\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n\n // Reset the ended and paused values.\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit('play', sound._id);\n }\n\n // Setting rate before playing won't work in IE, so we set it again here.\n node.playbackRate = sound._rate;\n\n // If the node is still paused, then we can assume there was a playback issue.\n if (node.paused) {\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n return;\n }\n\n // Setup the end timer on sprites or listen for the ended event.\n if (sprite !== '__default' || sound._loop) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n } else {\n self._endTimers[sound._id] = function() {\n // Fire ended on this audio node.\n self._ended(sound);\n\n // Clear this listener.\n node.removeEventListener('ended', self._endTimers[sound._id], false);\n };\n node.addEventListener('ended', self._endTimers[sound._id], false);\n }\n } catch (err) {\n self._emit('playerror', sound._id, err);\n }\n };\n\n // If this is streaming audio, make sure the src is set and load again.\n if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n node.src = self._src;\n node.load();\n }\n\n // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n if (node.readyState >= 3 || loadedNoReadyState) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = 'loading';\n\n var listener = function() {\n self._state = 'loaded';\n \n // Begin playback.\n playHtml5();\n\n // Clear this listener.\n node.removeEventListener(Howler._canPlayEvent, listener, false);\n };\n node.addEventListener(Howler._canPlayEvent, listener, false);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n },\n\n /**\n * Pause playback and save current position.\n * @param {Number} id The sound ID (empty to pause all in group).\n * @return {Howl}\n */\n pause: function(id) {\n var self = this;\n\n // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'pause',\n action: function() {\n self.pause(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be paused.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i Returns the group's volume value.\n * volume(id) -> Returns the sound id's current volume.\n * volume(vol) -> Sets the volume of all sounds in this Howl group.\n * volume(vol, id) -> Sets the volume of passed sound id.\n * @return {Howl/Number} Returns self or current volume.\n */\n volume: function() {\n var self = this;\n var args = arguments;\n var vol, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the value of the groups' volume.\n return self._volume;\n } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n // First check if this is an ID, and if not, assume it is a new volume.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n vol = parseFloat(args[0]);\n }\n } else if (args.length >= 2) {\n vol = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the volume or return the current volume.\n var sound;\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'volume',\n action: function() {\n self.volume.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group volume.\n if (typeof id === 'undefined') {\n self._volume = vol;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i 0) ? len / steps : len);\n var lastTick = Date.now();\n\n // Store the value being faded to.\n sound._fadeTo = to;\n\n // Update the volume value on each interval tick.\n sound._interval = setInterval(function() {\n // Update the volume based on the time since the last tick.\n var tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n // Round to within 2 decimal points.\n vol = Math.round(vol * 100) / 100;\n\n // Make sure the volume is in the right bounds.\n if (diff < 0) {\n vol = Math.max(to, vol);\n } else {\n vol = Math.min(to, vol);\n }\n\n // Change the volume.\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n // Set the group's volume.\n if (isGroup) {\n self._volume = vol;\n }\n\n // When the fade is complete, stop it and fire event.\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = null;\n sound._fadeTo = null;\n self.volume(to, sound._id);\n self._emit('fade', sound._id);\n }\n }, stepLen);\n },\n\n /**\n * Internal method that stops the currently playing fade when\n * a new fade starts, volume is changed or the sound is stopped.\n * @param {Number} id The sound id.\n * @return {Howl}\n */\n _stopFade: function(id) {\n var self = this;\n var sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio) {\n sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n }\n\n clearInterval(sound._interval);\n sound._interval = null;\n self.volume(sound._fadeTo, id);\n sound._fadeTo = null;\n self._emit('fade', id);\n }\n\n return self;\n },\n\n /**\n * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n * loop() -> Returns the group's loop value.\n * loop(id) -> Returns the sound id's loop value.\n * loop(loop) -> Sets the loop value for all sounds in this Howl group.\n * loop(loop, id) -> Sets the loop value of passed sound id.\n * @return {Howl/Boolean} Returns self or current loop value.\n */\n loop: function() {\n var self = this;\n var args = arguments;\n var loop, id, sound;\n\n // Determine the values for loop and id.\n if (args.length === 0) {\n // Return the grou's loop value.\n return self._loop;\n } else if (args.length === 1) {\n if (typeof args[0] === 'boolean') {\n loop = args[0];\n self._loop = loop;\n } else {\n // Return this sound's loop value.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._loop : false;\n }\n } else if (args.length === 2) {\n loop = args[0];\n id = parseInt(args[1], 10);\n }\n\n // If no id is passed, get all ID's to be looped.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current playback rate.\n * rate(id) -> Returns the sound id's current playback rate.\n * rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n * rate(rate, id) -> Sets the playback rate of passed sound id.\n * @return {Howl/Number} Returns self or the current playback rate.\n */\n rate: function() {\n var self = this;\n var args = arguments;\n var rate, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current rate of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new rate value.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n rate = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n rate = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the playback rate or return the current value.\n var sound;\n if (typeof rate === 'number') {\n // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'rate',\n action: function() {\n self.rate.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group rate.\n if (typeof id === 'undefined') {\n self._rate = rate;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current seek position.\n * seek(id) -> Returns the sound id's current seek position.\n * seek(seek) -> Sets the seek position of the first sound node.\n * seek(seek, id) -> Sets the seek position of passed sound id.\n * @return {Howl/Number} Returns self or the current seek position.\n */\n seek: function() {\n var self = this;\n var args = arguments;\n var seek, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current position of the first node.\n if (self._sounds.length) {\n id = self._sounds[0]._id;\n }\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new seek position.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]._id;\n seek = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n seek = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // If there is no ID, bail out.\n if (typeof id === 'undefined') {\n return 0;\n }\n\n // If the sound hasn't loaded, add it to the load queue to seek when capable.\n if (typeof seek === 'number' && (self._state !== 'loaded' || self._playLock)) {\n self._queue.push({\n event: 'seek',\n action: function() {\n self.seek.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Get the sound.\n var sound = self._soundById(id);\n\n if (sound) {\n if (typeof seek === 'number' && seek >= 0) {\n // Pause the sound and update position for restarting playback.\n var playing = self.playing(id);\n if (playing) {\n self.pause(id, true);\n }\n\n // Move the position of the track and cancel timer.\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n // Update the seek position for HTML5 Audio.\n if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n // Seek and emit when ready.\n var seekAndEmit = function() {\n // Restart the playback if the sound was playing.\n if (playing) {\n self.play(id, true);\n }\n\n self._emit('seek', id);\n };\n\n // Wait for the play lock to be unset before emitting (HTML5 Audio).\n if (playing && !self._webAudio) {\n var emitSeek = function() {\n if (!self._playLock) {\n seekAndEmit();\n } else {\n setTimeout(emitSeek, 0);\n }\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n } else {\n if (self._webAudio) {\n var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n } else {\n return sound._node.currentTime;\n }\n }\n }\n\n return self;\n },\n\n /**\n * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n * @param {Number} id The sound id to check. If none is passed, the whole sound group is checked.\n * @return {Boolean} True if playing and false if not.\n */\n playing: function(id) {\n var self = this;\n\n // Check the passed sound ID (if any).\n if (typeof id === 'number') {\n var sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n // Otherwise, loop through all sounds and check if any are playing.\n for (var i=0; i= 0) {\n Howler._howls.splice(index, 1);\n }\n\n // Delete this sound from the cache (if no other Howl is using it).\n var remCache = true;\n for (i=0; i= 0) {\n remCache = false;\n break;\n }\n }\n\n if (cache && remCache) {\n delete cache[self._src];\n }\n\n // Clear global errors.\n Howler.noAudio = false;\n\n // Clear out `self`.\n self._state = 'unloaded';\n self._sounds = [];\n self = null;\n\n return null;\n },\n\n /**\n * Listen to a custom event.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @param {Number} once (INTERNAL) Marks event to fire only once.\n * @return {Howl}\n */\n on: function(event, fn, id, once) {\n var self = this;\n var events = self['_on' + event];\n\n if (typeof fn === 'function') {\n events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n }\n\n return self;\n },\n\n /**\n * Remove a custom event. Call without parameters to remove all events.\n * @param {String} event Event name.\n * @param {Function} fn Listener to remove. Leave empty to remove all.\n * @param {Number} id (optional) Only remove events for this sound.\n * @return {Howl}\n */\n off: function(event, fn, id) {\n var self = this;\n var events = self['_on' + event];\n var i = 0;\n\n // Allow passing just an event and ID.\n if (typeof fn === 'number') {\n id = fn;\n fn = null;\n }\n\n if (fn || id) {\n // Loop through event store and remove the passed function.\n for (i=0; i=0; i--) {\n // Only fire the listener if the correct ID is used.\n if (!events[i].id || events[i].id === id || event === 'load') {\n setTimeout(function(fn) {\n fn.call(this, id, msg);\n }.bind(self, events[i].fn), 0);\n\n // If this event was setup with `once`, remove it.\n if (events[i].once) {\n self.off(event, events[i].fn, events[i].id);\n }\n }\n }\n\n // Pass the event type into load queue so that it can continue stepping.\n self._loadQueue(event);\n\n return self;\n },\n\n /**\n * Queue of actions initiated before the sound has loaded.\n * These will be called in sequence, with the next only firing\n * after the previous has finished executing (even if async like play).\n * @return {Howl}\n */\n _loadQueue: function(event) {\n var self = this;\n\n if (self._queue.length > 0) {\n var task = self._queue[0];\n\n // Remove this task if a matching event was passed.\n if (task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n\n // Run the task if no event type is passed.\n if (!event) {\n task.action();\n }\n }\n\n return self;\n },\n\n /**\n * Fired when playback ends at the end of the duration.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _ended: function(sound) {\n var self = this;\n var sprite = sound._sprite;\n\n // If we are using IE and there was network latency we may be clipping\n // audio before it completes playing. Lets check the node to make sure it\n // believes it has completed, before ending the playback.\n if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n setTimeout(self._ended.bind(self, sound), 100);\n return self;\n }\n\n // Should this sound loop?\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n // Fire the ended event.\n self._emit('end', sound._id);\n\n // Restart the playback for HTML5 Audio loop.\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n // Restart this timer if on a Web Audio loop.\n if (self._webAudio && loop) {\n self._emit('play', sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = Howler.ctx.currentTime;\n\n var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n // Mark the node as paused.\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n\n // Attempt to auto-suspend AudioContext if no sounds are still playing.\n Howler._autoSuspend();\n }\n\n // When using a sprite, end the track.\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n },\n\n /**\n * Clear the end timer for a sound playback.\n * @param {Number} id The sound ID.\n * @return {Howl}\n */\n _clearTimer: function(id) {\n var self = this;\n\n if (self._endTimers[id]) {\n // Clear the timeout or remove the ended listener.\n if (typeof self._endTimers[id] !== 'function') {\n clearTimeout(self._endTimers[id]);\n } else {\n var sound = self._soundById(id);\n if (sound && sound._node) {\n sound._node.removeEventListener('ended', self._endTimers[id], false);\n }\n }\n\n delete self._endTimers[id];\n }\n\n return self;\n },\n\n /**\n * Return the sound identified by this ID, or return null.\n * @param {Number} id Sound ID\n * @return {Object} Sound object or null.\n */\n _soundById: function(id) {\n var self = this;\n\n // Loop through all sounds and find the one with this ID.\n for (var i=0; i=0; i--) {\n if (cnt <= limit) {\n return;\n }\n\n if (self._sounds[i]._ended) {\n // Disconnect the audio source when using Web Audio.\n if (self._webAudio && self._sounds[i]._node) {\n self._sounds[i]._node.disconnect(0);\n }\n\n // Remove sounds until we have the pool size.\n self._sounds.splice(i, 1);\n cnt--;\n }\n }\n },\n\n /**\n * Get all ID's from the sounds pool.\n * @param {Number} id Only return one ID if one is passed.\n * @return {Array} Array of IDs.\n */\n _getSoundIds: function(id) {\n var self = this;\n\n if (typeof id === 'undefined') {\n var ids = [];\n for (var i=0; i= 0;\n\n if (Howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n }\n }\n node.bufferSource = null;\n\n return self;\n },\n\n /**\n * Set the source to a 0-second silence to stop any downloading (except in IE).\n * @param {Object} node Audio node to clear.\n */\n _clearSound: function(node) {\n var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n if (!checkIE) {\n node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n }\n }\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Setup the sound object, which each node attached to a Howl group is contained in.\n * @param {Object} howl The Howl parent group.\n */\n var Sound = function(howl) {\n this._parent = howl;\n this.init();\n };\n Sound.prototype = {\n /**\n * Initialize a new Sound object.\n * @return {Sound}\n */\n init: function() {\n var self = this;\n var parent = self._parent;\n\n // Setup the default parameters.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a unique ID for this sound.\n self._id = ++Howler._counter;\n\n // Add itself to the parent's pool.\n parent._sounds.push(self);\n\n // Create the new node.\n self.create();\n\n return self;\n },\n\n /**\n * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n * @return {Sound}\n */\n create: function() {\n var self = this;\n var parent = self._parent;\n var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n if (parent._webAudio) {\n // Create the gain node for controlling volume (the source will connect to this).\n self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n self._node.paused = true;\n self._node.connect(Howler.masterGain);\n } else if (!Howler.noAudio) {\n // Get an unlocked Audio object from the pool.\n self._node = Howler._obtainHtml5Audio();\n\n // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n self._errorFn = self._errorListener.bind(self);\n self._node.addEventListener('error', self._errorFn, false);\n\n // Listen for 'canplaythrough' event to let us know the sound is ready.\n self._loadFn = self._loadListener.bind(self);\n self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n // Listen for the 'ended' event on the sound to account for edge-case where\n // a finite sound has a duration of Infinity.\n self._endFn = self._endListener.bind(self);\n self._node.addEventListener('ended', self._endFn, false);\n\n // Setup the new audio node.\n self._node.src = parent._src;\n self._node.preload = parent._preload === true ? 'auto' : parent._preload;\n self._node.volume = volume * Howler.volume();\n\n // Begin loading the source.\n self._node.load();\n }\n\n return self;\n },\n\n /**\n * Reset the parameters of this sound to the original state (for recycle).\n * @return {Sound}\n */\n reset: function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all of the parameters of this sound.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a new ID so that it isn't confused with the previous sound.\n self._id = ++Howler._counter;\n\n return self;\n },\n\n /**\n * HTML5 Audio error listener callback.\n */\n _errorListener: function() {\n var self = this;\n\n // Fire an error event and pass back the code.\n self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n // Clear the event listener.\n self._node.removeEventListener('error', self._errorFn, false);\n },\n\n /**\n * HTML5 Audio canplaythrough listener callback.\n */\n _loadListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Setup a sprite if none is defined.\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = {__default: [0, parent._duration * 1000]};\n }\n\n if (parent._state !== 'loaded') {\n parent._state = 'loaded';\n parent._emit('load');\n parent._loadQueue();\n }\n\n // Clear the event listener.\n self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n },\n\n /**\n * HTML5 Audio ended listener callback.\n */\n _endListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Only handle the `ended`` event if the duration is Infinity.\n if (parent._duration === Infinity) {\n // Update the parent duration to match the real audio duration.\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Update the sprite that corresponds to the real duration.\n if (parent._sprite.__default[1] === Infinity) {\n parent._sprite.__default[1] = parent._duration * 1000;\n }\n\n // Run the regular ended method.\n parent._ended(self);\n }\n\n // Clear the event listener since the duration is now correct.\n self._node.removeEventListener('ended', self._endFn, false);\n }\n };\n\n /** Helper Methods **/\n /***************************************************************************/\n\n var cache = {};\n\n /**\n * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n * @param {Howl} self\n */\n var loadBuffer = function(self) {\n var url = self._src;\n\n // Check if the buffer has already been cached and use it instead.\n if (cache[url]) {\n // Set the duration from the cache.\n self._duration = cache[url].duration;\n\n // Load the sound into this Howl.\n loadSound(self);\n\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n // Decode the base64 data URI without XHR, since some browsers don't support it.\n var data = atob(url.split(',')[1]);\n var dataView = new Uint8Array(data.length);\n for (var i=0; i 0) {\n cache[self._src] = buffer;\n loadSound(self, buffer);\n } else {\n error();\n }\n };\n\n // Decode the buffer into an audio source.\n if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n } else {\n Howler.ctx.decodeAudioData(arraybuffer, success, error);\n }\n }\n\n /**\n * Sound is now loaded, so finish setting everything up and fire the loaded event.\n * @param {Howl} self\n * @param {Object} buffer The decoded buffer sound source.\n */\n var loadSound = function(self, buffer) {\n // Set the duration.\n if (buffer && !self._duration) {\n self._duration = buffer.duration;\n }\n\n // Setup a sprite if none is defined.\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = {__default: [0, self._duration * 1000]};\n }\n\n // Fire the loaded event.\n if (self._state !== 'loaded') {\n self._state = 'loaded';\n self._emit('load');\n self._loadQueue();\n }\n };\n\n /**\n * Setup the audio context when available, or switch to HTML5 Audio mode.\n */\n var setupAudioContext = function() {\n // If we have already detected that Web Audio isn't supported, don't run this step again.\n if (!Howler.usingWebAudio) {\n return;\n }\n\n // Check if we are using Web Audio and setup the AudioContext if we are.\n try {\n if (typeof AudioContext !== 'undefined') {\n Howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== 'undefined') {\n Howler.ctx = new webkitAudioContext();\n } else {\n Howler.usingWebAudio = false;\n }\n } catch(e) {\n Howler.usingWebAudio = false;\n }\n\n // If the audio context creation still failed, set using web audio to false.\n if (!Howler.ctx) {\n Howler.usingWebAudio = false;\n }\n\n // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n // If it is, disable Web Audio as it causes crashing.\n var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n var version = appVersion ? parseInt(appVersion[1], 10) : null;\n if (iOS && version && version < 9) {\n var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n if (Howler._navigator && !safari) {\n Howler.usingWebAudio = false;\n }\n }\n\n // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n if (Howler.usingWebAudio) {\n Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : Howler._volume, Howler.ctx.currentTime);\n Howler.masterGain.connect(Howler.ctx.destination);\n }\n\n // Re-run the setup on Howler.\n Howler._setup();\n };\n\n // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n if (typeof define === 'function' && define.amd) {\n define([], function() {\n return {\n Howler: Howler,\n Howl: Howl\n };\n });\n }\n\n // Add support for CommonJS libraries such as browserify.\n if (typeof exports !== 'undefined') {\n exports.Howler = Howler;\n exports.Howl = Howl;\n }\n\n // Add to global in Node.js (for testing, etc).\n if (typeof global !== 'undefined') {\n global.HowlerGlobal = HowlerGlobal;\n global.Howler = Howler;\n global.Howl = Howl;\n global.Sound = Sound;\n } else if (typeof window !== 'undefined') { // Define globally in case AMD is not available or unused.\n window.HowlerGlobal = HowlerGlobal;\n window.Howler = Howler;\n window.Howl = Howl;\n window.Sound = Sound;\n }\n})();\n\n\n/*!\n * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n * \n * howler.js v2.2.3\n * howlerjs.com\n *\n * (c) 2013-2020, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n // Setup default properties.\n HowlerGlobal.prototype._pos = [0, 0, 0];\n HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Helper method to update the stereo panning position of all current Howls.\n * Future Howls will not use this value unless explicitly set.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @return {Howler/Number} Self or current stereo panning value.\n */\n HowlerGlobal.prototype.stereo = function(pan) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Loop through all Howls and update their stereo panning.\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].stereo(pan);\n }\n\n return self;\n };\n\n /**\n * Get/set the position of the listener in 3D cartesian space. Sounds using\n * 3D position will be relative to the listener's position.\n * @param {Number} x The x-position of the listener.\n * @param {Number} y The y-position of the listener.\n * @param {Number} z The z-position of the listener.\n * @return {Howler/Array} Self or current listener position.\n */\n HowlerGlobal.prototype.pos = function(x, y, z) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._pos[1] : y;\n z = (typeof z !== 'number') ? self._pos[2] : z;\n\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n\n if (typeof self.ctx.listener.positionX !== 'undefined') {\n self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n }\n } else {\n return self._pos;\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the listener is pointing in the 3D cartesian space.\n * A front and up vector must be provided. The front is the direction the\n * face of the listener is pointing, and up is the direction the top of the\n * listener is pointing. Thus, these values are expected to be at right angles\n * from each other.\n * @param {Number} x The x-orientation of the listener.\n * @param {Number} y The y-orientation of the listener.\n * @param {Number} z The z-orientation of the listener.\n * @param {Number} xUp The x-orientation of the top of the listener.\n * @param {Number} yUp The y-orientation of the top of the listener.\n * @param {Number} zUp The z-orientation of the top of the listener.\n * @return {Howler/Array} Returns self or the current orientation vectors.\n */\n HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n var or = self._orientation;\n y = (typeof y !== 'number') ? or[1] : y;\n z = (typeof z !== 'number') ? or[2] : z;\n xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n if (typeof x === 'number') {\n self._orientation = [x, y, z, xUp, yUp, zUp];\n\n if (typeof self.ctx.listener.forwardX !== 'undefined') {\n self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upX.setTargetAtTime(xUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upY.setTargetAtTime(yUp, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upZ.setTargetAtTime(zUp, Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n }\n } else {\n return or;\n }\n\n return self;\n };\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core init.\n * @param {Function} _super Core init method.\n * @return {Howl}\n */\n Howl.prototype.init = (function(_super) {\n return function(o) {\n var self = this;\n\n // Setup user-defined default properties.\n self._orientation = o.orientation || [1, 0, 0];\n self._stereo = o.stereo || null;\n self._pos = o.pos || null;\n self._pannerAttr = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n };\n\n // Setup event listeners.\n self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n // Complete initilization with howler.js core's init function.\n return _super.call(this, o);\n };\n })(Howl.prototype.init);\n\n /**\n * Get/set the stereo panning of the audio source for this sound or all in the group.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Number} Returns self or the current stereo panning value.\n */\n Howl.prototype.stereo = function(pan, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'stereo',\n action: function() {\n self.stereo(pan, id);\n }\n });\n\n return self;\n }\n\n // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n // Setup the group's stereo panning if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's stereo panning if no parameters are passed.\n if (typeof pan === 'number') {\n self._stereo = pan;\n self._pos = [pan, 0, 0];\n } else {\n return self._stereo;\n }\n }\n\n // Change the streo panning of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the group's values.\n * pannerAttr(id) -> Returns the sound id's values.\n * pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n * pannerAttr(o, id) -> Set's the values of passed sound id.\n *\n * Attributes:\n * coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * inside of which there will be no volume reduction.\n * coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n * `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n * listener. Can be `linear`, `inverse` or `exponential.\n * maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n * will not be reduced any further.\n * refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n * This is simply a variable of the distance model and has a different effect depending on which model\n * is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n * variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, \u221E]`\n * with `inverse` and `exponential`.\n * panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n * Can be `HRTF` or `equalpower`.\n *\n * @return {Howl/Object} Returns self or current panner attributes.\n */\n Howl.prototype.pannerAttr = function() {\n var self = this;\n var args = arguments;\n var o, id, sound;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the group's panner attribute values.\n return self._pannerAttr;\n } else if (args.length === 1) {\n if (typeof args[0] === 'object') {\n o = args[0];\n\n // Set the grou's panner attribute values.\n if (typeof id === 'undefined') {\n if (!o.pannerAttr) {\n o.pannerAttr = {\n coneInnerAngle: o.coneInnerAngle,\n coneOuterAngle: o.coneOuterAngle,\n coneOuterGain: o.coneOuterGain,\n distanceModel: o.distanceModel,\n maxDistance: o.maxDistance,\n refDistance: o.refDistance,\n rolloffFactor: o.rolloffFactor,\n panningModel: o.panningModel\n };\n }\n\n self._pannerAttr = {\n coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n };\n }\n } else {\n // Return this sound's panner attribute values.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._pannerAttr : self._pannerAttr;\n }\n } else if (args.length === 2) {\n o = args[0];\n id = parseInt(args[1], 10);\n }\n\n // Update the values of the specified sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i 0) {\r\n this._myAddVelocityDelay--;\r\n if (this._myAddVelocityDelay == 0) {\r\n for (let physX of this._myDynamicPhysXComponents) {\r\n physX.kinematic = false;\r\n let strength = 50;\r\n physX.linearVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n physX.angularVelocity = [Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength)];\r\n }\r\n }\r\n }\r\n\r\n for (let physX of this._myKinematicPhysXObjects) {\r\n let strength = 5 * dt;\r\n this._myTranslateVec3.vec3_set(Math.pp_random(-strength, strength), Math.pp_random(-strength, strength), Math.pp_random(-strength, strength));\r\n physX.pp_translate(this._myTranslateVec3);\r\n\r\n rotateStrength = 50 * dt;\r\n this._myRotateVec3.vec3_set(Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength), Math.pp_random(-rotateStrength, rotateStrength));\r\n physX.pp_rotate(this._myRotateVec3);\r\n }\r\n },\r\n _raycastTest(debugActive) {\r\n let raycastCount = this._myRaycastCount;\r\n\r\n let distance = 10000;\r\n\r\n for (let i = 0; i < raycastCount; i++) {\r\n let origin = [Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign(), Math.pp_random(1, 2) * Math.pp_randomSign()];\r\n let direction = [Math.pp_random(-1, 1), Math.pp_random(-1, 1), Math.pp_random(-1, 1)];\r\n direction.vec3_normalize(direction);\r\n\r\n this._myRaycastSetup.myOrigin.vec3_copy(origin);\r\n this._myRaycastSetup.myDirection.vec3_copy(direction);\r\n this._myRaycastSetup.myDistance = distance;\r\n this._myRaycastSetup.myBlockLayerFlags.setMask(255);\r\n\r\n let raycastResult = PP.PhysicsUtils.raycast(this._myRaycastSetup, this._myRaycastResult);\r\n\r\n if (debugActive) {\r\n PP.myDebugVisualManager.drawRaycast(this._myDebugTimer.getDuration(), raycastResult, true, 5, 0.015);\r\n }\r\n }\r\n },\r\n _spawnDome(isStatic, isDynamic) {\r\n let maxCount = this._myStaticPhysXCount;\r\n let physXList = this._myStaticPhysXObjects;\r\n let cloves = Math.ceil(Math.sqrt(this._myStaticPhysXCount));\r\n if (!isStatic) {\r\n if (isDynamic) {\r\n cloves = Math.ceil(Math.sqrt(this._myDynamicPhysXCount));\r\n maxCount = this._myDynamicPhysXCount;\r\n physXList = this._myDynamicPhysXObjects;\r\n } else {\r\n cloves = Math.ceil(Math.sqrt(this._myKinematicPhysXCount));\r\n maxCount = this._myKinematicPhysXCount;\r\n physXList = this._myKinematicPhysXObjects;\r\n }\r\n }\r\n\r\n let angleForClove = Math.PI * 2 / cloves;\r\n\r\n let minDistance = Math.max(0, this._myStaticDomeSize - 20);\r\n let maxDistance = this._myStaticDomeSize + 20;\r\n\r\n if (!isStatic) {\r\n if (isDynamic) {\r\n minDistance = Math.max(0, this._myDynamicDomeSize - 20);\r\n maxDistance = this._myDynamicDomeSize + 20;\r\n } else {\r\n minDistance = Math.max(0, this._myKinematicDomeSize - 20);\r\n maxDistance = this._myKinematicDomeSize + 20;\r\n }\r\n }\r\n\r\n let minExtraRotation = 0;\r\n let maxExtraRotation = Math.pp_toRadians(10);\r\n\r\n let upDirection = [0, 1, 0];\r\n let horizontalDirection = [0, 0, -1];\r\n\r\n for (let i = 0; i < cloves / 2; i++) {\r\n let verticalDirection = [0, 1, 0];\r\n\r\n let rotationAxis = [];\r\n glMatrix.vec3.cross(rotationAxis, horizontalDirection, verticalDirection);\r\n glMatrix.vec3.normalize(rotationAxis, rotationAxis);\r\n\r\n for (let j = 0; j < cloves; j++) {\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.slice(0);\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n glMatrix.vec3.scale(physXDirection, physXDirection, distance);\r\n\r\n this._addPhysX(physXDirection, isStatic, isDynamic);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n if (physXList.length < maxCount) {\r\n let distance = Math.random() * (maxDistance - minDistance) + minDistance;\r\n let extraAxisRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let extraUpRotation = (Math.random() * 2 - 1) * (maxExtraRotation - minExtraRotation) + minExtraRotation;\r\n let physXDirection = verticalDirection.slice(0);\r\n\r\n physXDirection.vec3_rotateAxisRadians(extraAxisRotation, rotationAxis, physXDirection);\r\n physXDirection.vec3_rotateAxisRadians(extraUpRotation, upDirection, physXDirection);\r\n\r\n glMatrix.vec3.scale(physXDirection, physXDirection, distance);\r\n\r\n this._addPhysX(physXDirection, isStatic, isDynamic);\r\n }\r\n\r\n verticalDirection.vec3_rotateAxisRadians(angleForClove / 2, rotationAxis, verticalDirection);\r\n\r\n }\r\n\r\n horizontalDirection.vec3_rotateAxisRadians(angleForClove, upDirection, horizontalDirection);\r\n }\r\n },\r\n _addPhysX(physXDirection, isStatic, isDynamic) {\r\n let position = physXDirection;\r\n let scale = Math.pp_random(1, 10);\r\n let shape = Math.pp_randomPick(WL.Shape.Sphere, WL.Shape.Box);\r\n if (this._myUseConvexMesh) {\r\n shape = WL.Shape.ConvexMesh;\r\n scale *= this._myShapeScaleMultiplier;\r\n }\r\n\r\n let physX = WL.scene.addObject(this._myRootObject);\r\n physX.pp_setPosition(position);\r\n\r\n let physXComponent = physX.pp_addComponent(\"physx\", {\r\n \"shape\": shape, \"shapeData\": { index: this._myShapeIndex },\r\n \"extents\": [scale, scale, scale],\r\n \"static\": isStatic,\r\n \"kinematic\": !isDynamic,\r\n \"mass\": 1\r\n });\r\n\r\n if (isStatic) {\r\n this._myStaticPhysXObjects.push(physX);\r\n this._myStaticPhysXComponents.push(physXComponent);\r\n this._myStaticPhysXCollectors.push(new PP.PhysXCollisionCollector(physXComponent));\r\n } else if (isDynamic) {\r\n this._myDynamicPhysXObjects.push(physX);\r\n this._myDynamicPhysXComponents.push(physXComponent);\r\n this._myDynamicPhysXCollectors.push(new PP.PhysXCollisionCollector(physXComponent));\r\n } else {\r\n this._myKinematicPhysXObjects.push(physX);\r\n this._myKinematicPhysXComponents.push(physXComponent);\r\n this._myKinematicPhysXCollectors.push(new PP.PhysXCollisionCollector(physXComponent));\r\n }\r\n }\r\n});", "WL.registerComponent(\"pp-benchmark-max-visible-triangles\", {\r\n _myTargetFrameRate: { type: WL.Type.Int, default: -1 }, // -1 means it will auto detect it at start\r\n _myTargetFrameRateThreshold: { type: WL.Type.Int, default: 3 },\r\n _myStartPlaneCount: { type: WL.Type.Int, default: 1 },\r\n _myPlaneTriangles: { type: WL.Type.Int, default: 100 },\r\n _mySecondsBeforeDoubling: { type: WL.Type.Float, default: 0.5 }, // higher gives a better frame rate evaluation\r\n _myDTHistoryToIgnorePercentage: { type: WL.Type.Float, default: 0.25 },\r\n _myCloneMaterial: { type: WL.Type.Bool, default: false },\r\n _myCloneMesh: { type: WL.Type.Bool, default: false },\r\n\r\n _myEnableLog: { type: WL.Type.Bool, default: true },\r\n\r\n _myPlaneMaterial: { type: WL.Type.Material },\r\n _myBackgroundMaterial: { type: WL.Type.Material },\r\n _myTextMaterial: { type: WL.Type.Material, default: null },\r\n}, {\r\n _start() {\r\n this._myBackgroundSize = 4;\r\n this._myBackgroundObject.pp_setActive(true);\r\n this._myBackgroundObject.pp_setScale(this._myBackgroundSize + 0.1);\r\n this._myBackgroundObject.pp_translate([0, 0, -0.001]);\r\n\r\n this._myDoubleTimer = new PP.Timer(this._mySecondsBeforeDoubling);\r\n this._myIsDone = false;\r\n\r\n this._myCurrentPlanes = this._myStartPlaneCount;\r\n\r\n this._myDTHistory = [];\r\n\r\n this._myUpperLimit = -1;\r\n this._myLowerLimit = 0;\r\n\r\n this._myPlanes = [];\r\n this._mySkipNextFrames = 0;\r\n this._myMaxWaitFrames = 0;\r\n\r\n this._myMaxPlanesReached = false;\r\n\r\n this._myFirstTime = true;\r\n },\r\n _update(dt) {\r\n // Skip lag frames after the new set of plane has been shown, wait for it to be stable\r\n {\r\n if (dt < 0.00001) {\r\n return;\r\n }\r\n\r\n if (dt > 0.5 && this._myMaxWaitFrames > 0) {\r\n this._myMaxWaitFrames--;\r\n return;\r\n }\r\n\r\n this._myMaxWaitFrames = 10;\r\n\r\n if (this._mySkipNextFrames > 0) {\r\n this._mySkipNextFrames--;\r\n return;\r\n }\r\n }\r\n\r\n if (!this._myIsDone) {\r\n this._myDoubleTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myDoubleTimer.isDone()) {\r\n this._myDoubleTimer.start();\r\n\r\n let frameRate = this._computeAverageFrameRate(false);\r\n\r\n if (this._myFirstTime) {\r\n this._myFirstTime = false;\r\n } else {\r\n\r\n // if there is not lag, the current plane count is a good lower limit, otherwise the current count is now a upper threshold, we have to search below it\r\n let isLagging = false;\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n this._myUpperLimit = this._myCurrentPlanes;\r\n\r\n isLagging = true;\r\n\r\n if (this._myUpperLimit == 1) {\r\n this._myLowerLimit = 1;\r\n }\r\n } else {\r\n this._myLowerLimit = this._myCurrentPlanes;\r\n if (this._myUpperLimit > 0) {\r\n this._myUpperLimit = Math.max(this._myUpperLimit, this._myLowerLimit);\r\n }\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myCurrentPlanes * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myCurrentPlanes;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n if (isLagging) {\r\n this._myTriangleTextComponent.material.color = this._myLagColor;\r\n this._myPlaneTextComponent.material.color = this._myLagColor;\r\n this._myFPSTextComponent.material.color = this._myLagColor;\r\n } else {\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n }\r\n\r\n let reset = false;\r\n\r\n // check if the binary search is completed\r\n if ((this._myUpperLimit > 0 &&\r\n (!isLagging && (this._myUpperLimit - this._myLowerLimit) <= Math.max(2, 1000 / this._myRealTrianglesAmount)) ||\r\n (isLagging && (this._myUpperLimit - this._myLowerLimit) <= 1)) ||\r\n (!isLagging && this._myMaxPlanesReached)) {\r\n if (frameRate < this._myStableFrameRate - this._myTargetFrameRateThreshold) {\r\n // going a bit back with the binary search, maybe the lower limit was not lower after all cause of a bad assumption of average FPS\r\n this._myLowerLimit = Math.max(1, Math.floor(this._myUpperLimit / 2.5));\r\n this._myUpperLimit = 0;\r\n reset = true;\r\n\r\n if (this._myEnableLog) {\r\n console.log(\"Rst - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n } else {\r\n if (this._myMaxPlanesReached) {\r\n if (this._myEnableLog) {\r\n console.log(\"Aborted - Max Planes Reached\");\r\n\r\n this._myDoneTextComponent.text = \"Aborted - Max Planes Reached\";\r\n }\r\n } else {\r\n this._displayPlanes(this._myLowerLimit);\r\n\r\n if (this._myEnableLog) {\r\n console.log(\"\\nEnd - Triangles:\", this._myLowerLimit * this._myRealTrianglesAmount, \"- Planes:\", this._myLowerLimit, \"- Frame Rate:\", frameRate);\r\n console.log(\"Plane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n }\r\n\r\n this._myTriangleTextComponent.text = \"Triangles: \" + this._myLowerLimit * this._myRealTrianglesAmount;\r\n this._myPlaneTextComponent.text = \"Planes: \" + this._myLowerLimit;\r\n this._myFPSTextComponent.text = \"FPS: \" + frameRate + \" / \" + this._myStableFrameRate;\r\n\r\n this._myDoneTextComponent.text = \"End\";\r\n }\r\n this._myIsDone = true;\r\n }\r\n }\r\n\r\n if (isLagging && !reset) {\r\n if (this._myEnableLog) {\r\n console.log(\"Lag - Triangles:\", this._myCurrentPlanes * this._myRealTrianglesAmount, \"- Planes:\", this._myCurrentPlanes, \"- Frame Rate:\", frameRate);\r\n }\r\n }\r\n\r\n if (!this._myIsDone) {\r\n // sort of binary search, if there is no upper limit yet, just double\r\n if (this._myUpperLimit > 0) {\r\n this._myCurrentPlanes = Math.floor((this._myUpperLimit + this._myLowerLimit) / 2);\r\n this._myCurrentPlanes = Math.max(this._myCurrentPlanes, 1);\r\n } else if (!reset) {\r\n this._myCurrentPlanes = this._myLowerLimit * 2;\r\n } else {\r\n this._myCurrentPlanes = this._myLowerLimit;\r\n }\r\n\r\n if (this._myCurrentPlanes > 50000) {\r\n this._myCurrentPlanes = 50000;\r\n this._myMaxPlanesReached = true;\r\n } else {\r\n this._myMaxPlanesReached = false;\r\n }\r\n }\r\n }\r\n\r\n if (!this._myIsDone) {\r\n this._displayPlanes(this._myCurrentPlanes);\r\n this._myElapsedTime = 0;\r\n this._myFrameCount = 0;\r\n\r\n this._mySkipNextFrames = 30;\r\n }\r\n }\r\n }\r\n },\r\n _displayPlanes(count) {\r\n while (this._myPlanes.length > count) {\r\n let plane = this._myPlanes.pop();\r\n this._myPlanePool.release(plane);\r\n }\r\n\r\n while (this._myPlanes.length < count) {\r\n let plane = this._myPlanePool.get();\r\n this._myPlanes.push(plane);\r\n }\r\n\r\n let gridSize = 1;\r\n while (gridSize * gridSize < count) {\r\n gridSize++;\r\n }\r\n\r\n let spaceBetween = 0.01;\r\n let totalSpaceBetween = spaceBetween * (gridSize - 1);\r\n let planeSize = (this._myBackgroundSize * 2 - totalSpaceBetween) / (gridSize * 2);\r\n\r\n let currentCount = count;\r\n\r\n for (let i = 0; i < gridSize && currentCount > 0; i++) {\r\n for (let j = 0; j < gridSize && currentCount > 0; j++) {\r\n let plane = this._myPlanes[currentCount - 1];\r\n plane.pp_setScale(planeSize);\r\n\r\n let position = [-this._myBackgroundSize + planeSize + j * planeSize * 2 + j * spaceBetween, this._myBackgroundSize - planeSize - i * planeSize * 2 - i * spaceBetween, 0];\r\n\r\n plane.pp_setPositionLocal(position);\r\n plane.pp_setActive(true);\r\n\r\n currentCount--;\r\n }\r\n }\r\n },\r\n start() {\r\n this._myLagColor = [0.5, 0, 0, 1];\r\n this._myNormalColor = [0, 0, 0, 1];\r\n\r\n this._myRealTrianglesAmount = 0;\r\n\r\n this._myTrianglesObject = WL.scene.addObject(this.object);\r\n\r\n this._myBackgroundObject = WL.scene.addObject(this._myTrianglesObject);\r\n {\r\n let meshComponent = this._myBackgroundObject.addComponent('mesh');\r\n meshComponent.mesh = PP.MeshUtils.createPlaneMesh();\r\n meshComponent.material = this._myBackgroundMaterial.clone();\r\n }\r\n\r\n this._myPlaneObject = WL.scene.addObject(this._myTrianglesObject);\r\n {\r\n let meshComponent = this._myPlaneObject.addComponent('mesh');\r\n meshComponent.mesh = this._createPlaneMesh(this._myPlaneTriangles);\r\n this._myRealTrianglesAmount = meshComponent.mesh.indexData.length / 3;\r\n meshComponent.material = this._myPlaneMaterial.clone();\r\n }\r\n\r\n let poolParams = new PP.ObjectPoolParams();\r\n if (!this._myCloneMesh) {\r\n poolParams.myInitialPoolSize = 30000;\r\n } else {\r\n if (this._myRealTrianglesAmount <= 4) {\r\n poolParams.myInitialPoolSize = 15000;\r\n } else if (this._myRealTrianglesAmount <= 8) {\r\n poolParams.myInitialPoolSize = 10000;\r\n } else if (this._myRealTrianglesAmount <= 64) {\r\n poolParams.myInitialPoolSize = 7500;\r\n } else {\r\n poolParams.myInitialPoolSize = 5000;\r\n }\r\n }\r\n poolParams.myPercentageToAddWhenEmpty = 0;\r\n poolParams.myAmountToAddWhenEmpty = 10000;\r\n poolParams.myCloneParams = new PP.CloneParams();\r\n poolParams.myCloneParams.myDeepCloneParams.setDeepCloneComponentVariable(\"mesh\", \"material\", this._myCloneMaterial);\r\n poolParams.myCloneParams.myDeepCloneParams.setDeepCloneComponentVariable(\"mesh\", \"mesh\", this._myCloneMesh);\r\n this._myPlanePool = new PP.ObjectPool(this._myPlaneObject, poolParams);\r\n\r\n this._myBackgroundObject.pp_setActive(false);\r\n this._myPlaneObject.pp_setActive(false);\r\n\r\n this._myStartTimer = new PP.Timer(this._mySecondsBeforeDoubling * 2);\r\n this._mySessionStarted = false;\r\n\r\n this._myTextsObject = WL.scene.addObject(this._myTrianglesObject);\r\n //this._myTextsObject.pp_addComponent(\"pp-easy-transform\");\r\n\r\n this._myTriangleTextObject = WL.scene.addObject(this._myTextsObject);\r\n //this._myTriangleTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myTriangleTextComponent = this._myTriangleTextObject.addComponent('text');\r\n\r\n this._myTriangleTextComponent.alignment = WL.Alignment.Left;\r\n this._myTriangleTextComponent.justification = WL.Justification.Line;\r\n this._myTriangleTextComponent.material = this._myTextMaterial.clone();\r\n this._myTriangleTextComponent.material.color = this._myNormalColor;\r\n this._myTriangleTextComponent.text = \" \";\r\n //this._myTriangleTextComponent.text = \"Triangles: 9999999\";\r\n\r\n this._myPlaneTextObject = WL.scene.addObject(this._myTextsObject);\r\n\r\n this._myPlaneTextComponent = this._myPlaneTextObject.addComponent('text');\r\n //this._myPlaneTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myPlaneTextComponent.alignment = WL.Alignment.Left;\r\n this._myPlaneTextComponent.justification = WL.Justification.Line;\r\n this._myPlaneTextComponent.material = this._myTextMaterial.clone();\r\n this._myPlaneTextComponent.material.color = this._myNormalColor;\r\n this._myPlaneTextComponent.text = \" \";\r\n //this._myPlaneTextComponent.text = \"Planes: 9999999\";\r\n\r\n this._myFPSTextObject = WL.scene.addObject(this._myTextsObject);\r\n\r\n this._myFPSTextComponent = this._myFPSTextObject.addComponent('text');\r\n //this._myFPSTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myFPSTextComponent.alignment = WL.Alignment.Left;\r\n this._myFPSTextComponent.justification = WL.Justification.Line;\r\n this._myFPSTextComponent.material = this._myTextMaterial.clone();\r\n this._myFPSTextComponent.material.color = this._myNormalColor;\r\n this._myFPSTextComponent.text = \" \";\r\n //this._myFPSTextComponent.text = \"FPS: 99.99\";\r\n\r\n this._myDoneTextObject = WL.scene.addObject(this._myTrianglesObject);\r\n\r\n this._myDoneTextComponent = this._myDoneTextObject.addComponent('text');\r\n //this._myDoneTextObject.pp_addComponent(\"pp-easy-transform\", { _myIsLocal: true });\r\n\r\n this._myDoneTextComponent.alignment = WL.Alignment.Center;\r\n this._myDoneTextComponent.justification = WL.Justification.Line;\r\n this._myDoneTextComponent.material = this._myTextMaterial.clone();\r\n this._myDoneTextComponent.material.color = this._myNormalColor;\r\n this._myDoneTextComponent.text = \" \";\r\n //this._myDoneTextComponent.text = \"End\";\r\n\r\n this._myTextsObject.pp_setPositionLocal([0, 4.3, 0]);\r\n this._myTextsObject.pp_setScale(2.75);\r\n\r\n this._myTriangleTextObject.pp_setPositionLocal([-1.4, 0, 0]);\r\n this._myPlaneTextObject.pp_setPositionLocal([0.55, 0, 0]);\r\n this._myFPSTextObject.pp_setPositionLocal([-0.315, 0, 0]);\r\n this._myDoneTextObject.pp_setPositionLocal([0, -4.6, 0]);\r\n this._myDoneTextObject.pp_setScale(4);\r\n\r\n this._myDTHistory = [];\r\n },\r\n update(dt) {\r\n if (this._mySessionStarted) {\r\n if (this._myStartTimer.isRunning()) {\r\n this._myStartTimer.update(dt);\r\n\r\n this._myDTHistory.push(dt);\r\n\r\n if (this._myStartTimer.isDone()) {\r\n this._myStableFrameRate = this._computeAverageFrameRate(true);\r\n if (this._myTargetFrameRate > 0) {\r\n this._myStableFrameRate = this._myTargetFrameRate;\r\n }\r\n\r\n if (this._myEnableLog) {\r\n console.log(\"\\nPlane Triangles (Adjusted):\", this._myRealTrianglesAmount);\r\n console.log(\"Target Frame Rate:\", this._myStableFrameRate, \"- Threshold: \", (this._myStableFrameRate - this._myTargetFrameRateThreshold));\r\n console.log(\"\");\r\n }\r\n this._start();\r\n }\r\n } else {\r\n this._update(dt);\r\n }\r\n } else {\r\n this._mySessionStarted = WL.xrSession != null;\r\n }\r\n },\r\n _computeAverageFrameRate(isStart) {\r\n let frameRate = 0;\r\n\r\n this._myDTHistory.sort();\r\n let elementToRemove = Math.floor(this._myDTHistory.length) * Math.min(0.9, this._myDTHistoryToIgnorePercentage * (isStart ? 2 : 1));\r\n for (let i = 0; i < elementToRemove; i++) {\r\n this._myDTHistory.pop();\r\n }\r\n\r\n let averageDT = 0;\r\n for (let dt of this._myDTHistory) {\r\n averageDT += dt;\r\n }\r\n averageDT /= this._myDTHistory.length;\r\n frameRate = Math.round(1 / averageDT);\r\n\r\n this._myDTHistory = [];\r\n\r\n return frameRate;\r\n },\r\n _createPlaneMesh(trianglesAmount) {\r\n let squaresAmount = Math.ceil(trianglesAmount / 2);\r\n\r\n let row = 1;\r\n let column = 1;\r\n\r\n let closestSqrt = 1;\r\n while (closestSqrt * closestSqrt < squaresAmount) {\r\n closestSqrt++;\r\n }\r\n\r\n row = closestSqrt;\r\n column = closestSqrt;\r\n\r\n while (row > 1 && column > 1 && row * column > squaresAmount && ((row - 1) * column >= squaresAmount)) {\r\n row--;\r\n }\r\n\r\n let meshParams = new PP.MeshCreationParams();\r\n\r\n for (let i = 0; i < row + 1; i++) {\r\n for (let j = 0; j < column + 1; j++) {\r\n\r\n let x = (2 / column) * j;\r\n let y = (2 / row) * i;\r\n\r\n let vertexParams = new PP.MeshCreationVertexParams();\r\n\r\n vertexParams.myPosition = new PP.vec3_create();\r\n vertexParams.myPosition[0] = x - 1;\r\n vertexParams.myPosition[1] = y - 1;\r\n vertexParams.myPosition[2] = 0;\r\n\r\n vertexParams.myTextureCoordinates = new PP.vec2_create();\r\n vertexParams.myTextureCoordinates[0] = x / 2;\r\n vertexParams.myTextureCoordinates[1] = y / 2;\r\n\r\n vertexParams.myNormal = new PP.vec3_create();\r\n vertexParams.myNormal[0] = 0;\r\n vertexParams.myNormal[1] = 0;\r\n vertexParams.myNormal[2] = 1;\r\n\r\n meshParams.myVertexes.push(vertexParams);\r\n }\r\n }\r\n\r\n for (let i = 0; i < row; i++) {\r\n for (let j = 0; j < column; j++) {\r\n let firstTriangle = new PP.MeshCreationTriangleParams();\r\n firstTriangle.myIndexes[0] = (i * (column + 1)) + j;\r\n firstTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n firstTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j;\r\n\r\n let secondTriangle = new PP.MeshCreationTriangleParams();\r\n secondTriangle.myIndexes[0] = ((i + 1) * (column + 1)) + j;\r\n secondTriangle.myIndexes[1] = (i * (column + 1)) + j + 1;\r\n secondTriangle.myIndexes[2] = ((i + 1) * (column + 1)) + j + 1;\r\n\r\n meshParams.myTriangles.push(firstTriangle);\r\n meshParams.myTriangles.push(secondTriangle);\r\n }\r\n }\r\n\r\n let mesh = PP.MeshUtils.createMesh(meshParams);\r\n\r\n return mesh;\r\n }\r\n});", "//This is added just to make it easy to just use plain number instead of doing new PP.NumberOverValue() \r\n//You can remove this if it cause issues but you won't be able anymore to use plain number and will have to use new PP.NumberOverValue() \r\nNumber.prototype.get = function () {\r\n return this.valueOf();\r\n};\r\nObject.defineProperty(Number.prototype, \"get\", { enumerable: false });\r\n\r\n//You can just put startNumber if u want a number that doesn't actually change -> new PP.NumberOverValue(13)\r\nPP.NumberOverValue = class NumberOverValue {\r\n constructor(startNumber, endNumber = null, startInterpolationValue = 0, endInterpolationValue = 0, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (endNumber == null) {\r\n endNumber = startNumber;\r\n }\r\n\r\n this._myStartNumber = startNumber;\r\n this._myEndNumber = endNumber;\r\n\r\n this._myStartInterpolationValue = startInterpolationValue;\r\n this._myEndInterpolationValue = endInterpolationValue;\r\n\r\n this._myEasingFunction = easingFunction;\r\n this._myRoundingFunction = roundingFunction; // function(numberToRound, startNumber = null, endNumber = null), Math.round/floor/ceil can be used, must return an int\r\n }\r\n\r\n get(interpolationValue) {\r\n let lerpInterpolationValue = this._myEasingFunction(Math.pp_mapToRange(interpolationValue, this._myStartInterpolationValue, this._myEndInterpolationValue, 0, 1));\r\n let lerpNumber = Math.pp_lerp(this._myStartNumber, this._myEndNumber, lerpInterpolationValue);\r\n\r\n if (this._myRoundingFunction) {\r\n lerpNumber = this._myRoundingFunction(lerpNumber, this._myStartNumber, this._myEndNumber);\r\n }\r\n\r\n return lerpNumber;\r\n }\r\n\r\n getAverage(interpolationValue) {\r\n return this.get(interpolationValue);\r\n }\r\n\r\n getRange(interpolationValue) {\r\n let number = this.get(interpolationValue);\r\n return [number, number];\r\n }\r\n\r\n getMax(interpolationValue) {\r\n return this.get(interpolationValue);\r\n }\r\n\r\n getMin(interpolationValue) {\r\n return this.get(interpolationValue);\r\n }\r\n\r\n isInside(number, interpolationValue) {\r\n let currentNumber = this.get(interpolationValue);\r\n\r\n return currentNumber == number;\r\n }\r\n\r\n isInsideAngleRange(number, interpolationValue) {\r\n return this.isInsideAngleRangeDegrees(number, interpolationValue);\r\n }\r\n\r\n isInsideAngleRangeDegrees(number, interpolationValue) {\r\n let currentNumber = this.get(interpolationValue);\r\n\r\n let clampedNumber = Math.pp_angleClampDegrees(number);\r\n let clampedCurrentNumber = Math.pp_angleClampDegrees(currentNumber);\r\n\r\n return clampedNumber == clampedCurrentNumber;\r\n }\r\n\r\n isInsideAngleRangeRadians(number, interpolationValue) {\r\n let currentNumber = this.get(interpolationValue);\r\n\r\n let clampedNumber = Math.pp_angleClampRadians(number);\r\n let clampedCurrentNumber = Math.pp_angleClampRadians(currentNumber);\r\n\r\n return clampedNumber == clampedCurrentNumber;\r\n }\r\n};\r\n\r\nPP.IntOverValue = class IntOverValue extends PP.NumberOverValue {\r\n constructor(startNumber, endNumber, startInterpolationValue, endInterpolationValue, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (numberToRound, startNumber, endNumber) {\r\n let roundedNumber = null;\r\n\r\n let useFloor = startNumber <= endNumber;\r\n if (useFloor) {\r\n roundedNumber = Math.floor(numberToRound);\r\n } else {\r\n roundedNumber = Math.ceil(numberToRound);\r\n }\r\n\r\n return roundedNumber;\r\n };\r\n }\r\n\r\n super(startNumber, endNumber, startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n }\r\n};\r\n\r\n//You can just put startRange if u want a range that doesn't actually change -> new PP.NumberOverValue([1,25])\r\nPP.NumberRangeOverValue = class NumberRangeOverValue {\r\n constructor(startRange, endRange = null, startInterpolationValue = 0, endInterpolationValue = 0, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (endRange == null) {\r\n endRange = startRange;\r\n }\r\n\r\n this._myStartNumberOverValue = new PP.NumberOverValue(startRange[0], endRange[0], startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n this._myEndNumberOverValue = new PP.NumberOverValue(startRange[1], endRange[1], startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n\r\n this._myRoundingFunction = roundingFunction; // function(numberToRound, startNumber = null, endNumber = null), Math.round/floor/ceil can be used, must return an int\r\n }\r\n\r\n get(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n let randomValue = null;\r\n\r\n if (this._myRoundingFunction) {\r\n randomValue = Math.pp_randomInt(startNumber, endNumber);\r\n } else {\r\n randomValue = Math.pp_random(startNumber, endNumber);\r\n }\r\n\r\n return randomValue;\r\n }\r\n\r\n getAverage(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n let average = (startNumber + endNumber) / 2;\r\n if (this._myRoundingFunction) {\r\n average = this._myRoundingFunction(average, startNumber, endNumber);\r\n }\r\n\r\n return average;\r\n }\r\n\r\n getRange(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return [startNumber, endNumber];\r\n }\r\n\r\n getMax(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.max(startNumber, endNumber);\r\n }\r\n\r\n getMin(interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.min(startNumber, endNumber);\r\n }\r\n\r\n isInside(number, interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n let min = Math.min(startNumber, endNumber);\r\n let max = Math.max(startNumber, endNumber);\r\n\r\n return number >= min && number <= max;\r\n }\r\n\r\n isInsideAngleRange(number, interpolationValue) {\r\n return this.isInsideAngleRangeDegrees(number, interpolationValue);\r\n }\r\n\r\n isInsideAngleRangeDegrees(number, interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.pp_isInsideAngleRangeDegrees(number, startNumber, endNumber);\r\n }\r\n\r\n isInsideAngleRangeRadians(number, interpolationValue) {\r\n let startNumber = this._myStartNumberOverValue.get(interpolationValue);\r\n let endNumber = this._myEndNumberOverValue.get(interpolationValue);\r\n\r\n return Math.pp_isInsideAngleRangeRadians(number, startNumber, endNumber);\r\n }\r\n};\r\n\r\nPP.IntRangeOverValue = class IntRangeOverValue extends PP.NumberRangeOverValue {\r\n constructor(startRange, endRange, startInterpolationValue, endInterpolationValue, easingFunction = PP.EasingFunction.linear, roundingFunction = null) {\r\n if (roundingFunction == null) {\r\n roundingFunction = function (numberToRound, startNumber, endNumber) {\r\n let roundedNumber = null;\r\n\r\n let useFloor = startNumber <= endNumber;\r\n if (useFloor) {\r\n roundedNumber = Math.floor(numberToRound);\r\n } else {\r\n roundedNumber = Math.ceil(numberToRound);\r\n }\r\n\r\n return roundedNumber;\r\n };\r\n }\r\n\r\n super(startRange, endRange, startInterpolationValue, endInterpolationValue, easingFunction, roundingFunction);\r\n }\r\n};", "PP.ObjectPoolManager = class ObjectPoolManager {\r\n constructor() {\r\n this._myPoolMap = new Map();\r\n }\r\n\r\n addPool(poolID, poolObject, objectPoolParams = new PP.ObjectPoolParams()) {\r\n if (!this._myPoolMap.has(poolID)) {\r\n let pool = new PP.ObjectPool(poolObject, objectPoolParams);\r\n this._myPoolMap.set(poolID, pool);\r\n } else {\r\n console.error(\"Pool already created with this ID\");\r\n }\r\n }\r\n\r\n increasePool(poolID, amount) {\r\n let pool = this._myPoolMap.get(poolID);\r\n if (pool) {\r\n pool.increase(amount);\r\n }\r\n }\r\n\r\n increasePoolPercentage(poolID, percentage) {\r\n let pool = this._myPoolMap.get(poolID);\r\n if (pool) {\r\n pool.increasePercentage(percentage);\r\n }\r\n }\r\n\r\n getPool(poolID) {\r\n return this._myPoolMap.get(poolID);\r\n }\r\n\r\n hasPool(poolID) {\r\n return this._myPoolMap.has(poolID);\r\n }\r\n\r\n getObject(poolID) {\r\n if (this._myPoolMap.has(poolID)) {\r\n return this._myPoolMap.get(poolID).get();\r\n }\r\n\r\n return null;\r\n }\r\n\r\n releaseObject(poolID, object) {\r\n this._myPoolMap.get(poolID).release(object);\r\n }\r\n};\r\n\r\nPP.ObjectPoolParams = class ObjectPoolParams {\r\n constructor() {\r\n this.myInitialPoolSize = 0;\r\n this.myAmountToAddWhenEmpty = 1; //If all the objects are busy, this amount will be added to the pool\r\n this.myPercentageToAddWhenEmpty = 0.5; //If all the objects are busy, this percentage of the current pool size will be added to the pool \r\n\r\n this.myCloneParams = undefined;\r\n\r\n this.myOptimizeObjectsAllocation = true; //If true it will pre-allocate the memory before adding new objects to the pool\r\n\r\n //These extra functions can be used if u want to use the pool with objects that are not from WLE (WL.Object)\r\n this.myCloneCallback = undefined; //Signature: callback(object, cloneParams) -> clonedObject\r\n this.mySetActiveCallback = undefined; //Signature: callback(object, active)\r\n this.myEqualCallback = undefined; //Signature: callback(firstObject, secondObject) -> bool\r\n this.myOptimizeObjectsAllocationCallback = undefined; //Signature: callback(object, numberOfObjectsToAllocate)\r\n\r\n this.myEnableDebugLog = true;\r\n }\r\n};\r\n\r\nPP.ObjectPool = class ObjectPool {\r\n constructor(poolObject, objectPoolParams) {\r\n this._myObjectPoolParams = objectPoolParams;\r\n this._myPrototype = this._clone(poolObject);\r\n\r\n this._myAvailableObjects = [];\r\n this._myBusyObjects = [];\r\n\r\n this._addToPool(objectPoolParams.myInitialPoolSize, false);\r\n }\r\n\r\n get() {\r\n let object = this._myAvailableObjects.shift();\r\n\r\n if (object == null) {\r\n let amountToAdd = Math.ceil(this._myBusyObjects.length * this._myObjectPoolParams.myPercentageToAddWhenEmpty);\r\n amountToAdd += this._myObjectPoolParams.myAmountToAddWhenEmpty;\r\n this._addToPool(amountToAdd, this._myObjectPoolParams.myEnableDebugLog);\r\n object = this._myAvailableObjects.shift();\r\n }\r\n\r\n //object could still be null if the amountToAdd is 0\r\n if (object != null) {\r\n this._myBusyObjects.push(object);\r\n }\r\n\r\n return object;\r\n }\r\n\r\n release(object) {\r\n let released = this._myBusyObjects.pp_remove(this._equals.bind(this, object));\r\n if (released) {\r\n this._setActive(released, false);\r\n this._myAvailableObjects.push(released);\r\n }\r\n }\r\n\r\n increase(amount) {\r\n this._addToPool(amount, false);\r\n }\r\n\r\n increasePercentage(percentage) {\r\n let amount = Math.ceil((this.getSize()) * percentage);\r\n this._addToPool(amount, false);\r\n }\r\n\r\n getSize() {\r\n return this._myBusyObjects.length + this._myAvailableObjects.length;\r\n }\r\n\r\n getAvailableSize() {\r\n return this._myAvailableObjects.length;\r\n }\r\n\r\n getBusySize() {\r\n return this._myAvailableObjects.length;\r\n }\r\n\r\n _addToPool(size, log) {\r\n if (size <= 0) {\r\n return;\r\n }\r\n\r\n if (this._myObjectPoolParams.myOptimizeObjectsAllocation) {\r\n if (this._myObjectPoolParams.myOptimizeObjectsAllocationCallback) {\r\n this._myObjectPoolParams.myOptimizeObjectsAllocationCallback(this._myPrototype, size);\r\n } else if (this._myPrototype.pp_reserveObjectsHierarchy != null) {\r\n this._myPrototype.pp_reserveObjectsHierarchy(size);\r\n }\r\n }\r\n\r\n for (let i = 0; i < size; i++) {\r\n this._myAvailableObjects.push(this._clone(this._myPrototype));\r\n }\r\n\r\n if (log) {\r\n console.warn(\"Added new elements to the pool:\", size);\r\n }\r\n }\r\n\r\n _clone(object) {\r\n let clone = null;\r\n\r\n if (this._myObjectPoolParams.myCloneCallback != null) {\r\n clone = this._myObjectPoolParams.myCloneCallback(object, this._myObjectPoolParams.myCloneParams);\r\n } else if (object.pp_clone != null) {\r\n clone = object.pp_clone(this._myObjectPoolParams.myCloneParams);\r\n } else if (object.clone != null) {\r\n clone = object.clone(this._myObjectPoolParams.myCloneParams);\r\n }\r\n\r\n if (clone == null) {\r\n console.error(\"Object not cloneable, pool will return null\");\r\n } else {\r\n this._setActive(clone, false);\r\n }\r\n\r\n return clone;\r\n }\r\n\r\n _setActive(object, active) {\r\n if (this._myObjectPoolParams.mySetActiveCallback != null) {\r\n this._myObjectPoolParams.mySetActiveCallback(object, active);\r\n } else if (object.pp_setActive != null) {\r\n object.pp_setActive(active);\r\n } else if (object.setActive != null) {\r\n object.setActive(active);\r\n }\r\n }\r\n\r\n _equals(first, second) {\r\n let equals = false;\r\n\r\n if (this._myObjectPoolParams.myEqualCallback != null) {\r\n equals = this._myObjectPoolParams.myEqualCallback(first, second);\r\n } else if (first.pp_equals != null) {\r\n equals = first.pp_equals(second);\r\n } else if (first.equals != null) {\r\n equals = first.equals(second);\r\n } else {\r\n equals = first == second;\r\n }\r\n\r\n return equals;\r\n }\r\n};", "PP.PhysXCollisionCollector = class PhysXCollisionCollector {\r\n constructor(physXComponent, isTrigger = false) {\r\n this._myPhysX = physXComponent;\r\n\r\n this._myIsTrigger = isTrigger;\r\n\r\n this._myCollisions = [];\r\n\r\n this._myCollisionsStart = [];\r\n this._myCollisionsEnd = [];\r\n this._myUpdateActive = false;\r\n this._myCollisionsStartToProcess = [];\r\n this._myCollisionsEndToProcess = [];\r\n\r\n this._myCollisionCallbackID = null;\r\n\r\n this._myIsActive = false;\r\n this.setActive(true);\r\n\r\n this._myDebugActive = false;\r\n\r\n this._myTriggerDesyncFixDelay = new PP.Timer(0.1);\r\n\r\n this._myCollisionCallbacks = new Map(); // Signature: callback(thisPhysX, otherPhysX, collisionType)\r\n this._myCollisionStartCallbacks = new Map(); // Signature: callback(thisPhysX, otherPhysX, collisionType)\r\n this._myCollisionEndCallbacks = new Map(); // Signature: callback(thisPhysX, otherPhysX, collisionType)\r\n\r\n }\r\n\r\n getPhysX() {\r\n return this._myPhysX;\r\n }\r\n\r\n getCollisions() {\r\n return this._myCollisions;\r\n }\r\n\r\n getCollisionsStart() {\r\n return this._myCollisionsStart;\r\n }\r\n\r\n getCollisionsEnd() {\r\n return this._myCollisionsEnd;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myIsActive != active) {\r\n this._myIsActive = active;\r\n\r\n this._myCollisions = [];\r\n\r\n this._myCollisionsStart = [];\r\n this._myCollisionsEnd = [];\r\n this._myUpdateActive = false;\r\n this._myCollisionsStartToProcess = [];\r\n this._myCollisionsEndToProcess = [];\r\n\r\n if (this._myIsActive) {\r\n this._myCollisionCallbackID = this._myPhysX.onCollision(this._onCollision.bind(this));\r\n } else if (this._myCollisionCallbackID != null) {\r\n this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID);\r\n this._myCollisionCallbackID = null;\r\n }\r\n }\r\n }\r\n\r\n //Set to true only if u are going to actually update this object and don't want to lose any collision start/end events prior to updating the first time after activation\r\n setUpdateActive(active) {\r\n this._myUpdateActive = active;\r\n }\r\n\r\n //Update is not mandatory, use it only if u want to access collisions start and end\r\n update(dt) {\r\n if (!this._myIsActive) {\r\n return;\r\n }\r\n\r\n this._myUpdateActive = true;\r\n\r\n this._myCollisionsStart = this._myCollisionsStartToProcess;\r\n this._myCollisionsStartToProcess = [];\r\n\r\n this._myCollisionsEnd = this._myCollisionsEndToProcess;\r\n this._myCollisionsEndToProcess = [];\r\n\r\n if (this._myIsTrigger) {\r\n this._triggerDesyncFix(dt);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this._myCollisionCallbackID != null) {\r\n this._myPhysX.removeCollisionCallback(this._myCollisionCallbackID);\r\n this._myCollisionCallbackID = null;\r\n }\r\n }\r\n\r\n setDebugActive(active) {\r\n this._myDebugActive = active;\r\n }\r\n\r\n registerCollisionEventListener(callbackID, callback) {\r\n this._myCollisionCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCollisionEventListener(callbackID) {\r\n this._myCollisionCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCollisionStartEventListener(callbackID, callback) {\r\n this._myCollisionStartCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCollisionStartEventListener(callbackID) {\r\n this._myCollisionStartCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCollisionEndEventListener(callbackID, callback) {\r\n this._myCollisionEndCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCollisionEndEventListener(callbackID) {\r\n this._myCollisionEndCallbacks.delete(callbackID);\r\n }\r\n\r\n _onCollision(type, physXComponent) {\r\n if (type == WL.CollisionEventType.Touch || type == WL.CollisionEventType.TriggerTouch) {\r\n this._onCollisionStart(physXComponent);\r\n } else if (type == WL.CollisionEventType.TouchLost || type == WL.CollisionEventType.TriggerTouchLost) {\r\n this._onCollisionEnd(physXComponent);\r\n }\r\n\r\n if (this._myCollisionCallbacks.size > 0) {\r\n this._myCollisionCallbacks.forEach(function (callback) { callback(this._myPhysX, physXComponent, type); });\r\n }\r\n }\r\n\r\n _onCollisionStart(physXComponent) {\r\n if (this._myDebugActive) {\r\n let objectFound = false;\r\n for (let object of this._myCollisions) {\r\n if (object.pp_equals(physXComponent.object)) {\r\n objectFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (objectFound) {\r\n console.error(\"Collision Start on object already collected\");\r\n }\r\n }\r\n\r\n this._myCollisions.push(physXComponent.object);\r\n\r\n if (this._myUpdateActive) {\r\n this._myCollisionsStartToProcess.push(physXComponent.object);\r\n this._myCollisionsEndToProcess.pp_removeAll(function (element) {\r\n return element.pp_equals(physXComponent.object);\r\n });\r\n }\r\n\r\n if (this._myDebugActive) {\r\n console.log(\"Collision Start -\", this._myCollisions.length);\r\n }\r\n\r\n if (this._myCollisionStartCallbacks.size > 0) {\r\n this._myCollisionStartCallbacks.forEach(function (callback) { callback(this._myPhysX, physXComponent, type); });\r\n }\r\n }\r\n\r\n _onCollisionEnd(physXComponent) {\r\n if (this._myDebugActive) {\r\n let objectFound = false;\r\n for (let object of this._myCollisions) {\r\n if (object.pp_equals(physXComponent.object)) {\r\n objectFound = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!objectFound) {\r\n console.error(\"Collision End on object not collected\");\r\n }\r\n }\r\n\r\n\r\n this._myCollisions.pp_removeAll(function (element) {\r\n return element.pp_equals(physXComponent.object);\r\n });\r\n\r\n if (this._myUpdateActive) {\r\n this._myCollisionsEndToProcess.push(physXComponent.object);\r\n this._myCollisionsStartToProcess.pp_removeAll(function (element) {\r\n return element.pp_equals(physXComponent.object);\r\n });\r\n }\r\n\r\n if (this._myDebugActive) {\r\n console.log(\"Collision End -\", this._myCollisions.length);\r\n }\r\n\r\n if (this._myCollisionEndCallbacks.size > 0) {\r\n this._myCollisionEndCallbacks.forEach(function (callback) { callback(this._myPhysX, physXComponent, type); });\r\n }\r\n }\r\n\r\n _triggerDesyncFix(dt) {\r\n this._myTriggerDesyncFixDelay.update(dt);\r\n if (this._myTriggerDesyncFixDelay.isDone()) {\r\n this._myTriggerDesyncFixDelay.start();\r\n\r\n let collisionsToEnd = this._myCollisions.pp_findAll(function (element) {\r\n let physX = element.pp_getComponent(\"physx\");\r\n return physX == null || !physX.active;\r\n });\r\n\r\n if (collisionsToEnd.length > 0) {\r\n //console.error(\"DESYNC RESOLVED\");\r\n\r\n for (let collision of collisionsToEnd) {\r\n let physX = collision.pp_getComponent(\"physx\");\r\n if (physX) {\r\n this._onCollisionEnd(physX);\r\n } else {\r\n console.error(\"NO PHYSX, HOW?\");\r\n }\r\n }\r\n }\r\n }\r\n }\r\n};", "PP.SaveManager = class SaveManager {\r\n constructor() {\r\n this._mySaveCache = new Map();\r\n\r\n this._myCommitSavesDelayTimer = new PP.Timer(0, false);\r\n this._myDelaySavesCommit = true;\r\n this._myIDsToCommit = [];\r\n\r\n this._myCacheDefaultValueOnFail = true;\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n\r\n this._myClearCallbacks = new Map(); // Signature: callback()\r\n this._myDeleteCallbacks = new Map(); // Signature: callback(id)\r\n this._myDeleteIDCallbacks = new Map(); // Signature: callback(id)\r\n this._mySaveCallbacks = new Map(); // Signature: callback(id, value)\r\n this._mySaveValueChangedCallbacks = new Map(); // Signature: callback(id, value)\r\n this._mySaveIDCallbacks = new Map(); // Signature: callback(id, value)\r\n this._mySaveValueChangedIDCallbacks = new Map(); // Signature: callback(id, value)\r\n this._myCommitSaveCallbacks = new Map(); // Signature: callback(id, value, isCommitSaveDelayed, failed)\r\n this._myCommitSaveIDCallbacks = new Map(); // Signature: callback(id, value, isCommitSaveDelayed, failed)\r\n this._myCommitSavesCallbacks = new Map(); // Signature: callback(isCommitSavesDelayed, failed)\r\n\r\n this._myLoadCallbacks = new Map(); // Signature: callback(id, value, loadFromCache, failed)\r\n this._myLoadIDCallbacks = new Map(); // Signature: callback(id, value, loadFromCache, failed)\r\n }\r\n\r\n setCommitSavesDelay(delay) {\r\n this._myCommitSavesDelayTimer.start(delay);\r\n }\r\n\r\n setDelaySavesCommit(delayed) {\r\n this._myDelaySavesCommit = delayed;\r\n }\r\n\r\n setCacheDefaultValueOnFail(cache) {\r\n this._myCacheDefaultValueOnFail = cache;\r\n }\r\n\r\n update(dt) {\r\n if (this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.update(dt);\r\n if (this._myCommitSavesDelayTimer.isDone()) {\r\n this.commitSaves();\r\n }\r\n }\r\n }\r\n\r\n save(id, value, overrideDelaySavesCommit = null) {\r\n let sameValue = false;\r\n if (this._mySaveCache.has(id)) {\r\n sameValue = this._mySaveCache.get(id) === value;\r\n }\r\n\r\n if (!sameValue) {\r\n this._mySaveCache.set(id, value);\r\n if ((this._myDelaySavesCommit && overrideDelaySavesCommit == null) || (overrideDelaySavesCommit != null && overrideDelaySavesCommit)) {\r\n this._myIDsToCommit.pp_pushUnique(id);\r\n if (!this._myCommitSavesDelayTimer.isRunning()) {\r\n this._myCommitSavesDelayTimer.start();\r\n }\r\n } else {\r\n let failed = this._commitSave(id, false);\r\n\r\n if (this._myCommitSavesCallbacks.size > 0) {\r\n let isCommitSaveDelayed = false;\r\n this._myCommitSavesCallbacks.forEach(function (callback) { callback(isCommitSaveDelayed, failed); });\r\n }\r\n }\r\n }\r\n\r\n if (this._mySaveCallbacks.size > 0) {\r\n this._mySaveCallbacks.forEach(function (callback) { callback(id, value); });\r\n }\r\n\r\n if (this._mySaveIDCallbacks.size > 0) {\r\n let callbackMap = this._mySaveIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value); });\r\n }\r\n }\r\n\r\n if (!sameValue) {\r\n if (this._mySaveValueChangedCallbacks.size > 0) {\r\n this._mySaveValueChangedCallbacks.forEach(function (callback) { callback(id, value); });\r\n }\r\n\r\n if (this._mySaveValueChangedIDCallbacks.size > 0) {\r\n let callbackMap = this._mySaveValueChangedIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value); });\r\n }\r\n }\r\n }\r\n }\r\n\r\n commitSaves() {\r\n if (this._myIDsToCommit.length > 0) {\r\n let failed = false;\r\n\r\n for (let id of this._myIDsToCommit) {\r\n if (this._mySaveCache.has(id)) {\r\n let result = this._commitSave(id, true);\r\n failed = failed || result;\r\n }\r\n }\r\n\r\n this._myIDsToCommit = [];\r\n\r\n if (this._myCommitSavesCallbacks.size > 0) {\r\n let isCommitSavesDelayed = true;\r\n this._myCommitSavesCallbacks.forEach(function (callback) { callback(isCommitSavesDelayed, failed); });\r\n }\r\n }\r\n }\r\n\r\n has(id) {\r\n return this._mySaveCache.has(id) || PP.SaveUtils.has(id);\r\n }\r\n\r\n delete(id) {\r\n this._mySaveCache.delete(id);\r\n PP.SaveUtils.delete(id);\r\n\r\n if (this._myDeleteCallbacks.size > 0) {\r\n this._myDeleteCallbacks.forEach(function (callback) { callback(id); });\r\n }\r\n\r\n if (this._myDeleteIDCallbacks.size > 0) {\r\n let callbackMap = this._myDeleteIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id); });\r\n }\r\n }\r\n }\r\n\r\n clear() {\r\n this._mySaveCache.clear();\r\n PP.SaveUtils.clear();\r\n\r\n if (this._myClearCallbacks.size > 0) {\r\n this._myClearCallbacks.forEach(function (callback) { callback(); });\r\n }\r\n }\r\n\r\n load(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"load\");\r\n }\r\n\r\n loadString(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"loadString\");\r\n }\r\n\r\n loadNumber(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"loadNumber\");\r\n }\r\n\r\n loadBool(id, defaultValue = null) {\r\n return this._load(id, defaultValue, \"loadBool\");\r\n }\r\n\r\n getCommitSavesDelay() {\r\n return this._myCommitSavesDelayTimer.getDuration();\r\n }\r\n\r\n isDelaySavesCommit() {\r\n return this._myDelaySavesCommit;\r\n }\r\n\r\n isCacheDefaultValueOnFail() {\r\n return this._myCacheDefaultValueOnFail;\r\n }\r\n\r\n _commitSave(id, isCommitSaveDelayed) {\r\n let value = this._mySaveCache.get(id);\r\n let failed = false;\r\n\r\n try {\r\n PP.SaveUtils.save(id, value);\r\n } catch (error) {\r\n failed = true;\r\n }\r\n\r\n if (this._myCommitSaveCallbacks.size > 0) {\r\n this._myCommitSaveCallbacks.forEach(function (callback) { callback(id, value, isCommitSaveDelayed, failed); });\r\n }\r\n\r\n if (this._myCommitSaveIDCallbacks.size > 0) {\r\n let callbackMap = this._myCommitSaveIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value, isCommitSaveDelayed, failed); });\r\n }\r\n }\r\n\r\n return failed;\r\n }\r\n\r\n _load(id, defaultValue, functionName) {\r\n let value = null;\r\n let failed = false;\r\n let loadFromCache = false;\r\n\r\n if (this._mySaveCache.has(id)) {\r\n value = this._mySaveCache.get(id);\r\n\r\n if (value == null && defaultValue != null) {\r\n value = defaultValue;\r\n if (this._myCacheDefaultValueOnFail) {\r\n this._mySaveCache.set(id, value);\r\n }\r\n }\r\n\r\n loadFromCache = true;\r\n } else {\r\n let saveResult = null;\r\n try {\r\n saveResult = PP.SaveUtils[functionName](id, null);\r\n } catch (error) {\r\n // Error is managed as if it worked but there was no value\r\n saveResult = null;\r\n failed = true;\r\n }\r\n\r\n if (saveResult == null) {\r\n value = defaultValue;\r\n } else {\r\n value = saveResult;\r\n }\r\n\r\n if (saveResult != null || this._myCacheDefaultValueOnFail) {\r\n this._mySaveCache.set(id, value);\r\n } else {\r\n this._mySaveCache.set(id, null);\r\n }\r\n }\r\n\r\n if (this._myLoadCallbacks.size > 0) {\r\n this._myLoadCallbacks.forEach(function (callback) { callback(id, value, loadFromCache, failed); });\r\n }\r\n\r\n if (this._myLoadIDCallbacks.size > 0) {\r\n let callbackMap = this._myLoadIDCallbacks.get(id);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(id, value, loadFromCache, failed); });\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n session.addEventListener('visibilitychange', function (event) {\r\n if (event.session.visibilityState != \"visible\") {\r\n this._onXRSessionInterrupt();\r\n }\r\n }.bind(this));\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._onXRSessionInterrupt();\r\n }\r\n\r\n _onXRSessionInterrupt() {\r\n this.commitSaves();\r\n }\r\n\r\n registerClearEventListener(callbackID, callback) {\r\n this._myClearCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterClearEventListener(callbackID) {\r\n this._myClearCallbacks.delete(callbackID);\r\n }\r\n\r\n registerDeleteEventListener(callbackID, callback) {\r\n this._myDeleteCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterDeleteEventListener(callbackID) {\r\n this._myDeleteCallbacks.delete(callbackID);\r\n }\r\n\r\n registerDeleteIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._myDeleteIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._myDeleteIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._myDeleteIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterDeleteIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._myDeleteIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._myDeleteIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveEventListener(callbackID, callback) {\r\n this._mySaveCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveEventListener(callbackID) {\r\n this._mySaveCallbacks.delete(callbackID);\r\n }\r\n\r\n registerSaveIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._mySaveIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._mySaveIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._mySaveIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._mySaveIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._mySaveIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerSaveValueChangedEventListener(callbackID, callback) {\r\n this._mySaveValueChangedCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveValueChangedEventListener(callbackID) {\r\n this._mySaveValueChangedCallbacks.delete(callbackID);\r\n }\r\n\r\n registerSaveValueChangedIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._mySaveValueChangedIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._mySaveValueChangedIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._mySaveValueChangedIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterSaveValueChangedIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._mySaveValueChangedIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._mySaveValueChangedIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerCommitSavesEventListener(callbackID, callback) {\r\n this._myCommitSavesCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCommitSavesEventListener(callbackID) {\r\n this._myCommitSavesCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCommitSaveEventListener(callbackID, callback) {\r\n this._myCommitSaveCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterCommitSaveEventListener(callbackID) {\r\n this._myCommitSaveCallbacks.delete(callbackID);\r\n }\r\n\r\n registerCommitSaveIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._myCommitSaveIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._myCommitSaveIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._myCommitSaveIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterCommitSaveIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._myCommitSaveIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._myCommitSaveIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n\r\n registerLoadEventListener(callbackID, callback) {\r\n this._myLoadCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterLoadEventListener(callbackID) {\r\n this._myLoadCallbacks.delete(callbackID);\r\n }\r\n\r\n registerLoadIDEventListener(valueID, callbackID, callback) {\r\n let valueIDMap = this._myLoadIDCallbacks.get(valueID);\r\n if (valueIDMap == null) {\r\n this._myLoadIDCallbacks.set(valueID, new Map());\r\n valueIDMap = this._myLoadIDCallbacks.get(valueID);\r\n }\r\n\r\n valueIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterLoadIDEventListener(valueID, callbackID) {\r\n let valueIDMap = this._myLoadIDCallbacks.get(valueID);\r\n if (valueIDMap != null) {\r\n valueIDMap.delete(callbackID);\r\n\r\n if (valueIDMap.size <= 0) {\r\n this._myLoadIDCallbacks.delete(valueID);\r\n }\r\n }\r\n }\r\n};", "PP.Timer = class Timer {\r\n constructor(duration, autoStart = true) {\r\n this._myDuration = duration;\r\n this._myOnEndCallbacks = new Map(); // Signature: callback()\r\n\r\n this._myDone = false;\r\n this._myJustDone = false;\r\n this._myStarted = false;\r\n\r\n if (autoStart) {\r\n this.start();\r\n } else {\r\n this.reset();\r\n }\r\n }\r\n\r\n start(duration = null) {\r\n this.reset(duration);\r\n this._myStarted = true;\r\n }\r\n\r\n end() {\r\n this._done();\r\n }\r\n\r\n reset(duration = null) {\r\n if (duration != null) {\r\n this._myDuration = Math.max(0, duration);\r\n }\r\n\r\n this._myTimer = this._myDuration;\r\n this._myDone = false;\r\n this._myJustDone = false;\r\n this._myStarted = false;\r\n }\r\n\r\n update(dt) {\r\n this._myJustDone = false;\r\n\r\n if (this.isRunning()) {\r\n this._myTimer = Math.max(0, this._myTimer - dt);\r\n if (this._myTimer == 0) {\r\n this._done();\r\n }\r\n }\r\n }\r\n\r\n isDone() {\r\n return this._myDone;\r\n }\r\n\r\n isJustDone() {\r\n return this._myJustDone;\r\n }\r\n\r\n isStarted() {\r\n return this._myStarted;\r\n }\r\n\r\n isRunning() {\r\n return this.isStarted() && !this.isDone();\r\n }\r\n\r\n getDuration() {\r\n return this._myDuration;\r\n }\r\n\r\n setDuration(duration) {\r\n this._myDuration = Math.max(0, duration);\r\n }\r\n\r\n getTimer() {\r\n return this._myTimer;\r\n }\r\n\r\n getPercentage() {\r\n let percentage = 1;\r\n if (this._myTimer > 0) {\r\n percentage = (this._myDuration - this._myTimer) / this._myDuration;\r\n }\r\n return Math.pp_clamp(percentage, 0, 1);\r\n }\r\n\r\n onEnd(callback, id = null) {\r\n this._myOnEndCallbacks.set(id, callback);\r\n }\r\n\r\n unregisterOnEnd(id = null) {\r\n this._myOnEndCallbacks.delete(id);\r\n }\r\n\r\n _done() {\r\n this._myTimer = 0;\r\n this._myDone = true;\r\n this._myJustDone = true;\r\n if (this._myOnEndCallbacks.size > 0) {\r\n for (let callback of this._myOnEndCallbacks.values()) {\r\n callback();\r\n }\r\n }\r\n }\r\n};", "WL.registerComponent(\"pp-clear-console-on-xr-session-start\", {\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myFirstTime = true;\r\n WL.onXRSessionStart.push(function () {\r\n if (this._myFirstTime) {\r\n this._myFirstTime = false;\r\n console.clear();\r\n }\r\n }.bind(this));\r\n },\r\n update: function (dt) {\r\n }\r\n});", "WL.registerComponent('pp-set-active', {\n _myActive: { type: WL.Type.Bool, default: true },\n _mySetActiveOn: { type: WL.Type.Enum, values: ['self', 'children', 'descendants', 'hierarchy'], default: 'hierarchy' },\n _mySetActiveWhen: { type: WL.Type.Enum, values: ['init', 'start', 'first_update'], default: 'init' },\n}, {\n init: function () {\n if (this.active && this._mySetActiveWhen == 0) {\n this._setActive();\n }\n },\n start: function () {\n if (this._mySetActiveWhen == 1) {\n this._setActive();\n }\n this._myFirst = true;\n },\n update: function (dt) {\n if (this._mySetActiveWhen == 2 && this._myFirst) {\n this._myFirst = false;\n this._setActive();\n }\n },\n _setActive() {\n if (this._mySetActiveOn == 0) {\n this.object.pp_setActiveSelf(this._myActive);\n } else if (this._mySetActiveOn == 1) {\n this.object.pp_setActiveChildren(this._myActive);\n } else if (this._mySetActiveOn == 2) {\n this.object.pp_setActiveDescendants(this._myActive);\n } else {\n this.object.pp_setActiveHierarchy(this._myActive);\n }\n }\n});", "WL.registerComponent('pp-adjust-hierarchy-physx-scale', {\r\n _myWhen: { type: WL.Type.Enum, values: ['init', 'start', 'first_update'], default: 'start' },\r\n}, {\r\n init: function () {\r\n if (this.active && this._myWhen == 0) {\r\n this._adjustScale();\r\n }\r\n },\r\n start: function () {\r\n if (this._myWhen == 1) {\r\n this._adjustScale();\r\n }\r\n this._myFirst = true;\r\n },\r\n update: function (dt) {\r\n if (this._myWhen == 2 && this._myFirst) {\r\n this._myFirst = false;\r\n this._adjustScale();\r\n }\r\n },\r\n _adjustScale() {\r\n let scale = this.object.pp_getScale();\r\n let physXComponents = this.object.pp_getComponentsHierarchy(\"physx\");\r\n for (let physX of physXComponents) {\r\n physX.extents[0] = physX.extents[0] * scale[0];\r\n physX.extents[1] = physX.extents[1] * scale[1];\r\n physX.extents[2] = physX.extents[2] * scale[2];\r\n\r\n if (physX.active) {\r\n physX.active = false;\r\n physX.active = true;\r\n }\r\n }\r\n }\r\n});", "WL.registerComponent(\"pp-get-player-objects\", {\r\n _myPlayer: { type: WL.Type.Object },\r\n _myPlayerPivot: { type: WL.Type.Object }, // if u don't have a pivot under the player you set this to null, by default will be the same as the player\r\n _myNonVRCamera: { type: WL.Type.Object },\r\n _myEyeLeft: { type: WL.Type.Object },\r\n _myEyeRight: { type: WL.Type.Object },\r\n _myHead: { type: WL.Type.Object },\r\n _myNonVRHead: { type: WL.Type.Object },\r\n _myVRHead: { type: WL.Type.Object },\r\n _myHandLeft: { type: WL.Type.Object },\r\n _myHandRight: { type: WL.Type.Object }\r\n}, {\r\n init: function () {\r\n PP.myPlayerObjects.myPlayer = this._myPlayer;\r\n PP.myPlayerObjects.myPlayerPivot = this._myPlayerPivot;\r\n PP.myPlayerObjects.myNonVRCamera = this._myNonVRCamera;\r\n PP.myPlayerObjects.myHead = this._myHead;\r\n PP.myPlayerObjects.myNonVRHead = this._myNonVRHead;\r\n PP.myPlayerObjects.myVRHead = this._myVRHead;\r\n PP.myPlayerObjects.myEyeLeft = this._myEyeLeft;\r\n PP.myPlayerObjects.myEyeRight = this._myEyeRight;\r\n PP.myPlayerObjects.myHandLeft = this._myHandLeft;\r\n PP.myPlayerObjects.myHandRight = this._myHandRight;\r\n\r\n PP.myPlayerObjects.myEyes = [];\r\n PP.myPlayerObjects.myEyes[PP.Handedness.LEFT] = this._myEyeLeft;\r\n PP.myPlayerObjects.myEyes[PP.Handedness.RIGHT] = this._myEyeRight;\r\n\r\n PP.myPlayerObjects.myHands = [];\r\n PP.myPlayerObjects.myHands[PP.Handedness.LEFT] = this._myHandLeft;\r\n PP.myPlayerObjects.myHands[PP.Handedness.RIGHT] = this._myHandRight;\r\n\r\n if (PP.myPlayerObjects.myPlayerPivot == null) {\r\n PP.myPlayerObjects.myPlayerPivot = PP.myPlayerObjects.myPlayer;\r\n }\r\n }\r\n});\r\n\r\nPP.myPlayerObjects = {\r\n myPlayer: null,\r\n myPlayerPivot: null,\r\n myNonVRCamera: null,\r\n myNonVRHead: null,\r\n myVRHead: null,\r\n myHead: null,\r\n myEyeLeft: null,\r\n myEyeRight: null,\r\n myEyes: [],\r\n myHandLeft: null,\r\n myHandRight: null,\r\n myHands: [],\r\n};", "WL.registerComponent('pp-get-default-resources', {\r\n _myPlane: { type: WL.Type.Mesh },\r\n _myCube: { type: WL.Type.Mesh },\r\n _mySphere: { type: WL.Type.Mesh },\r\n _myCone: { type: WL.Type.Mesh },\r\n _myCylinder: { type: WL.Type.Mesh },\r\n _myCircle: { type: WL.Type.Mesh },\r\n\r\n _myFlatOpaque: { type: WL.Type.Material },\r\n _myFlatTransparentNoDepth: { type: WL.Type.Material },\r\n _myPhongOpaque: { type: WL.Type.Material },\r\n _myText: { type: WL.Type.Material },\r\n\r\n}, {\r\n init() {\r\n PP.myDefaultResources.myMeshes.myPlane = PP.MeshUtils.cloneMesh(this._myPlane);\r\n PP.myDefaultResources.myMeshes.myCube = PP.MeshUtils.cloneMesh(this._myCube);\r\n PP.myDefaultResources.myMeshes.mySphere = PP.MeshUtils.cloneMesh(this._mySphere);\r\n PP.myDefaultResources.myMeshes.myCone = PP.MeshUtils.cloneMesh(this._myCone);\r\n PP.myDefaultResources.myMeshes.myCylinder = PP.MeshUtils.cloneMesh(this._myCylinder);\r\n PP.myDefaultResources.myMeshes.myCircle = PP.MeshUtils.cloneMesh(this._myCircle);\r\n\r\n PP.myDefaultResources.myMeshes.myInvertedCube = PP.MeshUtils.invertMesh(this._myCube);\r\n PP.myDefaultResources.myMeshes.myInvertedSphere = PP.MeshUtils.invertMesh(this._mySphere);\r\n PP.myDefaultResources.myMeshes.myInvertedCone = PP.MeshUtils.invertMesh(this._myCone);\r\n PP.myDefaultResources.myMeshes.myInvertedCylinder = PP.MeshUtils.invertMesh(this._myCylinder);\r\n\r\n if (this._myFlatOpaque != null) {\r\n PP.myDefaultResources.myMaterials.myFlatOpaque = this._myFlatOpaque.clone();\r\n }\r\n\r\n if (this._myFlatTransparentNoDepth != null) {\r\n PP.myDefaultResources.myMaterials.myFlatTransparentNoDepth = this._myFlatTransparentNoDepth.clone();\r\n }\r\n\r\n if (this._myPhongOpaque != null) {\r\n PP.myDefaultResources.myMaterials.myPhongOpaque = this._myPhongOpaque.clone();\r\n }\r\n\r\n if (this._myText != null) {\r\n PP.myDefaultResources.myMaterials.myText = this._myText.clone();\r\n }\r\n }\r\n});\r\n\r\nPP.myDefaultResources = {\r\n myMeshes: {\r\n myPlane: null,\r\n myCube: null,\r\n mySphere: null,\r\n myCone: null,\r\n myCylinder: null,\r\n myCircle: null,\r\n\r\n myInvertedCube: null,\r\n myInvertedSphere: null,\r\n myInvertedCone: null,\r\n myInvertedCylinder: null\r\n },\r\n myMaterials: {\r\n myFlatOpaque: null,\r\n myFlatTransparentNoDepth: null, // for now the pipeline needs to be the last one to make this work properly\r\n myPhongOpaque: null,\r\n myText: null,\r\n }\r\n};", "WL.registerComponent('pp-show-fps', {\r\n _myRefreshSeconds: { type: WL.Type.Float, default: 0.25 },\r\n _myTextMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n },\r\n start() {\r\n this._myTimer = new PP.Timer(this._myRefreshSeconds);\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n\r\n this._myVisualFPSParent = this.object.pp_addObject();\r\n\r\n let visualParams = new PP.VisualTextParams();\r\n visualParams.myText = \"0\";\r\n\r\n visualParams.myTransform.mat4_setPositionRotationScale([-0.115, -0.115, 0.35], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n\r\n if (this._myTextMaterial != null) {\r\n visualParams.myMaterial = this._myTextMaterial.clone();\r\n } else {\r\n visualParams.myMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\n visualParams.myMaterial.color = [0, 1, 0, 1];\r\n }\r\n\r\n visualParams.myParent = this._myVisualFPSParent;\r\n\r\n this._myVisualFPS = new PP.VisualText(visualParams);\r\n\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"FPS X\", -0.25, 0.1, 3));\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"FPS Y\", -0.130, 0.1, 3));\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"FPS Z\", 0.35, 0.1, 3));\r\n },\r\n update: function () {\r\n let playerTransformQuat = PP.quat2_create();\r\n return function update(dt) {\r\n this._myTotalDT += dt;\r\n this._myFrames++;\r\n\r\n this._myTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n this._myTimer.start();\r\n\r\n let fps = Math.round(this._myFrames / this._myTotalDT);\r\n\r\n let visualParams = this._myVisualFPS.getParams();\r\n\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n visualParams.myTransform.mat4_setPositionRotationScale([-0.115, -0.115, 0.35], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n } else {\r\n visualParams.myTransform.mat4_setPositionRotationScale([-0.25, -0.130, 0.35], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n }\r\n\r\n //visualParams.myTransform.mat4_setPositionRotationScale([PP.myEasyTuneVariables.get(\"FPS X\"), PP.myEasyTuneVariables.get(\"FPS Y\"), PP.myEasyTuneVariables.get(\"FPS Z\")], [0, 180, 0], [0.3, 0.3, 0.3]);\r\n\r\n visualParams.myText = fps.toFixed(0);\r\n this._myVisualFPS.paramsUpdated();\r\n\r\n this._myTotalDT = 0;\r\n this._myFrames = 0;\r\n }\r\n\r\n this._myVisualFPSParent.pp_setTransformQuat(PP.myPlayerObjects.myHead.pp_getTransformQuat(playerTransformQuat));\r\n };\r\n }()\r\n});", "/*\r\n You can also use plain functions for state/transition if u want to do something simpler and faster\r\n\r\n Signatures:\r\n stateUpdateFunction(dt, fsm)\r\n initFunction(fsm, initStateData)\r\n transitionFunction(fsm, transitionData)\r\n*/\r\n\r\nPP.StateData = class StateData {\r\n constructor(stateID, stateObject) {\r\n this.myID = stateID;\r\n this.myObject = stateObject;\r\n }\r\n};\r\n\r\nPP.TransitionData = class TransitionData {\r\n constructor(transitionID, fromStateData, toStateData, transitionObject, skipStateFunction) {\r\n this.myID = transitionID;\r\n this.myFromState = fromStateData;\r\n this.myToState = toStateData;\r\n this.myObject = transitionObject;\r\n this.mySkipStateFunction = skipStateFunction;\r\n }\r\n};\r\n\r\nPP.PendingPerform = class PendingPerform {\r\n constructor(transitionID, ...args) {\r\n this.myID = transitionID;\r\n this.myArgs = args;\r\n }\r\n};\r\n\r\nPP.PerformType = {\r\n IMMEDIATE: 0,\r\n DELAYED: 1\r\n};\r\n\r\nPP.PerformDelayedType = {\r\n QUEUE: 0,\r\n KEEP_FIRST: 1,\r\n KEEP_LAST: 2\r\n};\r\n\r\nPP.SkipStateFunction = {\r\n NONE: 0,\r\n END: 1,\r\n START: 2,\r\n BOTH: 3\r\n};\r\n\r\nPP.FSM = class FSM {\r\n\r\n constructor(performType = PP.PerformType.IMMEDIATE, performDelayedType = PP.PerformDelayedType.QUEUE) {\r\n this._myCurrentStateData = null;\r\n\r\n this._myStateMap = new Map();\r\n this._myTransitionMap = new Map();\r\n\r\n this._myDebugLogActive = false;\r\n this._myDebugShowDelayedInfo = false;\r\n this._myDebugLogName = \"FSM\";\r\n\r\n this._myPerformType = performType;\r\n this._myPerformDelayedType = performDelayedType;\r\n this._myPendingPerforms = [];\r\n this._myCurrentlyPerformedTransition = null;\r\n\r\n this._myInitCallbacks = new Map(); // Signature: callback(fsm, initStateData, initTransitionObject, ...args)\r\n this._myInitIDCallbacks = new Map(); // Signature: callback(fsm, initStateData, initTransitionObject, ...args)\r\n this._myTransitionCallbacks = new Map(); // Signature: callback(fsm, fromStateData, toStateData, transitionData, performType, ...args)\r\n this._myTransitionIDCallbacks = []; // Signature: callback(fsm, fromStateData, toStateData, transitionData, performType, ...args)\r\n }\r\n\r\n addState(stateID, state = null) {\r\n let stateObject = null;\r\n if (!state || typeof state == 'function') {\r\n stateObject = {};\r\n if (typeof state == 'function') {\r\n stateObject.update = state;\r\n } else {\r\n stateObject.update = null;\r\n }\r\n stateObject.clone = function () {\r\n let cloneObject = {};\r\n cloneObject.update = this.update;\r\n cloneObject.clone = this.clone;\r\n return cloneObject;\r\n };\r\n } else {\r\n stateObject = state;\r\n }\r\n\r\n let stateData = new PP.StateData(stateID, stateObject);\r\n this._myStateMap.set(stateID, stateData);\r\n this._myTransitionMap.set(stateID, new Map());\r\n }\r\n\r\n addTransition(fromStateID, toStateID, transitionID, transition = null, skipStateFunction = PP.SkipStateFunction.NONE) {\r\n let transitionObject = null;\r\n if (!transition || typeof transition == 'function') {\r\n transitionObject = {};\r\n if (typeof transition == 'function') {\r\n transitionObject.perform = transition;\r\n } else {\r\n transitionObject.perform = null;\r\n }\r\n transitionObject.clone = function () {\r\n let cloneObject = {};\r\n cloneObject.perform = this.perform;\r\n cloneObject.clone = this.clone;\r\n return cloneObject;\r\n };\r\n } else {\r\n transitionObject = transition;\r\n }\r\n\r\n if (this.hasState(fromStateID) && this.hasState(toStateID)) {\r\n let fromMap = this._getTransitionMapFromState(fromStateID);\r\n\r\n let transitionData = new PP.TransitionData(transitionID, this.getState(fromStateID), this.getState(toStateID), transitionObject, skipStateFunction);\r\n fromMap.set(transitionID, transitionData);\r\n } else {\r\n if (!this.hasState(fromStateID) && !this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID, \"- to state not found:\", toStateID);\r\n } else if (!this.hasState(fromStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- from state not found:\", fromStateID);\r\n } else if (!this.hasState(toStateID)) {\r\n console.error(\"Can't add transition:\", transitionID, \"- to state not found:\", toStateID);\r\n }\r\n }\r\n }\r\n\r\n init(initStateID, initTransition = null, ...args) {\r\n let initTransitionObject = initTransition;\r\n if (initTransition && typeof initTransition == 'function') {\r\n initTransitionObject = {};\r\n initTransitionObject.performInit = initTransition;\r\n }\r\n\r\n if (this.hasState(initStateID)) {\r\n let initStateData = this._myStateMap.get(initStateID);\r\n\r\n if (this._myDebugLogActive) {\r\n console.log(this._myDebugLogName, \"- Init:\", initStateID);\r\n }\r\n\r\n if (initTransitionObject && initTransitionObject.performInit) {\r\n initTransitionObject.performInit(this, initStateData, ...args);\r\n } else if (initStateData.myObject && initStateData.myObject.init) {\r\n initStateData.myObject.init(this, initStateData, ...args);\r\n }\r\n\r\n this._myCurrentStateData = initStateData;\r\n\r\n if (this._myInitCallbacks.size > 0) {\r\n this._myInitCallbacks.forEach(function (callback) { callback(this, initStateData, initTransitionObject, ...args); }.bind(this));\r\n }\r\n\r\n if (this._myInitIDCallbacks.size > 0) {\r\n let callbackMap = this._myInitIDCallbacks.get(initStateID);\r\n if (callbackMap != null) {\r\n callbackMap.forEach(function (callback) { callback(this, initStateData, initTransitionObject, ...args); }.bind(this));\r\n }\r\n }\r\n } else if (this._myDebugLogActive) {\r\n console.warn(this._myDebugLogName, \"- Init state not found:\", initStateID);\r\n }\r\n }\r\n\r\n update(dt, ...args) {\r\n if (this._myPendingPerforms.length > 0) {\r\n for (let i = 0; i < this._myPendingPerforms.length; i++) {\r\n this._perform(this._myPendingPerforms[i].myID, PP.PerformType.DELAYED, ...this._myPendingPerforms[i].myArgs);\r\n }\r\n this._myPendingPerforms = [];\r\n }\r\n\r\n if (this._myCurrentStateData && this._myCurrentStateData.myObject && this._myCurrentStateData.myObject.update) {\r\n this._myCurrentStateData.myObject.update(dt, this, ...args);\r\n }\r\n }\r\n\r\n perform(transitionID, ...args) {\r\n if (this._myPerformType == PP.PerformType.DELAYED) {\r\n this.performDelayed(transitionID, ...args);\r\n } else {\r\n this.performImmediate(transitionID, ...args);\r\n }\r\n }\r\n\r\n performDelayed(transitionID, ...args) {\r\n let performDelayed = false;\r\n\r\n switch (this._myPerformDelayedType) {\r\n case PP.PerformDelayedType.QUEUE:\r\n this._myPendingPerforms.push(new PP.PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n case PP.PerformDelayedType.KEEP_FIRST:\r\n if (!this.hasPendingPerforms()) {\r\n this._myPendingPerforms.push(new PP.PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n }\r\n break;\r\n case PP.PerformDelayedType.KEEP_LAST:\r\n this.resetPendingPerforms();\r\n this._myPendingPerforms.push(new PP.PendingPerform(transitionID, ...args));\r\n performDelayed = true;\r\n break;\r\n }\r\n\r\n return performDelayed;\r\n }\r\n\r\n performImmediate(transitionID, ...args) {\r\n return this._perform(transitionID, PP.PerformType.IMMEDIATE, ...args);\r\n }\r\n\r\n canPerform(transitionID) {\r\n return this.hasTransitionFromState(this._myCurrentStateData.myID, transitionID);\r\n }\r\n\r\n canGoTo(stateID, transitionID = null) {\r\n return this.hasTransitionFromStateToState(this._myCurrentStateData.myID, stateID, transitionID);\r\n }\r\n\r\n isInState(stateID) {\r\n return this._myCurrentStateData != null && this._myCurrentStateData.myID == stateID;\r\n }\r\n\r\n isPerformingTransition() {\r\n return this._myCurrentlyPerformedTransition != null;\r\n }\r\n\r\n getCurrentlyPerformedTransition() {\r\n return this._myCurrentlyPerformedTransition;\r\n }\r\n\r\n hasBeenInit() {\r\n return this._myCurrentStateData != null;\r\n }\r\n\r\n reset() {\r\n this.resetState();\r\n this.resetPendingPerforms();\r\n }\r\n\r\n resetState() {\r\n this._myCurrentStateData = null;\r\n }\r\n\r\n resetPendingPerforms() {\r\n this._myPendingPerforms = [];\r\n }\r\n\r\n getCurrentState() {\r\n return this._myCurrentStateData;\r\n }\r\n\r\n getCurrentTransitions() {\r\n return this.getTransitionsFromState(this._myCurrentStateData.myID);\r\n }\r\n\r\n getCurrentTransitionsToState(stateID) {\r\n return this.getTransitionsFromStateToState(this._myCurrentStateData.myID, stateID);\r\n }\r\n\r\n getState(stateID) {\r\n return this._myStateMap.get(stateID);\r\n }\r\n\r\n getStates() {\r\n return this._myStateMap.values();\r\n }\r\n\r\n getTransitions() {\r\n let transitions = [];\r\n\r\n for (let transitionsPerStateMap of this._myTransitionMap.values()) {\r\n for (let transitionData of transitionsPerStateMap.values()) {\r\n transitions.push(transitionData);\r\n }\r\n }\r\n\r\n return transitions;\r\n }\r\n\r\n getTransitionsFromState(fromStateID) {\r\n let transitionMap = this._getTransitionMapFromState(fromStateID);\r\n return Array.from(transitionMap.values());\r\n }\r\n\r\n getTransitionsFromStateToState(fromStateID, toStateID) {\r\n let transitionMap = this._getTransitionMapFromState(fromStateID);\r\n\r\n let transitionsToState = [];\r\n for (let transitionData of transitionMap.values()) {\r\n if (transitionData.myToState.myID == toStateID) {\r\n transitionsToState.push(transitionData);\r\n }\r\n }\r\n\r\n return transitionsToState;\r\n }\r\n\r\n removeState(stateID) {\r\n if (this.hasState(stateID)) {\r\n this._myStateMap.delete(stateID);\r\n this._myTransitionMap.delete(stateID);\r\n\r\n for (let transitionMap of this._myTransitionMap.values()) {\r\n let toDelete = [];\r\n for (let [transitionID, transitionData] of transitionMap.entries()) {\r\n if (transitionData.myToState.myID == stateID) {\r\n toDelete.push(transitionID);\r\n }\r\n }\r\n\r\n for (let transitionID of toDelete) {\r\n transitionMap.delete(transitionID);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n removeTransitionFromState(fromStateID, transitionID) {\r\n let fromTransitions = this._getTransitionMapFromState(fromStateID);\r\n if (fromTransitions) {\r\n return fromTransitions.delete(transitionID);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasState(stateID) {\r\n return this._myStateMap.has(stateID);\r\n }\r\n\r\n hasTransitionFromState(fromStateID, transitionID) {\r\n let transitions = this.getTransitionsFromState(fromStateID);\r\n\r\n let transitionIndex = transitions.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n return transitionIndex >= 0;\r\n }\r\n\r\n hasTransitionFromStateToState(fromStateID, toStateID, transitionID = null) {\r\n let transitions = this.getTransitionsFromStateToState(fromStateID, toStateID);\r\n\r\n let hasTransition = false;\r\n if (transitionID) {\r\n let transitionIndex = transitions.findIndex(function (transition) {\r\n return transition.myID == transitionID;\r\n });\r\n\r\n hasTransition = transitionIndex >= 0;\r\n } else {\r\n hasTransition = transitions.length > 0;\r\n }\r\n\r\n return hasTransition;\r\n }\r\n\r\n setPerformType(performType) {\r\n this._myPerformType = performType;\r\n }\r\n\r\n getPerformType() {\r\n return this._myPerformType;\r\n }\r\n\r\n setPerformDelayedType(performDelayedType) {\r\n this._myPerformDelayedType = performDelayedType;\r\n }\r\n\r\n getPerformDelayedType() {\r\n return this._myPerformDelayedType;\r\n }\r\n\r\n hasPendingPerforms() {\r\n return this._myPendingPerforms.length > 0;\r\n }\r\n\r\n getPendingPerforms() {\r\n return this._myPendingPerforms.slice(0);\r\n }\r\n\r\n clone(deepClone = false) {\r\n if (!this.isCloneable(deepClone)) {\r\n return null;\r\n }\r\n\r\n let cloneFSM = new PP.FSM();\r\n\r\n cloneFSM._myDebugLogActive = this._myDebugLogActive;\r\n cloneFSM._myDebugShowDelayedInfo = this._myDebugShowDelayedInfo;\r\n cloneFSM._myDebugLogName = this._myDebugLogName.slice(0);\r\n\r\n cloneFSM._myPerformType = this._myPerformType;\r\n cloneFSM._myPerformDelayedType = this._myPerformDelayedType;\r\n cloneFSM._myPendingPerforms = this._myPendingPerforms.slice(0);\r\n\r\n for (let entry of this._myStateMap.entries()) {\r\n let stateData = null;\r\n\r\n if (deepClone) {\r\n stateData = new PP.StateData(entry[1].myID, entry[1].myObject.clone());\r\n } else {\r\n stateData = new PP.StateData(entry[1].myID, entry[1].myObject);\r\n }\r\n\r\n cloneFSM._myStateMap.set(stateData.myID, stateData);\r\n }\r\n\r\n for (let entry of this._myTransitionMap.entries()) {\r\n let fromStateMap = new Map();\r\n cloneFSM._myTransitionMap.set(entry[0], fromStateMap);\r\n\r\n for (let tEntry of entry[1].entries()) {\r\n let transitionData = null;\r\n\r\n let fromState = cloneFSM.getState(tEntry[1].myFromState.myID);\r\n let toState = cloneFSM.getState(tEntry[1].myToState.myID);\r\n\r\n if (deepClone) {\r\n transitionData = new PP.TransitionData(tEntry[1].myID, fromState, toState, tEntry[1].myObject.clone(), tEntry[1].mySkipStateFunction);\r\n } else {\r\n transitionData = new PP.TransitionData(tEntry[1].myID, fromState, toState, tEntry[1].myObject, tEntry[1].mySkipStateFunction);\r\n }\r\n\r\n fromStateMap.set(transitionData.myID, transitionData);\r\n }\r\n }\r\n\r\n if (this._myCurrentStateData) {\r\n cloneFSM._myCurrentStateData = cloneFSM.getState(this._myCurrentStateData.myID);\r\n }\r\n\r\n return cloneFSM;\r\n }\r\n\r\n isCloneable(deepClone = false) {\r\n if (!deepClone) {\r\n return true;\r\n }\r\n\r\n let isDeepCloneable = true;\r\n\r\n for (let entry of this._myStateMap.entries()) {\r\n isDeepCloneable = isDeepCloneable && entry[1].myObject.clone != null;\r\n }\r\n\r\n for (let entry of this._myTransitionMap.entries()) {\r\n for (let tEntry of entry[1].entries()) {\r\n isDeepCloneable = isDeepCloneable && tEntry[1].myObject.clone != null;\r\n }\r\n }\r\n\r\n return isDeepCloneable;\r\n }\r\n\r\n setDebugLogActive(active, debugLogName = null, showDelayedInfo = false) {\r\n this._myDebugLogActive = active;\r\n this._myDebugShowDelayedInfo = showDelayedInfo;\r\n if (debugLogName) {\r\n this._myDebugLogName = \"FSM: \".concat(debugLogName);\r\n }\r\n }\r\n\r\n registerInitEventListener(callbackID, callback) {\r\n this._myInitCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterInitEventListener(callbackID) {\r\n this._myInitCallbacks.delete(callbackID);\r\n }\r\n\r\n registerInitIDEventListener(iniStateID, callbackID, callback) {\r\n let iniStateIDMap = this._myInitIDCallbacks.get(iniStateID);\r\n if (iniStateIDMap == null) {\r\n this._myInitIDCallbacks.set(iniStateID, new Map());\r\n iniStateIDMap = this._myInitIDCallbacks.get(iniStateID);\r\n }\r\n\r\n iniStateIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterInitIDEventListener(iniStateID, callbackID) {\r\n let iniStateIDMap = this._myInitIDCallbacks.get(iniStateID);\r\n if (iniStateIDMap != null) {\r\n iniStateIDMap.delete(callbackID);\r\n\r\n if (iniStateIDMap.size <= 0) {\r\n this._myInitIDCallbacks.delete(iniStateID);\r\n }\r\n }\r\n }\r\n\r\n registerTransitionEventListener(callbackID, callback) {\r\n this._myTransitionCallbacks.set(callbackID, callback);\r\n }\r\n\r\n unregisterTransitionEventListener(callbackID) {\r\n this._myTransitionCallbacks.delete(callbackID);\r\n }\r\n\r\n //the fsm IDs can be null, that means that the callback is called whenever only the valid IDs match\r\n //this let you register to all the transitions with a specific ID and from of a specific state but to every state (toStateID == null)\r\n registerTransitionIDEventListener(fromStateID, toStateID, transitionID, callbackID, callback) {\r\n let transitionIDMap = null;\r\n for (let value of this._myTransitionIDCallbacks) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n transitionIDMap = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (transitionIDMap == null) {\r\n let transitionMapValue = [];\r\n transitionMapValue[0] = fromStateID;\r\n transitionMapValue[1] = toStateID;\r\n transitionMapValue[2] = transitionID;\r\n transitionMapValue[3] = new Map();\r\n\r\n transitionIDMap = transitionMapValue[3];\r\n\r\n this._myTransitionIDCallbacks.push(transitionMapValue);\r\n }\r\n\r\n transitionIDMap.set(callbackID, callback);\r\n }\r\n\r\n unregisterTransitionIDEventListener(fromStateID, toStateID, transitionID, callbackID) {\r\n let transitionIDMap = null;\r\n for (let value of this._myTransitionIDCallbacks) {\r\n if (value[0] == fromStateID && value[1] == toStateID && value[2] == transitionID) {\r\n transitionIDMap = value[3];\r\n break;\r\n }\r\n }\r\n\r\n if (transitionIDMap != null) {\r\n transitionIDMap.delete(callbackID);\r\n\r\n if (transitionIDMap.size <= 0) {\r\n this._myTransitionIDCallbacks.pp_remove(element => element[0] == fromStateID && element[1] == toStateID && element[2] == transitionID);\r\n }\r\n }\r\n }\r\n\r\n _perform(transitionID, performType, ...args) {\r\n if (this.isPerformingTransition()) {\r\n let currentlyPerformedTransition = this.getCurrentlyPerformedTransition();\r\n let consoleArguments = [this._myDebugLogName, \"- Trying to perform:\", transitionID];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n consoleArguments.push(\"- But another transition is currently being performed -\", currentlyPerformedTransition.myID);\r\n console.warn(...consoleArguments);\r\n\r\n return false;\r\n }\r\n\r\n if (this._myCurrentStateData) {\r\n if (this.canPerform(transitionID)) {\r\n let transitions = this._myTransitionMap.get(this._myCurrentStateData.myID);\r\n let transitionToPerform = transitions.get(transitionID);\r\n\r\n this._myCurrentlyPerformedTransition = transitionToPerform;\r\n\r\n let fromState = this._myCurrentStateData;\r\n let toState = this._myStateMap.get(transitionToPerform.myToState.myID);\r\n\r\n if (this._myDebugLogActive) {\r\n let consoleArguments = [this._myDebugLogName, \"- From:\", fromState.myID, \"- To:\", toState.myID, \"- With:\", transitionID];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.log(...consoleArguments);\r\n }\r\n\r\n if (transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.END && transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.BOTH &&\r\n fromState.myObject && fromState.myObject.end) {\r\n fromState.myObject.end(this, transitionToPerform, ...args);\r\n }\r\n\r\n if (transitionToPerform.myObject && transitionToPerform.myObject.perform) {\r\n transitionToPerform.myObject.perform(this, transitionToPerform, ...args);\r\n }\r\n\r\n if (transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.START && transitionToPerform.mySkipStateFunction != PP.SkipStateFunction.BOTH &&\r\n toState.myObject && toState.myObject.start) {\r\n toState.myObject.start(this, transitionToPerform, ...args);\r\n }\r\n\r\n this._myCurrentStateData = transitionToPerform.myToState;\r\n\r\n if (this._myTransitionCallbacks.size > 0) {\r\n this._myTransitionCallbacks.forEach(function (callback) { callback(this, fromState, toState, transitionToPerform, performType, ...args); }.bind(this));\r\n }\r\n\r\n if (this._myTransitionIDCallbacks.length > 0) {\r\n let transitionIDMaps = [];\r\n for (let value of this._myTransitionIDCallbacks) {\r\n if ((value[0] == null || value[0] == fromState.myID) &&\r\n (value[1] == null || value[1] == toState.myID) &&\r\n (value[2] == null || value[2] == transitionToPerform.myID)) {\r\n transitionIDMaps.push(value[3]);\r\n }\r\n }\r\n\r\n for (let callbackMap of this.transitionIDMaps) {\r\n callbackMap.forEach(function (callback) { callback(this, fromState, toState, transitionToPerform, performType, ...args); }.bind(this));\r\n }\r\n }\r\n\r\n this._myCurrentlyPerformedTransition = null;\r\n\r\n return true;\r\n } else if (this._myDebugLogActive) {\r\n let consoleArguments = [this._myDebugLogName, \"- No Transition:\", transitionID, \"- From:\", this._myCurrentStateData.myID];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n } else if (this._myDebugLogActive) {\r\n let consoleArguments = [this._myDebugLogName, \"- FSM not initialized yet\"];\r\n if (this._myDebugShowDelayedInfo) {\r\n consoleArguments.push(performType == PP.PerformType.DELAYED ? \"- Delayed\" : \"- Immediate\");\r\n }\r\n console.warn(...consoleArguments);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n _getTransitionMapFromState(fromStateID) {\r\n return this._myTransitionMap.get(fromStateID);\r\n }\r\n};", "/*\r\n There is no need to inherit from this state, especially since states can be only functions\r\n It's more like an example of what is needed\r\n \r\n If you don't specify some functions the fsm will just skip them\r\n Or consider them always valid\r\n\r\n The param state is of type PP.StateData and can be used to retrieve the stateID and other data\r\n The param transition is of type PP.TransitionData and can be used to retrieve the transitionID, the from and to states and other data\r\n*/\r\n\r\nPP.State = class State {\r\n\r\n //Called every frame if this is the current state\r\n //You can retrieve this state data by calling fsm.getCurrentState()\r\n update(dt, fsm, ...args) {\r\n }\r\n\r\n //Called when the fsm is started with this init state if no init transition object is specified or it does not have a performInit function\r\n //Since the state is set as the current one after the init, you can't use fsm.getCurrentState() to get it, so it is forwarded as a param if needed\r\n init(fsm, state, ...args) {\r\n }\r\n\r\n //Called when entering this state if no transition object is specified or it does not have a perform function\r\n //You can get this state data by accesing to the to state data inside the transition\r\n start(fsm, transition, ...args) {\r\n }\r\n\r\n //Called when exiting this state if no transition function is specified\r\n //You can get this state data by accesing to the from state data inside the transition\r\n end(fsm, transition, ...args) {\r\n }\r\n\r\n};", "/*\r\n There is no need to inherit from this transition, especially since states can be only transitions\r\n It's more like an example of what is needed\r\n \r\n The param transition (forwarded at the end every function) is of type PP.TransitionData and can be used to retrieve the transitionID and other data\r\n The initState param is of type PP.StateData and can be used to retrieve the stateID and other data\r\n*/\r\n\r\nPP.Transition = class Transition {\r\n\r\n //Called if this is used as an init transition for the fsm\r\n performInit(fsm, initState, ...args) {\r\n\r\n }\r\n\r\n //Called when performing a transition\r\n //You can find the from and to states inside the transition params\r\n perform(fsm, transition, ...args) {\r\n }\r\n\r\n};", "PP.TimerState = class TimerState extends PP.State {\r\n constructor(duration = 0, transitionToPerformOnEnd = null, ...transitionArgs) {\r\n super();\r\n\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n\r\n this._myTimer = new PP.Timer(duration, false);\r\n }\r\n\r\n setDuration(duration) {\r\n this._myTimer.setDuration(duration);\r\n }\r\n\r\n setTransitionToPerformOnEnd(transitionToPerformOnEnd, ...transitionArgs) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n\r\n onEnd(callback, id = null) {\r\n this._myTimer.onEnd(callback, id);\r\n }\r\n\r\n unregisterOnEnd(id = null) {\r\n this._myTimer.unregisterOnEnd(id);\r\n }\r\n\r\n update(dt, fsm) {\r\n this._myTimer.update(dt);\r\n if (this._myTimer.isDone()) {\r\n if (this._myTransitionToPerformOnEnd != null) {\r\n fsm.perform(this._myTransitionToPerformOnEnd, ...this._myTransitionArgs);\r\n }\r\n }\r\n }\r\n\r\n start(fsm, transition, duration = null, transitionToPerformOnEnd = null, ...transitionArgs) {\r\n this._myTimer.start(duration);\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n\r\n init(fsm, state, duration = null, transitionToPerformOnEnd = null, ...transitionArgs) {\r\n this._myTimer.start(duration);\r\n if (transitionToPerformOnEnd != null) {\r\n this._myTransitionToPerformOnEnd = transitionToPerformOnEnd;\r\n this._myTransitionArgs = transitionArgs;\r\n }\r\n }\r\n};", "PP.CAUtils = {\r\n _myDummyServer: null,\r\n _myUseDummyServerOnSDKMissing: false,\r\n _myUseDummyServerOnError: false,\r\n setUseDummyServerOnSDKMissing: function (useDummyServer) {\r\n PP.CAUtils._myUseDummyServerOnSDKMissing = useDummyServer;\r\n },\r\n setUseDummyServerOnError: function (useDummyServer) {\r\n PP.CAUtils._myUseDummyServerOnError = useDummyServer;\r\n },\r\n setDummyServer: function (dummyServer) {\r\n PP.CAUtils._myDummyServer = dummyServer;\r\n },\r\n isUseDummyServerOnSDKMissing: function () {\r\n return PP.CAUtils._myUseDummyServerOnSDKMissing;\r\n },\r\n isUseDummyServerOnError: function () {\r\n return PP.CAUtils._myUseDummyServerOnError;\r\n },\r\n getDummyServer: function () {\r\n return PP.CAUtils._myDummyServer;\r\n },\r\n isSDKAvailable: function () {\r\n return \"casdk\" in window;\r\n },\r\n getLeaderboard: function (leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError, overrideUseDummyServer = null) {\r\n if (PP.CAUtils.isSDKAvailable()) {\r\n if (!isAroundPlayer) {\r\n casdk.getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount).then(function (result) {\r\n if (result.leaderboard) {\r\n if (callbackOnDone) {\r\n callbackOnDone(result.leaderboard);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n });\r\n } else {\r\n PP.CAUtils.getUser(\r\n function (user) {\r\n let userName = user.displayName;\r\n casdk.getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount).then(function (result) {\r\n if (result.leaderboard) {\r\n let userValid = false;\r\n for (let value of result.leaderboard) {\r\n if (value.displayName == userName && value.score != 0) {\r\n userValid = true;\r\n break;\r\n }\r\n }\r\n if (userValid) {\r\n if (callbackOnDone) {\r\n callbackOnDone(result.leaderboard);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Searching for around player but the user has not submitted a score yet\";\r\n error.type = PP.CAUtils.ErrorType.USER_HAS_NO_SCORE;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Get leaderboard failed\";\r\n error.type = PP.CAUtils.ErrorType.GET_LEADERBOARD_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n });\r\n\r\n },\r\n function () {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Searching for around player but the user can't be retrieved\";\r\n error.type = PP.CAUtils.ErrorType.GET_USER_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n },\r\n false);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnSDKMissing && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = PP.CAUtils.ErrorType.CA_SDK_MISSING;\r\n callbackOnError(error, null);\r\n }\r\n }\r\n },\r\n getLeaderboardDummy(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError) {\r\n if (PP.CAUtils._myDummyServer) {\r\n PP.CAUtils._myDummyServer.getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError);\r\n } else {\r\n if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED;\r\n callbackOnError(error);\r\n }\r\n }\r\n },\r\n submitScore: function (leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError, overrideUseDummyServer = null) {\r\n if (PP.CAUtils.isSDKAvailable()) {\r\n casdk.submitScore(leaderboardID, scoreToSubmit).then(function (result) {\r\n if (result.error) {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Submit score failed\";\r\n error.type = PP.CAUtils.ErrorType.SUBMIT_SCORE_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n } else {\r\n callbackOnDone();\r\n }\r\n });\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnSDKMissing && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.submitScoreDummy(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = PP.CAUtils.ErrorType.CA_SDK_MISSING;\r\n callbackOnError(error, null);\r\n }\r\n }\r\n },\r\n submitScoreDummy(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError) {\r\n if (PP.CAUtils._myDummyServer) {\r\n PP.CAUtils._myDummyServer.submitScore(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError);\r\n } else {\r\n if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED;\r\n callbackOnError(error);\r\n }\r\n }\r\n },\r\n getUser: function (callbackOnDone, callbackOnError, overrideUseDummyServer = null) {\r\n if (PP.CAUtils.isSDKAvailable()) {\r\n casdk.getUser().then(function (result) {\r\n if (result.user) {\r\n if (callbackOnDone) {\r\n callbackOnDone(result.user);\r\n }\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnError && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getUserDummy(callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Get user failed\";\r\n error.type = PP.CAUtils.ErrorType.GET_USER_FAILED;\r\n callbackOnError(error, result);\r\n }\r\n }\r\n });\r\n } else {\r\n if ((PP.CAUtils._myUseDummyServerOnSDKMissing && overrideUseDummyServer == null) || (overrideUseDummyServer != null && overrideUseDummyServer)) {\r\n PP.CAUtils.getUserDummy(callbackOnDone, callbackOnError);\r\n } else if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Construct Arcade SDK missing\";\r\n error.type = PP.CAUtils.ErrorType.CA_SDK_MISSING;\r\n callbackOnError(error, null);\r\n }\r\n }\r\n },\r\n getUserDummy(callbackOnDone, callbackOnError) {\r\n if (PP.CAUtils._myDummyServer) {\r\n PP.CAUtils._myDummyServer.getUser(callbackOnDone, callbackOnError);\r\n } else {\r\n if (callbackOnError) {\r\n let error = {};\r\n error.reason = \"Dummy server not initialized\";\r\n error.type = PP.CAUtils.ErrorType.DUMMY_NOT_INITIALIZED;\r\n callbackOnError(error);\r\n }\r\n }\r\n },\r\n ErrorType: {\r\n DUMMY_NOT_INITIALIZED: 0,\r\n CA_SDK_MISSING: 1,\r\n SUBMIT_SCORE_FAILED: 2,\r\n GET_LEADERBOARD_FAILED: 3,\r\n GET_USER_FAILED: 4,\r\n USER_HAS_NO_SCORE: 5\r\n }\r\n};\r\n\r\nPP.CADummyServer = class CADummyServer {\r\n\r\n constructor() {\r\n }\r\n\r\n getLeaderboard(leaderboardID, isAscending, isAroundPlayer, scoresAmount, callbackOnDone, callbackOnError) {\r\n let leaderboard = null;\r\n\r\n if (isAroundPlayer) {\r\n leaderboard = [\r\n { rank: 7, displayName: \"Player 1\", score: 1000000 },\r\n { rank: 8, displayName: \"Player 2\", score: 1000000 },\r\n { rank: 9, displayName: \"Player 3\", score: 900000 },\r\n { rank: 10, displayName: \"Player 4\", score: 800000 },\r\n { rank: 11111, displayName: \"Player 5\", score: 70000000 },\r\n { rank: 22222, displayName: \"VeryLongName_06\", score: 600000 },\r\n { rank: 33333, displayName: \"Player 7\", score: 500000 },\r\n { rank: 44444, displayName: \"Player 8\", score: 400000 },\r\n { rank: 55555, displayName: \"Player 9\", score: 300000 },\r\n { rank: 66666, displayName: \"Player 10\", score: 200000 }];\r\n } else {\r\n leaderboard = [\r\n { rank: 0, displayName: \"Player 1\", score: 1000000 },\r\n { rank: 1, displayName: \"Player 2\", score: 1000000 },\r\n { rank: 2, displayName: \"Player 3\", score: 900000 },\r\n { rank: 3, displayName: \"Player 4\", score: 800000 },\r\n { rank: 4, displayName: \"Player 5\", score: 700000 },\r\n { rank: 5, displayName: \"Player 6\", score: 600000 },\r\n { rank: 6, displayName: \"Player 7\", score: 500000 },\r\n { rank: 7, displayName: \"Player 8\", score: 400000 },\r\n { rank: 8, displayName: \"Player 9\", score: 300000 },\r\n { rank: 9, displayName: \"Player 10\", score: 200000 }];\r\n }\r\n\r\n while (leaderboard.length > scoresAmount) {\r\n leaderboard.pop();\r\n }\r\n\r\n if (callbackOnDone) {\r\n callbackOnDone(leaderboard);\r\n }\r\n }\r\n\r\n submitScore(leaderboardID, scoreToSubmit, callbackOnDone, callbackOnError) {\r\n if (callbackOnDone) {\r\n callbackOnDone();\r\n }\r\n }\r\n\r\n getUser(callbackOnDone, callbackOnError) {\r\n let user = {};\r\n user.displayName = \"Jonathan\";\r\n\r\n if (callbackOnDone) {\r\n callbackOnDone(user);\r\n }\r\n }\r\n};", "PP.ColorUtils = {\r\n //RGB is in [0,1], alpha is not changed\r\n rgbToHsv: function (rgb) {\r\n let hsv = rgb.pp_clone();\r\n\r\n let r = rgb[0];\r\n let g = rgb[1];\r\n let b = rgb[2];\r\n\r\n var max = Math.max(r, g, b), min = Math.min(r, g, b),\r\n d = max - min,\r\n h,\r\n s = (max === 0 ? 0 : d / max),\r\n v = max;\r\n\r\n switch (max) {\r\n case min: h = 0; break;\r\n case r: h = (g - b) + d * (g < b ? 6 : 0); h /= 6 * d; break;\r\n case g: h = (b - r) + d * 2; h /= 6 * d; break;\r\n case b: h = (r - g) + d * 4; h /= 6 * d; break;\r\n }\r\n\r\n hsv[0] = h;\r\n hsv[1] = s;\r\n hsv[2] = v;\r\n\r\n return hsv;\r\n },\r\n //alpha is not changed\r\n hsvToRgb: function (hsv) {\r\n let rgb = hsv.pp_clone();\r\n\r\n let h = hsv[0];\r\n let s = hsv[1];\r\n let v = hsv[2];\r\n\r\n let r, g, b, i, f, p, q, t;\r\n i = Math.floor(h * 6);\r\n f = h * 6 - i;\r\n p = v * (1 - s);\r\n q = v * (1 - f * s);\r\n t = v * (1 - (1 - f) * s);\r\n\r\n switch (i % 6) {\r\n case 0: r = v, g = t, b = p; break;\r\n case 1: r = q, g = v, b = p; break;\r\n case 2: r = p, g = v, b = t; break;\r\n case 3: r = p, g = q, b = v; break;\r\n case 4: r = t, g = p, b = v; break;\r\n case 5: r = v, g = p, b = q; break;\r\n }\r\n\r\n rgb[0] = r;\r\n rgb[1] = g;\r\n rgb[2] = b;\r\n\r\n return rgb;\r\n },\r\n rgbCodeToHuman(rgb) {\r\n return PP.ColorUtils.color1To255(rgb);\r\n },\r\n rgbHumanToCode(rgb) {\r\n return PP.ColorUtils.color255To1(rgb);\r\n },\r\n hsvCodeToHuman(hsv) {\r\n return PP.ColorUtils.color1To255(hsv);\r\n },\r\n hsvHumanToCode(hsv) {\r\n return PP.ColorUtils.color255To1(hsv);\r\n },\r\n color255To1(color) {\r\n let result = color.pp_clone();\r\n\r\n for (let i = 0; i < result.length; i++) {\r\n result[i] /= 255;\r\n result[i] = Math.pp_clamp(result[i], 0, 1);\r\n }\r\n\r\n return result;\r\n },\r\n color1To255(color) {\r\n let result = color.pp_clone();\r\n\r\n for (let i = 0; i < result.length; i++) {\r\n result[i] = Math.round(result[i] * 255);\r\n result[i] = Math.pp_clamp(result[i], 0, 255);\r\n }\r\n\r\n return result;\r\n },\r\n};", "PP.MeshCreationVertexParams = class MeshCreationVertexParams {\n constructor() {\n this.myPosition = null; // vec3\n this.myTextureCoordinates = null; // vec2\n this.myNormal = null; // vec3\n this.myColor = null; // vec4\n }\n};\n\nPP.MeshCreationTriangleParams = class MeshCreationTriangleParams {\n constructor() {\n this.myIndexes = new Uint32Array(3);\n }\n};\n\nPP.MeshCreationParams = class MeshCreationParams {\n constructor() {\n this.myVertexes = [];\n this.myTriangles = [];\n }\n};\n\nPP.MeshUtils = {\n createPlaneMesh: function () {\n let vertexCount = 4;\n\n let meshParams = new PP.MeshCreationParams();\n\n for (let i = 0; i < vertexCount; ++i) {\n let vertexParams = new PP.MeshCreationVertexParams();\n\n vertexParams.myPosition = new PP.vec3_create();\n vertexParams.myPosition[0] = -1 + (i & 1) * 2;\n vertexParams.myPosition[1] = -1 + ((i & 2) >> 1) * 2; // this is a quick way to have positions (-1,-1) (1,-1) (1,-1) (1,1)\n vertexParams.myPosition[2] = 0;\n\n vertexParams.myTextureCoordinates = new PP.vec2_create();\n vertexParams.myTextureCoordinates[0] = (i & 1);\n vertexParams.myTextureCoordinates[1] = ((i & 2) >> 1);\n\n vertexParams.myNormal = new PP.vec3_create();\n vertexParams.myNormal[0] = 0;\n vertexParams.myNormal[1] = 0;\n vertexParams.myNormal[2] = 1;\n\n meshParams.myVertexes.push(vertexParams);\n }\n\n let firstTriangle = new PP.MeshCreationTriangleParams();\n firstTriangle.myIndexes[0] = 0;\n firstTriangle.myIndexes[1] = 1;\n firstTriangle.myIndexes[2] = 2;\n\n let secondTriangle = new PP.MeshCreationTriangleParams();\n secondTriangle.myIndexes[0] = 2;\n secondTriangle.myIndexes[1] = 1;\n secondTriangle.myIndexes[2] = 3;\n\n meshParams.myTriangles.push(firstTriangle);\n meshParams.myTriangles.push(secondTriangle);\n\n let mesh = PP.MeshUtils.createMesh(meshParams);\n\n return mesh;\n },\n createMesh: function (meshCreationParams) {\n let indexData = [];\n for (let triangle of meshCreationParams.myTriangles) {\n indexData.push(triangle.myIndexes[0]);\n indexData.push(triangle.myIndexes[1]);\n indexData.push(triangle.myIndexes[2]);\n }\n\n let indexDataUnsignedInt = new Uint32Array(indexData.length);\n indexDataUnsignedInt.pp_copy(indexData);\n\n let vertexCount = meshCreationParams.myVertexes.length;\n let mesh = new WL.Mesh({\n vertexCount: vertexCount,\n indexData: indexDataUnsignedInt,\n indexType: WL.MeshIndexType.UnsignedInt,\n });\n\n let positionAttribute = null;\n let textureCoordinatesAttribute = null;\n let normalAttribute = null;\n let colorAttribute = null;\n\n try {\n positionAttribute = mesh.attribute(WL.MeshAttribute.Position);\n } catch (error) {\n positionAttribute = null;\n }\n\n try {\n textureCoordinatesAttribute = mesh.attribute(WL.MeshAttribute.TextureCoordinate);\n } catch (error) {\n textureCoordinatesAttribute = null;\n }\n\n try {\n normalAttribute = mesh.attribute(WL.MeshAttribute.Normal);\n } catch (error) {\n normalAttribute = null;\n }\n\n try {\n colorAttribute = mesh.attribute(WL.MeshAttribute.Color);\n } catch (error) {\n colorAttribute = null;\n }\n\n for (let i = 0; i < meshCreationParams.myVertexes.length; i++) {\n let vertex = meshCreationParams.myVertexes[i];\n if (positionAttribute != null && vertex.myPosition) {\n positionAttribute.set(i, vertex.myPosition);\n }\n if (textureCoordinatesAttribute != null && vertex.myTextureCoordinates) {\n textureCoordinatesAttribute.set(i, vertex.myTextureCoordinates);\n }\n if (normalAttribute != null && vertex.myNormal) {\n normalAttribute.set(i, vertex.myNormal);\n }\n if (colorAttribute != null && vertex.myColor) {\n colorAttribute.set(i, vertex.myColor);\n }\n }\n\n return mesh;\n },\n cloneMesh: function () {\n let position = PP.vec3_create();\n let textureCoordinates = PP.vec2_create();\n let normal = PP.vec3_create();\n let color = PP.vec4_create();\n\n return function cloneMesh(mesh) {\n if (mesh == null) {\n return null;\n }\n\n let clonedIndexData = new Uint32Array(mesh.indexData.length);\n for (let i = 0; i < mesh.indexData.length; i++) {\n clonedIndexData[i] = mesh.indexData[i];\n }\n\n let clonedMesh = new WL.Mesh({\n vertexCount: mesh.vertexCount,\n indexData: clonedIndexData,\n indexType: WL.MeshIndexType.UnsignedInt,\n });\n\n let positionAttribute = null;\n let textureCoordinatesAttribute = null;\n let normalAttribute = null;\n let colorAttribute = null;\n\n let clonedPositionAttribute = null;\n let clonedTextureCoordinatesAttribute = null;\n let clonedNormalAttribute = null;\n let clonedColorAttribute = null;\n\n\n try {\n positionAttribute = mesh.attribute(WL.MeshAttribute.Position);\n clonedPositionAttribute = clonedMesh.attribute(WL.MeshAttribute.Position);\n } catch (error) {\n positionAttribute = null;\n clonedPositionAttribute = null;\n }\n\n try {\n textureCoordinatesAttribute = mesh.attribute(WL.MeshAttribute.TextureCoordinate);\n clonedTextureCoordinatesAttribute = clonedMesh.attribute(WL.MeshAttribute.TextureCoordinate);\n } catch (error) {\n textureCoordinatesAttribute = null;\n clonedTextureCoordinatesAttribute = null;\n }\n\n try {\n normalAttribute = mesh.attribute(WL.MeshAttribute.Normal);\n clonedNormalAttribute = clonedMesh.attribute(WL.MeshAttribute.Normal);\n } catch (error) {\n normalAttribute = null;\n clonedNormalAttribute = null;\n }\n\n try {\n colorAttribute = mesh.attribute(WL.MeshAttribute.Color);\n clonedColorAttribute = clonedMesh.attribute(WL.MeshAttribute.Color);\n } catch (error) {\n colorAttribute = null;\n clonedColorAttribute = null;\n }\n\n for (let i = 0; i < mesh.vertexCount; i++) {\n if (positionAttribute != null && clonedPositionAttribute != null) {\n clonedPositionAttribute.set(i, positionAttribute.get(i, position));\n }\n if (textureCoordinatesAttribute != null && clonedTextureCoordinatesAttribute != null) {\n clonedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\n }\n if (normalAttribute != null && clonedNormalAttribute != null) {\n clonedNormalAttribute.set(i, normalAttribute.get(i, normal));\n }\n if (colorAttribute != null && clonedColorAttribute != null) {\n clonedColorAttribute.set(i, colorAttribute.get(i, color));\n }\n }\n\n return clonedMesh;\n };\n }(),\n invertMesh: function () {\n let position = PP.vec3_create();\n let textureCoordinates = PP.vec2_create();\n let normal = PP.vec3_create();\n let color = PP.vec4_create();\n\n return function invertMesh(mesh) {\n if (mesh == null) {\n return null;\n }\n\n let invertedIndexData = new Uint32Array(mesh.indexData.length);\n for (let i = 0; i < mesh.indexData.length / 3; i++) {\n invertedIndexData[i * 3 + 0] = mesh.indexData[i * 3 + 2];\n invertedIndexData[i * 3 + 1] = mesh.indexData[i * 3 + 1];\n invertedIndexData[i * 3 + 2] = mesh.indexData[i * 3 + 0];\n }\n\n let invertedMesh = new WL.Mesh({\n vertexCount: mesh.vertexCount,\n indexData: invertedIndexData,\n indexType: WL.MeshIndexType.UnsignedInt,\n });\n\n let positionAttribute = null;\n let textureCoordinatesAttribute = null;\n let normalAttribute = null;\n let colorAttribute = null;\n\n let invertedPositionAttribute = null;\n let invertedTextureCoordinatesAttribute = null;\n let invertedNormalAttribute = null;\n let invertedColorAttribute = null;\n\n\n try {\n positionAttribute = mesh.attribute(WL.MeshAttribute.Position);\n invertedPositionAttribute = invertedMesh.attribute(WL.MeshAttribute.Position);\n } catch (error) {\n positionAttribute = null;\n invertedPositionAttribute = null;\n }\n\n try {\n textureCoordinatesAttribute = mesh.attribute(WL.MeshAttribute.TextureCoordinate);\n invertedTextureCoordinatesAttribute = invertedMesh.attribute(WL.MeshAttribute.TextureCoordinate);\n } catch (error) {\n textureCoordinatesAttribute = null;\n invertedTextureCoordinatesAttribute = null;\n }\n\n try {\n normalAttribute = mesh.attribute(WL.MeshAttribute.Normal);\n invertedNormalAttribute = invertedMesh.attribute(WL.MeshAttribute.Normal);\n } catch (error) {\n normalAttribute = null;\n invertedNormalAttribute = null;\n }\n\n try {\n colorAttribute = mesh.attribute(WL.MeshAttribute.Color);\n invertedColorAttribute = invertedMesh.attribute(WL.MeshAttribute.Color);\n } catch (error) {\n colorAttribute = null;\n invertedColorAttribute = null;\n }\n\n for (let i = 0; i < mesh.vertexCount; i++) {\n if (positionAttribute != null && invertedPositionAttribute != null) {\n invertedPositionAttribute.set(i, positionAttribute.get(i, position));\n }\n if (textureCoordinatesAttribute != null && invertedTextureCoordinatesAttribute != null) {\n invertedTextureCoordinatesAttribute.set(i, textureCoordinatesAttribute.get(i, textureCoordinates));\n }\n if (normalAttribute != null && invertedNormalAttribute != null) {\n normalAttribute.get(i, normal)\n normal.vec3_negate(normal);\n invertedNormalAttribute.set(i, normal);\n }\n if (colorAttribute != null && invertedColorAttribute != null) {\n invertedColorAttribute.set(i, colorAttribute.get(i, color));\n }\n }\n\n return invertedMesh;\n };\n }(),\n setAlpha: function () {\n let color = PP.vec4_create();\n return function setAlpha(object, alpha) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (meshComponent.material.color != null) {\n color.vec4_copy(meshComponent.material.color);\n color[3] = alpha;\n meshComponent.material.color = color;\n }\n\n if (meshComponent.material.diffuseColor != null) {\n color.vec4_copy(meshComponent.material.diffuseColor);\n color[3] = alpha;\n meshComponent.material.diffuseColor = color;\n }\n\n if (meshComponent.material.ambientColor != null) {\n color.vec4_copy(meshComponent.material.ambientColor);\n color[3] = alpha;\n meshComponent.material.ambientColor = color;\n }\n }\n };\n }(),\n setMaterial: function (object, material, cloneMaterial = false) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (cloneMaterial) {\n meshComponent.material = material.clone();\n } else {\n meshComponent.material = material;\n }\n }\n },\n setClonedMaterials: function (object) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n meshComponent.material = meshComponent.material.clone();\n }\n },\n setSpecularColor: function (object, color) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (meshComponent.material.specularColor != null) {\n meshComponent.material.specularColor = color;\n }\n }\n },\n setFogColor: function (object, color) {\n let meshComponents = object.pp_getComponentsHierarchy(\"mesh\");\n\n for (let meshComponent of meshComponents) {\n if (meshComponent.material.fogColor != null) {\n meshComponent.material.fogColor = color;\n }\n }\n },\n};", "PP.SaveUtils = {\r\n save: function (id, value) {\r\n if (value != null) {\r\n localStorage.setItem(id, value);\r\n }\r\n },\r\n has: function (id) {\r\n return PP.SaveUtils.loadString(id, null) != null;\r\n },\r\n delete: function (id) {\r\n return localStorage.removeItem(id);\r\n },\r\n clear: function () {\r\n return localStorage.clear();\r\n },\r\n load: function (id, defaultValue = null) {\r\n return PP.SaveUtils.loadString(id, defaultValue);\r\n },\r\n loadString: function (id, defaultValue = null) {\r\n let item = localStorage.getItem(id);\r\n\r\n if (item == null) {\r\n item = defaultValue;\r\n }\r\n\r\n return item;\r\n },\r\n loadNumber: function (id, defaultValue = null) {\r\n let item = PP.SaveUtils.loadString(id);\r\n\r\n if (item != null) {\r\n return Number(item);\r\n }\r\n\r\n return defaultValue;\r\n },\r\n loadBool: function (id, defaultValue = null) {\r\n let item = PP.SaveUtils.loadString(id);\r\n\r\n if (item == \"true\") {\r\n return true;\r\n } else if (item == \"false\") {\r\n return false;\r\n }\r\n\r\n return defaultValue;\r\n }\r\n};", "PP.TextUtils = {\r\n setClonedMaterials: function (object) {\r\n let textComponents = object.pp_getComponentsHierarchy(\"text\");\r\n\r\n for (let textComponent of textComponents) {\r\n textComponent.material = textComponent.material.clone();\r\n }\r\n },\r\n};", "PP.XRUtils = {\r\n isDeviceEmulated: function () {\r\n let isEmulated = ('CustomWebXRPolyfill' in window);\r\n return isEmulated;\r\n },\r\n isXRSessionActive: function () {\r\n return WL.xrSession != null;\r\n },\r\n isReferenceSpaceLocalFloor: function () {\r\n return ![\"local\", \"viewer\"].includes(WebXR.refSpace);\r\n }\r\n};", "PP.PhysicsUtils = {\r\n _myLayerFlagAmount: 8,\r\n _myLayerFlagNames: [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"],\r\n setLayerFlagAmount: function (layerFlagAmount) {\r\n PP.PhysicsUtils._myLayerFlagAmount = layerFlagAmount;\r\n },\r\n setLayerFlagNames: function (layerFlagNames) {\r\n PP.PhysicsUtils._myLayerFlagNames = layerFlagNames;\r\n },\r\n getLayerFlagAmount: function () {\r\n return PP.PhysicsUtils._myLayerFlagAmount;\r\n },\r\n getLayerFlagNames: function () {\r\n return PP.PhysicsUtils._myLayerFlagNames;\r\n },\r\n raycast: function () {\r\n let objectsEqualCallback = (first, second) => first.pp_equals(second);\r\n return function raycast(raycastSetup, raycastResult = new PP.RaycastResult()) {\r\n let internalRaycastResult = WL.physics.rayCast(raycastSetup.myOrigin, raycastSetup.myDirection, raycastSetup.myBlockLayerFlags.getMask(), raycastSetup.myDistance);\r\n\r\n raycastResult.myRaycastSetup = raycastSetup;\r\n\r\n let currentValidHitIndex = 0;\r\n let validHitsCount = 0;\r\n\r\n for (let i = 0; i < internalRaycastResult.hitCount; i++) {\r\n let isHitValid = true;\r\n\r\n isHitValid = isHitValid &&\r\n (raycastSetup.myObjectsToIgnore.length == 0 ||\r\n !raycastSetup.myObjectsToIgnore.pp_hasEqual(internalRaycastResult.objects[i], objectsEqualCallback));\r\n\r\n let isHitInsideCollision = isHitValid &&\r\n internalRaycastResult.distances[i] == 0 &&\r\n (raycastSetup.myOrigin.vec3_distance(internalRaycastResult.locations[i]) < 0.00001 &&\r\n Math.abs(raycastSetup.myDirection.vec3_angle(internalRaycastResult.normals[i]) - 180) < 0.00001);\r\n\r\n isHitValid = isHitValid && (!raycastSetup.myIgnoreHitsInsideCollision || !isHitInsideCollision);\r\n\r\n if (isHitValid) {\r\n let hit = null;\r\n\r\n if (currentValidHitIndex < raycastResult.myHits.length) {\r\n hit = raycastResult.myHits[currentValidHitIndex];\r\n } else if (raycastResult._myUnusedHits != null && raycastResult._myUnusedHits.length > 0) {\r\n hit = raycastResult._myUnusedHits.pop();\r\n raycastResult.myHits.push(hit);\r\n } else {\r\n hit = new PP.RaycastHit();\r\n raycastResult.myHits.push(hit);\r\n }\r\n\r\n hit.myPosition.vec3_copy(internalRaycastResult.locations[i]);\r\n hit.myNormal.vec3_copy(internalRaycastResult.normals[i]);\r\n hit.myDistance = internalRaycastResult.distances[i];\r\n hit.myObject = internalRaycastResult.objects[i];\r\n hit.myIsInsideCollision = isHitInsideCollision;\r\n\r\n validHitsCount++;\r\n currentValidHitIndex++;\r\n }\r\n }\r\n\r\n if (raycastResult.myHits.length > validHitsCount) {\r\n if (raycastResult._myUnusedHits == null) {\r\n raycastResult._myUnusedHits = [];\r\n }\r\n\r\n let hitsToRemove = raycastResult.myHits.length - validHitsCount;\r\n for (let i = 0; i < hitsToRemove; i++) {\r\n raycastResult._myUnusedHits.push(raycastResult.myHits.pop());\r\n }\r\n }\r\n\r\n return raycastResult;\r\n };\r\n }()\r\n};", "/*\r\nlet raycastSetup = new PP.RaycastSetup();\r\n\r\nraycastSetup.myOrigin.vec3_copy(origin);\r\nraycastSetup.myDirection.vec3_copy(direction);\r\nraycastSetup.myDistance = distance;\r\nraycastSetup.myBlockLayerFlags.setMask(flags);\r\nraycastSetup.myObjectsToIgnore.pp_clear();\r\nraycastSetup.myIgnoreHitsInsideCollision = false;\r\n\r\nlet raycastResult = PP.PhysicsUtils.raycast(raycastSetup);\r\n*/\r\n\r\nPP.RaycastSetup = class RaycastSetup {\r\n constructor() {\r\n this.myOrigin = [0, 0, 0];\r\n this.myDirection = [0, 0, 0];\r\n this.myDistance = 0;\r\n\r\n this.myBlockLayerFlags = new PP.PhysicsLayerFlags();\r\n\r\n this.myObjectsToIgnore = [];\r\n this.myIgnoreHitsInsideCollision = false;\r\n }\r\n\r\n copy(setup) {\r\n this.myOrigin.vec3_copy(setup.myOrigin);\r\n this.myDirection.vec3_copy(setup.myDirection);\r\n this.myDistance = setup.myDistance;\r\n\r\n this.myBlockLayerFlags.copy(setup.myBlockLayerFlags);\r\n\r\n this.myObjectsToIgnore.pp_copy(setup.myObjectsToIgnore);\r\n this.myIgnoreHitsInsideCollision = setup.myIgnoreHitsInsideCollision;\r\n }\r\n};\r\n\r\nPP.RaycastResult = class RaycastResult {\r\n constructor() {\r\n this.myRaycastSetup = null;\r\n this.myHits = [];\r\n\r\n this._myUnusedHits = null;\r\n }\r\n\r\n isColliding(ignoreHitsInsideCollision = false) {\r\n return ignoreHitsInsideCollision ? this.getFirstHitOutsideCollision() != null : this.myHits.length > 0;\r\n }\r\n\r\n getFirstHitInsideCollision() {\r\n let firstHit = null;\r\n\r\n for (let hit of this.myHits) {\r\n if (hit.myIsInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n getFirstHitOutsideCollision() {\r\n let firstHit = null;\r\n\r\n for (let hit of this.myHits) {\r\n if (!hit.myIsInsideCollision) {\r\n firstHit = hit;\r\n break;\r\n }\r\n }\r\n\r\n return firstHit;\r\n }\r\n\r\n getHitsInsideCollision() {\r\n let hits = [];\r\n\r\n for (let hit of this.myHits) {\r\n if (hit.myIsInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n getHitsOutsideCollision() {\r\n let hits = [];\r\n\r\n for (let hit of this.myHits) {\r\n if (!hit.myIsInsideCollision) {\r\n hits.push(hit);\r\n }\r\n }\r\n\r\n return hits;\r\n }\r\n\r\n removeHit(hitIndex) {\r\n let removedHit = this.myHits.pp_removeIndex(hitIndex);\r\n\r\n if (removedHit != null) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n this._myUnusedHits.push(removedHit);\r\n }\r\n\r\n return removedHit;\r\n }\r\n\r\n copy(result) {\r\n // implemented outside class definition\r\n }\r\n};\r\n\r\nPP.RaycastResult.prototype.copy = function () {\r\n let copyHitCallback = function (currentElement, elementToCopy) {\r\n if (currentElement == null) {\r\n currentElement = new PP.RaycastHit();\r\n }\r\n\r\n currentElement.copy(elementToCopy);\r\n\r\n return currentElement;\r\n };\r\n\r\n return function copy(result) {\r\n if (result.myRaycastSetup == null) {\r\n this.myRaycastSetup = null;\r\n } else {\r\n if (this.myRaycastSetup == null) {\r\n this.myRaycastSetup = new PP.RaycastSetup();\r\n }\r\n\r\n this.myRaycastSetup.copy(result.myRaycastSetup);\r\n }\r\n\r\n if (this.myHits.length > result.myHits.length) {\r\n if (this._myUnusedHits == null) {\r\n this._myUnusedHits = [];\r\n }\r\n\r\n for (let i = 0; i < this.myHits.length - result.myHits.length; i++) {\r\n this._myUnusedHits.push(this.myHits.pop());\r\n }\r\n } else if (this.myHits.length < result.myHits.length) {\r\n if (this._myUnusedHits != null) {\r\n let length = Math.min(this._myUnusedHits.length, result.myHits.length - this.myHits.length);\r\n\r\n for (let i = 0; i < length; i++) {\r\n this.myHits.push(this._myUnusedHits.pop());\r\n }\r\n }\r\n }\r\n\r\n this.myHits.pp_copy(result.myHits, copyHitCallback);\r\n };\r\n}();\r\n\r\nPP.RaycastHit = class RaycastHit {\r\n constructor() {\r\n this.myPosition = [0, 0, 0];\r\n this.myNormal = [0, 0, 0];\r\n this.myDistance = 0;\r\n this.myObject = null;\r\n\r\n this.myIsInsideCollision = false;\r\n }\r\n\r\n isValid() {\r\n return this.myObject != null;\r\n }\r\n\r\n copy(hit) {\r\n this.myPosition.vec3_copy(hit.myPosition);\r\n this.myNormal.vec3_copy(hit.myNormal);\r\n this.myDistance = hit.myDistance;\r\n this.myObject = hit.myObject;\r\n this.myIsInsideCollision = hit.myIsInsideCollision;\r\n }\r\n\r\n reset() {\r\n this.myPosition.vec3_zero();\r\n this.myNormal.vec3_zero();\r\n this.myDistance = 0;\r\n this.myObject = null;\r\n this.myIsInsideCollision = false;\r\n }\r\n};\r\n\r\n\r\n\r\nObject.defineProperty(PP.RaycastResult.prototype, \"copy\", { enumerable: false });", "PP.PhysicsLayerFlags = class PhysicsLayerFlags {\r\n constructor() {\r\n this._myLayerMask = 0;\r\n }\r\n\r\n setFlagActive(indexOrName, active) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PP.PhysicsUtils.getLayerFlagNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n if (index >= 0 && index < PP.PhysicsUtils.getLayerFlagAmount()) {\r\n let mask = 1 << index;\r\n\r\n if (active) {\r\n this._myLayerMask = this._myLayerMask | mask;\r\n } else {\r\n this._myLayerMask = this._myLayerMask & ~mask;\r\n }\r\n }\r\n }\r\n\r\n isFlagActive(indexOrName) {\r\n let index = indexOrName;\r\n if (isNaN(indexOrName)) {\r\n index = PP.PhysicsUtils.getLayerFlagNames().pp_findIndexEqual(indexOrName);\r\n }\r\n\r\n let isActive = false;\r\n\r\n if (index >= 0 && index < PP.PhysicsUtils.getLayerFlagAmount()) {\r\n let mask = 1 << index;\r\n isActive = !!(this._myLayerMask & mask);\r\n }\r\n\r\n return isActive;\r\n }\r\n\r\n setAllFlagsActive(active) {\r\n if (!active) {\r\n this._myLayerMask = 0;\r\n } else {\r\n this._myLayerMask = Math.pow(2, PP.PhysicsUtils.getLayerFlagAmount()) - 1;\r\n }\r\n }\r\n\r\n getMask() {\r\n return this._myLayerMask;\r\n }\r\n\r\n setMask(layerMask) {\r\n this._myLayerMask = layerMask;\r\n }\r\n\r\n copy(layerFlags) {\r\n this._myLayerMask = layerFlags._myLayerMask;\r\n }\r\n};", "PP.VisualManager = class VisualManager {\r\n constructor() {\r\n this._myVisualElementTypeMap = new Map();\r\n this._myVisualElementLastID = 0;\r\n this._myVisualElementsPool = new PP.ObjectPoolManager();\r\n this._myVisualElementsToShow = [];\r\n\r\n this._myActive = true;\r\n }\r\n\r\n setActive(active) {\r\n if (this._myActive != active) {\r\n this._myActive = active;\r\n\r\n if (!this._myActive) {\r\n this.clearDraw();\r\n }\r\n }\r\n }\r\n\r\n isActive() {\r\n return this._myActive;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n update(dt) {\r\n this._updateDraw(dt);\r\n }\r\n\r\n //lifetimeSeconds can be null, in that case the element will be drawn until cleared\r\n draw(visualElementParams, lifetimeSeconds = 0, idToReuse = null) {\r\n if (!this._myActive) {\r\n return 0;\r\n }\r\n\r\n let visualElement = null;\r\n let idReused = false;\r\n if (idToReuse != null) {\r\n if (this._myVisualElementTypeMap.has(visualElementParams.myType)) {\r\n let visualElementMap = this._myVisualElementTypeMap.get(visualElementParams.myType);\r\n if (visualElementMap.has(idToReuse)) {\r\n visualElement = visualElementMap.get(idToReuse)[0];\r\n visualElement.setParams(visualElementParams);\r\n visualElement.setVisible(false);\r\n idReused = true;\r\n }\r\n }\r\n }\r\n\r\n if (visualElement == null) {\r\n visualElement = this._getVisualElement(visualElementParams);\r\n }\r\n\r\n if (visualElement == null) {\r\n console.error(\"Couldn't create the requested visual element\");\r\n return null;\r\n }\r\n\r\n if (!this._myVisualElementTypeMap.has(visualElementParams.myType)) {\r\n this._myVisualElementTypeMap.set(visualElementParams.myType, new Map());\r\n }\r\n let visualElementMap = this._myVisualElementTypeMap.get(visualElementParams.myType);\r\n\r\n let elementID = null;\r\n if (!idReused) {\r\n elementID = this._myVisualElementLastID + 1;\r\n this._myVisualElementLastID = elementID;\r\n\r\n visualElementMap.set(elementID, [visualElement, new PP.Timer(lifetimeSeconds, lifetimeSeconds != null)]);\r\n } else {\r\n elementID = idToReuse;\r\n let visualElementPair = visualElementMap.get(elementID);\r\n visualElementPair[0] = visualElement;\r\n visualElementPair[1].reset(lifetimeSeconds);\r\n if (lifetimeSeconds != null) {\r\n visualElementPair[1].start();\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow.push(visualElement);\r\n\r\n return elementID;\r\n }\r\n\r\n getDraw(elementID) {\r\n let visualElement = null;\r\n\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n if (visualElementMap.has(elementID)) {\r\n let visualElementPair = visualElementMap.get(elementID);\r\n visualElement = visualElementPair[0];\r\n break;\r\n }\r\n }\r\n\r\n return visualElement;\r\n }\r\n\r\n clearDraw(elementID = null) {\r\n if (elementID == null) {\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n for (let visualElement of visualElementMap.values()) {\r\n this._myVisualElementsPool.releaseObject(visualElement[0].getParams().myType, visualElement[0]);\r\n }\r\n }\r\n\r\n this._myVisualElementsToShow = [];\r\n this._myVisualElementTypeMap = new Map();\r\n this._myVisualElementLastID = 0;\r\n } else {\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n if (visualElementMap.has(elementID)) {\r\n let visualElementPair = visualElementMap.get(elementID);\r\n this._myVisualElementsPool.releaseObject(visualElementPair[0].getParams().myType, visualElementPair[0]);\r\n visualElementMap.delete(elementID);\r\n\r\n this._myVisualElementsToShow.pp_removeEqual(visualElementPair[0]);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n allocateDraw(visualElementType, amount) {\r\n if (!this._myVisualElementsPool.hasPool(visualElementType)) {\r\n this._addVisualElementTypeToPool(visualElementType);\r\n }\r\n\r\n let pool = this._myVisualElementsPool.getPool(visualElementType);\r\n\r\n let difference = pool.getAvailableSize() - amount;\r\n if (difference < 0) {\r\n pool.increase(-difference);\r\n }\r\n }\r\n\r\n _updateDraw(dt) {\r\n for (let visualElement of this._myVisualElementsToShow) {\r\n visualElement.setVisible(true);\r\n }\r\n this._myVisualElementsToShow = [];\r\n\r\n for (let visualElementMap of this._myVisualElementTypeMap.values()) {\r\n let idsToRemove = [];\r\n for (let visualElementMapEntry of visualElementMap.entries()) {\r\n let visualElement = visualElementMapEntry[1];\r\n if (visualElement[1].isDone()) {\r\n this._myVisualElementsPool.releaseObject(visualElement[0].getParams().myType, visualElement[0]);\r\n idsToRemove.push(visualElementMapEntry[0]);\r\n }\r\n\r\n visualElement[1].update(dt);\r\n }\r\n\r\n for (let id of idsToRemove) {\r\n visualElementMap.delete(id);\r\n }\r\n }\r\n }\r\n\r\n _getVisualElement(params) {\r\n let element = null;\r\n\r\n if (!this._myVisualElementsPool.hasPool(params.myType)) {\r\n this._addVisualElementTypeToPool(params.myType);\r\n }\r\n\r\n element = this._myVisualElementsPool.getObject(params.myType);\r\n\r\n if (element != null) {\r\n element.setParams(params);\r\n }\r\n\r\n return element;\r\n }\r\n\r\n _addVisualElementTypeToPool(type) {\r\n let objectPoolParams = new PP.ObjectPoolParams();\r\n objectPoolParams.myInitialPoolSize = 10;\r\n objectPoolParams.myPercentageToAddWhenEmpty = 1;\r\n objectPoolParams.myEnableDebugLog = false;\r\n objectPoolParams.mySetActiveCallback = function (object, active) {\r\n object.setVisible(active);\r\n };\r\n\r\n let visualElement = null;\r\n switch (type) {\r\n case PP.VisualElementType.LINE:\r\n visualElement = new PP.VisualLine();\r\n break;\r\n case PP.VisualElementType.MESH:\r\n visualElement = new PP.VisualMesh();\r\n break;\r\n case PP.VisualElementType.POINT:\r\n visualElement = new PP.VisualPoint();\r\n break;\r\n case PP.VisualElementType.ARROW:\r\n visualElement = new PP.VisualArrow();\r\n break;\r\n case PP.VisualElementType.TEXT:\r\n visualElement = new PP.VisualText();\r\n break;\r\n case PP.VisualElementType.TRANSFORM:\r\n visualElement = new PP.VisualTransform();\r\n break;\r\n case PP.VisualElementType.RAYCAST:\r\n visualElement = new PP.VisualRaycast();\r\n break;\r\n case PP.VisualElementType.TORUS:\r\n visualElement = new PP.VisualTorus();\r\n break;\r\n }\r\n\r\n visualElement.setVisible(false);\r\n visualElement.setAutoRefresh(true);\r\n\r\n if (visualElement != null) {\r\n this._myVisualElementsPool.addPool(type, visualElement, objectPoolParams);\r\n } else {\r\n console.error(\"Visual element type not supported\");\r\n }\r\n }\r\n};", "PP.VisualElementType = {\r\n MESH: 0,\r\n LINE: 1,\r\n POINT: 2,\r\n TEXT: 3,\r\n ARROW: 4,\r\n TRANSFORM: 5,\r\n RAYCAST: 6,\r\n TORUS: 7,\r\n};", "/*\r\nlet visualParams = new PP.VisualLineParams();\r\nvisualParams.myStart.vec3_copy(start);\r\nvisualParams.myDirection.vec3_copy(direction);\r\nvisualParams.myLength = 0.2;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualLine = new PP.VisualLine(visualParams);\r\n*/\r\n\r\nPP.VisualLineParams = class VisualLineParams {\r\n\r\n constructor() {\r\n this.myStart = [0, 0, 0];\r\n this.myDirection = [0, 0, 1];\r\n this.myLength = 0;\r\n\r\n this.myThickness = 0.005;\r\n\r\n this.myMaterial = null;\r\n this.myColor = null; // if this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.LINE;\r\n }\r\n\r\n setStartEnd(start, end) {\r\n end.vec3_sub(start, this.myDirection);\r\n this.myLength = this.myDirection.vec3_length();\r\n this.myDirection.vec3_normalize(this.myDirection);\r\n this.myStart.vec3_copy(start);\r\n\r\n return this;\r\n }\r\n};\r\n\r\nPP.VisualLine = class VisualLine {\r\n\r\n constructor(params = new PP.VisualLineParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myLineRootObject = null;\r\n this._myLineObject = null;\r\n this._myLineMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myLineRootObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _build() {\r\n this._myLineRootObject = WL.scene.addObject(null);\r\n this._myLineObject = WL.scene.addObject(this._myLineRootObject);\r\n\r\n this._myLineMeshComponent = this._myLineObject.addComponent('mesh');\r\n this._myLineMeshComponent.mesh = PP.myDefaultResources.myMeshes.myCylinder;\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualLineParams();\r\n clonedParams.myStart.vec3_copy(this._myParams.myStart);\r\n clonedParams.myDirection.vec3_copy(this._myParams.myDirection);\r\n clonedParams.myLength = this._myParams.myLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualLine(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualLine.prototype._refresh = function () {\r\n let scaleLine = PP.vec3_create();\r\n let translateLine = PP.vec3_create();\r\n\r\n let forward = PP.vec3_create(0, 0, 1);\r\n return function _refresh() {\r\n this._myLineRootObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myLineRootObject.pp_setPositionLocal(this._myParams.myStart);\r\n\r\n this._myLineObject.pp_resetPositionLocal();\r\n this._myLineObject.pp_resetScaleLocal();\r\n\r\n scaleLine.vec3_set(this._myParams.myThickness / 2, this._myParams.myLength / 2, this._myParams.myThickness / 2);\r\n this._myLineObject.pp_scaleObject(scaleLine);\r\n\r\n this._myLineObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n translateLine.vec3_set(0, this._myParams.myLength / 2, 0);\r\n this._myLineObject.pp_translateObject(translateLine);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myLineMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n this._myLineMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myLineMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualLine.prototype, \"_refresh\", { enumerable: false });", "/*\r\nlet visualParams = new PP.VisualMeshParams();\r\nvisualParams.myTransform = transform;\r\nvisualParams.myMesh = PP.myDefaultResources.myMeshes.mySphere;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualMesh = new PP.VisualMesh(visualParams);\r\n*/\r\n\r\nPP.VisualMeshParams = class VisualMeshParams {\r\n\r\n constructor() {\r\n this.myTransform = PP.mat4_create();\r\n\r\n this.myMesh = null;\r\n this.myMaterial = null;\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.MESH;\r\n }\r\n};\r\n\r\nPP.VisualMesh = class VisualMesh {\r\n\r\n constructor(params = new PP.VisualMeshParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myMeshObject = null;\r\n this._myMeshComponent = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myMeshObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _refresh() {\r\n this._myMeshObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n this._myMeshObject.pp_setTransformLocal(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMesh == null) {\r\n this._myMeshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\r\n } else {\r\n this._myMeshComponent.mesh = this._myParams.myMesh;\r\n }\r\n\r\n if (this._myParams.myMaterial == null) {\r\n this._myMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n this._myMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n }\r\n\r\n _build() {\r\n this._myMeshObject = WL.scene.addObject(null);\r\n\r\n this._myMeshComponent = this._myMeshObject.addComponent('mesh');\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualMeshParams();\r\n clonedParams.myTransform.pp_copy(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMesh != null) {\r\n clonedParams.myMesh = this._myParams.myMesh;\r\n } else {\r\n clonedParams.myMesh = null;\r\n }\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualMesh(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualPointParams();\r\nvisualParams.myPosition.vec3_copy(position);\r\nvisualParams.myRadius = 0.005;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualPoint = new PP.VisualPoint(visualParams);\r\n*/\r\n\r\nPP.VisualPointParams = class VisualPointParams {\r\n\r\n constructor() {\r\n this.myPosition = [0, 0, 0];\r\n this.myRadius = 0.005;\r\n\r\n this.myMaterial = null;\r\n this.myColor = null; // if this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.POINT;\r\n }\r\n};\r\n\r\nPP.VisualPoint = class VisualPoint {\r\n\r\n constructor(params = new PP.VisualPointParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myPointObject = null;\r\n this._myPointMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myPointObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _refresh() {\r\n this._myPointObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myPointObject.pp_setPositionLocal(this._myParams.myPosition);\r\n this._myPointObject.pp_setScaleLocal(this._myParams.myRadius);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myPointMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n this._myPointMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myPointMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n }\r\n\r\n _build() {\r\n this._myPointObject = WL.scene.addObject(null);\r\n\r\n this._myPointMeshComponent = this._myPointObject.addComponent('mesh');\r\n this._myPointMeshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualPointParams();\r\n clonedParams.myPosition.vec3_copy(this._myParams.myPosition);\r\n clonedParams.myRadius = this._myParams.myRadius;\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualPoint(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualArrowParams();\r\nvisualParams.myStart.vec3_copy(start);\r\nvisualParams.myDirection.vec3_copy(direction);\r\nvisualParams.myLength = 0.2;\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualArrow = new PP.VisualArrow(visualParams);\r\n*/\r\n\r\nPP.VisualArrowParams = class VisualArrowParams extends PP.VisualLineParams {\r\n constructor() {\r\n super();\r\n\r\n this.myType = PP.VisualElementType.ARROW;\r\n }\r\n};\r\n\r\nPP.VisualArrow = class VisualArrow {\r\n\r\n constructor(params = new PP.VisualArrowParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myVisualLine = new PP.VisualLine();\r\n this._myVisualLine.setAutoRefresh(false);\r\n\r\n this._myArrowRootObject = null;\r\n this._myArrowObject = null;\r\n this._myArrowMeshComponent = null;\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myVisualLine.setVisible(visible);\r\n this._myArrowRootObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n this._myVisualLine.forceRefresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n this._myDirty = false;\r\n }\r\n\r\n this._myVisualLine.update(dt);\r\n }\r\n\r\n _build() {\r\n this._myArrowRootObject = WL.scene.addObject(null);\r\n this._myArrowObject = WL.scene.addObject(this._myArrowRootObject);\r\n\r\n this._myArrowMeshComponent = this._myArrowObject.addComponent('mesh');\r\n this._myArrowMeshComponent.mesh = PP.myDefaultResources.myMeshes.myCone;\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualArrowParams();\r\n clonedParams.myStart.vec3_copy(this._myParams.myStart);\r\n clonedParams.myDirection.vec3_copy(this._myParams.myDirection);\r\n clonedParams.myLength = this._myParams.myLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualArrow(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualArrow.prototype._refresh = function () {\r\n let end = PP.vec3_create();\r\n let translateRoot = PP.vec3_create();\r\n let scaleArrow = PP.vec3_create();\r\n let direction = PP.vec3_create();\r\n\r\n let forward = PP.vec3_create(0, 0, 1);\r\n return function _refresh() {\r\n this._myArrowRootObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myParams.myDirection.vec3_scale(Math.max(0.001, this._myParams.myLength - this._myParams.myThickness * 4), end);\r\n end.vec3_add(this._myParams.myStart, end);\r\n\r\n this._myArrowRootObject.pp_setPositionLocal(end);\r\n this._myArrowRootObject.pp_setUpLocal(this._myParams.myDirection, forward);\r\n\r\n translateRoot.vec3_set(0, this._myParams.myThickness * 2 - 0.00001, 0);\r\n this._myArrowRootObject.pp_translateObject(translateRoot);\r\n\r\n this._myArrowObject.pp_resetScaleLocal();\r\n scaleArrow.vec3_set(this._myParams.myThickness * 1.25, this._myParams.myThickness * 2, this._myParams.myThickness * 1.25);\r\n this._myArrowObject.pp_scaleObject(scaleArrow);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myArrowMeshComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n this._myArrowMeshComponent.material = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myArrowMeshComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n direction = end.vec3_sub(this._myParams.myStart, direction);\r\n let visualLineParams = this._myVisualLine.getParams();\r\n visualLineParams.myStart.vec3_copy(this._myParams.myStart);\r\n visualLineParams.myDirection = direction.vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = direction.vec3_length();\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n visualLineParams.myMaterial = this._myArrowMeshComponent.material;\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualLine.paramsUpdated();\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualArrow.prototype, \"_refresh\", { enumerable: false });", "/*\r\nlet visualParams = new PP.VisualTextParams();\r\nvisualParams.myText = text;\r\nvisualParams.myTransform.mat4_copy(transform);\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualText = new PP.VisualText(visualParams);\r\n*/\r\n\r\nPP.VisualTextParams = class VisualTextParams {\r\n\r\n constructor() {\r\n this.myText = \"\";\r\n this.myAlignment = WL.Alignment.Center;\r\n this.myJustification = WL.Justification.Middle;\r\n\r\n this.myTransform = PP.mat4_create();\r\n\r\n this.myMaterial = null;\r\n\r\n this.myColor = null; // if this is set and material is null, it will use the default text material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.TEXT;\r\n }\r\n};\r\n\r\nPP.VisualText = class VisualText {\r\n\r\n constructor(params = new PP.VisualTextParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myTextObject = null;\r\n this._myTextComponent = null;\r\n\r\n this._myTextMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myTextObject.pp_setActive(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n }\r\n\r\n _refresh() {\r\n this._myTextObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n\r\n this._myTextObject.pp_setTransformLocal(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n this._myTextComponent.material = PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial;\r\n } else {\r\n if (this._myTextMaterial == null) {\r\n this._myTextMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\n }\r\n this._myTextComponent.material = this._myTextMaterial;\r\n this._myTextMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n this._myTextComponent.material = this._myParams.myMaterial;\r\n }\r\n\r\n this._myTextComponent.text = this._myParams.myText;\r\n this._myTextComponent.alignment = this._myParams.myAlignment;\r\n this._myTextComponent.justification = this._myParams.myJustification;\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n _build() {\r\n this._myTextObject = WL.scene.addObject(null);\r\n this._myTextComponent = this._myTextObject.addComponent('text');\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualTextParams();\r\n\r\n clonedParams.myText = this._myParams.myText;\r\n clonedParams.myAlignment = this._myParams.myAlignment;\r\n clonedParams.myJustification = this._myParams.myJustification;\r\n\r\n clonedParams.myTransform.mat4_copy(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualText(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualTransformParams();\r\nvisualParams.myTransform.mat4_copy(transform);\r\nvisualParams.myLength = 0.2;\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualTransform = new PP.VisualTransform(visualParams);\r\n*/\r\n\r\nPP.VisualTransformParams = class VisualTransformParams {\r\n\r\n constructor() {\r\n this.myTransform = PP.mat4_create();\r\n this.myLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myForwardMaterial = null;\r\n this.myUpMaterial = null;\r\n this.myRightMaterial = null;\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.TRANSFORM;\r\n }\r\n};\r\n\r\nPP.VisualTransform = class VisualTransform {\r\n\r\n constructor(params = new PP.VisualTransformParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myVisualRight = new PP.VisualArrow();\r\n this._myVisualUp = new PP.VisualArrow();\r\n this._myVisualForward = new PP.VisualArrow();\r\n\r\n this._myVisualRight.setAutoRefresh(false);\r\n this._myVisualUp.setAutoRefresh(false);\r\n this._myVisualForward.setAutoRefresh(false);\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n this._myVisualRight.setVisible(visible);\r\n this._myVisualUp.setVisible(visible);\r\n this._myVisualForward.setVisible(visible);\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n this._myVisualRight.forceRefresh();\r\n this._myVisualUp.forceRefresh();\r\n this._myVisualForward.forceRefresh();\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n this._myVisualRight.update(dt);\r\n this._myVisualUp.update(dt);\r\n this._myVisualForward.update(dt);\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualTransformParams();\r\n clonedParams.myTransform.mat4_copy(this._myParams.myTransform);\r\n clonedParams.myLength = this._myParams.myLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRightMaterial != null) {\r\n clonedParams.myRightMaterial = this._myParams.myRightMaterial.clone();\r\n } else {\r\n clonedParams.myRightMaterial = null;\r\n }\r\n\r\n if (this._myParams.myUpMaterial != null) {\r\n clonedParams.myUpMaterial = this._myParams.myUpMaterial.clone();\r\n } else {\r\n clonedParams.myUpMaterial = null;\r\n }\r\n\r\n if (this._myParams.myForwardMaterial != null) {\r\n clonedParams.myForwardMaterial = this._myParams.myForwardMaterial.clone();\r\n } else {\r\n clonedParams.myForwardMaterial = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualTransform(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualTransform.prototype._refresh = function () {\r\n let axes = [PP.vec3_create(), PP.vec3_create(), PP.vec3_create()];\r\n let scale = PP.vec3_create();\r\n let position = PP.vec3_create();\r\n return function _refresh() {\r\n axes = this._myParams.myTransform.mat4_getAxes(axes);\r\n scale = this._myParams.myTransform.mat4_getScale(scale);\r\n let maxValue = 0;\r\n for (let value of scale) {\r\n maxValue = Math.max(value, maxValue);\r\n }\r\n\r\n if (maxValue == 0) {\r\n scale[0] = 1;\r\n scale[1] = 1;\r\n scale[2] = 1;\r\n } else {\r\n scale[0] = scale[0] / maxValue;\r\n scale[1] = scale[1] / maxValue;\r\n scale[2] = scale[2] / maxValue;\r\n }\r\n\r\n position = this._myParams.myTransform.mat4_getPosition(position);\r\n\r\n {\r\n let visualLineParams = this._myVisualRight.getParams();\r\n visualLineParams.myStart.vec3_copy(position);\r\n visualLineParams.myDirection = axes[0].vec3_negate(visualLineParams.myDirection).vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = Math.max(this._myParams.myLength * scale[0], 0.001);\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRightMaterial == null) {\r\n visualLineParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial;\r\n } else {\r\n visualLineParams.myMaterial = this._myParams.myRightMaterial;\r\n }\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualRight.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualLineParams = this._myVisualUp.getParams();\r\n visualLineParams.myStart.vec3_copy(position);\r\n visualLineParams.myDirection = axes[1].vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = Math.max(this._myParams.myLength * scale[1], 0.001);\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myUpMaterial == null) {\r\n visualLineParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial;\r\n } else {\r\n visualLineParams.myMaterial = this._myParams.myUpMaterial;\r\n }\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualUp.paramsUpdated();\r\n }\r\n\r\n {\r\n let visualLineParams = this._myVisualForward.getParams();\r\n visualLineParams.myStart.vec3_copy(position);\r\n visualLineParams.myDirection = axes[2].vec3_normalize(visualLineParams.myDirection);\r\n visualLineParams.myLength = Math.max(this._myParams.myLength * scale[2], 0.001);\r\n visualLineParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myForwardMaterial == null) {\r\n visualLineParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial;\r\n } else {\r\n visualLineParams.myMaterial = this._myParams.myForwardMaterial;\r\n }\r\n\r\n visualLineParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualForward.paramsUpdated();\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualTransform.prototype, \"_refresh\", { enumerable: false });", "/*\r\nlet visualParams = new PP.VisualRaycastParams();\r\nvisualParams.myRaycastResult = raycastResult;\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualRaycast = new PP.VisualRaycast(visualParams);\r\n*/\r\n\r\nPP.VisualRaycastParams = class VisualRaycastParams {\r\n\r\n constructor() {\r\n this._myRaycastResult = new PP.RaycastResult();\r\n\r\n this.myHitNormalLength = 0.2;\r\n this.myThickness = 0.005;\r\n\r\n this.myShowOnlyFirstHit = true;\r\n\r\n this.myRayMaterial = null;\r\n this.myHitNormalMaterial = null;\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.RAYCAST;\r\n }\r\n\r\n get myRaycastResult() {\r\n return this._myRaycastResult;\r\n }\r\n\r\n set myRaycastResult(result) {\r\n this._myRaycastResult.copy(result);\r\n }\r\n};\r\n\r\nPP.VisualRaycast = class VisualRaycast {\r\n\r\n constructor(params = new PP.VisualRaycastParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myVisualRaycast = new PP.VisualArrow();\r\n\r\n this._myVisualRaycast.setAutoRefresh(false);\r\n\r\n this._myVisualRaycastHitList = [];\r\n this._addVisualRaycastHit();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myVisible) {\r\n if (this._myParams.myRaycastResult.myRaycastSetup != null) {\r\n this._myVisualRaycast.setVisible(true);\r\n }\r\n\r\n if (this._myParams.myRaycastResult.myHits.length > 0) {\r\n let hitsToShow = Math.min(this._myParams.myRaycastResult.myHits.length, this._myVisualRaycastHitList.length);\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n visualRaycastHit.setVisible(true);\r\n }\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n this._myVisualRaycast.forceRefresh();\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.forceRefresh();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n this._myDirty = false;\r\n }\r\n\r\n this._myVisualRaycast.update(dt);\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.update(dt);\r\n }\r\n }\r\n\r\n _refresh() {\r\n for (let visualRaycastHit of this._myVisualRaycastHitList) {\r\n visualRaycastHit.setVisible(false);\r\n }\r\n\r\n if (this._myParams.myRaycastResult.myHits.length > 0) {\r\n let raycastDistance = this._myParams.myShowOnlyFirstHit ?\r\n this._myParams.myRaycastResult.myHits.pp_first().myDistance :\r\n this._myParams.myRaycastResult.myHits.pp_last().myDistance;\r\n\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myDirection);\r\n visualRaycastParams.myLength = raycastDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n\r\n let hitsToShow = this._myParams.myShowOnlyFirstHit ? 1 : this._myParams.myRaycastResult.myHits.length;\r\n while (hitsToShow > this._myVisualRaycastHitList.length) {\r\n this._addVisualRaycastHit();\r\n }\r\n\r\n for (let i = 0; i < hitsToShow; i++) {\r\n let visualRaycastHit = this._myVisualRaycastHitList[i];\r\n\r\n {\r\n let visualRaycastHitParams = visualRaycastHit.getParams();\r\n visualRaycastHitParams.myStart.vec3_copy(this._myParams.myRaycastResult.myHits[i].myPosition);\r\n visualRaycastHitParams.myDirection.vec3_copy(this._myParams.myRaycastResult.myHits[i].myNormal);\r\n visualRaycastHitParams.myLength = this._myParams.myHitNormalLength;\r\n visualRaycastHitParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myHitNormalMaterial == null) {\r\n visualRaycastHitParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial;\r\n } else {\r\n visualRaycastHitParams.myMaterial = this._myParams.myHitNormalMaterial;\r\n }\r\n\r\n visualRaycastHitParams.myParent = this._myParams.myParent;\r\n\r\n visualRaycastHit.paramsUpdated();\r\n\r\n visualRaycastHit.setVisible(this._myVisible);\r\n }\r\n }\r\n\r\n } else if (this._myParams.myRaycastResult.myRaycastSetup != null) {\r\n {\r\n let visualRaycastParams = this._myVisualRaycast.getParams();\r\n visualRaycastParams.myStart.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myOrigin);\r\n visualRaycastParams.myDirection.vec3_copy(this._myParams.myRaycastResult.myRaycastSetup.myDirection);\r\n visualRaycastParams.myLength = this._myParams.myRaycastResult.myRaycastSetup.myDistance;\r\n visualRaycastParams.myThickness = this._myParams.myThickness;\r\n\r\n if (this._myParams.myRayMaterial == null) {\r\n visualRaycastParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial;\r\n } else {\r\n visualRaycastParams.myMaterial = this._myParams.myRayMaterial;\r\n }\r\n\r\n visualRaycastParams.myParent = this._myParams.myParent;\r\n\r\n this._myVisualRaycast.paramsUpdated();\r\n\r\n this._myVisualRaycast.setVisible(this._myVisible);\r\n }\r\n } else {\r\n this._myVisualRaycast.setVisible(false);\r\n }\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualRaycastParams();\r\n clonedParams.myRaycastResult = this._myParams.myRaycastResult;\r\n clonedParams.myHitNormalLength = this._myParams.myHitNormalLength;\r\n clonedParams.myThickness = this._myParams.myThickness;\r\n clonedParams.myShowOnlyFirstHit = this._myParams.myShowOnlyFirstHit;\r\n\r\n if (this._myParams.myRayMaterial != null) {\r\n clonedParams.myRayMaterial = this._myParams.myRayMaterial.clone();\r\n } else {\r\n clonedParams.myRayMaterial = null;\r\n }\r\n\r\n if (this._myParams.myHitNormalMaterial != null) {\r\n clonedParams.myHitNormalMaterial = this._myParams.myHitNormalMaterial.clone();\r\n } else {\r\n clonedParams.myHitNormalMaterial = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualRaycast(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n\r\n _addVisualRaycastHit() {\r\n let visualRaycastHit = new PP.VisualArrow();\r\n\r\n visualRaycastHit.setAutoRefresh(false);\r\n visualRaycastHit.setVisible(false);\r\n\r\n this._myVisualRaycastHitList.push(visualRaycastHit);\r\n }\r\n};", "/*\r\nlet visualParams = new PP.VisualTorusParams();\r\nvisualParams.myRadius = 1;\r\nvisualParams.mySegmentAmount = 12;\r\nvisualParams.mySegmentThickness = 0.05;\r\nvisualParams.myTransform.mat4_copy(transform);\r\nvisualParams.myMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\nvisualParams.myMaterial.color = [1, 1, 1, 1];\r\nPP.myVisualManager.draw(visualParams);\r\n\r\nor\r\n\r\nlet visualTorus = new PP.VisualTorus(visualParams);\r\n*/\r\n\r\nPP.VisualTorusParams = class VisualTorusParams {\r\n\r\n constructor() {\r\n this.myRadius = 0;\r\n\r\n this.mySegmentAmount = 12;\r\n this.mySegmentThickness = 0.05;\r\n\r\n this.myTransform = PP.mat4_create();\r\n\r\n this.myMaterial = null;\r\n this.myColor = null; // if this is set and material is null, it will use the default flat opaque material with this color\r\n\r\n this.myParent = null; // if this is set the parent will not be the visual root anymore, the positions will be local to this object\r\n\r\n this.myType = PP.VisualElementType.TORUS;\r\n }\r\n};\r\n\r\nPP.VisualTorus = class VisualTorus {\r\n\r\n constructor(params = new PP.VisualTorusParams()) {\r\n this._myParams = params;\r\n\r\n this._myVisible = false;\r\n this._myAutoRefresh = true;\r\n\r\n this._myDirty = false;\r\n\r\n this._myTorusRootObject = null;\r\n\r\n this._myVisualSegmentList = [];\r\n\r\n this._myFlatOpaqueMaterial = null;\r\n\r\n this._build();\r\n\r\n this.setVisible(true);\r\n }\r\n\r\n setVisible(visible) {\r\n if (this._myVisible != visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myVisible) {\r\n let segmentToShow = Math.min(this._myParams.mySegmentAmount, this._myVisualSegmentList.length);\r\n\r\n for (let i = 0; i < segmentToShow; i++) {\r\n let visualSegment = this._myVisualSegmentList[i];\r\n visualSegment.setVisible(true);\r\n }\r\n } else {\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.setVisible(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setAutoRefresh(autoRefresh) {\r\n this._myAutoRefresh = autoRefresh;\r\n }\r\n\r\n getParams() {\r\n return this._myParams;\r\n }\r\n\r\n setParams(params) {\r\n this._myParams = params;\r\n this._markDirty();\r\n }\r\n\r\n paramsUpdated() {\r\n this._markDirty();\r\n }\r\n\r\n refresh() {\r\n this.update(0);\r\n }\r\n\r\n forceRefresh() {\r\n this._refresh();\r\n\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.forceRefresh();\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (this._myDirty) {\r\n this._refresh();\r\n\r\n this._myDirty = false;\r\n }\r\n\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.update(dt);\r\n }\r\n }\r\n\r\n _build() {\r\n this._myTorusRootObject = WL.scene.addObject(null);\r\n\r\n this._fillSegmentList();\r\n }\r\n\r\n _markDirty() {\r\n this._myDirty = true;\r\n\r\n if (this._myAutoRefresh) {\r\n this.update(0);\r\n }\r\n }\r\n\r\n _fillSegmentList() {\r\n while (this._myVisualSegmentList.length < this._myParams.mySegmentAmount) {\r\n let visualSegment = new PP.VisualLine();\r\n\r\n visualSegment.setAutoRefresh(false);\r\n visualSegment.setVisible(false);\r\n\r\n visualSegment.getParams().myParent = this._myTorusRootObject;\r\n\r\n this._myVisualSegmentList.push(visualSegment);\r\n }\r\n }\r\n\r\n clone() {\r\n let clonedParams = new PP.VisualTorusParams();\r\n clonedParams.myRadius = this._myParams.myRadius;\r\n clonedParams.mySegmentAmount = this._myParams.mySegmentAmount;\r\n clonedParams.mySegmentThickness = this._myParams.mySegmentThickness;\r\n\r\n clonedParams.myTransform.mat4_copy(this._myParams.myTransform);\r\n\r\n if (this._myParams.myMaterial != null) {\r\n clonedParams.myMaterial = this._myParams.myMaterial.clone();\r\n } else {\r\n clonedParams.myMaterial = null;\r\n }\r\n\r\n if (this._myParams.myColor != null) {\r\n clonedParams.myColor.vec4_copy(this._myParams.myColor);\r\n } else {\r\n clonedParams.myColor = null;\r\n }\r\n\r\n clonedParams.myParent = this._myParams.myParent;\r\n\r\n let clone = new PP.VisualTorus(clonedParams);\r\n clone.setAutoRefresh(this._myAutoRefresh);\r\n clone.setVisible(this._myVisible);\r\n clone._myDirty = this._myDirty;\r\n\r\n return clone;\r\n }\r\n};\r\n\r\nPP.VisualTorus.prototype._refresh = function () {\r\n let segmentStart = PP.vec3_create();\r\n let segmentEnd = PP.vec3_create();\r\n\r\n let segmentDirection = PP.vec3_create();\r\n\r\n let fixedSegmentStart = PP.vec3_create();\r\n let fixedSegmentEnd = PP.vec3_create();\r\n\r\n let up = PP.vec3_create(0, 1, 0);\r\n return function _refresh() {\r\n this._fillSegmentList();\r\n\r\n for (let visualSegment of this._myVisualSegmentList) {\r\n visualSegment.setVisible(false);\r\n }\r\n\r\n this._myTorusRootObject.pp_setParent(this._myParams.myParent == null ? PP.myVisualData.myRootObject : this._myParams.myParent, false);\r\n this._myTorusRootObject.pp_setTransformLocal(this._myParams.myTransform);\r\n\r\n let sliceAngle = 2 * Math.PI / this._myParams.mySegmentAmount;\r\n segmentStart.vec3_set(this._myParams.myRadius, 0, 0);\r\n for (let i = 0; i < this._myParams.mySegmentAmount; i++) {\r\n segmentEnd = segmentStart.vec3_rotateAxisRadians(sliceAngle, up, segmentEnd);\r\n\r\n segmentDirection = segmentEnd.vec3_sub(segmentStart, segmentDirection).vec3_normalize(segmentDirection);\r\n\r\n let extraLength = Math.tan(sliceAngle / 2) * this._myParams.mySegmentThickness / 2;\r\n\r\n fixedSegmentStart = segmentStart.vec3_sub(segmentDirection.vec3_scale(extraLength, fixedSegmentStart), fixedSegmentStart);\r\n fixedSegmentEnd = segmentEnd.vec3_add(segmentDirection.vec3_scale(extraLength, fixedSegmentEnd), fixedSegmentEnd);\r\n\r\n let visualSegment = this._myVisualSegmentList[i];\r\n\r\n let visualSegmentParams = visualSegment.getParams();\r\n visualSegmentParams.setStartEnd(fixedSegmentStart, fixedSegmentEnd);\r\n visualSegmentParams.myThickness = this._myParams.mySegmentThickness;\r\n\r\n if (this._myParams.myMaterial == null) {\r\n if (this._myParams.myColor == null) {\r\n visualSegmentParams.myMaterial = PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial;\r\n } else {\r\n if (this._myFlatOpaqueMaterial == null) {\r\n this._myFlatOpaqueMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n }\r\n visualSegmentParams.myMaterial = this._myFlatOpaqueMaterial;\r\n this._myFlatOpaqueMaterial.color = this._myParams.myColor;\r\n }\r\n } else {\r\n visualSegmentParams.myMaterial = this._myParams.myMaterial;\r\n }\r\n\r\n visualSegment.paramsUpdated();\r\n\r\n visualSegment.setVisible(this._myVisible);\r\n\r\n segmentStart.vec3_copy(segmentEnd);\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.VisualTorus.prototype, \"_refresh\", { enumerable: false });", "WL.registerComponent('pp-visual-manager', {\r\n}, {\r\n init: function () {\r\n if (this.active) {\r\n PP.myVisualData.myRootObject = WL.scene.addObject(null);\r\n\r\n PP.myVisualManager = new PP.VisualManager();\r\n }\r\n },\r\n start() {\r\n PP.myVisualData.myDefaultMaterials.myDefaultMeshMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n\r\n PP.myVisualData.myDefaultMaterials.myDefaultTextMaterial = PP.myDefaultResources.myMaterials.myText.clone();\r\n\r\n PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultRightMaterial.color = [1, 0, 0, 1];\r\n PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultUpMaterial.color = [0, 1, 0, 1];\r\n PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultForwardMaterial.color = [0, 0, 1, 1];\r\n\r\n PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultRayMaterial.color = [0, 1, 0, 1];\r\n PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n PP.myVisualData.myDefaultMaterials.myDefaultHitNormalMaterial.color = [1, 0, 0, 1];\r\n\r\n PP.myVisualManager.start();\r\n },\r\n update(dt) {\r\n PP.myVisualManager.update(dt);\r\n }\r\n});\r\n\r\nPP.myVisualManager = null;\r\n\r\nPP.myVisualData = {\r\n myRootObject: null,\r\n myDefaultMaterials: {\r\n myDefaultMeshMaterial: null,\r\n myDefaultTextMaterial: null,\r\n myDefaultRightMaterial: null,\r\n myDefaultUpMaterial: null,\r\n myDefaultForwardMaterial: null,\r\n myDefaultRayMaterial: null,\r\n myDefaultHitNormalMaterial: null\r\n }\r\n};", "PP.DebugManager = class DebugManager {\r\n constructor() {\r\n this._myDebugVisualManager = new PP.DebugVisualManager();\r\n }\r\n\r\n getDebugVisualManager() {\r\n return this._myDebugVisualManager;\r\n }\r\n\r\n start() {\r\n this._myDebugVisualManager.start();\r\n }\r\n\r\n update(dt) {\r\n this._myDebugVisualManager.update(dt);\r\n }\r\n};", "PP.DebugVisualManager = class DebugVisualManager extends PP.VisualManager {\r\n drawLine(lifetimeSeconds, start, direction, length, color = [0, 1, 0, 1], thickness = 0.005) {\r\n let visualParams = new PP.VisualLineParams();\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawLineEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n // implemented outside class definition\r\n }\r\n\r\n drawArrow(lifetimeSeconds, start, direction, length, color = [0, 1, 0, 1], thickness = 0.005) {\r\n let visualParams = new PP.VisualArrowParams();\r\n visualParams.myStart.vec3_copy(start);\r\n visualParams.myDirection.vec3_copy(direction);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawArrowEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n // implemented outside class definition\r\n }\r\n\r\n drawPoint(lifetimeSeconds, position, color = [0, 1, 0, 1], radius = 0.005) {\r\n let visualParams = new PP.VisualPointParams();\r\n visualParams.myPosition.vec3_copy(position);\r\n visualParams.myRadius = radius;\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawText(lifetimeSeconds, text, transform, color = [0, 1, 0, 1], alignment = WL.Alignment.Center, justification = WL.Justification.Middle) {\r\n let visualParams = new PP.VisualTextParams();\r\n visualParams.myText = text;\r\n visualParams.myAlignment = alignment;\r\n visualParams.myJustification = justification;\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myColor = PP.vec4_create();\r\n visualParams.myColor.vec4_copy(color);\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawRaycast(lifetimeSeconds, raycastResult, showOnlyFirstHit = true, hitNormalLength = 0.2, thickness = 0.005) {\r\n let visualParams = new PP.VisualRaycastParams();\r\n visualParams.myRaycastResult = raycastResult;\r\n visualParams.myShowOnlyFirstHit = showOnlyFirstHit;\r\n visualParams.myHitNormalLength = hitNormalLength;\r\n visualParams.myThickness = thickness;\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n\r\n drawTransform(lifetimeSeconds, transform, length = 0.2, thickness = 0.005) {\r\n let visualParams = new PP.VisualTransformParams();\r\n visualParams.myTransform.mat4_copy(transform);\r\n visualParams.myLength = length;\r\n visualParams.myThickness = thickness;\r\n this.draw(visualParams, lifetimeSeconds);\r\n }\r\n};\r\n\r\nPP.DebugVisualManager.prototype.drawLineEnd = function () {\r\n let direction = PP.vec3_create();\r\n return function drawLineEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n direction = end.vec3_sub(start, direction);\r\n length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n this.drawLine(lifetimeSeconds, start, direction, length, color, thickness);\r\n };\r\n}();\r\n\r\nPP.DebugVisualManager.prototype.drawArrowEnd = function () {\r\n let direction = PP.vec3_create();\r\n return function drawArrowEnd(lifetimeSeconds, start, end, color = [0, 1, 0, 1], thickness = 0.005) {\r\n direction = end.vec3_sub(start, direction);\r\n length = direction.vec3_length();\r\n direction.vec3_normalize(direction);\r\n this.drawArrow(lifetimeSeconds, start, direction, length, color, thickness);\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.DebugVisualManager.prototype, \"drawLineEnd\", { enumerable: false });\r\nObject.defineProperty(PP.DebugVisualManager.prototype, \"drawArrowEnd\", { enumerable: false });", "WL.registerComponent(\"pp-debug-transform\", {\r\n _myLength: { type: WL.Type.Float, default: 0.1 },\r\n _myThickness: { type: WL.Type.Float, default: 0.005 }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myDebugTransformParams = new PP.VisualTransformParams();\r\n this._myDebugTransformParams.myLength = this._myLength;\r\n this._myDebugTransformParams.myThickness = this._myThickness;\r\n },\r\n update: function (dt) {\r\n this.object.pp_getTransform(this._myDebugTransformParams.myTransform);\r\n PP.myDebugVisualManager.draw(this._myDebugTransformParams);\r\n }\r\n});", "WL.registerComponent('pp-debug-manager', {\r\n}, {\r\n init: function () {\r\n if (this.active) {\r\n PP.myDebugManager = new PP.DebugManager();\r\n PP.myDebugVisualManager = PP.myDebugManager.getDebugVisualManager();\r\n }\r\n },\r\n start() {\r\n PP.myDebugManager.start();\r\n },\r\n update(dt) {\r\n PP.myDebugManager.update(dt);\r\n }\r\n});\r\n\r\nPP.myDebugManager = null;\r\nPP.myDebugVisualManager = null;", "PP.Direction2DTo3DConverterParams = class Direction2DTo3DConverterParams {\r\n constructor() {\r\n this.myStartFlyingForward = false;\r\n this.myStartFlyingRight = false;\r\n\r\n this.myAutoUpdateFlyForward = false;\r\n this.myAutoUpdateFlyRight = false;\r\n\r\n this.myResetFlyForwardWhenZero = false;\r\n this.myResetFlyRightWhenZero = false;\r\n\r\n this.myMinAngleToFlyForwardUp = 90;\r\n this.myMinAngleToFlyForwardDown = 90;\r\n this.myMinAngleToFlyRightUp = 90;\r\n this.myMinAngleToFlyRightDown = 90;\r\n }\r\n};\r\n\r\nPP.Direction2DTo3DConverter = class Direction2DTo3DConverter {\r\n\r\n constructor(params = new PP.Direction2DTo3DConverterParams()) {\r\n this._myParams = params;\r\n\r\n this._myIsFlyingForward = this._myParams.myStartFlyingForward;\r\n this._myIsFlyingRight = this._myParams.myStartFlyingRight;\r\n\r\n this._myLastValidFlatForward = PP.vec3_create();\r\n this._myLastValidFlatRight = PP.vec3_create();\r\n\r\n //Setup\r\n this._myMinAngleToBeValid = 5;\r\n }\r\n\r\n // directionUp is needed when u want to understand when the direction is going to fly or not\r\n // if you don't want the direction to be flat (so like it's always flying) you can avoid specifying it\r\n convert(direction2D, referenceTransformQuat, directionUp = null, outDirection3D = PP.vec3_create()) {\r\n // implemented outside class definition\r\n }\r\n\r\n isFlying() {\r\n return this._myIsFlyingForward || this._myIsFlyingRight;\r\n }\r\n\r\n isFlyingForward() {\r\n return this._myIsFlyingForward;\r\n }\r\n\r\n isFlyingRight() {\r\n return this._myIsFlyingRight;\r\n }\r\n\r\n startFlying() {\r\n this._myIsFlyingForward = true;\r\n this._myIsFlyingRight = true;\r\n }\r\n\r\n startFlyingForward() {\r\n this._myIsFlyingForward = true;\r\n }\r\n\r\n startFlyingRight() {\r\n this._myIsFlyingRight = true;\r\n }\r\n\r\n stopFlying() {\r\n this._myIsFlyingForward = false;\r\n this._myIsFlyingRight = false;\r\n }\r\n\r\n stopFlyingForward() {\r\n this._myIsFlyingForward = false;\r\n }\r\n\r\n stopFlyingRight() {\r\n this._myIsFlyingRight = false;\r\n }\r\n\r\n resetFly() {\r\n this.resetFlyForward();\r\n this.resetFlyRight();\r\n }\r\n\r\n resetFlyForward() {\r\n if (this._myParams.myStartFlyingForward) {\r\n this.startFlyingForward();\r\n } else {\r\n this.stopFlyingForward();\r\n }\r\n\r\n this._myLastValidFlatForward.vec3_zero();\r\n }\r\n\r\n resetFlyRight() {\r\n if (this._myParams.myStartFlyingRight) {\r\n this.startFlyingRight();\r\n } else {\r\n this.stopFlyingRight();\r\n }\r\n\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n};\r\n\r\nPP.Direction2DTo3DConverter.prototype.convert = function () {\r\n let forward = PP.vec3_create();\r\n let right = PP.vec3_create();\r\n let directionUpNegate = PP.vec3_create();\r\n let forwardScaled = PP.vec3_create();\r\n let rightScaled = PP.vec3_create();\r\n return function convert(direction2D, referenceTransformQuat, directionUp = null, outDirection3D = PP.vec3_create()) {\r\n if (direction2D.vec2_isZero()) {\r\n let resetFlyForward = this._myParams.myAutoUpdateFlyForward && this._myParams.myResetFlyForwardWhenZero;\r\n if (resetFlyForward) {\r\n this.resetFlyForward();\r\n }\r\n\r\n let resetFlyRight = this._myParams.myAutoUpdateFlyRight && this._myParams.myResetFlyRightWhenZero;\r\n if (resetFlyRight) {\r\n this.resetFlyRight();\r\n }\r\n\r\n return [0, 0, 0];\r\n } else {\r\n if (direction2D[0] == 0) {\r\n this._myLastValidFlatRight.vec3_zero();\r\n }\r\n\r\n if (direction2D[1] == 0) {\r\n this._myLastValidFlatForward.vec3_zero();\r\n }\r\n }\r\n\r\n forward = referenceTransformQuat.quat2_getForward(forward);\r\n right = referenceTransformQuat.quat2_getRight(right);\r\n\r\n if (directionUp != null) {\r\n directionUpNegate = directionUp.vec3_negate(directionUpNegate);\r\n\r\n // check if it is flying based on the convert transform orientation \r\n if (this._myParams.myAutoUpdateFlyForward) {\r\n let angleForwardWithDirectionUp = forward.vec3_angle(directionUp);\r\n this._myIsFlyingForward = this._myIsFlyingForward ||\r\n (angleForwardWithDirectionUp < 90 - this._myParams.myMinAngleToFlyForwardUp || angleForwardWithDirectionUp > 90 + this._myParams.myMinAngleToFlyForwardDown);\r\n }\r\n\r\n if (this._myParams.myAutoUpdateFlyRight) {\r\n let angleRightWithDirectionUp = right.vec3_angle(directionUp);\r\n this._myIsFlyingRight = this._myIsFlyingRight ||\r\n (angleRightWithDirectionUp < 90 - this._myParams.myMinAngleToFlyRightUp || angleRightWithDirectionUp > 90 + this._myParams.myMinAngleToFlyRightDown);\r\n }\r\n\r\n // remove the component to prevent flying, if needed\r\n if (!this._myIsFlyingForward) {\r\n // if the forward is too similar to the up (or down) take the last valid forward\r\n if (!this._myLastValidFlatForward.vec3_isZero(0.000001) && (forward.vec3_angle(directionUp) < this._myMinAngleToBeValid || forward.vec3_angle(directionUpNegate) < this._myMinAngleToBeValid)) {\r\n if (forward.vec3_isConcordant(this._myLastValidFlatForward)) {\r\n forward.pp_copy(this._myLastValidFlatForward);\r\n } else {\r\n forward = this._myLastValidFlatForward.vec3_negate(forward);\r\n }\r\n }\r\n\r\n forward = forward.vec3_removeComponentAlongAxis(directionUp, forward);\r\n forward.vec3_normalize(forward);\r\n }\r\n\r\n if (!this._myIsFlyingRight) {\r\n // if the right is too similar to the up (or down) take the last valid right\r\n if (!this._myLastValidFlatRight.vec3_isZero(0.000001) && (right.vec3_angle(directionUp) < this._myMinAngleToBeValid || right.vec3_angle(directionUpNegate) < this._myMinAngleToBeValid)) {\r\n if (right.vec3_isConcordant(this._myLastValidFlatRight)) {\r\n right.pp_copy(this._myLastValidFlatRight);\r\n } else {\r\n right = this._myLastValidFlatRight.vec3_negate(right);\r\n }\r\n }\r\n\r\n right = right.vec3_removeComponentAlongAxis(directionUp, right);\r\n right.vec3_normalize(right);\r\n }\r\n\r\n // update last valid\r\n if ((forward.vec3_angle(directionUp) > this._myMinAngleToBeValid && forward.vec3_angle(directionUpNegate) > this._myMinAngleToBeValid) ||\r\n (direction2D[1] != 0 && this._myLastValidFlatForward.vec3_isZero(0.000001))) {\r\n this._myLastValidFlatForward = forward.vec3_removeComponentAlongAxis(directionUp, this._myLastValidFlatForward);\r\n this._myLastValidFlatForward.vec3_normalize(this._myLastValidFlatForward);\r\n }\r\n\r\n if ((right.vec3_angle(directionUp) > this._myMinAngleToBeValid && right.vec3_angle(directionUpNegate) > this._myMinAngleToBeValid) ||\r\n (direction2D[0] != 0 && this._myLastValidFlatRight.vec3_isZero(0.000001))) {\r\n this._myLastValidFlatRight = right.vec3_removeComponentAlongAxis(directionUp, this._myLastValidFlatRight);\r\n this._myLastValidFlatRight.vec3_normalize(this._myLastValidFlatRight);\r\n }\r\n }\r\n\r\n // compute direction 3D\r\n outDirection3D = right.vec3_scale(direction2D[0], rightScaled).vec3_add(forward.vec3_scale(direction2D[1], forwardScaled), outDirection3D);\r\n\r\n if (directionUp != null && !this._myIsFlyingForward && !this._myIsFlyingRight) {\r\n outDirection3D = outDirection3D.vec3_removeComponentAlongAxis(directionUp, outDirection3D);\r\n }\r\n\r\n outDirection3D.vec3_normalize(outDirection3D);\r\n\r\n return outDirection3D;\r\n };\r\n}();", "WL.registerComponent('pp-grabbable', {\n _myThrowLinearVelocityMultiplier: { type: WL.Type.Float, default: 1 },\n _myThrowAngularVelocityMultiplier: { type: WL.Type.Float, default: 1 },\n _myKinematicValueOnRelease: { type: WL.Type.Enum, values: ['true', 'false', 'keep'], default: 'false' },\n}, {\n init: function () {\n this._myIsGrabbed = false;\n\n this._myGrabber = null;\n\n this._myGrabCallbacks = new Map(); // Signature: callback(grabber, grabbable)\n this._myThrowCallbacks = new Map(); // Signature: callback(grabber, grabbable)\n this._myReleaseCallbacks = new Map(); // Signature: callback(grabber, grabbable, isThrow)\n },\n start: function () {\n this._myOldParent = this.object.parent;\n this._myPhysX = this.object.pp_getComponent('physx');\n this._myOldKinematicValue = null;\n },\n onDeactivate: function () {\n this.release();\n },\n grab: function (grabber) {\n if (!this.isGrabbed()) {\n this._myOldKinematicValue = this._myPhysX.kinematic;\n }\n\n this.release();\n\n this._myPhysX.kinematic = true;\n\n this._myOldParent = this.object.parent;\n this.object.pp_setParent(grabber);\n\n this._myIsGrabbed = true;\n\n this._myGrabCallbacks.forEach(function (callback) { callback(grabber, this); }.bind(this));\n },\n throw: function (linearVelocity, angularVelocity) {\n if (this._myIsGrabbed) {\n let grabber = this._myGrabber;\n\n this._release();\n\n //#TODO for now kinematic is not updated instantly, add the if as soon as it is\n //if (!this._myPhysX.kinematic) {\n this._myPhysX.linearVelocity = linearVelocity.vec3_scale(this._myThrowLinearVelocityMultiplier);\n this._myPhysX.angularVelocity = angularVelocity.vec3_scale(this._myThrowAngularVelocityMultiplier);\n //}\n\n this._myThrowCallbacks.forEach(function (callback) { callback(grabber, this); }.bind(this));\n this._myReleaseCallbacks.forEach(function (callback) { callback(grabber, this, true); }.bind(this));\n }\n },\n release() {\n if (this._myIsGrabbed) {\n let grabber = this._myGrabber;\n\n this._release();\n\n this._myReleaseCallbacks.forEach(function (callback) { callback(grabber, this, false); }.bind(this));\n }\n },\n getLinearVelocity() {\n let linearVelocity = PP.vec3_create();\n\n this._myPhysX.linearVelocity.vec3_clone(linearVelocity);\n\n return linearVelocity;\n },\n getAngularVelocity() {\n return this.getAngularVelocityDegrees();\n },\n getAngularVelocityDegrees() {\n let angularVelocityDegrees = PP.vec3_create();\n\n this._myPhysX.angularVelocity.vec3_toDegrees(angularVelocityDegrees);\n\n return angularVelocityDegrees;\n },\n getAngularVelocityRadians() {\n let angularVelocityRadians = PP.vec3_create();\n\n this._myPhysX.angularVelocity.vec3_clone(angularVelocityRadians);\n\n return angularVelocityRadians;\n },\n isGrabbed() {\n return this._myIsGrabbed;\n },\n getGrabber() {\n return this._myGrabber;\n },\n registerGrabEventListener(id, callback) {\n this._myGrabCallbacks.set(id, callback);\n },\n unregisterGrabEventListener(id) {\n this._myGrabCallbacks.delete(id);\n },\n registerThrowEventListener(id, callback) {\n this._myThrowCallbacks.set(id, callback);\n },\n unregisterThrowEventListener(id) {\n this._myThrowCallbacks.delete(id);\n },\n registerReleaseEventListener(id, callback) {\n this._myReleaseCallbacks.set(id, callback);\n },\n unregisterReleaseEventListener(id) {\n this._myReleaseCallbacks.delete(id);\n },\n _release() {\n this.object.pp_setParent(this._myOldParent);\n this._myIsGrabbed = false;\n this._myGrabber = null;\n\n if (this._myKinematicValueOnRelease == 0) {\n this._myPhysX.kinematic = true;\n } else if (this._myKinematicValueOnRelease == 1) {\n this._myPhysX.kinematic = false;\n } else if (this._myOldKinematicValue != null) {\n this._myPhysX.kinematic = this._myOldKinematicValue;\n }\n\n if (this._myPhysX.kinematic) {\n this._myPhysX.linearVelocity = [0, 0, 0];\n this._myPhysX.angularVelocity = [0, 0, 0];\n }\n }\n});", "WL.registerComponent('pp-grabber-hand', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myGrabButton: { type: WL.Type.Enum, values: ['select', 'squeeze', 'both', 'both_exclusive'], default: 'squeeze' }, // both_exclusive means u can use both buttons but you have to use the same button you grabbed with to throw\r\n _mySnapOnPivot: { type: WL.Type.Bool, default: false },\r\n _myMaxNumberOfObjects: { type: WL.Type.Int, default: 1 }, // how many objects you can grab at the same time\r\n // ADVANCED SETTINGS\r\n _myThrowVelocitySource: { type: WL.Type.Enum, values: ['hand', 'grabbable'], default: 'hand' },\r\n _myThrowLinearVelocityMultiplier: { type: WL.Type.Float, default: 1 }, // multiply the overall throw speed, so slow throws will be multiplied too\r\n _myThrowMaxLinearSpeed: { type: WL.Type.Float, default: 15 },\r\n _myThrowAngularVelocityMultiplier: { type: WL.Type.Float, default: 0.5 },\r\n _myThrowMaxAngularSpeed: { type: WL.Type.Float, default: 1080 }, // degrees\r\n _myThrowLinearVelocityBoost: { type: WL.Type.Float, default: 1.75 }, // this boost is applied from 0% to 100% based on how fast you throw, so slow throws are not affected\r\n _myThrowLinearVelocityBoostMinSpeedThreshold: { type: WL.Type.Float, default: 0.6 }, // 0% boost is applied if plain throw speed is under this value\r\n _myThrowLinearVelocityBoostMaxSpeedThreshold: { type: WL.Type.Float, default: 2.5 }, // 100% boost is applied if plain throw speed is over this value\r\n}, {\r\n init: function () {\r\n this._myGrabbables = [];\r\n\r\n this._myGamepad = null;\r\n\r\n this._myActiveGrabButton = null;\r\n\r\n this._myLinearVelocityHistorySize = 5;\r\n this._myLinearVelocityHistorySpeedAverageSamplesFromStart = 1;\r\n this._myLinearVelocityHistoryDirectionAverageSamplesFromStart = 3;\r\n this._myLinearVelocityHistoryDirectionAverageSkipFromStart = 0;\r\n\r\n this._myHandLinearVelocityHistory = new Array(this._myLinearVelocityHistorySize);\r\n this._myHandLinearVelocityHistory.fill([0, 0, 0]);\r\n\r\n this._myAngularVelocityHistorySize = 1;\r\n this._myHandAngularVelocityHistory = new Array(this._myAngularVelocityHistorySize);\r\n this._myHandAngularVelocityHistory.fill([0, 0, 0]);\r\n\r\n this._myThrowMaxAngularSpeedRadians = Math.pp_toRadians(this._myThrowMaxAngularSpeed);\r\n\r\n this._myGrabCallbacks = new Map(); // Signature: callback(grabber, grabbable)\r\n this._myThrowCallbacks = new Map(); // Signature: callback(grabber, grabbable)\r\n\r\n this._myDebugActive = false;\r\n },\r\n start: function () {\r\n if (this._myHandedness == PP.HandednessIndex.LEFT) {\r\n this._myGamepad = PP.myLeftGamepad;\r\n } else {\r\n this._myGamepad = PP.myRightGamepad;\r\n }\r\n\r\n this._myPhysX = this.object.pp_getComponent('physx');\r\n this._myCollisionsCollector = new PP.PhysXCollisionCollector(this._myPhysX, true);\r\n },\r\n update: function (dt) {\r\n this._myCollisionsCollector.update(dt);\r\n\r\n if (this._myGrabbables.length > 0) {\r\n this._updateLinearVelocityHistory();\r\n this._updateAngularVelocityHistory();\r\n }\r\n },\r\n grab: function (grabButton = null) {\r\n this._grab(grabButton);\r\n },\r\n throw: function (throwButton = null) {\r\n this._throw(throwButton);\r\n },\r\n registerGrabEventListener(id, callback) {\r\n this._myGrabCallbacks.set(id, callback);\r\n },\r\n unregisterGrabEventListener(id) {\r\n this._myGrabCallbacks.delete(id);\r\n },\r\n registerThrowEventListener(id, callback) {\r\n this._myThrowCallbacks.set(id, callback);\r\n },\r\n unregisterThrowEventListener(id) {\r\n this._myThrowCallbacks.delete(id);\r\n },\r\n onActivate() {\r\n if (this._myGamepad == null) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 0) {\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SELECT));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SELECT));\r\n } else if (this._myGrabButton == 1) {\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SQUEEZE));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SQUEEZE));\r\n } else {\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SQUEEZE));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SQUEEZE));\r\n\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this, this._grab.bind(this, PP.ButtonType.SELECT));\r\n this._myGamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this, this._throw.bind(this, PP.ButtonType.SELECT));\r\n }\r\n },\r\n onDeactivate() {\r\n if (this._myGamepad == null) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 0) {\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this);\r\n } else if (this._myGrabButton == 1) {\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this);\r\n } else {\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.PRESS_END, this);\r\n\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_START, this);\r\n this._myGamepad.unregisterButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.PRESS_END, this);\r\n }\r\n },\r\n _grab: function (grabButton) {\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n return;\r\n }\r\n\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == grabButton || grabButton == null) {\r\n let grabbablesToGrab = [];\r\n\r\n let collisions = this._myCollisionsCollector.getCollisions();\r\n for (let i = 0; i < collisions.length; i++) {\r\n let grabbable = collisions[i].getComponent(\"pp-grabbable\");\r\n if (grabbable && grabbable.active) {\r\n grabbablesToGrab.push(grabbable);\r\n }\r\n }\r\n\r\n let grabberPosition = this.object.pp_getPosition();\r\n grabbablesToGrab.sort(function (first, second) {\r\n let firstPosition = first.object.pp_getPosition();\r\n let secondPosition = second.object.pp_getPosition();\r\n\r\n let firstDistance = firstPosition.vec3_distance(grabberPosition);\r\n let secondDistance = secondPosition.vec3_distance(grabberPosition);\r\n\r\n return Math.pp_sign(firstDistance - secondDistance, 0);\r\n });\r\n\r\n for (let grabbableToGrab of grabbablesToGrab) {\r\n if (!this._isAlreadyGrabbed(grabbableToGrab)) {\r\n let grabbableData = new PP.GrabberHandGrabbableData(grabbableToGrab, this._myThrowVelocitySource == 1, this._myLinearVelocityHistorySize, this._myAngularVelocityHistorySize);\r\n this._myGrabbables.push(grabbableData);\r\n grabbableToGrab.grab(this.object);\r\n grabbableToGrab.registerReleaseEventListener(this, this._onRelease.bind(this));\r\n\r\n if (this._mySnapOnPivot) {\r\n grabbableToGrab.object.resetTranslation();\r\n }\r\n\r\n this._myGrabCallbacks.forEach(function (callback) { callback(this, grabbableToGrab); }.bind(this));\r\n }\r\n\r\n if (this._myGrabbables.length >= this._myMaxNumberOfObjects) {\r\n break;\r\n }\r\n }\r\n\r\n if (this._myGrabbables.length > 0) {\r\n if (this._myActiveGrabButton == null) {\r\n this._myActiveGrabButton = grabButton;\r\n }\r\n }\r\n }\r\n },\r\n _throw: function (throwButton) {\r\n if (this._myGrabButton == 2 || this._myActiveGrabButton == null || this._myActiveGrabButton == throwButton || throwButton == null) {\r\n if (this._myGrabbables.length > 0) {\r\n let linearVelocity = null;\r\n let angularVelocity = null;\r\n\r\n if (this._myThrowVelocitySource == 0) {\r\n linearVelocity = this._computeReleaseLinearVelocity(this._myHandLinearVelocityHistory);\r\n angularVelocity = this._computeReleaseAngularVelocity(this._myHandAngularVelocityHistory);\r\n }\r\n\r\n for (let grabbableData of this._myGrabbables) {\r\n let grabbable = grabbableData.getGrabbable();\r\n\r\n grabbable.unregisterReleaseEventListener(this);\r\n\r\n if (this._myThrowVelocitySource == 1) {\r\n linearVelocity = this._computeReleaseLinearVelocity(grabbableData.getLinearVelocityHistory());\r\n angularVelocity = this._computeReleaseAngularVelocity(grabbableData.getAngularVelocityHistory());\r\n }\r\n\r\n grabbable.throw(linearVelocity, angularVelocity);\r\n\r\n this._myThrowCallbacks.forEach(function (callback) { callback(this, grabbable); }.bind(this));\r\n }\r\n\r\n this._myGrabbables = [];\r\n }\r\n\r\n this._myActiveGrabButton = null;\r\n }\r\n },\r\n _onRelease(grabber, grabbable) {\r\n grabbable.unregisterReleaseEventListener(this);\r\n this._myGrabbables.pp_remove(element => element.getGrabbable() == grabbable);\r\n\r\n if (this._myGrabbables.length <= 0) {\r\n this._myActiveGrabButton = null;\r\n }\r\n },\r\n _updateLinearVelocityHistory() {\r\n let handPose = this._myGamepad.getHandPose();\r\n this._myHandLinearVelocityHistory.unshift(handPose.getLinearVelocity().pp_clone());\r\n this._myHandLinearVelocityHistory.pop();\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateLinearVelocityHistory();\r\n }\r\n },\r\n _updateAngularVelocityHistory() {\r\n let handPose = this._myGamepad.getHandPose();\r\n this._myHandAngularVelocityHistory.unshift(handPose.getAngularVelocityRadians().pp_clone());\r\n this._myHandAngularVelocityHistory.pop();\r\n\r\n for (let grabbable of this._myGrabbables) {\r\n grabbable.updateAngularVelocityHistory();\r\n }\r\n },\r\n _computeReleaseLinearVelocity(linearVelocityHistory) {\r\n //speed\r\n let speed = linearVelocityHistory[0].vec3_length();\r\n for (let i = 1; i < this._myLinearVelocityHistorySpeedAverageSamplesFromStart; i++) {\r\n speed += linearVelocityHistory[i].vec3_length();\r\n }\r\n speed /= this._myLinearVelocityHistorySpeedAverageSamplesFromStart;\r\n\r\n // This way I give an increasing and smooth boost to the throw so that when u want to perform a weak throw, the value is not changed, but if u put more speed\r\n // it will be boosted to make it easier and still feel good and natural (value does not increase suddenly)\r\n let speedEaseMultiplier = Math.pp_mapToRange(speed, this._myThrowLinearVelocityBoostMinSpeedThreshold, this._myThrowLinearVelocityBoostMaxSpeedThreshold, 0, 1);\r\n speedEaseMultiplier = PP.EasingFunction.easeIn(speedEaseMultiplier);\r\n\r\n // Add the boost to the speed\r\n let extraSpeed = speed * (speedEaseMultiplier * this._myThrowLinearVelocityBoost);\r\n speed += extraSpeed;\r\n speed *= this._myThrowLinearVelocityMultiplier;\r\n speed = Math.pp_clamp(speed, 0, this._myThrowMaxLinearSpeed);\r\n\r\n if (this._myDebugActive) {\r\n this._debugDirectionLines(linearVelocityHistory);\r\n }\r\n\r\n //direction\r\n let directionCurrentWeight = this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let lastDirectionIndex = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart;\r\n let direction = [0, 0, 0];\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i];\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n },\r\n _computeReleaseAngularVelocity(angularVelocityHistory) {\r\n let angularVelocity = angularVelocityHistory[0];\r\n\r\n //speed\r\n let speed = angularVelocity.vec3_length();\r\n\r\n speed = Math.pp_clamp(speed * this._myThrowAngularVelocityMultiplier, 0, this._myThrowMaxAngularSpeedRadians);\r\n\r\n //direction\r\n let direction = angularVelocity;\r\n direction.vec3_normalize(direction);\r\n\r\n direction.vec3_scale(speed, direction);\r\n\r\n return direction;\r\n },\r\n _debugDirectionLines(linearVelocityHistory) {\r\n for (let j = this._myLinearVelocityHistoryDirectionAverageSkipFromStart + this._myLinearVelocityHistoryDirectionAverageSamplesFromStart; j > this._myLinearVelocityHistoryDirectionAverageSkipFromStart; j--) {\r\n\r\n let directionCurrentWeight = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let lastDirectionIndex = j - this._myLinearVelocityHistoryDirectionAverageSkipFromStart;\r\n let direction = [0, 0, 0];\r\n for (let i = this._myLinearVelocityHistoryDirectionAverageSkipFromStart; i < lastDirectionIndex; i++) {\r\n let currentDirection = linearVelocityHistory[i].pp_clone();\r\n currentDirection.vec3_scale(directionCurrentWeight, currentDirection);\r\n direction.vec3_add(currentDirection, direction);\r\n\r\n directionCurrentWeight--;\r\n }\r\n direction.vec3_normalize(direction);\r\n\r\n let color = 1 / j;\r\n\r\n PP.myDebugVisualManager.drawLine(5, this.object.pp_getPosition(), direction, 0.2, [olor, color, color, 1]);\r\n }\r\n },\r\n _isAlreadyGrabbed(grabbable) {\r\n let found = this._myGrabbables.pp_find(element => element.getGrabbable() == grabbable);\r\n return found != null;\r\n }\r\n});\r\n\r\nPP.GrabberHandGrabbableData = class GrabberHandGrabbableData {\r\n constructor(grabbable, useGrabbableAsVelocitySource, linearVelocityHistorySize, angularVelocityHistorySize) {\r\n this._myGrabbable = grabbable;\r\n this._myUseGrabbableAsVelocitySource = useGrabbableAsVelocitySource;\r\n\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory = new Array(linearVelocityHistorySize);\r\n this._myLinearVelocityHistory.fill([0, 0, 0]);\r\n\r\n this._myAngularVelocityHistory = new Array(angularVelocityHistorySize);\r\n this._myAngularVelocityHistory.fill([0, 0, 0]);\r\n }\r\n }\r\n\r\n getGrabbable() {\r\n return this._myGrabbable;\r\n }\r\n\r\n getLinearVelocityHistory() {\r\n return this._myLinearVelocityHistory;\r\n }\r\n\r\n getAngularVelocityHistory() {\r\n return this._myAngularVelocityHistory;\r\n }\r\n\r\n updateLinearVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myLinearVelocityHistory.unshift(this._myGrabbable.getLinearVelocity());\r\n this._myLinearVelocityHistory.pop();\r\n }\r\n }\r\n\r\n updateAngularVelocityHistory() {\r\n if (this._myUseGrabbableAsVelocitySource) {\r\n this._myAngularVelocityHistory.unshift(this._myGrabbable.getAngularVelocityRadians());\r\n this._myAngularVelocityHistory.pop();\r\n }\r\n }\r\n};", "WL.registerComponent('pp-finger-cursor', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myEnableMultipleClicks: { type: WL.Type.Bool, default: true },\r\n _myCollisionGroup: { type: WL.Type.Int, default: 1 },\r\n _myCollisionSize: { type: WL.Type.Float, default: 0.0125 },\r\n _myCursorObject: { type: WL.Type.Object, default: null }\r\n}, {\r\n init: function () {\r\n this._myLastTarget = null;\r\n this._myReferenceSpace = null;\r\n this._myHandInputSource = null;\r\n this._myHandednessString = ['left', 'right'][this._myHandedness];\r\n\r\n this._myDoubleClickTimer = 0;\r\n this._myTripleClickTimer = 0;\r\n this._myMultipleClickObject = null;\r\n this._myMultipleClickDelay = 0.3;\r\n },\r\n start: function () {\r\n this._myCursorObjectRoot = WL.scene.addObject(null);\r\n\r\n if (this._myCursorObject == null) {\r\n this._myCursorObject = this._myCursorObjectRoot.pp_addObject();\r\n } else {\r\n this._myCursorObject.pp_setParent(this._myCursorObjectRoot);\r\n }\r\n\r\n this._myCollisionComponent = this._myCursorObject.addComponent('collision');\r\n this._myCollisionComponent.collider = WL.Collider.Sphere;\r\n this._myCollisionComponent.group = 1 << this._myCollisionGroup;\r\n this._myCollisionComponent.extents = [this._myCollisionSize, this._myCollisionSize, this._myCollisionSize];\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n },\r\n update: function (dt) {\r\n if (this._myDoubleClickTimer > 0) {\r\n this._myDoubleClickTimer -= dt;\r\n }\r\n\r\n if (this._myTripleClickTimer > 0) {\r\n this._myTripleClickTimer -= dt;\r\n }\r\n\r\n this._myCursorObjectRoot.pp_setTransformQuat(PP.myPlayerObjects.myPlayerPivot.pp_getTransformQuat());\r\n this._updateHand();\r\n\r\n if (this._myHandInputSource) {\r\n let overlaps = this._myCollisionComponent.queryOverlaps();\r\n let overlapTarget = null;\r\n for (let i = 0; i < overlaps.length; ++i) {\r\n let object = overlaps[i].object;\r\n let target = object.getComponent('cursor-target');\r\n if (target && (overlapTarget == null || !target.isSurface)) {\r\n overlapTarget = target;\r\n if (!target.isSurface) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!overlapTarget) {\r\n this._targetTouchEnd();\r\n } else if (!overlapTarget.equals(this._myLastTarget)) {\r\n this._targetTouchEnd();\r\n\r\n this._myLastTarget = overlapTarget;\r\n\r\n this._targetTouchStart();\r\n }\r\n } else {\r\n this._targetTouchEnd();\r\n }\r\n },\r\n _targetTouchStart: function () {\r\n this._myLastTarget.onHover(this._myLastTarget.object, this);\r\n this._myLastTarget.onDown(this._myLastTarget.object, this);\r\n },\r\n _targetTouchEnd: function () {\r\n if (this._myLastTarget) {\r\n if (this._myEnableMultipleClicks && this._myTripleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject.equals(this._myLastTarget.object)) {\r\n this._myLastTarget.onTripleClick(this._myLastTarget.object, this);\r\n\r\n this._myTripleClickTimer = 0;\r\n } else if (this._myEnableMultipleClicks && this._myDoubleClickTimer > 0 && this._myMultipleClickObject && this._myMultipleClickObject.equals(this._myLastTarget.object)) {\r\n this._myLastTarget.onDoubleClick(this._myLastTarget.object, this);\r\n\r\n this._myTripleClickTimer = this._myMultipleClickDelay;\r\n this._myDoubleClickTimer = 0;\r\n } else {\r\n this._myLastTarget.onClick(this._myLastTarget.object, this);\r\n\r\n this._myTripleClickTimer = 0;\r\n this._myDoubleClickTimer = this._myMultipleClickDelay;\r\n this._myMultipleClickObject = this._myLastTarget.object;\r\n }\r\n\r\n this._myLastTarget.onUp(this._myLastTarget.object, this);\r\n this._myLastTarget.onUnhover(this._myLastTarget.object, this);\r\n\r\n this._myLastTarget = null;\r\n }\r\n },\r\n onActivate: function () {\r\n this._myCursorObjectRoot.pp_setActive(true);\r\n },\r\n onDeactivate: function () {\r\n this._myCursorObjectRoot.pp_setActive(false);\r\n },\r\n _updateHand() {\r\n this._myHandInputSource = PP.InputUtils.getInputSource(this._myHandednessString, PP.InputSourceType.TRACKED_HAND);\r\n\r\n if (this._myHandInputSource) {\r\n let tip = Module['webxr_frame'].getJointPose(this._myHandInputSource.hand.get(\"index-finger-tip\"), this._myReferenceSpace);\r\n\r\n if (tip) {\r\n this._myCursorObject.pp_setRotationLocalQuat([\r\n tip.transform.orientation.x,\r\n tip.transform.orientation.y,\r\n tip.transform.orientation.z,\r\n tip.transform.orientation.w]);\r\n\r\n this._myCursorObject.pp_setPositionLocal([\r\n tip.transform.position.x,\r\n tip.transform.position.y,\r\n tip.transform.position.z]);\r\n }\r\n }\r\n },\r\n _onXRSessionStart: function (session) {\r\n session.requestReferenceSpace(WebXR.refSpace).then(function (referenceSpace) { this._myReferenceSpace = referenceSpace; }.bind(this));\r\n },\r\n _onXRSessionEnd: function (session) {\r\n this._myReferenceSpace = null;\r\n }\r\n});", "\nPP.Handedness = {\n LEFT: \"left\",\n RIGHT: \"right\"\n};\n\nPP.HandednessIndex = {\n LEFT: 0,\n RIGHT: 1\n};\n\nPP.InputSourceType = {\n GAMEPAD: 0,\n TRACKED_HAND: 1\n};\n\nPP.TrackedHandJointType = {\n WRIST: \"wrist\",\n\n THUMB_METACARPAL: \"thumb-metacarpal\",\n THUMB_PHALANX_PROXIMAL: \"thumb-phalanx-proximal\",\n THUMB_PHALANX_DISTAL: \"thumb-phalanx-distal\",\n THUMB_TIP: \"thumb-tip\",\n\n INDEX_FINGER_METACARPAL: \"index-finger-metacarpal\",\n INDEX_FINGER_PHALANX_PROXIMAL: \"index-finger-phalanx-proximal\",\n INDEX_FINGER_PHALANX_INTERMEDIATE: \"index-finger-phalanx-intermediate\",\n INDEX_FINGER_PHALANX_DISTAL: \"index-finger-phalanx-distal\",\n INDEX_FINGER_TIP: \"index-finger-tip\",\n\n MIDDLE_FINGER_METACARPAL: \"middle-finger-metacarpal\",\n MIDDLE_FINGER_PHALANX_PROXIMAL: \"middle-finger-phalanx-proximal\",\n MIDDLE_FINGER_PHALANX_INTERMEDIATE: \"middle-finger-phalanx-intermediate\",\n MIDDLE_FINGER_PHALANX_DISTAL: \"middle-finger-phalanx-distal\",\n MIDDLE_FINGER_TIP: \"middle-finger-tip\",\n\n RING_FINGER_METACARPAL: \"ring-finger-metacarpal\",\n RING_FINGER_PHALANX_PROXIMAL: \"ring-finger-phalanx-proximal\",\n RING_FINGER_PHALANX_INTERMEDIATE: \"ring-finger-phalanx-intermediate\",\n RING_FINGER_PHALANX_DISTAL: \"ring-finger-phalanx-distal\",\n RING_FINGER_TIP: \"ring-finger-tip\",\n\n PINKY_FINGER_METACARPAL: \"pinky-finger-metacarpal\",\n PINKY_FINGER_PHALANX_PROXIMAL: \"pinky-finger-phalanx-proximal\",\n PINKY_FINGER_PHALANX_INTERMEDIATE: \"pinky-finger-phalanx-intermediate\",\n PINKY_FINGER_PHALANX_DISTAL: \"pinky-finger-phalanx-distal\",\n PINKY_FINGER_TIP: \"pinky-finger-tip\",\n};\n\nPP.TrackedHandJointTypeIndex = {\n WRIST: 0,\n\n THUMB_METACARPAL: 1,\n THUMB_PHALANX_PROXIMAL: 2,\n THUMB_PHALANX_DISTAL: 3,\n THUMB_TIP: 4,\n\n INDEX_FINGER_METACARPAL: 5,\n INDEX_FINGER_PHALANX_PROXIMAL: 6,\n INDEX_FINGER_PHALANX_INTERMEDIATE: 7,\n INDEX_FINGER_PHALANX_DISTAL: 8,\n INDEX_FINGER_TIP: 9,\n\n MIDDLE_FINGER_METACARPAL: 10,\n MIDDLE_FINGER_PHALANX_PROXIMAL: 11,\n MIDDLE_FINGER_PHALANX_INTERMEDIATE: 12,\n MIDDLE_FINGER_PHALANX_DISTAL: 13,\n MIDDLE_FINGER_TIP: 14,\n\n RING_FINGER_METACARPAL: 15,\n RING_FINGER_PHALANX_PROXIMAL: 16,\n RING_FINGER_PHALANX_INTERMEDIATE: 17,\n RING_FINGER_PHALANX_DISTAL: 18,\n RING_FINGER_TIP: 19,\n\n PINKY_FINGER_METACARPAL: 20,\n PINKY_FINGER_PHALANX_PROXIMAL: 21,\n PINKY_FINGER_PHALANX_INTERMEDIATE: 22,\n PINKY_FINGER_PHALANX_DISTAL: 23,\n PINKY_FINGER_TIP: 24,\n};", "PP.InputUtils = {\r\n getHandednessByIndex: function (index) {\r\n let handedness = null;\r\n\r\n switch (index) {\r\n case PP.HandednessIndex.LEFT:\r\n handedness = PP.Handedness.LEFT;\r\n break;\r\n case PP.HandednessIndex.RIGHT:\r\n handedness = PP.Handedness.RIGHT;\r\n break;\r\n }\r\n\r\n return handedness;\r\n },\r\n getInputSource: function (handedness, inputSourceType) {\r\n let inputSource = null;\r\n\r\n if (WL.xrSession && WL.xrSession.inputSources) {\r\n for (let i = 0; i < WL.xrSession.inputSources.length; i++) {\r\n let input = WL.xrSession.inputSources[i];\r\n\r\n let isCorrectType = (!inputSourceType) || (inputSourceType == PP.InputSourceType.GAMEPAD && !input.hand) || (inputSourceType == PP.InputSourceType.TRACKED_HAND && input.hand);\r\n if (isCorrectType && input.handedness == handedness) {\r\n inputSource = input;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return inputSource;\r\n },\r\n getInputSourceTypeByHandedness: function (handedness) {\r\n let inputSource = PP.InputUtils.getInputSource(handedness);\r\n\r\n return PP.InputUtils.getInputSourceType(inputSource);\r\n },\r\n getInputSourceType: function (inputSource) {\r\n let inputSourceType = null;\r\n\r\n if (inputSource) {\r\n if (inputSource.hand) {\r\n inputSourceType = PP.InputSourceType.TRACKED_HAND;\r\n } else {\r\n inputSourceType = PP.InputSourceType.GAMEPAD;\r\n }\r\n }\r\n\r\n return inputSourceType;\r\n },\r\n getOppositeHandedness: function (handedness) {\r\n let oppositeHandedness = null;\r\n\r\n switch (handedness) {\r\n case PP.Handedness.LEFT:\r\n oppositeHandedness = PP.Handedness.RIGHT;\r\n break;\r\n case PP.Handedness.RIGHT:\r\n oppositeHandedness = PP.Handedness.LEFT;\r\n break;\r\n }\r\n\r\n return oppositeHandedness;\r\n },\r\n getJointTypeByIndex: function (index) {\r\n let jointType = null;\r\n\r\n let jointTypeKey = null;\r\n for (let jointTypeIndexKey in PP.TrackedHandJointTypeIndex) {\r\n if (PP.TrackedHandJointTypeIndex[jointTypeIndexKey] == index) {\r\n jointTypeKey = jointTypeIndexKey;\r\n break;\r\n }\r\n }\r\n\r\n if (jointTypeKey != null) {\r\n jointType = PP.TrackedHandJointType[jointTypeKey];\r\n }\r\n\r\n return jointType;\r\n },\r\n};", "PP.KeyType = {\r\n _0: \"0\",\r\n _1: \"1\",\r\n _2: \"2\",\r\n _3: \"3\",\r\n _4: \"4\",\r\n _5: \"5\",\r\n _6: \"6\",\r\n _7: \"7\",\r\n _8: \"8\",\r\n _9: \"9\",\r\n\r\n A: \"A\",\r\n B: \"B\",\r\n C: \"C\",\r\n D: \"D\",\r\n E: \"E\",\r\n F: \"F\",\r\n G: \"G\",\r\n H: \"H\",\r\n I: \"I\",\r\n J: \"J\",\r\n K: \"K\",\r\n L: \"L\",\r\n M: \"M\",\r\n N: \"N\",\r\n O: \"O\",\r\n P: \"P\",\r\n Q: \"Q\",\r\n R: \"R\",\r\n S: \"S\",\r\n T: \"T\",\r\n U: \"U\",\r\n V: \"V\",\r\n W: \"W\",\r\n X: \"X\",\r\n Y: \"Y\",\r\n Z: \"Z\",\r\n\r\n a: \"a\",\r\n b: \"b\",\r\n c: \"c\",\r\n d: \"d\",\r\n e: \"e\",\r\n f: \"f\",\r\n g: \"g\",\r\n h: \"h\",\r\n i: \"i\",\r\n j: \"j\",\r\n k: \"k\",\r\n l: \"l\",\r\n m: \"m\",\r\n n: \"n\",\r\n o: \"o\",\r\n p: \"p\",\r\n q: \"q\",\r\n r: \"r\",\r\n s: \"s\",\r\n t: \"t\",\r\n u: \"u\",\r\n v: \"v\",\r\n w: \"w\",\r\n x: \"x\",\r\n y: \"y\",\r\n z: \"z\",\r\n\r\n UP: \"ArrowUp\",\r\n DOWN: \"ArrowDown\",\r\n LEFT: \"ArrowLeft\",\r\n RIGHT: \"ArrowRight\",\r\n\r\n SPACE: \" \",\r\n ENTER: \"Enter\",\r\n BACKSPACE: \"Backspace\",\r\n ESC: \"Escape\",\r\n\r\n SHIFT_LEFT: \"ShiftLeft\",\r\n SHIFT_RIGHT: \"ShiftRight\",\r\n CONTROL_LEFT: \"ControlLeft\",\r\n CONTROL_RIGHT: \"ControlRight\",\r\n ALT_LEFT: \"AltLeft\",\r\n ALT_RIGHT: \"AltRight\",\r\n};\r\n\r\nPP.Keyboard = class Keyboard {\r\n constructor() {\r\n this._myKeyInfos = new Map();\r\n\r\n for (let keyType in PP.KeyType) {\r\n this.addKey(PP.KeyType[keyType]);\r\n }\r\n }\r\n\r\n isKeyPressed(keyType) {\r\n let isPressed = false;\r\n\r\n if (this._myKeyInfos.has(keyType)) {\r\n isPressed = this._myKeyInfos.get(keyType).myIsPressed;\r\n }\r\n\r\n return isPressed;\r\n }\r\n\r\n isKeyPressStart(keyType) {\r\n let isPressStart = false;\r\n\r\n if (this._myKeyInfos.has(keyType)) {\r\n isPressStart = this._myKeyInfos.get(keyType).myIsPressStart;\r\n }\r\n\r\n return isPressStart;\r\n }\r\n\r\n isKeyPressEnd(keyType) {\r\n let isPressEnd = false;\r\n\r\n if (this._myKeyInfos.has(keyType)) {\r\n isPressEnd = this._myKeyInfos.get(keyType).myIsPressEnd;\r\n }\r\n\r\n return isPressEnd;\r\n }\r\n\r\n addKey(keyType) {\r\n this._myKeyInfos.set(keyType,\r\n { myIsPressed: false, myIsPressStart: false, myIsPressStartToProcess: false, myIsPressEnd: false, myIsPressEndToProcess: false, });\r\n }\r\n\r\n start() {\r\n window.addEventListener('keydown', this._keyDown.bind(this));\r\n window.addEventListener('keyup', this._keyUp.bind(this));\r\n }\r\n\r\n update(dt) {\r\n if (!document.hasFocus()) {\r\n for (let keyInfo of this._myKeyInfos.values()) {\r\n if (keyInfo.myIsPressed) {\r\n keyInfo.myIsPressed = false;\r\n keyInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n for (let keyInfo of this._myKeyInfos.values()) {\r\n keyInfo.myIsPressStart = keyInfo.myIsPressStartToProcess;\r\n keyInfo.myIsPressEnd = keyInfo.myIsPressEndToProcess;\r\n keyInfo.myIsPressStartToProcess = false;\r\n keyInfo.myIsPressEndToProcess = false;\r\n }\r\n }\r\n\r\n _keyDown(event) {\r\n this._keyPressedChanged(event.key, true);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, true);\r\n }\r\n }\r\n\r\n _keyUp(event) {\r\n this._keyPressedChanged(event.key, false);\r\n if (event.key != event.code) {\r\n this._keyPressedChanged(event.code, false);\r\n }\r\n }\r\n\r\n _keyPressedChanged(keyType, isPressed) {\r\n if (this._myKeyInfos.has(keyType)) {\r\n let keyInfo = this._myKeyInfos.get(keyType);\r\n\r\n if (isPressed) {\r\n keyInfo.myIsPressed = true;\r\n keyInfo.myIsPressStartToProcess = true;\r\n } else {\r\n keyInfo.myIsPressed = false;\r\n keyInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n};", "PP.MouseButtonType = {\r\n LEFT: 0,\r\n MIDDLE: 1,\r\n RIGHT: 2,\r\n};\r\n\r\nPP.Mouse = class Mouse {\r\n constructor() {\r\n // #TODO refactor Mouse/Keyboard/Gamepad and create a sort of parent ButtonHandler that have the base ButtonInfo and all of them inherit\r\n // ButtonType could also become GamepadButtonID or directly GamepadButton like in Unity\r\n\r\n this._myButtonInfos = new Map();\r\n for (let typeKey in PP.MouseButtonType) {\r\n this._myButtonInfos.set(PP.MouseButtonType[typeKey],\r\n { myIsPressed: false, myIsPressStart: false, myIsPressStartToProcess: false, myIsPressEnd: false, myIsPressEndToProcess: false, });\r\n }\r\n\r\n this._myPreventContextMenuCallback = this._preventContextMenu.bind(this);\r\n this._myPreventMiddleButtonScrollCallback = this._preventMiddleButtonScroll.bind(this);\r\n\r\n this._myInternalMousePosition = PP.vec2_create();\r\n this._myScreenSize = PP.vec2_create();\r\n\r\n this._myResetMovingDelay = 0.15;\r\n this._myResetMovingTimer = new PP.Timer(this._myResetMovingDelay, false);\r\n this._myIsMoving = false;\r\n\r\n this._myIsInsideView = true;\r\n\r\n this._myContextMenuActive = true;\r\n this._myMiddleButtonScrollActive = true;\r\n\r\n // Support Variables\r\n this._myProjectionMatrixInverse = PP.mat4_create();\r\n this._myRotationQuat = PP.quat_create();\r\n this._myOriginWorld = PP.vec3_create();\r\n this._myDirectionWorld = PP.vec3_create();\r\n }\r\n\r\n start() {\r\n this._myOnMouseMoveCallback = this._onMouseMove.bind(this);\r\n WL.canvas.addEventListener(\"mousemove\", this._myOnMouseMoveCallback);\r\n this._myOnMouseDownCallback = this._onMouseDown.bind(this);\r\n WL.canvas.addEventListener(\"mousedown\", this._myOnMouseDownCallback);\r\n this._myOnMouseUpCallback = this._onMouseUp.bind(this);\r\n WL.canvas.addEventListener(\"mouseup\", this._myOnMouseUpCallback);\r\n this._myOnMouseLeaveCallback = this._onMouseLeave.bind(this);\r\n WL.canvas.addEventListener(\"mouseleave\", this._myOnMouseLeaveCallback);\r\n this._myOnMouseEnterCallback = this._onMouseEnter.bind(this);\r\n WL.canvas.addEventListener(\"mouseenter\", this._myOnMouseEnterCallback);\r\n }\r\n\r\n update(dt) {\r\n if (this._myResetMovingTimer.isRunning()) {\r\n this._myResetMovingTimer.update(dt);\r\n if (this._myResetMovingTimer.isDone()) {\r\n this._myResetMovingTimer.reset();\r\n this._myIsMoving = false;\r\n }\r\n }\r\n\r\n for (let buttonInfo of this._myButtonInfos.values()) {\r\n buttonInfo.myIsPressStart = buttonInfo.myIsPressStartToProcess;\r\n buttonInfo.myIsPressEnd = buttonInfo.myIsPressEndToProcess;\r\n buttonInfo.myIsPressStartToProcess = false;\r\n buttonInfo.myIsPressEndToProcess = false;\r\n }\r\n }\r\n\r\n destroy() {\r\n WL.canvas.removeEventListener(\"mousemove\", this._myOnMouseMoveCallback);\r\n WL.canvas.removeEventListener(\"mousedown\", this._myOnMouseDownCallback);\r\n WL.canvas.removeEventListener(\"mouseup\", this._myOnMouseUpCallback);\r\n WL.canvas.removeEventListener(\"mouseleave\", this._myOnMouseLeaveCallback);\r\n WL.canvas.removeEventListener(\"contextmenu\", this._myPreventContextMenuCallback);\r\n WL.canvas.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollCallback);\r\n }\r\n\r\n isButtonPressed(buttonInfoType) {\r\n let isPressed = false;\r\n\r\n if (this._myButtonInfos.has(buttonInfoType)) {\r\n isPressed = this._myButtonInfos.get(buttonInfoType).myIsPressed;\r\n }\r\n\r\n return isPressed;\r\n }\r\n\r\n isButtonPressStart(buttonInfoType) {\r\n let isPressStart = false;\r\n\r\n if (this._myButtonInfos.has(buttonInfoType)) {\r\n isPressStart = this._myButtonInfos.get(buttonInfoType).myIsPressStart;\r\n }\r\n\r\n return isPressStart;\r\n }\r\n\r\n isButtonPressEnd(buttonInfoType = null) {\r\n let isPressEnd = false;\r\n\r\n if (this._myButtonInfos.has(buttonInfoType)) {\r\n isPressEnd = this._myButtonInfos.get(buttonInfoType).myIsPressEnd;\r\n }\r\n\r\n return isPressEnd;\r\n }\r\n\r\n isMoving() {\r\n return this._myIsMoving;\r\n }\r\n\r\n isInsideView() {\r\n return this._myIsInsideView;\r\n }\r\n\r\n setContextMenuActive(active) {\r\n if (this._myContextMenuActive != active) {\r\n if (active) {\r\n WL.canvas.removeEventListener(\"contextmenu\", this._myPreventContextMenuCallback);\r\n } else {\r\n WL.canvas.addEventListener(\"contextmenu\", this._myPreventContextMenuCallback, false);\r\n }\r\n this._myContextMenuActive = active;\r\n }\r\n }\r\n\r\n setMiddleButtonScrollActive(active) {\r\n if (this._myMiddleButtonScrollActive != active) {\r\n if (active) {\r\n WL.canvas.removeEventListener(\"mousedown\", this._myPreventMiddleButtonScrollCallback);\r\n } else {\r\n WL.canvas.addEventListener(\"mousedown\", this._myPreventMiddleButtonScrollCallback, false);\r\n }\r\n this._myMiddleButtonScrollActive = active;\r\n }\r\n }\r\n\r\n getPositionScreen(out = PP.vec2_create()) {\r\n let mousePosition = out;\r\n mousePosition[0] = this._myInternalMousePosition[0];\r\n mousePosition[1] = this._myScreenSize[1] - 1 - this._myInternalMousePosition[1];\r\n return mousePosition;\r\n }\r\n\r\n getScreenSize() {\r\n return this._myScreenSize;\r\n }\r\n\r\n getPositionWorld(distanceFromCamera, out = PP.vec3_create()) {\r\n let originWorld = this.getOriginWorld(this._myOriginWorld);\r\n let directionWorld = this.getDirectionWorld(this._myDirectionWorld);\r\n\r\n out = originWorld.vec3_add(directionWorld.vec3_scale(distanceFromCamera, out), out);\r\n return out;\r\n }\r\n\r\n getOriginWorld(out = PP.vec3_create()) {\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n PP.myPlayerObjects.myEyeLeft.pp_getPosition(out); // in theory mouse should not be used inside the session, but may make sense for AR which uses eye left\r\n } else {\r\n PP.myPlayerObjects.myNonVRCamera.pp_getPosition(out);\r\n }\r\n\r\n return out;\r\n }\r\n\r\n getDirectionWorld(out = PP.vec3_create()) {\r\n let right = this._myInternalMousePosition[0] / this._myScreenSize[0];\r\n let up = this._myInternalMousePosition[1] / this._myScreenSize[1];\r\n\r\n let directionLocal = out;\r\n directionLocal.vec3_set(right * 2 - 1, -up * 2 + 1, -1.0);\r\n\r\n let projectionMatrixInvert = this._myProjectionMatrixInverse;\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n projectionMatrixInvert = PP.myPlayerObjects.myEyeLeft.pp_getComponentHierarchy(\"view\").projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n } else {\r\n projectionMatrixInvert = PP.myPlayerObjects.myNonVRCamera.pp_getComponentHierarchy(\"view\").projectionMatrix.mat4_invert(projectionMatrixInvert);\r\n }\r\n\r\n directionLocal.vec3_transformMat4(projectionMatrixInvert, directionLocal);\r\n directionLocal.vec3_normalize(directionLocal);\r\n\r\n let directionWorld = directionLocal;\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n directionWorld = directionLocal.vec3_transformQuat(PP.myPlayerObjects.myEyeLeft.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n } else {\r\n directionWorld = directionLocal.vec3_transformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getRotationQuat(this._myRotationQuat), directionLocal);\r\n }\r\n\r\n directionWorld.vec3_normalize(directionWorld);\r\n\r\n return out;\r\n }\r\n\r\n // the origin and direction are set by the mouse\r\n raycastWorld(raycastSetup, raycastResult = new PP.RaycastResult()) {\r\n this.getOriginWorld(raycastSetup.myOrigin);\r\n this.getDirectionWorld(raycastSetup.myDirection);\r\n raycastResult = PP.PhysicsUtils.raycast(raycastSetup, raycastResult);\r\n return raycastResult;\r\n }\r\n\r\n setResetMovingDelay(delay) {\r\n this._myResetMovingDelay = delay;\r\n }\r\n\r\n getResetMovingDelay() {\r\n return this._myResetMovingDelay;\r\n }\r\n\r\n _updatePositionAndView(event) {\r\n let bounds = event.target.getBoundingClientRect();\r\n this._myScreenSize[0] = bounds.width;\r\n this._myScreenSize[1] = bounds.height;\r\n this._myInternalMousePosition[0] = event.clientX;\r\n this._myInternalMousePosition[1] = event.clientY;\r\n }\r\n\r\n _onMouseMove(event) {\r\n this._myResetMovingTimer.start(this._myResetMovingDelay);\r\n this._myIsMoving = true;\r\n\r\n this._updatePositionAndView(event);\r\n }\r\n\r\n _onMouseDown(event) {\r\n let buttonInfo = this._myButtonInfos.get(event.button);\r\n if (!buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = true;\r\n buttonInfo.myIsPressStartToProcess = true;\r\n }\r\n\r\n this._updatePositionAndView(event);\r\n }\r\n\r\n _onMouseUp(event) {\r\n let buttonInfo = this._myButtonInfos.get(event.button);\r\n if (buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = false;\r\n buttonInfo.myIsPressEndToProcess = true;\r\n }\r\n\r\n this._updatePositionAndView(event);\r\n }\r\n\r\n _onMouseLeave(event) {\r\n this._myIsInsideView = false;\r\n\r\n for (let buttonInfo of this._myButtonInfos.values()) {\r\n if (buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = false;\r\n buttonInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n _onMouseEnter(event) {\r\n this._myIsInsideView = true;\r\n\r\n for (let buttonInfo of this._myButtonInfos.values()) {\r\n if (buttonInfo.myIsPressed) {\r\n buttonInfo.myIsPressed = false;\r\n buttonInfo.myIsPressEndToProcess = true;\r\n }\r\n }\r\n }\r\n\r\n _preventContextMenu(event) {\r\n event.preventDefault();\r\n }\r\n\r\n _preventMiddleButtonScroll(event) {\r\n if (event.button == 1) {\r\n event.preventDefault();\r\n return false;\r\n }\r\n }\r\n};", "PP.InputManager = class InputManager {\r\n constructor() {\r\n this._myMouse = new PP.Mouse();\r\n this._myKeyboard = new PP.Keyboard();\r\n this._myGamepadManager = new PP.GamepadManager();\r\n }\r\n\r\n start() {\r\n this._myMouse.start();\r\n this._myKeyboard.start();\r\n this._myGamepadManager.start();\r\n }\r\n\r\n update(dt) {\r\n this._myMouse.update(dt);\r\n this._myKeyboard.update(dt);\r\n this._myGamepadManager.update(dt);\r\n }\r\n\r\n getMouse() {\r\n return this._myMouse;\r\n }\r\n\r\n getKeyboard() {\r\n return this._myKeyboard;\r\n }\r\n\r\n getGamepadManager() {\r\n return this._myGamepadManager;\r\n }\r\n};", "WL.registerComponent('pp-input-manager', {\r\n _myGamepadFixForward: { type: WL.Type.Bool, default: true },\r\n _myMousePreventContextMenu: { type: WL.Type.Bool, default: true },\r\n _myMousePreventMiddleButtonScroll: { type: WL.Type.Bool, default: true },\r\n}, {\r\n init() {\r\n this._myInputManager = new PP.InputManager();\r\n\r\n PP.myInputManager = this._myInputManager;\r\n\r\n PP.myMouse = this._myInputManager.getMouse();\r\n PP.myKeyboard = this._myInputManager.getKeyboard();\r\n\r\n PP.myGamepadManager = this._myInputManager.getGamepadManager();\r\n PP.myGamepads = PP.myGamepadManager.getGamepads();\r\n PP.myLeftGamepad = PP.myGamepadManager.getLeftGamepad();\r\n PP.myRightGamepad = PP.myGamepadManager.getRightGamepad();\r\n },\r\n start() {\r\n this._myInputManager.start();\r\n\r\n this._setupMousePrevent();\r\n this._addGamepadCores();\r\n },\r\n update(dt) {\r\n this._myInputManager.update(dt);\r\n },\r\n _setupMousePrevent() {\r\n if (this._myMousePreventContextMenu) {\r\n PP.myMouse.setContextMenuActive(false);\r\n }\r\n\r\n if (this._myMousePreventMiddleButtonScroll) {\r\n PP.myMouse.setMiddleButtonScrollActive(false);\r\n }\r\n },\r\n _addGamepadCores() {\r\n let handPoseParams = new PP.HandPoseParams();\r\n handPoseParams.myReferenceObject = PP.myPlayerObjects.myPlayerPivot;\r\n handPoseParams.myFixForward = this._myFixForward;\r\n handPoseParams.myForceEmulatedVelocities = false;\r\n\r\n let leftXRGamepadCore = new PP.XRGamepadCore(PP.Handedness.LEFT, handPoseParams);\r\n let rightXRGamepadCore = new PP.XRGamepadCore(PP.Handedness.RIGHT, handPoseParams);\r\n\r\n PP.myLeftGamepad.addGamepadCore(\"left_xr_gamepad\", leftXRGamepadCore);\r\n PP.myRightGamepad.addGamepadCore(\"right_xr_gamepad\", rightXRGamepadCore);\r\n\r\n let leftKeyboardGamepadCore = new PP.KeyboardGamepadCore(PP.Handedness.LEFT, leftXRGamepadCore.getHandPose());\r\n let rightKeyboardGamepadCore = new PP.KeyboardGamepadCore(PP.Handedness.RIGHT, rightXRGamepadCore.getHandPose());\r\n\r\n PP.myLeftGamepad.addGamepadCore(\"left_keyboard_gamepad\", leftKeyboardGamepadCore);\r\n PP.myRightGamepad.addGamepadCore(\"right_keyboard_gamepad\", rightKeyboardGamepadCore);\r\n }\r\n});\r\n\r\nPP.myInputManager = null;\r\n\r\nPP.myMouse = null;\r\n\r\nPP.myKeyboard = null;\r\n\r\nPP.myGamepadManager = null;\r\nPP.myGamepads = null;\r\nPP.myLeftGamepad = null;\r\nPP.myRightGamepad = null;", "WL.registerComponent('pp-switch-hand-object', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myGamepad: { type: WL.Type.Object },\r\n _myTrackedHand: { type: WL.Type.Object }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myHandednessType = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myFirstUpdate = true;\r\n\r\n this._myCurrentInputSourceType = null;\r\n },\r\n onActivate() {\r\n this._myFirstUpdate = true;\r\n },\r\n update: function (dt) {\r\n if (this._myFirstUpdate) {\r\n this._myFirstUpdate = false;\r\n this._start();\r\n }\r\n\r\n let inputSourceType = PP.InputUtils.getInputSourceTypeByHandedness(this._myHandednessType);\r\n if (inputSourceType != null && this._myCurrentInputSourceType != inputSourceType) {\r\n this._myCurrentInputSourceType = inputSourceType;\r\n\r\n if (inputSourceType == PP.InputSourceType.TRACKED_HAND) {\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(true);\r\n } else if (inputSourceType == PP.InputSourceType.GAMEPAD) {\r\n this._myTrackedHand.pp_setActive(false);\r\n this._myGamepad.pp_setActive(true);\r\n }\r\n }\r\n },\r\n _start() {\r\n this._myGamepad.pp_setActive(false);\r\n this._myTrackedHand.pp_setActive(false);\r\n\r\n this._myCurrentInputSourceType = null;\r\n }\r\n});", "WL.registerComponent('pp-tracked-hand-draw-joint', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _myJointType: {\r\n type: WL.Type.Enum, values:\r\n [\r\n 'Wrist',\r\n 'Thumb Metacarpal', 'Thumb Phalanx Proximal', 'Thumb Phalanx Distal', 'Thumb Tip',\r\n 'Index Metacarpal', 'Index Phalanx Proximal', 'Index Phalanx Intermediate', 'Index Phalanx Distal', 'Index Tip',\r\n 'Middle Metacarpal', 'Middle Phalanx Proximal', 'Middle Phalanx Intermediate', 'Middle Phalanx Distal', 'Middle Tip',\r\n 'Ring Metacarpal', 'Ring Phalanx Proximal', 'Ring Phalanx Intermediate', 'Ring Phalanx Distal', 'Ring Tip',\r\n 'Pinky Metacarpal', 'Pinky Phalanx Proximal', 'Pinky Phalanx Intermediate', 'Pinky Phalanx Distal', 'Pinky Tip'\r\n ],\r\n default: 'Wrist'\r\n },\r\n _myJointMesh: { type: WL.Type.Mesh },\r\n _myJointMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n this._myHandednessInternal = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointTypeInternal = PP.InputUtils.getJointTypeByIndex(this._myJointType);\r\n\r\n this._myTrackedHandJointPose = new PP.TrackedHandJointPose(this._myHandednessInternal, this._myJointTypeInternal);\r\n this._myTrackedHandJointPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myTrackedHandJointPose.start();\r\n\r\n this._buildTrackedHandHierarchy();\r\n },\r\n update: function (dt) {\r\n this._myTrackedHandJointPose.update(dt);\r\n this._myJointMeshObject.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat());\r\n this._myJointMeshObject.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius());\r\n },\r\n _buildTrackedHandHierarchy() {\r\n this._myJointMeshObject = this.object.pp_addObject();\r\n\r\n let mesh = this._myJointMeshObject.pp_addComponent(\"mesh\");\r\n mesh.mesh = this._myJointMesh;\r\n mesh.material = this._myJointMaterial;\r\n\r\n this._myJointMeshObject.pp_setScaleLocal(0);\r\n }\r\n});", "WL.registerComponent('pp-tracked-hand-draw-all-joints', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _myHideMetacarpals: { type: WL.Type.Bool, default: true },\r\n _myJointMesh: { type: WL.Type.Mesh },\r\n _myJointMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._buildTrackedHandHierarchy();\r\n },\r\n update: function (dt) {\r\n },\r\n _buildTrackedHandHierarchy() {\r\n this._myTrackedHandMeshObject = this.object.pp_addObject();\r\n\r\n this._myJointMeshObjectList = [];\r\n\r\n for (let jointTypeKey in PP.TrackedHandJointType) {\r\n let jointType = PP.TrackedHandJointType[jointTypeKey];\r\n if (!this._myHideMetacarpals ||\r\n (jointType != PP.TrackedHandJointType.THUMB_METACARPAL &&\r\n jointType != PP.TrackedHandJointType.INDEX_FINGER_METACARPAL && jointType != PP.TrackedHandJointType.MIDDLE_FINGER_METACARPAL &&\r\n jointType != PP.TrackedHandJointType.RING_FINGER_METACARPAL && jointType != PP.TrackedHandJointType.PINKY_FINGER_METACARPAL)\r\n ) {\r\n let jointObject = this._myTrackedHandMeshObject.pp_addObject();\r\n this._myJointMeshObjectList[jointType] = jointObject;\r\n\r\n jointObject.pp_addComponent(\"pp-tracked-hand-draw-joint\",\r\n {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myFixForward\": this._myFixForward,\r\n \"_myJointType\": PP.TrackedHandJointTypeIndex[jointTypeKey],\r\n \"_myJointMesh\": this._myJointMesh,\r\n \"_myJointMaterial\": this._myJointMaterial,\r\n });\r\n\r\n }\r\n }\r\n }\r\n});", "WL.registerComponent('pp-tracked-hand-draw-skin', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _myHandSkin: { type: WL.Type.Skin, default: null }\r\n}, {\r\n init: function () {\r\n this._myHandednessInternal = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n\r\n this._myTrackedHandPose = new PP.TrackedHandPose(this._myHandednessInternal);\r\n this._myTrackedHandPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myTrackedHandPose.start();\r\n\r\n this._prepareJoints();\r\n },\r\n update: function update(dt) {\r\n this._myTrackedHandPose.update(dt);\r\n\r\n for (let i = 0; i < this._myJoints.length; i++) {\r\n let jointObject = this._myJoints[i];\r\n\r\n let jointType = jointObject.name; // joint name must match the PP.TrackedHandJointType enum value\r\n let jointPose = this._myTrackedHandPose.getJointPose(jointType);\r\n\r\n jointObject.pp_setTransformLocalQuat(jointPose.getTransformQuat());\r\n }\r\n },\r\n _prepareJoints() {\r\n this._myJoints = [];\r\n\r\n let skinJointIDs = this._myHandSkin.jointIds;\r\n\r\n for (let i = 0; i < skinJointIDs.length; i++) {\r\n this._myJoints[i] = new WL.Object(skinJointIDs[i]);\r\n }\r\n }\r\n});", "PP.ButtonType = {\r\n SELECT: 0, // Trigger\r\n SQUEEZE: 1, // Grip\r\n TOUCHPAD: 2, // This is to support older gamepads, you can just use TOP_BUTTON to use this button for both older and newer gamepads\r\n THUMBSTICK: 3,\r\n BOTTOM_BUTTON: 4, // A or X button on oculus quest gamepad\r\n TOP_BUTTON: 5, // B or Y button on oculus quest gamepad, reverts to TOUCHPAD button for gamepads that does not support TOP_BUTTON\r\n THUMB_REST: 6\r\n};\r\n\r\nPP.ButtonEvent = {\r\n PRESS_START: 0,\r\n PRESS_END: 1,\r\n PRESSED: 2, //Every frame that it is pressed\r\n NOT_PRESSED: 3, //Every frame that it is not pressed\r\n TOUCH_START: 4,\r\n TOUCH_END: 5,\r\n TOUCHED: 6, //Every frame that it is touched\r\n NOT_TOUCHED: 7, //Every frame that it is not touched\r\n VALUE_CHANGED: 8,\r\n ALWAYS: 9, //Every frame\r\n};\r\n\r\nPP.AxesEvent = {\r\n X_CHANGED: 0,\r\n Y_CHANGED: 1,\r\n AXES_CHANGED: 2,\r\n ALWAYS: 3\r\n};\r\n\r\nPP.ButtonInfo = class ButtonInfo {\r\n constructor(type, handedness) {\r\n this.myType = type;\r\n this.myHandedness = handedness;\r\n\r\n this.myIsPressed = false;\r\n this.myPrevIsPressed = false;\r\n\r\n this.myIsTouched = false;\r\n this.myPrevIsTouched = false;\r\n\r\n this.myValue = 0.0;\r\n this.myPrevValue = 0.0;\r\n\r\n this.myTimePressed = 0;\r\n this.myPrevTimePressed = 0;\r\n\r\n this.myTimeNotPressed = 0;\r\n this.myPrevTimeNotPressed = 0;\r\n\r\n this.myTimeTouched = 0;\r\n this.myPrevTimeTouched = 0;\r\n\r\n this.myTimeNotTouched = 0;\r\n this.myPrevTimeNotTouched = 0;\r\n\r\n this.myMultiplePressStartCount = 0;\r\n this.myPrevMultiplePressStartCount = 0;\r\n this.myMultiplePressEndCount = 0;\r\n this.myPrevMultiplePressEndCount = 0;\r\n\r\n this.myMultipleTouchStartCount = 0;\r\n this.myPrevMultipleTouchStartCount = 0;\r\n this.myMultipleTouchEndCount = 0;\r\n this.myPrevMultipleTouchEndCount = 0;\r\n }\r\n\r\n getType() {\r\n return this.myType;\r\n }\r\n\r\n getHandedness() {\r\n return this.myHandedness;\r\n }\r\n\r\n getValue() {\r\n return this.myValue;\r\n }\r\n\r\n isPressed() {\r\n return this.myIsPressed;\r\n }\r\n\r\n isTouched() {\r\n return this.myIsTouched;\r\n }\r\n\r\n isPressStart(multiplePressCount = null) {\r\n return (this.myIsPressed && !this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressStartCount == multiplePressCount);\r\n }\r\n\r\n isPressEnd(multiplePressCount = null) {\r\n return (!this.myIsPressed && this.myPrevIsPressed) && (multiplePressCount == null || this.myMultiplePressEndCount == multiplePressCount);\r\n }\r\n\r\n isTouchStart(multipleTouchCount = null) {\r\n return (this.myIsTouched && !this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchStartCount == multipleTouchCount);\r\n }\r\n\r\n isTouchEnd(multipleTouchCount = null) {\r\n return (!this.myIsTouched && this.myPrevIsTouched) && (multipleTouchCount == null || this.myMultipleTouchEndCount == multipleTouchCount);\r\n }\r\n\r\n clone() {\r\n let value = new ButtonInfo(this.myType, this.myHandedness);\r\n value.myIsPressed = this.myIsPressed;\r\n value.myPrevIsPressed = this.myPrevIsPressed;\r\n value.myIsTouched = this.myIsTouched;\r\n value.myPrevIsTouched = this.myPrevIsTouched;\r\n value.myValue = this.myValue;\r\n value.myPrevValue = this.myPrevValue;\r\n\r\n value.myTimePressed = this.myTimePressed;\r\n value.myPrevTimePressed = this.myPrevTimePressed;\r\n value.myTimeNotPressed = this.myTimeNotPressed;\r\n value.myPrevTimeNotPressed = this.myPrevTimeNotPressed;\r\n\r\n value.myTimeTouched = this.myTimeTouched;\r\n value.myPrevTimeTouched = this.myPrevTimeTouched;\r\n value.myTimeNotTouched = this.myTimeNotTouched;\r\n value.myPrevTimeNotTouched = this.myPrevTimeNotTouched;\r\n\r\n value.myMultiplePressStartCount = this.myMultiplePressStartCount;\r\n value.myPrevMultiplePressStartCount = this.myPrevMultiplePressStartCount;\r\n value.myMultiplePressEndCount = this.myMultiplePressEndCount;\r\n value.myPrevMultiplePressEndCount = this.myPrevMultiplePressEndCount;\r\n\r\n value.myMultipleTouchStartCount = this.myMultipleTouchStartCount;\r\n value.myPrevMultipleTouchStartCount = this.myPrevMultipleTouchStartCount;\r\n value.myMultipleTouchEndCount = this.myMultipleTouchEndCount;\r\n value.myPrevMultipleTouchEndCount = this.myPrevMultipleTouchEndCount;\r\n\r\n return value;\r\n }\r\n};\r\n\r\nPP.AxesInfo = class AxesInfo {\r\n constructor(handedness) {\r\n this.myHandedness = handedness;\r\n\r\n this.myAxes = new Float32Array(2); // this.myAxes[0] is X, this.myAxes[1] is Y\r\n this.myAxes.fill(0.0);\r\n\r\n this.myPrevAxes = new Float32Array(2);\r\n this.myPrevAxes.fill(0.0);\r\n }\r\n\r\n getAxes() {\r\n return this.myAxes;\r\n }\r\n\r\n getHandedness() {\r\n return this.myHandedness;\r\n }\r\n\r\n clone() {\r\n let value = new AxesInfo(this.myHandedness);\r\n value.myAxes = this.myAxes;\r\n value.myPrevAxes = this.myPrevAxes;\r\n\r\n return value;\r\n }\r\n};\r\n\r\nPP.PulseInfo = class PulseInfo {\r\n constructor() {\r\n this.myIntensity = 0.0;\r\n this.myDuration = 0.0;\r\n\r\n this.myIsDevicePulsing = false; // true if the gamepad actually sent a request to pulse to the device\r\n }\r\n\r\n clone() {\r\n let value = new PulseInfo();\r\n value.myIntensity = this.myIntensity;\r\n value.myDuration = this.myDuration;\r\n value.myIsDevicePulsing = this.myIsDevicePulsing;\r\n\r\n return value;\r\n }\r\n};", "PP.BaseGamepad = class BaseGamepad {\r\n\r\n constructor(handedness) {\r\n this._myHandedness = handedness;\r\n\r\n this._myButtonInfos = [];\r\n for (let key in PP.ButtonType) {\r\n this._myButtonInfos[PP.ButtonType[key]] = new PP.ButtonInfo(PP.ButtonType[key], this._myHandedness);\r\n }\r\n\r\n this._myAxesInfo = new PP.AxesInfo(this._myHandedness);\r\n\r\n this._myButtonCallbacks = []; // Signature: callback(ButtonInfo, Gamepad)\r\n for (let typeKey in PP.ButtonType) {\r\n this._myButtonCallbacks[PP.ButtonType[typeKey]] = [];\r\n for (let eventKey in PP.ButtonEvent) {\r\n this._myButtonCallbacks[PP.ButtonType[typeKey]][PP.ButtonEvent[eventKey]] = new Map();\r\n }\r\n }\r\n\r\n this._myAxesCallbacks = []; // Signature: callback(AxesInfo, Gamepad)\r\n for (let eventKey in PP.AxesEvent) {\r\n this._myAxesCallbacks[PP.AxesEvent[eventKey]] = new Map();\r\n }\r\n\r\n this._myPulseInfo = new PP.PulseInfo();\r\n\r\n //Setup\r\n this._myMultiplePressMaxDelay = 0.3;\r\n this._myMultipleTouchMaxDelay = 0.3;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getButtonInfo(buttonType) {\r\n return this._myButtonInfos[buttonType];\r\n }\r\n\r\n registerButtonEventListener(buttonType, buttonEvent, id, callback) {\r\n this._myButtonCallbacks[buttonType][buttonEvent].set(id, callback);\r\n }\r\n\r\n unregisterButtonEventListener(buttonType, buttonEvent, id) {\r\n this._myButtonCallbacks[buttonType][buttonEvent].delete(id);\r\n }\r\n\r\n getAxesInfo() {\r\n return this._myAxesInfo;\r\n }\r\n\r\n registerAxesEventListener(axesEvent, id, callback) {\r\n this._myAxesCallbacks[axesEvent].set(id, callback);\r\n }\r\n\r\n unregisterAxesEventListener(axesEvent, id) {\r\n this._myAxesCallbacks[axesEvent].delete(id);\r\n }\r\n\r\n pulse(intensity, duration = 0) {\r\n this._myPulseInfo.myIntensity = Math.min(Math.max(intensity, 0), 1); // clamp \r\n this._myPulseInfo.myDuration = Math.max(duration, 0);\r\n }\r\n\r\n stopPulse() {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n\r\n isPulsing() {\r\n return this._myPulseInfo.myIntensity > 0 || this._myPulseInfo.myDuration > 0;\r\n }\r\n\r\n getPulseInfo() {\r\n return this._myPulseInfo;\r\n }\r\n\r\n getMultiplePressMaxDelay() {\r\n return this._myMultiplePressMaxDelay;\r\n }\r\n\r\n setMultiplePressMaxDelay(maxDelay) {\r\n this._myMultiplePressMaxDelay = maxDelay;\r\n }\r\n\r\n getMultipleTouchMaxDelay() {\r\n return this._myMultipleTouchMaxDelay;\r\n }\r\n\r\n setMultipleTouchMaxDelay(maxDelay) {\r\n this._myMultipleTouchMaxDelay = maxDelay;\r\n }\r\n\r\n // the following functions should be re-implemented in the actual class\r\n\r\n getHandPose() {\r\n return null;\r\n }\r\n\r\n isGamepadActive() {\r\n return true;\r\n }\r\n\r\n _start() {\r\n\r\n }\r\n\r\n _preUpdate(dt) {\r\n\r\n }\r\n\r\n _postUpdate(dt) {\r\n\r\n }\r\n\r\n _getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n return buttonData;\r\n }\r\n\r\n _getAxesData() {\r\n let axes = [0.0, 0.0];\r\n return axes;\r\n }\r\n\r\n _getHapticActuators() {\r\n let hapticActuator = [];\r\n return hapticActuator;\r\n }\r\n\r\n // the above functions should be re-implemented in the actual class\r\n\r\n start() {\r\n this._start();\r\n }\r\n\r\n update(dt) {\r\n this._preUpdate(dt);\r\n\r\n this._preUpdateButtonInfos();\r\n this._updateButtonInfos();\r\n this._postUpdateButtonInfos(dt);\r\n\r\n this._preUpdateAxesInfos();\r\n this._updateAxesInfos();\r\n this._postUpdateAxesInfos();\r\n\r\n this._updatePulse(dt);\r\n\r\n this._postUpdate(dt);\r\n }\r\n\r\n _preUpdateButtonInfos() {\r\n this._myButtonInfos.forEach(function (item) {\r\n item.myPrevIsPressed = item.myIsPressed;\r\n item.myPrevIsTouched = item.myIsTouched;\r\n item.myPrevValue = item.myValue;\r\n });\r\n }\r\n\r\n _updateButtonInfos() {\r\n this._updateSingleButtonInfo(PP.ButtonType.SELECT);\r\n this._updateSingleButtonInfo(PP.ButtonType.SQUEEZE);\r\n this._updateSingleButtonInfo(PP.ButtonType.TOUCHPAD);\r\n this._updateSingleButtonInfo(PP.ButtonType.THUMBSTICK);\r\n this._updateSingleButtonInfo(PP.ButtonType.BOTTOM_BUTTON);\r\n this._updateSingleButtonInfo(PP.ButtonType.TOP_BUTTON);\r\n this._updateSingleButtonInfo(PP.ButtonType.THUMB_REST);\r\n }\r\n\r\n _updateSingleButtonInfo(buttonType) {\r\n let button = this._myButtonInfos[buttonType];\r\n let buttonData = this._getButtonData(buttonType);\r\n\r\n button.myIsPressed = buttonData.myIsPressed;\r\n button.myIsTouched = buttonData.myIsTouched;\r\n button.myValue = buttonData.myValue;\r\n }\r\n\r\n _postUpdateButtonInfos(dt) {\r\n this._myButtonInfos.forEach(function (item) {\r\n if (item.myIsPressed) {\r\n item.myTimePressed += dt;\r\n if (!item.myPrevIsPressed) {\r\n item.myMultiplePressStartCount += 1;\r\n\r\n item.myPrevTimeNotPressed = item.myTimeNotPressed;\r\n item.myTimeNotPressed = 0;\r\n }\r\n\r\n if (item.myPrevTimeNotPressed + item.myTimePressed > this._myMultiplePressMaxDelay && item.myMultiplePressEndCount > 0) {\r\n item.myPrevMultiplePressEndCount = item.myMultiplePressEndCount;\r\n item.myMultiplePressEndCount = 0;\r\n }\r\n\r\n if (item.myTimePressed > this._myMultiplePressMaxDelay && item.myMultiplePressStartCount > 0) {\r\n item.myPrevMultiplePressStartCount = item.myMultiplePressStartCount;\r\n item.myMultiplePressStartCount = 0;\r\n }\r\n } else {\r\n item.myTimeNotPressed += dt;\r\n if (item.myPrevIsPressed) {\r\n item.myMultiplePressEndCount += 1;\r\n\r\n item.myPrevTimePressed = item.myTimePressed;\r\n item.myTimePressed = 0;\r\n }\r\n\r\n if (item.myPrevTimePressed + item.myTimeNotPressed > this._myMultiplePressMaxDelay && item.myMultiplePressStartCount > 0) {\r\n item.myPrevMultiplePressStartCount = item.myMultiplePressStartCount;\r\n item.myMultiplePressStartCount = 0;\r\n }\r\n\r\n if (item.myTimeNotPressed > this._myMultiplePressMaxDelay && item.myMultiplePressEndCount > 0) {\r\n item.myPrevMultiplePressEndCount = item.myMultiplePressEndCount;\r\n item.myMultiplePressEndCount = 0;\r\n }\r\n }\r\n\r\n if (item.myIsTouched) {\r\n item.myTimeTouched += dt;\r\n if (!item.myPrevIsTouched) {\r\n item.myMultipleTouchStartCount += 1;\r\n\r\n item.myPrevTimeNotTouched = item.myTimeNotTouched;\r\n item.myTimeNotTouched = 0;\r\n }\r\n\r\n if (item.myPrevTimeNotTouched + item.myTimeTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchEndCount > 0) {\r\n item.myPrevMultipleTouchEndCount = item.myMultipleTouchEndCount;\r\n item.myMultipleTouchEndCount = 0;\r\n }\r\n\r\n if (item.myTimeTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchStartCount > 0) {\r\n item.myPrevMultipleTouchStartCount = item.myMultipleTouchStartCount;\r\n item.myMultipleTouchStartCount = 0;\r\n }\r\n } else {\r\n item.myTimeNotTouched += dt;\r\n if (item.myPrevIsTouched) {\r\n item.myMultipleTouchEndCount += 1;\r\n\r\n item.myPrevTimeTouched = item.myTimeTouched;\r\n item.myTimeTouched = 0;\r\n }\r\n\r\n if (item.myPrevTimeTouched + item.myTimeNotTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchStartCount > 0) {\r\n item.myPrevMultipleTouchStartCount = item.myMultipleTouchStartCount;\r\n item.myMultipleTouchStartCount = 0;\r\n }\r\n\r\n if (item.myTimeNotTouched > this._myMultipleTouchMaxDelay && item.myMultipleTouchEndCount > 0) {\r\n item.myPrevMultipleTouchEndCount = item.myMultipleTouchEndCount;\r\n item.myMultipleTouchEndCount = 0;\r\n }\r\n }\r\n }.bind(this));\r\n\r\n for (let typeKey in PP.ButtonType) {\r\n let buttonInfo = this._myButtonInfos[PP.ButtonType[typeKey]];\r\n let buttonCallbacks = this._myButtonCallbacks[PP.ButtonType[typeKey]];\r\n\r\n //PRESSED\r\n if (buttonInfo.myIsPressed && !buttonInfo.myPrevIsPressed) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.PRESS_START];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (!buttonInfo.myIsPressed && buttonInfo.myPrevIsPressed) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.PRESS_END];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (buttonInfo.myIsPressed) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.PRESSED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n } else {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.NOT_PRESSED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n //TOUCHED\r\n if (buttonInfo.myIsTouched && !buttonInfo.myPrevIsTouched) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.TOUCH_START];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (!buttonInfo.myIsTouched && buttonInfo.myPrevIsTouched) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.TOUCH_END];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n if (buttonInfo.myIsTouched) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.TOUCHED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n } else {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.NOT_TOUCHED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n //VALUE\r\n if (buttonInfo.myValue != buttonInfo.myPrevValue) {\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.VALUE_CHANGED];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n //ALWAYS\r\n let callbacksMap = buttonCallbacks[PP.ButtonEvent.ALWAYS];\r\n this._triggerCallbacks(callbacksMap, buttonInfo);\r\n }\r\n\r\n this._mySelectStart = false;\r\n this._mySelectEnd = false;\r\n this._mySqueezeStart = false;\r\n this._mySqueezeEnd = false;\r\n }\r\n\r\n _preUpdateAxesInfos() {\r\n this._myAxesInfo.myPrevAxes = this._myAxesInfo.myAxes;\r\n }\r\n\r\n _updateAxesInfos() {\r\n this._myAxesInfo.myAxes = this._getAxesData();\r\n }\r\n\r\n _postUpdateAxesInfos() {\r\n //X CHANGED\r\n if (this._myAxesInfo.myAxes[0] != this._myAxesInfo.myPrevAxes[0]) {\r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.X_CHANGED];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n //Y CHANGED\r\n if (this._myAxesInfo.myAxes[1] != this._myAxesInfo.myPrevAxes[1]) {\r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.Y_CHANGED];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n //AXES CHANGED\r\n if (this._myAxesInfo.myAxes[0] != this._myAxesInfo.myPrevAxes[0] ||\r\n this._myAxesInfo.myAxes[1] != this._myAxesInfo.myPrevAxes[1]) {\r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.AXES_CHANGED];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n //ALWAYS \r\n let callbacksMap = this._myAxesCallbacks[PP.AxesEvent.ALWAYS];\r\n this._triggerCallbacks(callbacksMap, this._myAxesInfo);\r\n }\r\n\r\n _updatePulse(dt) {\r\n if (this._myPulseInfo.myIsDevicePulsing || this._myPulseInfo.myIntensity > 0) {\r\n let hapticActuators = this._getHapticActuators();\r\n if (hapticActuators.length > 0) {\r\n if (this._myPulseInfo.myIntensity > 0) {\r\n for (let hapticActuator of hapticActuators) {\r\n hapticActuator.pulse(this._myPulseInfo.myIntensity, 1000); // duration is managed by this class\r\n }\r\n this._myPulseInfo.myIsDevicePulsing = true;\r\n } else if (this._myPulseInfo.myIsDevicePulsing) {\r\n for (let hapticActuator of hapticActuators) {\r\n hapticActuator.reset();\r\n }\r\n this._myPulseInfo.myIsDevicePulsing = false;\r\n }\r\n } else {\r\n this._myPulseInfo.myIsDevicePulsing = false;\r\n }\r\n }\r\n\r\n this._myPulseInfo.myDuration -= dt;\r\n if (this._myPulseInfo.myDuration <= 0) {\r\n this._myPulseInfo.myIntensity = 0;\r\n this._myPulseInfo.myDuration = 0;\r\n }\r\n }\r\n\r\n _triggerCallbacks(callbacksMap, info) {\r\n for (let callback of callbacksMap.values()) {\r\n callback(info, this);\r\n }\r\n }\r\n};", "PP.UniversalGamepad = class UniversalGamepad extends PP.BaseGamepad {\r\n\r\n constructor(handedness) {\r\n super(handedness);\r\n\r\n this._myGamepadCores = new Map();\r\n\r\n this._myStarted = false;\r\n }\r\n\r\n addGamepadCore(id, gamepadCore) {\r\n if (gamepadCore.getHandedness() == this.getHandedness()) {\r\n this._myGamepadCores.set(id, gamepadCore);\r\n if (this._myStarted) {\r\n gamepadCore.start();\r\n }\r\n }\r\n }\r\n\r\n getGamepadCore(id) {\r\n this._myGamepadCores.get(id);\r\n }\r\n\r\n removeGamepadCore(id) {\r\n let gamepadCore = this._myGamepadCores.get(id);\r\n if (gamepadCore) {\r\n this._myGamepadCores.delete(id);\r\n }\r\n }\r\n\r\n removeAllGamepadCores() {\r\n for (let id of this._myGamepadCores.keys()) {\r\n this.removeGamepadCore(id);\r\n }\r\n }\r\n\r\n getHandPose() {\r\n let handPose = null;\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n handPose = core.getHandPose();\r\n }\r\n\r\n if (handPose != null) {\r\n break;\r\n }\r\n }\r\n\r\n return handPose;\r\n }\r\n\r\n isGamepadActive() {\r\n let isActive = false;\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n isActive = true;\r\n break;\r\n }\r\n }\r\n\r\n return isActive;\r\n }\r\n\r\n _start() {\r\n for (let core of this._myGamepadCores.values()) {\r\n core.start();\r\n }\r\n\r\n this._myStarted = true;\r\n }\r\n\r\n _preUpdate(dt) {\r\n for (let core of this._myGamepadCores.values()) {\r\n core.preUpdate(dt);\r\n }\r\n }\r\n\r\n _postUpdate(dt) {\r\n for (let core of this._myGamepadCores.values()) {\r\n core.postUpdate(dt);\r\n }\r\n }\r\n\r\n _getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n let coreButtonData = core.getButtonData(buttonType);\r\n buttonData.myIsPressed = buttonData.myIsPressed || coreButtonData.myIsPressed;\r\n buttonData.myIsTouched = buttonData.myIsTouched || coreButtonData.myIsTouched;\r\n if (Math.abs(coreButtonData.myValue) > Math.abs(buttonData.myValue)) {\r\n buttonData.myValue = coreButtonData.myValue;\r\n }\r\n }\r\n }\r\n\r\n return buttonData;\r\n }\r\n\r\n _getAxesData() {\r\n let axesData = [0.0, 0.0];\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n let coreAxesData = core.getAxesData();\r\n\r\n if (Math.abs(coreAxesData[0]) > Math.abs(axesData[0])) {\r\n axesData[0] = coreAxesData[0];\r\n }\r\n\r\n if (Math.abs(coreAxesData[1]) > Math.abs(axesData[1])) {\r\n axesData[1] = coreAxesData[1];\r\n }\r\n }\r\n }\r\n\r\n return axesData;\r\n }\r\n\r\n _getHapticActuators() {\r\n let hapticActuators = [];\r\n\r\n for (let core of this._myGamepadCores.values()) {\r\n if (core.isGamepadCoreActive()) {\r\n hapticActuators.push(...core.getHapticActuators());\r\n }\r\n }\r\n\r\n return hapticActuators;\r\n }\r\n};", "PP.GamepadCore = class GamepadCore {\r\n\r\n constructor(handedness) {\r\n this._myHandedness = handedness;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getHandPose() {\r\n return null;\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return true;\r\n }\r\n\r\n start() {\r\n\r\n }\r\n\r\n preUpdate(dt) {\r\n\r\n }\r\n\r\n postUpdate(dt) {\r\n\r\n }\r\n\r\n getButtonData(buttonType) {\r\n let buttonData = { pressed: false, touched: false, value: 0 };\r\n return buttonData;\r\n }\r\n\r\n getAxesData() {\r\n let axesData = [0.0, 0.0];\r\n return axesData;\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n return hapticActuators;\r\n }\r\n};", "// xr-standard mapping is assumed\r\nPP.XRGamepadCore = class XRGamepadCore extends PP.GamepadCore {\r\n\r\n constructor(handedness, handPoseParams = new PP.HandPoseParams()) {\r\n super(handedness);\r\n\r\n this._myHandPose = new PP.HandPose(this._myHandedness, handPoseParams);\r\n\r\n this._mySelectPressed = false;\r\n this._mySqueezePressed = false;\r\n\r\n this._myIsXRSessionActive = false;\r\n this._myInputSource = null;\r\n this._myGamepad = null;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getHandPose() {\r\n return this._myHandPose;\r\n }\r\n\r\n isGamepadCoreActive() {\r\n //connected == null is to fix webxr emulator that leaves that field undefined\r\n return this._myIsXRSessionActive && this._myGamepad != null && (this._myGamepad.connected == null || this._myGamepad.connected);\r\n }\r\n\r\n start() {\r\n this._myHandPose.start();\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n }\r\n\r\n preUpdate(dt) {\r\n this._updateHandPose(dt);\r\n }\r\n\r\n getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (buttonType < this._myGamepad.buttons.length) {\r\n let gamepadButton = this._myGamepad.buttons[buttonType];\r\n\r\n if (buttonType != PP.ButtonType.SELECT && buttonType != PP.ButtonType.SQUEEZE) {\r\n buttonData.myIsPressed = gamepadButton.pressed;\r\n } else {\r\n buttonData.myIsPressed = this._getSpecialButtonPressed(buttonType);\r\n }\r\n\r\n buttonData.myIsTouched = gamepadButton.touched;\r\n buttonData.myValue = gamepadButton.value;\r\n } else if (buttonType == PP.ButtonType.TOP_BUTTON && this._myGamepad.buttons.length >= 3) {\r\n //This way if you are using a basic touch gamepad, top button will work anyway\r\n let touchButton = this._myGamepad.buttons[2];\r\n buttonData.myIsPressed = touchButton.pressed;\r\n buttonData.myIsTouched = touchButton.touched;\r\n buttonData.myValue = touchButton.value;\r\n }\r\n }\r\n\r\n return buttonData;\r\n }\r\n\r\n getAxesData() {\r\n let axes = [0.0, 0.0];\r\n\r\n if (this.isGamepadCoreActive()) {\r\n let internalAxes = this._myGamepad.axes;\r\n if (internalAxes.length == 4) {\r\n //in this case it could be both touch axes or thumbstick axes, that depends on the gamepad\r\n //to support both I simply choose the absolute max value (unused axes will always be 0)\r\n\r\n //X\r\n if (Math.abs(internalAxes[0]) > Math.abs(internalAxes[2])) {\r\n axes[0] = internalAxes[0];\r\n } else {\r\n axes[0] = internalAxes[2];\r\n }\r\n\r\n //Y\r\n if (Math.abs(internalAxes[1]) > Math.abs(internalAxes[3])) {\r\n axes[1] = internalAxes[1];\r\n } else {\r\n axes[1] = internalAxes[3];\r\n }\r\n\r\n } else if (internalAxes.length == 2) {\r\n axes[0] = internalAxes[0];\r\n axes[1] = internalAxes[1];\r\n }\r\n\r\n //y axis is recorder negative when thumbstick is pressed forward for weird reasons\r\n axes[1] = -axes[1];\r\n }\r\n\r\n return axes;\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this._myGamepad.hapticActuators && this._myGamepad.hapticActuators.length > 0) {\r\n hapticActuators = this._myGamepad.hapticActuators;\r\n } else if (this._myGamepad.vibrationActuator) {\r\n hapticActuators.push(this._myGamepad.vibrationActuator);\r\n }\r\n }\r\n\r\n return hapticActuators;\r\n }\r\n\r\n _updateHandPose(dt) {\r\n this._myHandPose.update(dt);\r\n\r\n this._myInputSource = this._myHandPose.getInputSource();\r\n if (this._myInputSource != null) {\r\n this._myGamepad = this._myInputSource.gamepad;\r\n } else {\r\n this._myGamepad = null;\r\n }\r\n }\r\n\r\n //This is to be more compatible\r\n _getSpecialButtonPressed(buttonType) {\r\n let isPressed = false;\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (buttonType == PP.ButtonType.SELECT) {\r\n isPressed = this._mySelectPressed;\r\n } else if (buttonType == PP.ButtonType.SQUEEZE) {\r\n isPressed = this._mySqueezePressed;\r\n }\r\n }\r\n\r\n return isPressed;\r\n }\r\n\r\n _onXRSessionStart(session) {\r\n session.addEventListener(\"selectstart\", this._selectStart.bind(this));\r\n session.addEventListener(\"selectend\", this._selectEnd.bind(this));\r\n\r\n session.addEventListener(\"squeezestart\", this._squeezeStart.bind(this));\r\n session.addEventListener(\"squeezeend\", this._squeezeEnd.bind(this));\r\n\r\n this._myIsXRSessionActive = true;\r\n }\r\n\r\n _onXRSessionEnd(session) {\r\n this._myIsXRSessionActive = false;\r\n }\r\n\r\n //Select and Squeeze are managed this way to be more compatible\r\n _selectStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = true;\r\n }\r\n }\r\n\r\n _selectEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySelectPressed = false;\r\n }\r\n }\r\n\r\n _squeezeStart(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = true;\r\n }\r\n }\r\n\r\n _squeezeEnd(event) {\r\n if (this._myInputSource != null && this._myInputSource == event.inputSource) {\r\n this._mySqueezePressed = false;\r\n }\r\n }\r\n};", "// xr-standard mapping is assumed\r\nPP.KeyboardGamepadCore = class KeyboardGamepadCore extends PP.GamepadCore {\r\n\r\n constructor(handedness, handPose) {\r\n super(handedness);\r\n\r\n this._myHandPose = handPose; // can be null for keyboard\r\n this._myHandPoseUpdateActive = false;\r\n }\r\n\r\n getHandedness() {\r\n return this._myHandedness;\r\n }\r\n\r\n getHandPose() {\r\n return this._myHandPose;\r\n }\r\n\r\n setHandPoseUpdateActive(active) {\r\n this._myHandPoseUpdateActive = active;\r\n }\r\n\r\n isHandPoseUpdateActive() {\r\n return this._myHandPoseUpdateActive;\r\n }\r\n\r\n isGamepadCoreActive() {\r\n return true;\r\n }\r\n\r\n start() {\r\n if (this._myHandPose && this._myHandPoseUpdateActive) {\r\n this._myHandPose.start();\r\n }\r\n }\r\n\r\n preUpdate(dt) {\r\n if (this._myHandPose && this._myHandPoseUpdateActive) {\r\n this._myHandPose.update(dt);\r\n }\r\n }\r\n\r\n getButtonData(buttonType) {\r\n let buttonData = { myIsPressed: false, myIsTouched: false, myValue: 0 };\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == PP.Handedness.LEFT) {\r\n switch (buttonType) {\r\n case PP.ButtonType.SELECT:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.C) || PP.myKeyboard.isKeyPressed(PP.KeyType.c);\r\n break;\r\n case PP.ButtonType.SQUEEZE:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.F) || PP.myKeyboard.isKeyPressed(PP.KeyType.f);\r\n break;\r\n case PP.ButtonType.TOUCHPAD:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.X) || PP.myKeyboard.isKeyPressed(PP.KeyType.x);\r\n break;\r\n case PP.ButtonType.THUMBSTICK:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.R) || PP.myKeyboard.isKeyPressed(PP.KeyType.r);\r\n break;\r\n case PP.ButtonType.BOTTOM_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.Q) || PP.myKeyboard.isKeyPressed(PP.KeyType.q);\r\n break;\r\n case PP.ButtonType.TOP_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.E) || PP.myKeyboard.isKeyPressed(PP.KeyType.e);\r\n break;\r\n case PP.ButtonType.THUMB_REST:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.V) || PP.myKeyboard.isKeyPressed(PP.KeyType.v);\r\n break;\r\n }\r\n } else {\r\n switch (buttonType) {\r\n case PP.ButtonType.SELECT:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.N) || PP.myKeyboard.isKeyPressed(PP.KeyType.n);\r\n break;\r\n case PP.ButtonType.SQUEEZE:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.H) || PP.myKeyboard.isKeyPressed(PP.KeyType.h);\r\n break;\r\n case PP.ButtonType.TOUCHPAD:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.M) || PP.myKeyboard.isKeyPressed(PP.KeyType.m);\r\n break;\r\n case PP.ButtonType.THUMBSTICK:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.Y) || PP.myKeyboard.isKeyPressed(PP.KeyType.y);\r\n break;\r\n case PP.ButtonType.BOTTOM_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.O) || PP.myKeyboard.isKeyPressed(PP.KeyType.o);\r\n break;\r\n case PP.ButtonType.TOP_BUTTON:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.U) || PP.myKeyboard.isKeyPressed(PP.KeyType.u);\r\n break;\r\n case PP.ButtonType.THUMB_REST:\r\n buttonData.myIsPressed = PP.myKeyboard.isKeyPressed(PP.KeyType.B) || PP.myKeyboard.isKeyPressed(PP.KeyType.b);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (buttonData.myIsPressed) {\r\n buttonData.myIsTouched = true;\r\n buttonData.myValue = 1;\r\n }\r\n\r\n return buttonData;\r\n }\r\n\r\n getAxesData() {\r\n let axes = [0.0, 0.0];\r\n\r\n if (this.isGamepadCoreActive()) {\r\n if (this.getHandedness() == PP.Handedness.LEFT) {\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.W) || PP.myKeyboard.isKeyPressed(PP.KeyType.w)) axes[1] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.S) || PP.myKeyboard.isKeyPressed(PP.KeyType.s)) axes[1] += -1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.D) || PP.myKeyboard.isKeyPressed(PP.KeyType.d)) axes[0] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.A) || PP.myKeyboard.isKeyPressed(PP.KeyType.a)) axes[0] += -1.0;\r\n } else {\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.I) || PP.myKeyboard.isKeyPressed(PP.KeyType.i) || PP.myKeyboard.isKeyPressed(PP.KeyType.UP)) axes[1] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.K) || PP.myKeyboard.isKeyPressed(PP.KeyType.k) || PP.myKeyboard.isKeyPressed(PP.KeyType.DOWN)) axes[1] += -1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.L) || PP.myKeyboard.isKeyPressed(PP.KeyType.l) || PP.myKeyboard.isKeyPressed(PP.KeyType.RIGHT)) axes[0] += 1.0;\r\n if (PP.myKeyboard.isKeyPressed(PP.KeyType.J) || PP.myKeyboard.isKeyPressed(PP.KeyType.j) || PP.myKeyboard.isKeyPressed(PP.KeyType.LEFT)) axes[0] += -1.0;\r\n }\r\n }\r\n\r\n return axes;\r\n }\r\n\r\n getHapticActuators() {\r\n let hapticActuators = [];\r\n return hapticActuators;\r\n }\r\n};", "WL.registerComponent('pp-gamepad-mesh-animator', {\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\n _mySelect: { type: WL.Type.Object, default: null },\n _mySqueeze: { type: WL.Type.Object, default: null },\n _myThumbstick: { type: WL.Type.Object, default: null },\n _myTopButton: { type: WL.Type.Object, default: null },\n _myBottomButton: { type: WL.Type.Object, default: null },\n _mySelectRotateAngle: { type: WL.Type.Float, default: 15 },\n _mySqueezeRotateAngle: { type: WL.Type.Float, default: 11 },\n _myThumbstickRotateAngle: { type: WL.Type.Float, default: 15 },\n _myThumbstickPressOffset: { type: WL.Type.Float, default: 0.000625 },\n _myTopButtonPressOffset: { type: WL.Type.Float, default: 0.0015 },\n _myBottomButtonPressOffset: { type: WL.Type.Float, default: 0.0015 },\n _myUsePressForSqueeze: { type: WL.Type.Bool, default: false },\n _mySqueezePressOffset: { type: WL.Type.Float, default: 0.0015 },\n}, {\n start: function () {\n let gamepad = null;\n if (this._myHandedness == 0) {\n gamepad = PP.myLeftGamepad; // @EDIT get gamepad LEFT here based on how you store it in your game\n } else {\n gamepad = PP.myRightGamepad; // @EDIT get gamepad RIGHT here based on how you store it in your game\n }\n\n if (this._mySelect != null) {\n this._mySelectOriginalRotation = this._mySelect.pp_getRotationLocalQuat();\n this._mySelectOriginalLeft = this._mySelect.pp_getLeftLocal();\n }\n\n if (this._mySqueeze != null) {\n this._mySqueezeOriginalPosition = this._mySqueeze.pp_getPositionLocal();\n this._mySqueezeOriginalRotation = this._mySqueeze.pp_getRotationLocalQuat();\n this._mySqueezeOriginalLeft = this._mySqueeze.pp_getLeftLocal();\n this._mySqueezeOriginalForward = this._mySqueeze.pp_getForwardLocal();\n }\n\n if (this._myThumbstick != null) {\n this._myThumbstickOriginalPosition = this._myThumbstick.pp_getPositionLocal();\n this._myThumbstickOriginalRotation = this._myThumbstick.pp_getRotationLocalQuat();\n this._myThumbstickOriginalLeft = this._myThumbstick.pp_getLeftLocal();\n this._myThumbstickOriginalUp = this._myThumbstick.pp_getUpLocal();\n this._myThumbstickOriginalForward = this._myThumbstick.pp_getForwardLocal();\n }\n\n if (this._myTopButton != null) {\n this._myTopButtonOriginalPosition = this._myTopButton.pp_getPositionLocal();\n this._myTopButtonOriginalUp = this._myTopButton.pp_getUpLocal();\n }\n\n if (this._myBottomButton != null) {\n this._myBottomButtonOriginalPosition = this._myBottomButton.pp_getPositionLocal();\n this._myBottomButtonOriginalUp = this._myBottomButton.pp_getUpLocal();\n }\n\n // PRESSED\n if (this._myThumbstick != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.THUMBSTICK, PP.ButtonEvent.PRESS_START, this, this._thumbstickPressedStart.bind(this));\n gamepad.registerButtonEventListener(PP.ButtonType.THUMBSTICK, PP.ButtonEvent.PRESS_END, this, this._thumbstickPressedEnd.bind(this));\n }\n\n if (this._myTopButton != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.TOP_BUTTON, PP.ButtonEvent.PRESS_START, this, this._topButtonPressedStart.bind(this));\n gamepad.registerButtonEventListener(PP.ButtonType.TOP_BUTTON, PP.ButtonEvent.PRESS_END, this, this._topButtonPressedEnd.bind(this));\n }\n\n if (this._myBottomButton != null) {\n\n gamepad.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON, PP.ButtonEvent.PRESS_START, this, this._bottomButtonPressedStart.bind(this));\n gamepad.registerButtonEventListener(PP.ButtonType.BOTTOM_BUTTON, PP.ButtonEvent.PRESS_END, this, this._bottomButtonPressedEnd.bind(this));\n }\n\n // VALUE CHANGED\n if (this._mySelect != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.SELECT, PP.ButtonEvent.VALUE_CHANGED, this, this._selectValueChanged.bind(this));\n }\n\n if (this._mySqueeze != null) {\n gamepad.registerButtonEventListener(PP.ButtonType.SQUEEZE, PP.ButtonEvent.VALUE_CHANGED, this, this._squeezeValueChanged.bind(this));\n }\n\n // AXES CHANGED\n if (this._myThumbstick != null) {\n gamepad.registerAxesEventListener(PP.AxesEvent.AXES_CHANGED, this, this._thumbstickValueChanged.bind(this));\n }\n },\n _thumbstickPressedStart: function () {\n let upTranslation = PP.vec3_create();\n return function _thumbstickPressedStart(buttonInfo, gamepad) {\n // since thumbstick object rotate you need to specifically use its original up to translate it\n this._myThumbstickOriginalUp.vec3_scale(-this._myThumbstickPressOffset, upTranslation);\n this._myThumbstick.pp_translateLocal(upTranslation);\n };\n }(),\n _thumbstickPressedEnd: function _thumbstickPressedEnd(buttonInfo, gamepad) {\n this._myThumbstick.pp_setPositionLocal(this._myThumbstickOriginalPosition);\n },\n _topButtonPressedStart: function (buttonInfo, gamepad) {\n this._myTopButton.pp_translateAxisLocal(-this._myTopButtonPressOffset, this._myTopButtonOriginalUp);\n },\n _topButtonPressedEnd: function (buttonInfo, gamepad) {\n this._myTopButton.pp_setPositionLocal(this._myTopButtonOriginalPosition);\n },\n _bottomButtonPressedStart: function (buttonInfo, gamepad) {\n this._myBottomButton.pp_translateAxisLocal(-this._myBottomButtonPressOffset, this._myBottomButtonOriginalUp);\n },\n _bottomButtonPressedEnd: function (buttonInfo, gamepad) {\n this._myBottomButton.pp_setPositionLocal(this._myBottomButtonOriginalPosition);\n },\n _selectValueChanged: function (buttonInfo, gamepad) {\n this._mySelect.pp_setRotationLocalQuat(this._mySelectOriginalRotation);\n\n if (buttonInfo.myValue > 0.00001) {\n this._mySelect.pp_rotateAxisLocal(this._mySelectRotateAngle * buttonInfo.myValue, this._mySelectOriginalLeft);\n }\n },\n _squeezeValueChanged: function (buttonInfo, gamepad) {\n this._mySqueeze.pp_setPositionLocal(this._mySqueezeOriginalPosition);\n this._mySqueeze.pp_setRotationLocalQuat(this._mySqueezeOriginalRotation);\n\n if (buttonInfo.myValue > 0.00001) {\n if (this._myUsePressForSqueeze) {\n let translation = this._mySqueezePressOffset;\n if (this._myHandedness == 1) {\n translation *= -1;\n }\n\n this._mySqueeze.pp_translateAxisLocal(translation * buttonInfo.myValue, this._mySqueezeOriginalLeft);\n } else {\n let rotation = -this._mySqueezeRotateAngle;\n if (this._myHandedness == 1) {\n rotation *= -1;\n }\n\n this._mySqueeze.pp_rotateAxisLocal(rotation * buttonInfo.myValue, this._mySqueezeOriginalForward);\n }\n }\n },\n _thumbstickValueChanged: function (axesInfo, gamepad) {\n this._myThumbstick.pp_setRotationLocalQuat(this._myThumbstickOriginalRotation);\n\n let leftRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[1];\n let forwardRotation = this._myThumbstickRotateAngle * axesInfo.myAxes[0];\n\n if (Math.abs(leftRotation) > 0.0001) {\n this._myThumbstick.pp_rotateAxisLocal(leftRotation, this._myThumbstickOriginalLeft);\n }\n\n if (Math.abs(forwardRotation) > 0.0001) {\n this._myThumbstick.pp_rotateAxisLocal(forwardRotation, this._myThumbstickOriginalForward);\n }\n }\n});", "PP.GamepadManager = class GamepadManager {\r\n constructor() {\r\n this._myLeftGamepad = new PP.UniversalGamepad(PP.Handedness.LEFT);\r\n this._myRightGamepad = new PP.UniversalGamepad(PP.Handedness.RIGHT);\r\n }\r\n\r\n start() {\r\n this._myLeftGamepad.start();\r\n this._myRightGamepad.start();\r\n }\r\n\r\n update(dt) {\r\n this._myLeftGamepad.update(dt);\r\n this._myRightGamepad.update(dt);\r\n }\r\n\r\n getLeftGamepad() {\r\n return this._myLeftGamepad;\r\n }\r\n\r\n getRightGamepad() {\r\n return this._myRightGamepad;\r\n }\r\n\r\n getGamepad(handedness) {\r\n let gamepad = null;\r\n\r\n switch (handedness) {\r\n case PP.Handedness.LEFT:\r\n gamepad = this._myLeftGamepad;\r\n break;\r\n case PP.Handedness.RIGHT:\r\n gamepad = this._myRightGamepad;\r\n break;\r\n default:\r\n gamepad = null;\r\n }\r\n\r\n return gamepad;\r\n }\r\n\r\n getGamepads() {\r\n let gamepads = [];\r\n\r\n gamepads[PP.Handedness.LEFT] = this._myLeftGamepad;\r\n gamepads[PP.Handedness.RIGHT] = this._myRightGamepad;\r\n\r\n return gamepads;\r\n }\r\n};", "PP.GamepadUtils = {\r\n _mySimultaneousPressMaxDelay: 0.15,\r\n _mySimultaneousTouchMaxDelay: 0.15,\r\n setSimultaneousPressMaxDelay: function (simultaneousPressMaxDelay) {\r\n PP.GamepadUtils._mySimultaneousPressMaxDelay = simultaneousPressMaxDelay;\r\n },\r\n setSimultaneousTouchMaxDelay: function (simultaneousTouchMaxDelay) {\r\n PP.GamepadUtils._mySimultaneousTouchMaxDelay = simultaneousTouchMaxDelay;\r\n },\r\n getSimultaneousPressMaxDelay: function () {\r\n return PP.GamepadUtils._mySimultaneousPressMaxDelay;\r\n },\r\n getSimultaneousTouchMaxDelay: function () {\r\n return PP.GamepadUtils._mySimultaneousTouchMaxDelay;\r\n },\r\n\r\n // gamepadButtonTypesList is a sequence of a gamepads and a list of buttonTypes like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n // if the first parameter is a number it's used as multiplePressCount\r\n // if the buttonTypes list is empty for a given gamepad, it means that every button will be included\r\n isAnyButtonPressStart: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOnePressStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n isOnePressStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOnePressStart) {\r\n break;\r\n }\r\n }\r\n\r\n return isOnePressStart;\r\n },\r\n // gamepadButtonTypesList is a sequence of a gamepads and a list of buttonTypes like this ([gamepad1, squeeze, top, select], [gamepad2, bottom, squeeze, select], ...)\r\n // if the first parameter is a number it's used as multiplePressCount\r\n // if the buttonTypes list is empty for a given gamepad, it means that every button will be included\r\n areButtonsPressStart: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonPressedRecently = true;\r\n let isOnePressStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(button.myIsPressed && (multiplePressCount == null || button.myMultiplePressStartCount == multiplePressCount) && button.myTimePressed < PP.GamepadUtils._mySimultaneousPressMaxDelay)) {\r\n areButtonPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressStart(multiplePressCount)) {\r\n isOnePressStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonPressedRecently && isOnePressStart;\r\n },\r\n isAnyButtonPressEnd: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOnePressEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n isOnePressEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOnePressEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return isOnePressEnd;\r\n },\r\n areButtonsPressEnd: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotPressedRecently = true;\r\n let isOnePressEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(!button.myIsPressed && (multiplePressCount == null || button.myMultiplePressEndCount == multiplePressCount) && button.myTimeNotPressed < PP.GamepadUtils._mySimultaneousPressMaxDelay)) {\r\n areButtonNotPressedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isPressEnd(multiplePressCount)) {\r\n isOnePressEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotPressedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotPressedRecently && isOnePressEnd;\r\n },\r\n isAnyButtonTouchStart: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOneTouchStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isTouchStart(multiplePressCount)) {\r\n isOneTouchStart = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOneTouchStart) {\r\n break;\r\n }\r\n }\r\n\r\n return isOneTouchStart;\r\n },\r\n areButtonsTouchStart: function (...gamepadButtonTypesList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multipleTouchCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonTouchedRecently = true;\r\n let isOneTouchStart = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(button.myIsTouched && (multipleTouchCount == null || button.myMultipleTouchStartCount == multipleTouchCount) && button.myTimeTouched < PP.GamepadUtils._mySimultaneousTouchMaxDelay)) {\r\n areButtonTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchStart(multipleTouchCount)) {\r\n isOneTouchStart = true;\r\n }\r\n }\r\n\r\n if (!areButtonTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonTouchedRecently && isOneTouchStart;\r\n },\r\n isAnyButtonTouchEnd: function (...gamepadButtonTypesList) {\r\n let multiplePressCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multiplePressCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let isOneTouchEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (button.isTouchEnd(multiplePressCount)) {\r\n isOneTouchEnd = true;\r\n break;\r\n }\r\n }\r\n\r\n if (isOneTouchEnd) {\r\n break;\r\n }\r\n }\r\n\r\n return isOneTouchEnd;\r\n },\r\n areButtonsTouchEnd: function (...gamepadButtonTypesList) {\r\n let multipleTouchCount = null;\r\n let realGamepadButtonTypesList = gamepadButtonTypesList;\r\n if (!isNaN(gamepadButtonTypesList[0])) {\r\n multipleTouchCount = gamepadButtonTypesList[0];\r\n realGamepadButtonTypesList = gamepadButtonTypesList.slice(1);\r\n }\r\n\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n if (gamepadButtonTypes.length == 1) {\r\n for (let key in PP.ButtonType) {\r\n gamepadButtonTypes.push(PP.ButtonType[key]);\r\n }\r\n }\r\n }\r\n\r\n let areButtonNotTouchedRecently = true;\r\n let isOneTouchEnd = false;\r\n for (let gamepadButtonTypes of realGamepadButtonTypesList) {\r\n let gamepad = gamepadButtonTypes[0];\r\n for (let i = 1; i < gamepadButtonTypes.length; i++) {\r\n let buttonType = gamepadButtonTypes[i];\r\n let button = gamepad.getButtonInfo(buttonType);\r\n\r\n if (!(!button.myIsTouched && (multipleTouchCount == null || button.myMultipleTouchEndCount == multipleTouchCount) && button.myTimeNotTouched < PP.GamepadUtils._mySimultaneousTouchMaxDelay)) {\r\n areButtonNotTouchedRecently = false;\r\n break;\r\n }\r\n\r\n if (button.isTouchEnd(multipleTouchCount)) {\r\n isOneTouchEnd = true;\r\n }\r\n }\r\n\r\n if (!areButtonNotTouchedRecently) {\r\n break;\r\n }\r\n }\r\n\r\n return areButtonNotTouchedRecently && isOneTouchEnd;\r\n },\r\n};", "WL.registerComponent('pp-gamepad-control-scheme', {\r\n _myShowOnStart: { type: WL.Type.Bool, default: true },\r\n\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n\r\n _mySelectText: { type: WL.Type.String, default: \"\" },\r\n _mySqueezeText: { type: WL.Type.String, default: \"\" },\r\n _myThumbstickText: { type: WL.Type.String, default: \"\" },\r\n _myBottomButtonText: { type: WL.Type.String, default: \"\" },\r\n _myTopButtonText: { type: WL.Type.String, default: \"\" },\r\n\r\n _mySelect: { type: WL.Type.Object, default: null },\r\n _mySqueeze: { type: WL.Type.Object, default: null },\r\n _myThumbstick: { type: WL.Type.Object, default: null },\r\n _myBottomButton: { type: WL.Type.Object, default: null },\r\n _myTopButton: { type: WL.Type.Object, default: null },\r\n\r\n _myTextScaleMultiplier: { type: WL.Type.Float, default: 1 },\r\n _myTextOffsetMultiplier: { type: WL.Type.Float, default: 1 },\r\n _myLineLengthMultiplier: { type: WL.Type.Float, default: 1 },\r\n _myLineThicknessMultiplier: { type: WL.Type.Float, default: 1 },\r\n _myDistanceFromButtonsMultiplier: { type: WL.Type.Float, default: 1 },\r\n\r\n _myTextMaterial: { type: WL.Type.Material },\r\n _myLineMaterial: { type: WL.Type.Material }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myTextMaterialFinal = (this._myTextMaterial != null) ? this._myTextMaterial : PP.myDefaultResources.myMaterials.myText.clone();\r\n this._myLineMaterialFinal = (this._myLineMaterial != null) ? this._myLineMaterial : PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n\r\n this._myHandednessType = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myControlSchemeDirection = (this._myHandednessType == PP.Handedness.LEFT) ? 1 : -1;\r\n\r\n this._myVisible = false;\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._createControlScheme();\r\n this.setVisible(this._myShowOnStart);\r\n\r\n this._myVisibleBackup = this._myVisible;\r\n },\r\n update: function (dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this.setVisible(false);\r\n this.setVisible(this._myVisibleBackup);\r\n }\r\n },\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n },\r\n onDeactivate() {\r\n this._myVisibleBackup = this._myVisible;\r\n this.setVisible(false);\r\n },\r\n isVisible() {\r\n return this._myVisible;\r\n },\r\n setVisible(visible) {\r\n this._myVisible = visible;\r\n\r\n if (this._myRootObject != null) {\r\n this._myRootObject.pp_setActive(this._myVisible);\r\n\r\n if (this._myVisible) {\r\n this._hideEmptySchemes();\r\n }\r\n }\r\n },\r\n setSelectText(text) {\r\n this._mySelectText = text;\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setSqueezeText(text) {\r\n this._mySqueezeText = text;\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setThumbstickText(text) {\r\n this._myThumbstickText = text;\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setBottomButtonText(text) {\r\n this._myBottomButtonText = text;\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n this.setVisible(this._myVisible);\r\n },\r\n setTopButtonText(text) {\r\n this._myTopButtonText = text;\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n this.setVisible(this._myVisible);\r\n },\r\n _createControlScheme() {\r\n this._myRootObject = this.object.pp_addObject();\r\n\r\n let distanceFromButton = 0.02 * this._myDistanceFromButtonsMultiplier;\r\n let lineLength = 0.0935 * this._myLineLengthMultiplier;\r\n\r\n let referenceObject = this._myThumbstick;\r\n\r\n this._mySelectObject = this._myRootObject.pp_addObject();\r\n this._mySelectTextComponent = this._addScheme(this._mySelect, referenceObject,\r\n [0, 0, distanceFromButton],\r\n [lineLength * this._myControlSchemeDirection, 0, 0],\r\n this._mySelectObject);\r\n this._mySelectTextComponent.text = this._mySelectText;\r\n\r\n this._mySqueezeObject = this._myRootObject.pp_addObject();\r\n this._mySqueezeTextComponent = this._addScheme(this._mySqueeze, referenceObject,\r\n [distanceFromButton * this._myControlSchemeDirection, 0, 0],\r\n [lineLength * this._myControlSchemeDirection, 0, 0],\r\n this._mySqueezeObject);\r\n this._mySqueezeTextComponent.text = this._mySqueezeText;\r\n\r\n this._myThumbstickObject = this._myRootObject.pp_addObject();\r\n this._myThumbstickTextComponent = this._addScheme(this._myThumbstick, referenceObject,\r\n [0, distanceFromButton, 0],\r\n [-lineLength * this._myControlSchemeDirection, 0, 0],\r\n this._myThumbstickObject);\r\n this._myThumbstickTextComponent.text = this._myThumbstickText;\r\n\r\n let thumbstickPositionLocal = this._myThumbstick.pp_getPositionLocal();\r\n let thumbstickUpLocal = this._myThumbstick.pp_getUpLocal();\r\n\r\n {\r\n let bottomButtonPositionLocal = this._myBottomButton.pp_getPositionLocal();\r\n let difference = bottomButtonPositionLocal.vec3_sub(thumbstickPositionLocal);\r\n let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal);\r\n\r\n this._myBottomButtonObject = this._myRootObject.pp_addObject();\r\n this._myBottomButtonTextComponent = this._addScheme(this._myBottomButton, referenceObject,\r\n [0, distanceFromButton - differenceOnUp, 0],\r\n [0, 0, -lineLength],\r\n this._myBottomButtonObject);\r\n this._myBottomButtonTextComponent.text = this._myBottomButtonText;\r\n }\r\n\r\n {\r\n let topButtonPositionLocal = this._myTopButton.pp_getPositionLocal();\r\n let difference = topButtonPositionLocal.vec3_sub(thumbstickPositionLocal);\r\n let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal);\r\n\r\n this._myTopButtonObject = this._myRootObject.pp_addObject();\r\n this._myTopButtonTextComponent = this._addScheme(this._myTopButton, referenceObject,\r\n [0, distanceFromButton - differenceOnUp, 0],\r\n [-lineLength * this._myControlSchemeDirection, 0, 0].vec3_rotateAxis(-45 * this._myControlSchemeDirection, [0, 1, 0]),\r\n this._myTopButtonObject);\r\n this._myTopButtonTextComponent.text = this._myTopButtonText;\r\n }\r\n },\r\n _addScheme(buttonObject, referenceObject, startOffset, endOffset, parentObject) {\r\n let buttonPosition = buttonObject.pp_getPositionLocal();\r\n let referenceForward = referenceObject.pp_getForwardLocal();\r\n let referenceRight = referenceObject.pp_getRightLocal();\r\n let referenceUp = referenceObject.pp_getUpLocal();\r\n\r\n let lineStart = buttonPosition.vec3_add(referenceRight.vec3_scale(startOffset[0]));\r\n lineStart.vec3_add(referenceUp.vec3_scale(startOffset[1]), lineStart);\r\n lineStart.vec3_add(referenceForward.vec3_scale(startOffset[2]), lineStart);\r\n\r\n let lineEnd = lineStart.vec3_add(referenceRight.vec3_scale(endOffset[0]));\r\n lineEnd.vec3_add(referenceUp.vec3_scale(endOffset[1]), lineEnd);\r\n lineEnd.vec3_add(referenceForward.vec3_scale(endOffset[2]), lineEnd);\r\n\r\n let textOffset = 0.01 * this._myTextOffsetMultiplier;\r\n let textPosition = lineEnd.vec3_add(referenceForward.vec3_scale(-textOffset));\r\n\r\n this._addLine(lineStart, lineEnd, parentObject);\r\n let textComponent = this._addText(textPosition, referenceForward, referenceUp, parentObject);\r\n\r\n return textComponent;\r\n },\r\n _addLine(start, end, parentObject) {\r\n let lineDirection = end.vec3_sub(start);\r\n let length = lineDirection.vec3_length();\r\n lineDirection.vec3_normalize(lineDirection);\r\n\r\n lineRootObject = parentObject.pp_addObject();\r\n lineObject = lineRootObject.pp_addObject();\r\n\r\n let lineMesh = lineObject.addComponent('mesh');\r\n lineMesh.mesh = PP.myDefaultResources.myMeshes.myCylinder;\r\n lineMesh.material = this._myLineMaterialFinal;\r\n\r\n lineRootObject.pp_setPositionLocal(start);\r\n\r\n let thickness = 0.001 * this._myLineThicknessMultiplier;\r\n lineObject.pp_scaleObject([thickness / 2, length / 2, thickness / 2]);\r\n\r\n lineObject.pp_setUpLocal(lineDirection);\r\n lineObject.pp_translateObject([0, length / 2, 0]);\r\n },\r\n _addText(position, forward, up, parentObject) {\r\n let textObject = parentObject.pp_addObject();\r\n textObject.pp_setPositionLocal(position);\r\n textObject.pp_lookToLocal(up, forward);\r\n textObject.pp_scaleObject(0.0935 * this._myTextScaleMultiplier);\r\n\r\n let textComponent = textObject.pp_addComponent(\"text\");\r\n textComponent.alignment = WL.Alignment.Center;\r\n textComponent.justification = WL.Justification.Top;\r\n textComponent.material = this._myTextMaterialFinal;\r\n\r\n return textComponent;\r\n },\r\n _hideEmptySchemes() {\r\n if (this._mySelectText.length == 0) {\r\n this._mySelectObject.pp_setActive(false);\r\n }\r\n if (this._mySqueezeText.length == 0) {\r\n this._mySqueezeObject.pp_setActive(false);\r\n }\r\n if (this._myThumbstickText.length == 0) {\r\n this._myThumbstickObject.pp_setActive(false);\r\n }\r\n if (this._myBottomButtonText.length == 0) {\r\n this._myBottomButtonObject.pp_setActive(false);\r\n }\r\n if (this._myTopButtonText.length == 0) {\r\n this._myTopButtonObject.pp_setActive(false);\r\n }\r\n }\r\n});", "PP.BasePoseParams = class BasePoseParams {\r\n constructor() {\r\n this.myReferenceObject = null;\r\n this.myFixForward = true;\r\n this.myForceEmulatedVelocities = false;\r\n }\r\n};\r\n\r\n// BasePose transform is local by default (as if the parent/reference object was the identity transform)\r\n// you can use setReferenceObject if you want the BasePose to return the transform in world space \r\nPP.BasePose = class BasePose {\r\n\r\n constructor(basePoseParams = new PP.BasePoseParams()) {\r\n this._myFixForward = basePoseParams.myFixForward;\r\n this._myForceEmulatedVelocities = basePoseParams.myForceEmulatedVelocities;\r\n\r\n this._myReferenceSpace = null;\r\n this._myReferenceObject = basePoseParams.myReferenceObject;\r\n\r\n this._myPosition = [0, 0, 0];\r\n this._myRotation = [0, 0, 0, 1];\r\n\r\n this._myPrevPosition = [0, 0, 0];\r\n this._myPrevRotation = [0, 0, 0, 1];\r\n\r\n this._myLinearVelocity = [0, 0, 0];\r\n this._myAngularVelocity = [0, 0, 0]; // Radians\r\n\r\n this._myIsValid = false;\r\n this._myIsLinearVelocityEmulated = true;\r\n this._myIsAngularVelocityEmulated = true;\r\n }\r\n\r\n // if the reference object is set, the transform will be converted using it as a parent,\r\n // otherwise the transform will be local, as if the parent/reference object was the identity transform\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setFixForward(fixForward) {\r\n this._myFixForward = fixForward;\r\n }\r\n\r\n isFixForward() {\r\n return this._myFixForward;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n\r\n getReferenceSpace() {\r\n return this._myReferenceSpace;\r\n }\r\n\r\n getInputSource() {\r\n return this._myInputSource;\r\n }\r\n\r\n getPosition() {\r\n // implemented outside class definition\r\n }\r\n\r\n getRotation() {\r\n return this.getRotationDegrees();\r\n }\r\n\r\n getRotationDegrees() {\r\n return this.getRotationQuat().quat_toDegrees();\r\n\r\n }\r\n\r\n getRotationRadians() {\r\n return this.getRotationQuat().quat_toRadians();\r\n }\r\n\r\n getRotationQuat() {\r\n // implemented outside class definition\r\n }\r\n\r\n getTransform() {\r\n return this.getTransformMatrix();\r\n }\r\n\r\n getTransformMatrix() {\r\n // implemented outside class definition\r\n }\r\n\r\n getTransformQuat() {\r\n // implemented outside class definition\r\n }\r\n\r\n getLinearVelocity() {\r\n // implemented outside class definition\r\n }\r\n\r\n getAngularVelocity() {\r\n return this.getAngularVelocityDegrees();\r\n }\r\n\r\n getAngularVelocityDegrees() {\r\n // implemented outside class definition\r\n }\r\n\r\n getAngularVelocityRadians() {\r\n // implemented outside class definition\r\n }\r\n\r\n isValid() {\r\n return this._myIsValid;\r\n }\r\n\r\n isLinearVelocityEmulated() {\r\n return this._myIsLinearVelocityEmulated;\r\n }\r\n\r\n isAngularVelocityEmulated() {\r\n return this._myIsAngularVelocityEmulated;\r\n }\r\n\r\n start() {\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(true, WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this, false));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n }\r\n\r\n update(dt) {\r\n this._myPrevPosition.vec3_copy(this._myPosition);\r\n this._myPrevRotation.quat_copy(this._myRotation);\r\n\r\n let xrFrame = Module['webxr_frame'];\r\n if (xrFrame && this._isReadyToGetPose()) {\r\n let xrPose = null;\r\n try {\r\n xrPose = this._getPose(xrFrame);\r\n } catch (error) {\r\n // not handled, pose will be null\r\n }\r\n\r\n if (xrPose) {\r\n this._myPosition[0] = xrPose.transform.position.x;\r\n this._myPosition[1] = xrPose.transform.position.y;\r\n this._myPosition[2] = xrPose.transform.position.z;\r\n\r\n this._myRotation[0] = xrPose.transform.orientation.x;\r\n this._myRotation[1] = xrPose.transform.orientation.y;\r\n this._myRotation[2] = xrPose.transform.orientation.z;\r\n this._myRotation[3] = xrPose.transform.orientation.w;\r\n\r\n if (xrPose.linearVelocity && !this._myForceEmulatedVelocities) {\r\n this._myLinearVelocity[0] = xrPose.linearVelocity.x;\r\n this._myLinearVelocity[1] = xrPose.linearVelocity.y;\r\n this._myLinearVelocity[2] = xrPose.linearVelocity.z;\r\n\r\n this._myIsLinearVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedLinearVelocity(dt);\r\n\r\n this._myIsLinearVelocityEmulated = true;\r\n }\r\n\r\n if (xrPose.angularVelocity && !this._myForceEmulatedVelocities) {\r\n this._myAngularVelocity[0] = xrPose.angularVelocity.x;\r\n this._myAngularVelocity[1] = xrPose.angularVelocity.y;\r\n this._myAngularVelocity[2] = xrPose.angularVelocity.z;\r\n\r\n this._myIsAngularVelocityEmulated = false;\r\n } else {\r\n this._computeEmulatedAngularVelocity(dt);\r\n\r\n this._myIsAngularVelocityEmulated = true;\r\n }\r\n\r\n this._myIsValid = true;\r\n } else {\r\n // keep previous position and rotation but reset velocity because reasons\r\n\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocity[0] = 0;\r\n this._myAngularVelocity[1] = 0;\r\n this._myAngularVelocity[2] = 0;\r\n\r\n this._myIsValid = false;\r\n this._myIsLinearVelocityEmulated = true;\r\n this._myIsAngularVelocityEmulated = true;\r\n }\r\n\r\n this._updateHook(dt, xrPose);\r\n } else {\r\n // keep previous position and rotation but reset velocity because reasons\r\n\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n\r\n this._myAngularVelocity[0] = 0;\r\n this._myAngularVelocity[1] = 0;\r\n this._myAngularVelocity[2] = 0;\r\n\r\n this._myIsValid = false;\r\n this._myIsLinearVelocityEmulated = true;\r\n this._myIsAngularVelocityEmulated = true;\r\n\r\n this._updateHook(dt, null);\r\n }\r\n }\r\n\r\n // Hooks\r\n\r\n _isReadyToGetPose() {\r\n return true;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return null;\r\n }\r\n\r\n _updateHook(dt, xrPose) {\r\n }\r\n\r\n _onXRSessionStartHook(manualStart, session) {\r\n\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n\r\n }\r\n\r\n // Hooks end\r\n\r\n _computeEmulatedLinearVelocity(dt) {\r\n if (dt > 0) {\r\n this._myPosition.vec3_sub(this._myPrevPosition, this._myLinearVelocity);\r\n this._myLinearVelocity.vec3_scale(1 / dt, this._myLinearVelocity);\r\n } else {\r\n this._myLinearVelocity[0] = 0;\r\n this._myLinearVelocity[1] = 0;\r\n this._myLinearVelocity[2] = 0;\r\n }\r\n }\r\n\r\n _onXRSessionStart(manualStart, session) {\r\n session.requestReferenceSpace(WebXR.refSpace).then(function (referenceSpace) { this._myReferenceSpace = referenceSpace; }.bind(this));\r\n\r\n this._onXRSessionStartHook(manualStart, session);\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._onXRSessionEndHook();\r\n\r\n this._myReferenceSpace = null;\r\n }\r\n};\r\n\r\nPP.BasePose.prototype.getPosition = function () {\r\n let position = PP.vec3_create();\r\n let transform = PP.mat4_create();\r\n return function getPosition() {\r\n if (this._myReferenceObject == null) {\r\n return this._myPosition;\r\n }\r\n\r\n return this._myPosition.vec3_convertPositionToWorld(this._myReferenceObject.pp_getTransform(transform), position);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getRotationQuat = function () {\r\n let rotationQuat = PP.quat_create();\r\n let playerRotationQuat = PP.quat_create();\r\n let up = PP.vec3_create();\r\n return function getRotationQuat() {\r\n rotationQuat.quat_copy(this._myRotation);\r\n\r\n if (this._myFixForward) {\r\n rotationQuat.quat_rotateAxisRadians(Math.PI, rotationQuat.quat_getUp(up), rotationQuat);\r\n }\r\n\r\n if (this._myReferenceObject == null) {\r\n return rotationQuat;\r\n }\r\n\r\n return rotationQuat.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(playerRotationQuat), rotationQuat);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getTransformMatrix = function () {\r\n let transform = PP.mat4_create();\r\n return function getTransformMatrix() {\r\n return this.getTransformQuat().quat2_toMatrix(transform);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getTransformQuat = function () {\r\n let transformQuat = PP.quat2_create();\r\n let playerTransformQuat = PP.quat2_create();\r\n return function getTransformQuat() {\r\n transformQuat.quat2_setPositionRotationQuat(this._myPosition, this.getRotationQuat());\r\n\r\n if (this._myReferenceObject == null) {\r\n return transformQuat;\r\n }\r\n\r\n return transformQuat.quat_toWorld(this._myReferenceObject.pp_getTransformQuat(playerTransformQuat), transformQuat);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getLinearVelocity = function () {\r\n let position = PP.vec3_create();\r\n let transform = PP.mat4_create();\r\n return function getLinearVelocity() {\r\n if (this._myReferenceObject == null) {\r\n return this._myLinearVelocity;\r\n }\r\n\r\n return this._myLinearVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(transform), position);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getAngularVelocityDegrees = function () {\r\n let rotationDegrees = PP.vec3_create();\r\n return function getAngularVelocityDegrees() {\r\n this.getAngularVelocityRadians().vec3_toDegrees(rotationDegrees);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype.getAngularVelocityRadians = function () {\r\n let rotationRadians = PP.vec3_create();\r\n let transform = PP.mat4_create();\r\n return function getAngularVelocityRadians() {\r\n if (this._myReferenceObject == null) {\r\n return this._myAngularVelocity;\r\n }\r\n\r\n return this._myAngularVelocity.vec3_convertDirectionToWorld(this._myReferenceObject.pp_getTransform(transform), rotationRadians);\r\n };\r\n}();\r\n\r\nPP.BasePose.prototype._computeEmulatedAngularVelocity = function () {\r\n let rotationRadians = PP.vec3_create();\r\n let prevRotationRadians = PP.vec3_create();\r\n return function _computeEmulatedAngularVelocity(dt) {\r\n if (dt > 0) {\r\n rotationRadians = this._myRotation.quat_toRadians(rotationRadians);\r\n prevRotationRadians = this._myPrevRotation.quat_toRadians(prevRotationRadians);\r\n rotationRadians.vec3_sub(prevRotationRadians, this._myAngularVelocity);\r\n this._myAngularVelocity.vec3_scale(1 / dt, this._myAngularVelocity);\r\n } else {\r\n this._myAngularVelocity[0] = 0;\r\n this._myAngularVelocity[1] = 0;\r\n this._myAngularVelocity[2] = 0;\r\n }\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.BasePose.prototype, \"getPosition\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getRotationQuat\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getTransformMatrix\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getTransformQuat\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getLinearVelocity\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getAngularVelocityDegrees\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"getAngularVelocityRadians\", { enumerable: false });\r\nObject.defineProperty(PP.BasePose.prototype, \"_computeEmulatedAngularVelocity\", { enumerable: false });", "PP.HandPoseParams = class HandPoseParams extends PP.BasePoseParams {\r\n constructor() {\r\n super();\r\n\r\n this.myFixTrackedHandRotation = true;\r\n }\r\n};\r\n\r\nPP.HandPose = class HandPose extends PP.BasePose {\r\n\r\n constructor(handedness, handPoseParams = new PP.HandPoseParams()) {\r\n super(handPoseParams);\r\n\r\n this._myInputSource = null;\r\n\r\n this._myHandedness = handedness;\r\n this._myFixTrackedHandRotation = handPoseParams.myFixTrackedHandRotation;\r\n\r\n this._myIsTrackedHand = false;\r\n }\r\n\r\n getInputSourceType() {\r\n if (this._myInputSource == null) {\r\n return null;\r\n }\r\n\r\n return PP.InputUtils.getInputSourceType(this._myInputSource);\r\n }\r\n\r\n isFixTrackedHandRotation() {\r\n return this._myFixTrackedHandRotation;\r\n }\r\n\r\n setFixTrackedHandRotation(fixTrackedHandRotation) {\r\n this.myFixTrackedHandRotation = fixTrackedHandRotation;\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getPose(this._myInputSource.gripSpace, this._myReferenceSpace);\r\n }\r\n\r\n _onXRSessionStartHook(manualStart, session) {\r\n session.addEventListener('inputsourceschange', function (event) {\r\n if (event.removed) {\r\n for (let item of event.removed) {\r\n if (item == this._myInputSource) {\r\n this._myInputSource = null;\r\n }\r\n }\r\n }\r\n\r\n if (event.added) {\r\n for (let item of event.added) {\r\n if (item.handedness == this._myHandedness) {\r\n this._myInputSource = item;\r\n this._myIsTrackedHand = PP.InputUtils.getInputSourceType(this._myInputSource) == PP.InputSourceType.TRACKED_HAND;\r\n }\r\n }\r\n }\r\n }.bind(this));\r\n\r\n if (manualStart && this._myInputSource == null && session.inputSources) {\r\n for (let item of session.inputSources) {\r\n if (item.handedness == this._myHandedness) {\r\n this._myInputSource = item;\r\n this._myIsTrackedHand = PP.InputUtils.getInputSourceType(this._myInputSource) == PP.InputSourceType.TRACKED_HAND;\r\n }\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myInputSource = null;\r\n }\r\n};\r\n\r\nPP.HandPose.prototype.getRotationQuat = function () {\r\n let rotationQuat = PP.quat_create();\r\n let playerRotationQuat = PP.quat_create();\r\n let up = PP.vec3_create();\r\n let right = PP.vec3_create();\r\n let forward = PP.vec3_create();\r\n return function getRotationQuat() {\r\n rotationQuat.quat_copy(this._myRotation);\r\n\r\n if (this._myFixForward) {\r\n rotationQuat.quat_rotateAxisRadians(Math.PI, rotationQuat.quat_getUp(up), rotationQuat);\r\n }\r\n\r\n if (this._myFixTrackedHandRotation && this._myIsTrackedHand) {\r\n rotationQuat.quat_rotateAxis(-60, rotationQuat.quat_getRight(right), rotationQuat);\r\n\r\n let forwardRotation = 20;\r\n forwardRotation = (this._myHandedness == PP.Handedness.LEFT) ? forwardRotation : -forwardRotation;\r\n rotationQuat.quat_rotateAxis(forwardRotation, rotationQuat.quat_getForward(forward), rotationQuat);\r\n }\r\n\r\n if (this._myReferenceObject == null) {\r\n return rotationQuat;\r\n }\r\n\r\n return rotationQuat.quat_toWorld(this._myReferenceObject.pp_getRotationQuat(playerRotationQuat), rotationQuat);\r\n };\r\n}();\r\n\r\n\r\n\r\nObject.defineProperty(PP.HandPose.prototype, \"getRotationQuat\", { enumerable: false });", "PP.HeadPose = class HeadPose extends PP.BasePose {\r\n _getPose(xrFrame) {\r\n return xrFrame.getViewerPose(this._myReferenceSpace);\r\n }\r\n};", "PP.TrackedHandJointPose = class TrackedHandJointPose extends PP.BasePose {\r\n\r\n constructor(handedness, trackedHandJointType, basePoseParams = new PP.BasePoseParams()) {\r\n super(basePoseParams);\r\n\r\n this._myInputSource = null;\r\n\r\n this._myHandedness = handedness;\r\n this._myTrackedHandJointType = trackedHandJointType;\r\n\r\n this._myJointRadius = 0;\r\n }\r\n\r\n getTrackedHandJointType() {\r\n return this._myTrackedHandJointType;\r\n }\r\n\r\n setTrackedHandJointType(trackedHandJointType) {\r\n this._myTrackedHandJointType = trackedHandJointType;\r\n }\r\n\r\n getJointRadius() {\r\n return this._myJointRadius;\r\n }\r\n\r\n _isReadyToGetPose() {\r\n return this._myInputSource != null;\r\n }\r\n\r\n _getPose(xrFrame) {\r\n return xrFrame.getJointPose(this._myInputSource.hand.get(this._myTrackedHandJointType), this._myReferenceSpace);\r\n }\r\n\r\n _updateHook(dt, xrPose) {\r\n if (xrPose != null) {\r\n this._myJointRadius = xrPose.radius;\r\n }\r\n }\r\n\r\n _onXRSessionStartHook(manualStart, session) {\r\n session.addEventListener('inputsourceschange', function (event) {\r\n if (event.removed) {\r\n for (let item of event.removed) {\r\n if (item == this._myInputSource) {\r\n this._myInputSource = null;\r\n }\r\n }\r\n }\r\n\r\n if (event.added) {\r\n for (let item of event.added) {\r\n if (item.handedness == this._myHandedness) {\r\n if (PP.InputUtils.getInputSourceType(item) == PP.InputSourceType.TRACKED_HAND) {\r\n this._myInputSource = item;\r\n }\r\n }\r\n }\r\n }\r\n }.bind(this));\r\n\r\n if (manualStart && this._myInputSource == null && session.inputSources) {\r\n for (let item of session.inputSources) {\r\n if (item.handedness == this._myHandedness) {\r\n if (PP.InputUtils.getInputSourceType(item) == PP.InputSourceType.TRACKED_HAND) {\r\n this._myInputSource = item;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _onXRSessionEndHook() {\r\n this._myInputSource = null;\r\n }\r\n};", "PP.TrackedHandPoseParams = class TrackedHandPoseParams extends PP.BasePoseParams {\r\n constructor(addAllJointTypes = true) {\r\n super();\r\n\r\n this.myTrackedHandJointTypeList = [];\r\n\r\n if (addAllJointTypes) {\r\n for (let typeKey in PP.TrackedHandJointType) {\r\n this.myTrackedHandJointTypeList.push([PP.TrackedHandJointType[typeKey]]);\r\n }\r\n }\r\n }\r\n};\r\n\r\nPP.TrackedHandPose = class TrackedHandPose {\r\n constructor(handedness, trackedHandPoseParams = new PP.TrackedHandPoseParams()) {\r\n this._myHandedness = handedness;\r\n\r\n this._myFixForward = trackedHandPoseParams.myFixForward;\r\n this._myForceEmulatedVelocities = trackedHandPoseParams.myForceEmulatedVelocities;\r\n this._myReferenceObject = trackedHandPoseParams.myReferenceObject;\r\n\r\n this._myTrackedHandJointPoseParams = new PP.BasePoseParams();\r\n this._myTrackedHandJointPoseParams.myFixForward = this._myFixForward;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n\r\n this._myTrackedHandJointPoseList = [];\r\n for (let jointType of trackedHandPoseParams.myTrackedHandJointTypeList) {\r\n let trackedHandJointPose = new PP.TrackedHandJointPose(this._myHandedness, jointType, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoseList[jointType] = trackedHandJointPose;\r\n }\r\n }\r\n\r\n start() {\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.start();\r\n }\r\n }\r\n\r\n update(dt) {\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.update(dt);\r\n }\r\n }\r\n\r\n getJointPose(jointType) {\r\n return this._myTrackedHandJointPoseList[jointType];\r\n }\r\n\r\n getJointPoseByIndex(jointPoseTypeIndex) {\r\n return this._myTrackedHandJointPoseList[PP.InputUtils.getJointTypeByIndex(jointPoseTypeIndex)];\r\n }\r\n\r\n addTrackedHandJointType(jointType) {\r\n if (!this._myTrackedHandJointPoseList.pp_has(element => element.getTrackedHandJointType() == jointType)) {\r\n let trackedHandJointPose = new PP.TrackedHandJointPose(this._myHandedness, jointType, this._myTrackedHandJointPoseParams);\r\n this._myTrackedHandJointPoseList.push(trackedHandJointPose);\r\n }\r\n }\r\n\r\n removeTrackedHandJointType(jointType) {\r\n this._myTrackedHandJointPoseList.pp_remove(element => element.getTrackedHandJointType() == jointType);\r\n }\r\n\r\n setReferenceObject(referenceObject) {\r\n this._myReferenceObject = referenceObject;\r\n this._myTrackedHandJointPoseParams.myReferenceObject = this._myReferenceObject;\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.setReferenceObject(referenceObject);\r\n }\r\n }\r\n\r\n getReferenceObject() {\r\n return this._myReferenceObject;\r\n }\r\n\r\n setFixForward(fixForward) {\r\n this._myFixForward = fixForward;\r\n this._myTrackedHandJointPoseParams.myFixForward = this._myFixForward;\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.setFixForward(fixForward);\r\n }\r\n }\r\n\r\n isFixForward() {\r\n return this._myFixForward;\r\n }\r\n\r\n setForceEmulatedVelocities(forceEmulatedVelocities) {\r\n this._myForceEmulatedVelocities = forceEmulatedVelocities;\r\n this._myTrackedHandJointPoseParams.myForceEmulatedVelocities = this._myForceEmulatedVelocities;\r\n for (let jointPoseKey in this._myTrackedHandJointPoseList) {\r\n let jointPose = this._myTrackedHandJointPoseList[jointPoseKey];\r\n jointPose.setForceEmulatedVelocities(forceEmulatedVelocities);\r\n }\r\n }\r\n\r\n isForceEmulatedVelocities() {\r\n return this._myForceEmulatedVelocities;\r\n }\r\n};", "WL.registerComponent(\"pp-set-player-height\", {\r\n _myEyesHeight: { type: WL.Type.Float, default: 1.65 },\r\n _mySetOnlyOnStart: { type: WL.Type.Bool, default: false }\r\n}, {\r\n start() {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal([localPosition[0], this._myEyesHeight, localPosition[2]]);\r\n\r\n this._myHeightSetOnce = false;\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n },\r\n _onXRSessionStart() {\r\n if (this.active && (!this._mySetOnlyOnStart || !this._myHeightSetOnce)) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n if (PP.XRUtils.isReferenceSpaceLocalFloor()) {\r\n this.object.pp_setPositionLocal([localPosition[0], 0, localPosition[2]]);\r\n } else if (PP.XRUtils.isDeviceEmulated()) {\r\n this.object.pp_setPositionLocal([localPosition[0], 0, localPosition[2]]);\r\n } else {\r\n this.object.pp_setPositionLocal([localPosition[0], this._myEyesHeight, localPosition[2]]);\r\n }\r\n\r\n this._myHeightSetOnce = true;\r\n }\r\n },\r\n _onXRSessionEnd() {\r\n if (this.active && !this._mySetOnlyOnStart) {\r\n let localPosition = this.object.pp_getPositionLocal();\r\n this.object.pp_setPositionLocal([localPosition[0], this._myEyesHeight, localPosition[2]]);\r\n }\r\n }\r\n});", "WL.registerComponent('pp-set-hand-local-transform', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n this._myHandPose = new PP.HandPose(PP.InputUtils.getHandednessByIndex(this._myHandedness));\r\n this._myHandPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myHandPose.start();\r\n },\r\n update: function () {\r\n let handPoseTransform = PP.quat2_create();\r\n return function update(dt) {\r\n this._myHandPose.update(dt);\r\n this.object.pp_setTransformLocalQuat(this._myHandPose.getTransformQuat(handPoseTransform));\r\n };\r\n }(),\r\n});", "WL.registerComponent('pp-set-head-local-transform', {\r\n _myNonVRCamera: { type: WL.Type.Object },\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n this._myHeadPose = new PP.HeadPose();\r\n this._myHeadPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myHeadPose.start();\r\n },\r\n update: function () {\r\n let headPoseTransform = PP.quat2_create();\r\n let nonVRCameraRotation = PP.quat_create();\r\n let nonVRCameraUp = PP.vec3_create();\r\n let nonVRCameraPosition = PP.vec3_create();\r\n return function update(dt) {\r\n this._myHeadPose.update(dt);\r\n\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(headPoseTransform));\r\n } else {\r\n nonVRCameraRotation = this._myNonVRCamera.pp_getRotationLocalQuat(nonVRCameraRotation);\r\n if (this._myFixForward) {\r\n nonVRCameraRotation.quat_rotateAxisRadians(Math.PI, nonVRCameraRotation.quat_getUp(nonVRCameraUp), nonVRCameraRotation);\r\n }\r\n this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(nonVRCameraPosition));\r\n this.object.pp_setRotationLocalQuat(nonVRCameraRotation);\r\n }\r\n };\r\n }(),\r\n});", "WL.registerComponent('pp-set-vr-head-local-transform', {\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n this._myHeadPose = new PP.HeadPose();\r\n this._myHeadPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myHeadPose.start();\r\n },\r\n update: function () {\r\n let headPoseTransform = PP.quat2_create();\r\n return function update(dt) {\r\n this._myHeadPose.update(dt);\r\n this.object.pp_setTransformLocalQuat(this._myHeadPose.getTransformQuat(headPoseTransform));\r\n };\r\n }(),\r\n});", "WL.registerComponent('pp-set-non-vr-head-local-transform', {\r\n _myNonVRCamera: { type: WL.Type.Object },\r\n _myFixForward: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n },\r\n update: function (dt) {\r\n let nonVRCameraRotation = PP.quat_create();\r\n let nonVRCameraUp = PP.vec3_create();\r\n let nonVRCameraPosition = PP.vec3_create();\r\n return function update(dt) {\r\n nonVRCameraRotation = this._myNonVRCamera.pp_getRotationLocalQuat(nonVRCameraRotation);\r\n if (this._myFixForward) {\r\n nonVRCameraRotation.quat_rotateAxisRadians(Math.PI, nonVRCameraRotation.quat_getUp(nonVRCameraUp), nonVRCameraRotation);\r\n }\r\n this.object.pp_setPositionLocal(this._myNonVRCamera.pp_getPositionLocal(nonVRCameraPosition));\r\n this.object.pp_setRotationLocalQuat(nonVRCameraRotation);\r\n };\r\n }(),\r\n}); ", "WL.registerComponent('pp-set-tracked-hand-joint-local-transform', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myFixForward: { type: WL.Type.Bool, default: true },\r\n _mySetLocalScaleAsJointRadius: { type: WL.Type.Bool, default: false },\r\n _myJointType: {\r\n type: WL.Type.Enum, values:\r\n [\r\n 'Wrist',\r\n 'Thumb Metacarpal', 'Thumb Phalanx Proximal', 'Thumb Phalanx Distal', 'Thumb Tip',\r\n 'Index Metacarpal', 'Index Phalanx Proximal', 'Index Phalanx Intermediate', 'Index Phalanx Distal', 'Index Tip',\r\n 'Middle Metacarpal', 'Middle Phalanx Proximal', 'Middle Phalanx Intermediate', 'Middle Phalanx Distal', 'Middle Tip',\r\n 'Ring Metacarpal', 'Ring Phalanx Proximal', 'Ring Phalanx Intermediate', 'Ring Phalanx Distal', 'Ring Tip',\r\n 'Pinky Metacarpal', 'Pinky Phalanx Proximal', 'Pinky Phalanx Intermediate', 'Pinky Phalanx Distal', 'Pinky Tip'\r\n ],\r\n default: 'Wrist'\r\n }\r\n}, {\r\n init: function () {\r\n this._myHandednessInternal = PP.InputUtils.getHandednessByIndex(this._myHandedness);\r\n this._myJointTypeInternal = PP.InputUtils.getJointTypeByIndex(this._myJointType);\r\n\r\n this._myTrackedHandJointPose = new PP.TrackedHandJointPose(this._myHandednessInternal, this._myJointTypeInternal);\r\n this._myTrackedHandJointPose.setFixForward(this._myFixForward);\r\n },\r\n start: function () {\r\n this._myTrackedHandJointPose.start();\r\n },\r\n update: function (dt) {\r\n this._myTrackedHandJointPose.update(dt);\r\n\r\n this.object.pp_setTransformLocalQuat(this._myTrackedHandJointPose.getTransformQuat());\r\n\r\n if (this._mySetLocalScaleAsJointRadius) {\r\n this.object.pp_setScaleLocal(this._myTrackedHandJointPose.getJointRadius());\r\n }\r\n }\r\n});", "WL.registerComponent('pp-copy-hand-transform', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n}, {\r\n init: function () {\r\n this._myHandednessType = (this._myHandedness == 0) ? PP.Handedness.LEFT : PP.Handedness.RIGHT;\r\n },\r\n update: function (dt) {\r\n let hand = PP.myPlayerObjects.myHands[this._myHandednessType];\r\n this.object.pp_setTransformQuat(hand.pp_getTransformQuat());\r\n this.object.pp_setScale(hand.pp_getScale());\r\n },\r\n});", "WL.registerComponent('pp-copy-head-transform', {\r\n}, {\r\n update: function (dt) {\r\n let head = PP.myPlayerObjects.myHead;\r\n this.object.pp_setTransformQuat(head.pp_getTransformQuat());\r\n this.object.pp_setScale(head.pp_getScale());\r\n },\r\n});", "WL.registerComponent('pp-copy-player-transform', {\r\n}, {\r\n update: function (dt) {\r\n let player = PP.myPlayerObjects.myPlayer;\r\n this.object.pp_setTransformQuat(player.pp_getTransformQuat());\r\n this.object.pp_setScale(player.pp_getScale());\r\n },\r\n});", "WL.registerComponent('pp-copy-player-pivot-transform', {\r\n}, {\r\n update: function (dt) {\r\n let playerPivot = PP.myPlayerObjects.myPlayerPivot;\r\n this.object.pp_setTransformQuat(playerPivot.pp_getTransformQuat());\r\n this.object.pp_setScale(playerPivot.pp_getScale());\r\n },\r\n});", "\r\nPP.ToolHandedness = {\r\n NONE: null,\r\n LEFT: \"left\",\r\n RIGHT: \"right\",\r\n};\r\n\r\nPP.ToolInputSourceType = {\r\n NONE: null,\r\n GAMEPAD: 0,\r\n TRACKED_HAND: 1\r\n};", "WL.registerComponent('pp-tool-cursor', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' },\r\n _myPulseOnHover: { type: WL.Type.Bool, default: false },\r\n _myShowFingerCursor: { type: WL.Type.Bool, default: false }\r\n}, {\r\n init: function () {\r\n this._myHandednessString = ['left', 'right'][this._myHandedness];\r\n\r\n this._myCursorPosition = [0, -0.035, -0.05];\r\n this._myCursorRotation = [-30, 0, 0];\r\n this._myCursorMeshScale = [0.0025, 0.0025, 0.0025];\r\n this._myCursorColor = [255 / 255, 255 / 255, 255 / 255, 1];\r\n\r\n this._myCursorTargetCollisionGroup = 7;\r\n },\r\n start: function () {\r\n this._myFixForwardObject = WL.scene.addObject(this.object);\r\n this._myFixForwardObject.pp_rotateObject([0, 180, 0]);\r\n\r\n this._myCursorObjectVR = WL.scene.addObject(this._myFixForwardObject);\r\n this._myCursorObjectVR.pp_setPositionLocal(this._myCursorPosition);\r\n this._myCursorObjectVR.pp_rotateObject(this._myCursorRotation);\r\n\r\n {\r\n let cursorMeshObject = WL.scene.addObject(this._myCursorObjectVR);\r\n cursorMeshObject.pp_setScale(this._myCursorMeshScale);\r\n\r\n let cursorMeshComponent = cursorMeshObject.addComponent(\"mesh\");\r\n cursorMeshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\r\n cursorMeshComponent.material = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n cursorMeshComponent.material.color = this._myCursorColor;\r\n\r\n let cursorComponent = this._myCursorObjectVR.addComponent(\"cursor\", { \"collisionGroup\": this._myCursorTargetCollisionGroup, \"handedness\": this._myHandedness + 1, \"cursorObject\": cursorMeshObject });\r\n cursorComponent.rayCastMode = 0; //collision\r\n if (this._myPulseOnHover) {\r\n cursorComponent.globalTarget.addHoverFunction(this._pulseOnHover.bind(this));\r\n }\r\n }\r\n\r\n this._myCursorObjectNonVR = WL.scene.addObject(null);\r\n\r\n {\r\n let cursorComponent = this._myCursorObjectNonVR.addComponent(\"cursor\", { \"collisionGroup\": this._myCursorTargetCollisionGroup, \"handedness\": this._myHandedness + 1 });\r\n cursorComponent.rayCastMode = 0; //collision\r\n if (this._myPulseOnHover) {\r\n cursorComponent.globalTarget.addHoverFunction(this._pulseOnHover.bind(this));\r\n }\r\n cursorComponent.setViewComponent(PP.myPlayerObjects.myNonVRCamera.getComponent(\"view\"));\r\n }\r\n\r\n let fingerCursorObject = null;\r\n let fingerCollisionSize = 0.0125;\r\n\r\n if (this._myShowFingerCursor) {\r\n fingerCursorObject = this.object.pp_addObject();\r\n\r\n let meshComponent = fingerCursorObject.addComponent(\"mesh\");\r\n meshComponent.mesh = PP.myDefaultResources.myMeshes.mySphere;\r\n meshComponent.material = PP.myDefaultResources.myMaterials.myFlatOpaque.clone();\r\n meshComponent.material.color = this._myCursorColor;\r\n\r\n fingerCursorObject.pp_setScale(fingerCollisionSize);\r\n }\r\n\r\n this._myFingerCursorObject = WL.scene.addObject(this.object);\r\n this._myFingerCursorComponent = this._myFingerCursorObject.addComponent(\"pp-finger-cursor\", {\r\n \"_myHandedness\": this._myHandedness,\r\n \"_myEnableMultipleClicks\": true,\r\n \"_myCollisionGroup\": this._myCursorTargetCollisionGroup,\r\n \"_myCollisionSize\": fingerCollisionSize,\r\n \"_myCursorObject\": fingerCursorObject\r\n });\r\n\r\n this._myCursorObjectVR.pp_setActive(false);\r\n this._myCursorObjectNonVR.pp_setActive(false);\r\n this._myFingerCursorObject.pp_setActive(false);\r\n\r\n },\r\n update: function () {\r\n let transformQuat = PP.quat2_create();\r\n return function update(dt) {\r\n let isUsingHand = this._isUsingHand();\r\n\r\n this._myFingerCursorObject.pp_setActive(isUsingHand);\r\n\r\n if (isUsingHand) {\r\n this._myCursorObjectNonVR.pp_setActive(false);\r\n this._myCursorObjectVR.pp_setActive(false);\r\n } else {\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n this._myCursorObjectVR.pp_setActive(!isUsingHand);\r\n this._myCursorObjectNonVR.pp_setActive(false);\r\n } else {\r\n this._myCursorObjectNonVR.pp_setActive(!isUsingHand);\r\n this._myCursorObjectVR.pp_setActive(false);\r\n\r\n this._myCursorObjectNonVR.pp_setTransformQuat(PP.myPlayerObjects.myNonVRCamera.pp_getTransformQuat(transformQuat));\r\n }\r\n }\r\n };\r\n }(),\r\n _isUsingHand: function () {\r\n let isUsingHand = false;\r\n\r\n if (WL.xrSession && WL.xrSession.inputSources) {\r\n for (let i = 0; i < WL.xrSession.inputSources.length; i++) {\r\n let input = WL.xrSession.inputSources[i];\r\n if (input.hand && input.handedness == this._myHandednessString) {\r\n isUsingHand = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return isUsingHand;\r\n },\r\n _pulseOnHover: function (object) {\r\n let targetComponent = object.getComponent(\"cursor-target\");\r\n\r\n if (targetComponent && !targetComponent.isSurface) {\r\n if (this._myHandedness == 0) {\r\n if (PP.myLeftGamepad) {\r\n PP.myLeftGamepad.pulse(0.4, 0);\r\n }\r\n } else {\r\n if (PP.myRightGamepad) {\r\n PP.myRightGamepad.pulse(0.4, 0);\r\n }\r\n }\r\n }\r\n }\r\n});", "PP.ConsoleVRWidgetSetup = class ConsoleVRWidgetSetup {\n\n constructor() {\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7; //keep this in sync with ConsoleVRSetup\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n this.myMessageTypeColors = [];\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG] = this.myDefaultTextColor;\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR] = [255 / 255, 40 / 255, 40 / 255, 1];\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN] = [250 / 255, 220 / 255, 40 / 255, 1];\n this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO] = [60 / 255, 200 / 255, 255 / 255, 1];\n\n //Messages\n this.myMessagesPanelPosition = [0, 0.075, 0];\n\n this.myMessagesBackgroundScale = [0.34, 0.15, 1];\n\n {\n let xPaddingPercentage = 0.03;\n let yPaddingPercentage = xPaddingPercentage * this.myMessagesBackgroundScale[0] / this.myMessagesBackgroundScale[1] * 0.8; //a bit less padding\n let xPosition = -this.myMessagesBackgroundScale[0] + this.myMessagesBackgroundScale[0] * xPaddingPercentage;\n let yPosition = this.myMessagesBackgroundScale[1] - this.myMessagesBackgroundScale[1] * yPaddingPercentage;\n this.myMessagesTextsPanelPosition = [xPosition, yPosition, 0.007];\n }\n this.myMessagesTextsPanelScale = [0.1, 0.1, 0.1];\n\n this.myMessagesTextStartString = \".\\n\"; // to avoid issue with text component padding\n this.myMessagesTextAlignment = 1; // left\n this.myMessagesTextJustification = 3; // top\n\n this.myMessagesTextPositions = [];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.LOG] = [0, 0, 0.00001];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.ERROR] = [0, 0, 0];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.WARN] = [0, 0, 0];\n this.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType.INFO] = [0, 0, 0];\n\n this.myMessagesTextColors = [];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.LOG] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.ERROR] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.WARN] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN];\n this.myMessagesTextColors[PP.ConsoleVRWidget.MessageType.INFO] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO];\n\n //Buttons \n this.myButtonsPanelPosition = [0, -0.11, 0.015];\n\n this.myButtonBackgroundScale = [0.04, 0.02, 1];\n\n this.myButtonTextPosition = [0, 0, 0.0065];\n this.myButtonTextScale = [0.18, 0.18, 0.18];\n\n this.myButtonCursorTargetPosition = [0, 0, 0];\n this.myButtonCursorTargetPosition[2] = this.myButtonTextPosition[2];\n\n this.myButtonsCollisionCollider = this.myCursorTargetCollisionCollider;\n this.myButtonsCollisionGroup = this.myCursorTargetCollisionGroup;\n this.myButtonsCollisionExtents = this.myButtonBackgroundScale.slice(0);\n this.myButtonsCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myClearButtonTextLabel = \"clear\";\n this.myUpButtonTextLabel = \"up\";\n this.myDownButtonTextLabel = \"down\";\n\n this.myFilterButtonsTextColors = [];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.LOG] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.LOG];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.ERROR] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.ERROR];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.WARN] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.WARN];\n this.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType.INFO] = this.myMessageTypeColors[PP.ConsoleVRWidget.MessageType.INFO];\n\n this.myFilterButtonsTextLabel = [];\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.LOG] = \"log\";\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.ERROR] = \"error\";\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.WARN] = \"warn\";\n this.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType.INFO] = \"info\";\n\n //Buttons positioning\n {\n let numberOfButtons = 7;\n let buttonsHorizontalSpace = Math.max(0.68, this.myButtonBackgroundScale[0] * numberOfButtons);\n //2 at start, 3 between filters, 4 spaces between filter and clear and 4 spaces between clear and up/down, 1 space between up and down, 1 at end\n let numberOfSpacesBetweenButtons = 2 + 3 + 4 + 4 + 1 + 2;\n let spaceWidth = Math.max((buttonsHorizontalSpace - numberOfButtons * this.myButtonBackgroundScale[0] * 2) / numberOfSpacesBetweenButtons, 0);\n let halfButtonWidth = this.myButtonBackgroundScale[0];\n let initialPosition = - buttonsHorizontalSpace / 2;\n\n this.myFilterButtonsPositions = [];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.LOG] = [initialPosition + spaceWidth * 2 + halfButtonWidth, 0, 0];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.ERROR] = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.LOG][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.WARN] = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.ERROR][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.INFO] = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.WARN][0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n\n this.myClearButtonPosition = [this.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType.INFO][0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\n this.myUpButtonPosition = [this.myClearButtonPosition[0] + halfButtonWidth + spaceWidth * 4 + halfButtonWidth, 0, 0];\n this.myDownButtonPosition = [this.myUpButtonPosition[0] + halfButtonWidth + spaceWidth + halfButtonWidth, 0, 0];\n }\n\n //Notify Icon\n this.myNotifyIconBackgroundScale = [0.01, 0.01, 1];\n\n this.myNotifyIconPanelPositions = [];\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE] = [0, 0, 0];\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][0] = -this.myMessagesBackgroundScale[0] + this.myNotifyIconBackgroundScale[0] + 0.01;\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][1] = -this.myMessagesBackgroundScale[1] + this.myNotifyIconBackgroundScale[1] + 0.01;\n this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE][2] = this.myMessagesTextsPanelPosition[2] - 0.00001; //prevent glitches with text\n\n this.myNotifyIconPanelPositions[PP.ToolHandedness.LEFT] = this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE];\n\n this.myNotifyIconPanelPositions[PP.ToolHandedness.RIGHT] = this.myNotifyIconPanelPositions[PP.ToolHandedness.NONE];\n\n this.myNotifyIconCursorTargetPosition = [0, 0, 0];\n this.myNotifyIconCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - this.myMessagesTextsPanelPosition[2]; // a little behind the button target to avoid hiding it\n\n this.myNotifyIconCollisionExtents = this.myNotifyIconBackgroundScale.slice(0);\n this.myNotifyIconCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNotifyIconColor = [210 / 255, 210 / 255, 210 / 255, 1];\n\n //Pointer\n this.myPointerCollisionCollider = this.myCursorTargetCollisionCollider;\n this.myPointerCollisionGroup = this.myCursorTargetCollisionGroup;\n\n {\n let spaceBetweenMessagesAndButtons = Math.abs((this.myMessagesPanelPosition[1] - this.myMessagesBackgroundScale[1]) - (this.myButtonsPanelPosition[1] + this.myButtonBackgroundScale[1]));\n let pointerCollisionHalfHeight = this.myMessagesBackgroundScale[1] + this.myButtonBackgroundScale[1] + spaceBetweenMessagesAndButtons / 2;\n this.myPointerCollisionExtents = [this.myMessagesBackgroundScale[0], pointerCollisionHalfHeight, this.myCursorTargetCollisionThickness];\n }\n\n this.myPointerCursorTargetPosition = [0, 0, 0];\n this.myPointerCursorTargetPosition[1] = (this.myMessagesPanelPosition[1] + this.myMessagesBackgroundScale[1]) - this.myPointerCollisionExtents[1];\n this.myPointerCursorTargetPosition[2] = this.myButtonsPanelPosition[2] + this.myButtonTextPosition[2] - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myTabString = \" \";\n this.myAssertStartString = \"Assertion failed:\";\n\n this.myMaxCharactersPerLine = 100;\n this.myMaxLineSplits = 50; //prevent infinite splitting\n this.myMaxLines = 22;\n this.myMaxMessages = 2000;\n this.myMaxMessagesDeletePad = 2000; // to prevent deleting at every message, delay the delete after the limit is exceed by this value\n\n this.myLinesBetweenMessages = 1;\n\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myButtonDisabledTextColor = this.myBackgroundColor;\n this.myButtonDisabledBackgroundColor = [110 / 255, 110 / 255, 110 / 255, 1];\n\n this.myFilterButtonDisabledTextColor = this.myButtonDisabledTextColor;\n this.myFilterButtonDisabledBackgroundColor = this.myButtonDisabledBackgroundColor;\n\n this.myScrollDelay = 0.1;\n this.myScrollAmount = 1;\n this.myScrollThumbstickHandedness = PP.ToolHandedness.RIGHT;\n this.myScrollThumbstickDelay = 0.1;\n this.myScrollThumbstickMinThreshold = 0.2;\n this.myScrollThumbstickAmount = 3;\n\n this.myPulseDelay = 5;\n this.myPulseIntensity = 0.3;\n this.myPulseDuration = 0.085;\n\n this.myClearBrowserConsoleWhenClearPressed = true;\n\n this.myGamepadScrollOnlyOnHover = true;\n }\n};", "PP.ConsoleVRWidgetUI = class ConsoleVRWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this._createMessagesSkeleton();\n this._createButtonsSkeleton();\n this._createPointerSkeleton();\n }\n\n _createMessagesSkeleton() {\n this.myMessagesPanel = WL.scene.addObject(this.myPivotObject);\n this.myMessagesBackground = WL.scene.addObject(this.myMessagesPanel);\n this.myMessagesTextsPanel = WL.scene.addObject(this.myMessagesPanel);\n\n this.myMessagesTexts = [];\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myMessagesTextsPanel);\n }\n\n this.myNotifyIconPanel = WL.scene.addObject(this.myMessagesPanel);\n this.myNotifyIconBackground = WL.scene.addObject(this.myNotifyIconPanel);\n this.myNotifyIconCursorTarget = WL.scene.addObject(this.myNotifyIconPanel);\n }\n\n _createButtonsSkeleton() {\n this.myButtonsPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myFilterButtonsPanels = [];\n this.myFilterButtonsBackgrounds = [];\n this.myFilterButtonsTexts = [];\n this.myFilterButtonsCursorTargets = [];\n\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myButtonsPanel);\n this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]]);\n this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]]);\n this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]] = WL.scene.addObject(this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]]);\n }\n\n this.myClearButtonPanel = WL.scene.addObject(this.myButtonsPanel);\n this.myClearButtonBackground = WL.scene.addObject(this.myClearButtonPanel);\n this.myClearButtonText = WL.scene.addObject(this.myClearButtonPanel);\n this.myClearButtonCursorTarget = WL.scene.addObject(this.myClearButtonPanel);\n\n this.myUpButtonPanel = WL.scene.addObject(this.myButtonsPanel);\n this.myUpButtonBackground = WL.scene.addObject(this.myUpButtonPanel);\n this.myUpButtonText = WL.scene.addObject(this.myUpButtonPanel);\n this.myUpButtonCursorTarget = WL.scene.addObject(this.myUpButtonPanel);\n\n this.myDownButtonPanel = WL.scene.addObject(this.myButtonsPanel);\n this.myDownButtonBackground = WL.scene.addObject(this.myDownButtonPanel);\n this.myDownButtonText = WL.scene.addObject(this.myDownButtonPanel);\n this.myDownButtonCursorTarget = WL.scene.addObject(this.myDownButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setDirty();\n\n this._setMessagesTransforms();\n this._setButtonsTransforms();\n this._setPointerTransform();\n }\n\n _setMessagesTransforms() {\n this.myMessagesPanel.setTranslationLocal(this._mySetup.myMessagesPanelPosition);\n this.myMessagesBackground.scale(this._mySetup.myMessagesBackgroundScale);\n\n this.myMessagesTextsPanel.setTranslationLocal(this._mySetup.myMessagesTextsPanelPosition);\n this.myMessagesTextsPanel.scale(this._mySetup.myMessagesTextsPanelScale);\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myMessagesTextPositions[PP.ConsoleVRWidget.MessageType[key]]);\n }\n\n this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[this._myAdditionalSetup.myHandedness]);\n this.myNotifyIconBackground.scale(this._mySetup.myNotifyIconBackgroundScale);\n this.myNotifyIconCursorTarget.setTranslationLocal(this._mySetup.myNotifyIconCursorTargetPosition);\n }\n\n _setButtonsTransforms() {\n this.myButtonsPanel.setTranslationLocal(this._mySetup.myButtonsPanelPosition);\n\n //Filter Buttons\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this.myFilterButtonsPanels[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myFilterButtonsPositions[PP.ConsoleVRWidget.MessageType[key]]);\n\n this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[key]].scale(this._mySetup.myButtonBackgroundScale);\n\n this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]].scale(this._mySetup.myButtonTextScale);\n\n this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]].setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n\n //Clear\n {\n this.myClearButtonPanel.setTranslationLocal(this._mySetup.myClearButtonPosition);\n\n this.myClearButtonBackground.scale(this._mySetup.myButtonBackgroundScale);\n\n this.myClearButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myClearButtonText.scale(this._mySetup.myButtonTextScale);\n\n this.myClearButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n\n //Up\n {\n this.myUpButtonPanel.setTranslationLocal(this._mySetup.myUpButtonPosition);\n\n this.myUpButtonBackground.scale(this._mySetup.myButtonBackgroundScale);\n\n this.myUpButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myUpButtonText.scale(this._mySetup.myButtonTextScale);\n\n this.myUpButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n\n //Down\n {\n this.myDownButtonPanel.setTranslationLocal(this._mySetup.myDownButtonPosition);\n\n this.myDownButtonBackground.scale(this._mySetup.myButtonBackgroundScale);\n\n this.myDownButtonText.setTranslationLocal(this._mySetup.myButtonTextPosition);\n this.myDownButtonText.scale(this._mySetup.myButtonTextScale);\n\n this.myDownButtonCursorTarget.setTranslationLocal(this._mySetup.myButtonCursorTargetPosition);\n }\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this._addMessagesComponents();\n this._addButtonsComponents();\n this._addPointerComponents();\n }\n\n _addMessagesComponents() {\n let messagesBackgroundMeshComp = this.myMessagesBackground.addComponent('mesh');\n messagesBackgroundMeshComp.mesh = this._myPlaneMesh;\n messagesBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n messagesBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n this.myMessagesTextComponents = [];\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let textComp = this.myMessagesTexts[PP.ConsoleVRWidget.MessageType[key]].addComponent('text');\n\n textComp.alignment = this._mySetup.myMessagesTextAlignment;\n textComp.justification = this._mySetup.myMessagesTextJustification;\n textComp.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComp.material.color = this._mySetup.myMessagesTextColors[PP.ConsoleVRWidget.MessageType[key]];\n textComp.lineSpacing = 1.2;\n textComp.text = this._mySetup.myMessagesTextStartString;\n\n this.myMessagesTextComponents[PP.ConsoleVRWidget.MessageType[key]] = textComp;\n }\n\n this.myNotifyIconBackgroundComponent = this.myNotifyIconBackground.addComponent('mesh');\n this.myNotifyIconBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNotifyIconBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNotifyIconBackgroundComponent.material.color = this._mySetup.myNotifyIconColor;\n\n this.myNotifyIconCursorTargetComponent = this.myNotifyIconCursorTarget.addComponent('cursor-target');\n\n this.myNotifyIconCollisionComponent = this.myNotifyIconCursorTarget.addComponent('collision');\n this.myNotifyIconCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNotifyIconCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNotifyIconCollisionComponent.extents = this._mySetup.myNotifyIconCollisionExtents;\n }\n\n _addButtonsComponents() {\n //worship the code copy pasteness\n\n this.myFilterButtonsBackgroundComponents = [];\n this.myFilterButtonsTextComponents = [];\n this.myFilterButtonsCursorTargetComponents = [];\n this.myFilterButtonsCollisionComponents = [];\n\n //Filter Buttons\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let buttonBackgroundMeshComp = this.myFilterButtonsBackgrounds[PP.ConsoleVRWidget.MessageType[key]].addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myFilterButtonsTexts[PP.ConsoleVRWidget.MessageType[key]].addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.material.color = this._mySetup.myFilterButtonsTextColors[PP.ConsoleVRWidget.MessageType[key]];\n buttonTextComp.text = this._mySetup.myFilterButtonsTextLabel[PP.ConsoleVRWidget.MessageType[key]];\n\n let buttonCursorTargetComp = this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]].addComponent('cursor-target');\n\n let buttonCollisionComp = this.myFilterButtonsCursorTargets[PP.ConsoleVRWidget.MessageType[key]].addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonBackgroundMeshComp;\n this.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonTextComp;\n this.myFilterButtonsCursorTargetComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonCursorTargetComp;\n this.myFilterButtonsCollisionComponents[PP.ConsoleVRWidget.MessageType[key]] = buttonCollisionComp;\n }\n\n //Clear \n {\n let buttonBackgroundMeshComp = this.myClearButtonBackground.addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myClearButtonText.addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.text = this._mySetup.myClearButtonTextLabel;\n\n let buttonCursorTargetComp = this.myClearButtonCursorTarget.addComponent('cursor-target');\n\n let buttonCollisionComp = this.myClearButtonCursorTarget.addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myClearButtonBackgroundComponent = buttonBackgroundMeshComp;\n this.myClearButtonTextComponent = buttonTextComp;\n this.myClearButtonCursorTargetComponent = buttonCursorTargetComp;\n this.myClearButtonCollisionComponent = buttonCollisionComp;\n }\n\n //Up \n {\n let buttonBackgroundMeshComp = this.myUpButtonBackground.addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myUpButtonText.addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.text = this._mySetup.myUpButtonTextLabel;\n\n let buttonCursorTargetComp = this.myUpButtonCursorTarget.addComponent('cursor-target');\n\n let buttonCollisionComp = this.myUpButtonCursorTarget.addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myUpButtonBackgroundComponent = buttonBackgroundMeshComp;\n this.myUpButtonTextComponent = buttonTextComp;\n this.myUpButtonCursorTargetComponent = buttonCursorTargetComp;\n this.myUpButtonCollisionComponent = buttonCollisionComp;\n }\n\n //Down \n {\n let buttonBackgroundMeshComp = this.myDownButtonBackground.addComponent('mesh');\n buttonBackgroundMeshComp.mesh = this._myPlaneMesh;\n buttonBackgroundMeshComp.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n buttonBackgroundMeshComp.material.color = this._mySetup.myBackgroundColor;\n\n let buttonTextComp = this.myDownButtonText.addComponent('text');\n this._setupButtonTextComponent(buttonTextComp);\n buttonTextComp.text = this._mySetup.myDownButtonTextLabel;\n\n let buttonCursorTargetComp = this.myDownButtonCursorTarget.addComponent('cursor-target');\n\n let buttonCollisionComp = this.myDownButtonCursorTarget.addComponent('collision');\n buttonCollisionComp.collider = this._mySetup.myButtonsCollisionCollider;\n buttonCollisionComp.group = 1 << this._mySetup.myButtonsCollisionGroup;\n buttonCollisionComp.extents = this._mySetup.myButtonsCollisionExtents;\n\n this.myDownButtonBackgroundComponent = buttonBackgroundMeshComp;\n this.myDownButtonTextComponent = buttonTextComp;\n this.myDownButtonCursorTargetComponent = buttonCursorTargetComp;\n this.myDownButtonCollisionComponent = buttonCollisionComp;\n }\n }\n\n _addPointerComponents() {\n this.myPointerCursorTargetComponent = this.myPointerCursorTarget.addComponent('cursor-target');\n this.myPointerCursorTargetComponent.isSurface = true;\n\n let collisionComp = this.myPointerCursorTarget.addComponent('collision');\n collisionComp.collider = this._mySetup.myPointerCollisionCollider;\n collisionComp.group = 1 << this._mySetup.myPointerCollisionGroup;\n collisionComp.extents = this._mySetup.myPointerCollisionExtents;\n\n this.myPointerCollisionComponent = collisionComp;\n }\n\n _setupButtonTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myNotifyIconPanel.setTranslationLocal(this._mySetup.myNotifyIconPanelPositions[PP.ToolHandedness.NONE]);\n }\n};", "/* Doesn't support\n - Placeholder like %d and other similar kind of way to build strings\n*/\n\nPP.ConsoleVRWidget = class ConsoleVRWidget {\n\n constructor() {\n this._myWidgetFrame = new PP.WidgetFrame(\"C\", 0);\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\n\n this._mySetup = new PP.ConsoleVRWidgetSetup();\n this._myAdditionalSetup = null;\n\n this._myUI = new PP.ConsoleVRWidgetUI();\n\n this._myMessages = [];\n\n this._myOldBrowserConsole = [];\n this._myOldConsoleVR = [];\n\n this._myTypeFilters = [];\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = false;\n }\n\n this._myScrollUp = false;\n this._myScrollDown = false;\n this._myScrollOffset = 0;\n this._myScrollTimer = 0;\n this._myScrollThumbstickTimer = 0;\n\n this._myPulseTimer = 0;\n\n this._myGamepadScrollActive = true;\n if (this._mySetup.myGamepadScrollOnlyOnHover) {\n this._myGamepadScrollActive = false;\n }\n }\n\n setVisible(visible) {\n this._myWidgetFrame.setVisible(visible);\n }\n\n isVisible() {\n return this._myWidgetFrame.isVisible();\n }\n\n start(parentObject, additionalSetup) {\n this._myLeftGamepad = PP.myLeftGamepad; //@EDIT get gamepad LEFT here based on how you store it in your game\n this._myRightGamepad = PP.myRightGamepad; //@EDIT get gamepad RIGHT here based on how you store it in your game\n\n this._myAdditionalSetup = additionalSetup;\n\n this._myWidgetFrame.start(parentObject, additionalSetup);\n\n this._myUI.build(this._myWidgetFrame.getWidgetObject(), this._mySetup, additionalSetup);\n this._myUI.setVisible(this._myWidgetFrame.myIsWidgetVisible);\n this._setNotifyIconActive(false);\n\n this._addListeners();\n\n this._overrideConsolesFunctions();\n }\n\n //This must be done only when all the setup is complete, to avoid issues with other part of the code calling the console and then triggering the console vr while not ready yet\n _overrideConsolesFunctions() {\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.LOG] = console.log;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.ERROR] = console.error;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.WARN] = console.warn;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.INFO] = console.info;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.DEBUG] = console.debug;\n this._myOldBrowserConsole[PP.ConsoleVRWidget.ConsoleFunction.ASSERT] = console.assert;\n this._myOldBrowserConsoleClear = console.clear;\n\n if (this._myAdditionalSetup.myOverrideBrowserConsole) {\n console.log = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.LOG, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.error = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.warn = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.WARN, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.info = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.INFO, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.debug = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.DEBUG, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.assert = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ASSERT, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n console.clear = this._clearConsole.bind(this, true, PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE);\n\n window.addEventListener('error', function (errorEvent) {\n this._consolePrint(PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.WINDOW, \"Uncaught\", errorEvent.error.stack);\n }.bind(this));\n\n window.addEventListener('unhandledrejection', function (errorEvent) {\n this._consolePrint(PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.WINDOW, \"Uncaught (in promise)\", errorEvent.reason);\n }.bind(this));\n }\n\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.LOG] = PP.ConsoleVR.log;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.ERROR] = PP.ConsoleVR.error;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.WARN] = PP.ConsoleVR.warn;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.INFO] = PP.ConsoleVR.info;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.DEBUG] = PP.ConsoleVR.debug;\n this._myOldConsoleVR[PP.ConsoleVRWidget.ConsoleFunction.ASSERT] = PP.ConsoleVR.assert;\n this._myOldConsoleVRClear = PP.ConsoleVR.clear;\n\n PP.ConsoleVR.log = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.LOG, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.error = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ERROR, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.warn = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.WARN, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.info = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.INFO, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.debug = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.DEBUG, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.assert = this._consolePrint.bind(this, PP.ConsoleVRWidget.ConsoleFunction.ASSERT, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n PP.ConsoleVR.clear = this._clearConsole.bind(this, true, PP.ConsoleVRWidget.Sender.CONSOLE_VR);\n }\n\n update(dt) {\n this._myWidgetFrame.update(dt);\n\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._updateScroll(dt);\n }\n\n this._updateGamepadsExtraActions(dt);\n }\n\n //Text section\n\n _updateText(messageType) {\n let consoleText = \"\";\n\n if (!this._myTypeFilters[messageType]) {\n let linesCount = 0;\n let i = this._myMessages.length - 1;\n\n let scrollLinesToSkip = Math.round(this._myScrollOffset);\n\n while (i >= 0 && linesCount < this._mySetup.myMaxLines) {\n let message = this._myMessages[i];\n\n //skip filtered messages\n if (this._myTypeFilters[message.myType]) {\n i -= 1;\n continue;\n }\n\n let messageLines = message.myLines.length;\n\n //compute line to skip due to scroll offset\n let linesToSkip = 0;\n if (scrollLinesToSkip > 0) {\n let additionalEmptyLines = 0;\n if (i != this._myMessages.length - 1) {\n additionalEmptyLines = this._mySetup.myLinesBetweenMessages;\n }\n\n if (scrollLinesToSkip >= messageLines + additionalEmptyLines) { // + empty lines between messages\n scrollLinesToSkip -= messageLines + additionalEmptyLines;\n linesToSkip = messageLines + additionalEmptyLines;\n } else {\n linesToSkip = scrollLinesToSkip;\n scrollLinesToSkip = 0;\n }\n }\n\n //add empty lines between messages\n if (i != this._myMessages.length - 1) {\n let emptyLinesToSkip = this._mySetup.myLinesBetweenMessages - Math.max(this._mySetup.myLinesBetweenMessages - linesToSkip, 0);\n let emptyLinesToShow = this._mySetup.myLinesBetweenMessages - emptyLinesToSkip;\n if (linesCount + emptyLinesToShow > this._mySetup.myMaxLines) {\n emptyLinesToShow = this._myMaxLines - linesCount;\n }\n\n for (let j = 0; j < emptyLinesToShow; j++) {\n consoleText = (\"\\n\").concat(consoleText);\n }\n\n linesCount += emptyLinesToShow;\n linesToSkip -= emptyLinesToSkip;\n }\n\n //computing the number of message lines to show\n let linesToShow = messageLines - linesToSkip;\n if (linesCount + linesToShow > this._mySetup.myMaxLines) {\n linesToShow = this._mySetup.myMaxLines - linesCount;\n }\n\n if (linesToShow > 0) {\n if (message.myType == messageType) {\n //if the message is the same type of this message text component, add the message lines\n\n let linesToPrint = message.myLines.slice(messageLines - linesToShow - linesToSkip, messageLines - linesToSkip);\n let text = linesToPrint.join(\"\\n\");\n consoleText = (text.concat(\"\\n\")).concat(consoleText);\n\n linesCount += linesToShow;\n } else {\n //otherwise add empty lines, so that the text component with the correct type will have space to show this message\n\n for (let j = 0; j < linesToShow; j++) {\n consoleText = (\"\\n\").concat(consoleText);\n }\n\n linesCount += linesToShow;\n }\n }\n\n i -= 1;\n }\n }\n\n consoleText = this._mySetup.myMessagesTextStartString.concat(consoleText);\n\n this._myUI.myMessagesTextComponents[messageType].text = consoleText;\n }\n\n _consolePrint(consoleFunction, sender, ...args) {\n if (consoleFunction != PP.ConsoleVRWidget.ConsoleFunction.ASSERT || (args.length > 0 && !args[0])) {\n let message = this._argsToMessage(consoleFunction, ...args);\n this._addMessage(message);\n\n if (this._myMessages.length >= this._mySetup.myMaxMessages + this._mySetup.myMaxMessagesDeletePad) {\n this._myMessages = this._myMessages.slice(this._myMessages.length - this._mySetup.myMaxMessages);\n this._clampScrollOffset();\n }\n\n this._updateAllTexts();\n\n this._pulseGamepad();\n }\n\n switch (sender) {\n case PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE:\n this._myOldBrowserConsole[consoleFunction].apply(console, args);\n break;\n case PP.ConsoleVRWidget.Sender.CONSOLE_VR:\n this._myOldConsoleVR[consoleFunction].apply(PP.ConsoleVR, args);\n break;\n default:\n break;\n }\n }\n\n _argsToMessage(consoleFunction, ...args) {\n if (consoleFunction == PP.ConsoleVRWidget.ConsoleFunction.ASSERT) {\n args = args.slice(1);\n args.splice(0, 0, this._mySetup.myAssertStartString);\n }\n\n let messageType = this._consoleFunctionToMessageType(consoleFunction);\n\n let formattedText = this._formatArgs(...args);\n\n let lines = this._splitLongLines(formattedText);\n\n if (messageType == PP.ConsoleVRWidget.MessageType.DEBUG) {\n messageType = PP.ConsoleVRWidget.MessageType.LOG;\n } else if (messageType == PP.ConsoleVRWidget.MessageType.EXCEPTION || messageType == PP.ConsoleVRWidget.MessageType.ASSERT) {\n messageType = PP.ConsoleVRWidget.MessageType.ERROR;\n }\n\n\n let message = new PP.ConsoleVRWidget.Message(messageType, lines);\n\n return message;\n }\n\n _consoleFunctionToMessageType(consoleFunction) {\n let messageType = PP.ConsoleVRWidget.MessageType.LOG;\n\n if (consoleFunction < PP.ConsoleVRWidget.ConsoleFunction.DEBUG) {\n messageType = consoleFunction;\n } else if (consoleFunction == PP.ConsoleVRWidget.ConsoleFunction.DEBUG) {\n messageType = PP.ConsoleVRWidget.MessageType.LOG;\n } else {\n messageType = PP.ConsoleVRWidget.MessageType.ERROR;\n }\n\n return messageType;\n }\n\n //Here the formatting using placeholder like %d could be implemented in the future\n _formatArgs(...args) {\n let stringifiedArgs = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i] === undefined) {\n stringifiedArgs.push(\"undefined\");\n } else {\n stringifiedArgs.push(this._stringifyItem(args[i]));\n }\n }\n\n let formattedString = stringifiedArgs.join(\" \");\n\n return formattedString;\n }\n\n _stringifyItem(item) {\n if (typeof item === 'object') {\n let stringifiedItem = null;\n let linesBetweenItems = 2;\n\n try {\n stringifiedItem = JSON.stringify(item, this._jsonReplacer.bind(this), linesBetweenItems);\n } catch (error) {\n let cache = new WeakSet();\n\n stringifiedItem = JSON.stringify(item, function (key, value) {\n if (typeof value === 'object' && value !== null) {\n if (cache.has(value)) {\n return \"\"; //try to avoid circular reference, a repeated object will be caught in this check too sadly\n }\n cache.add(value);\n }\n\n return this._jsonReplacer(key, value);\n }.bind(this), linesBetweenItems);\n }\n\n stringifiedItem = stringifiedItem.replaceAll('\"[', '[');\n stringifiedItem = stringifiedItem.replaceAll(\"'[\", \"[\");\n stringifiedItem = stringifiedItem.replaceAll(']\"', ']');\n stringifiedItem = stringifiedItem.replaceAll(\"]'\", \"]\");\n\n return stringifiedItem;\n }\n\n return item;\n }\n\n _splitLongLines(messageText) {\n let linesToSplit = messageText.split(\"\\n\");\n let lines = [];\n for (let i = 0; i < linesToSplit.length; i++) {\n let lineToSplit = linesToSplit[i];\n\n if (lineToSplit.length > this._mySetup.myMaxCharactersPerLine) {\n let spacesAtStart = this._getSpacesAtStart(lineToSplit);\n let spaceToAdd = this._mySetup.myTabString.concat(spacesAtStart);\n let lineSplits = 0;\n\n while (lineToSplit.length > this._mySetup.myMaxCharactersPerLine && lineSplits < this._mySetup.myMaxLineSplits) {\n let firstSub = lineToSplit.substr(0, this._mySetup.myMaxCharactersPerLine - 1);\n let secondSub = lineToSplit.substr(this._mySetup.myMaxCharactersPerLine - 1);\n secondSub = spaceToAdd.concat(secondSub);\n\n lines.push(firstSub);\n\n lineToSplit = secondSub;\n lineSplits++;\n }\n lines.push(lineToSplit);\n } else {\n lines.push(lineToSplit);\n }\n }\n\n return lines;\n }\n\n _getSpacesAtStart(text) {\n let spaces = \"\";\n let i = 0;\n\n while (i < text.length && text[i] == ' ') {\n spaces = spaces.concat(\" \");\n i++;\n }\n\n return spaces;\n }\n\n _addMessage(message) {\n let hasSameInfoAsPrev = false;\n if (this._myMessages.length > 0) {\n let lastMessage = this._myMessages[this._myMessages.length - 1];\n if (lastMessage.hasSameInfo(message)) {\n lastMessage.increaseCount();\n hasSameInfoAsPrev = true;\n }\n }\n\n if (!hasSameInfoAsPrev) {\n this._myMessages.push(message);\n }\n\n this._adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev);\n this._updateNotifyIcon(message);\n }\n\n //if you have scrolled, new messages does not move the scroll position\n _adjustScrollOffsetAfterMessageAdded(message, hasSameInfoAsPrev) {\n if (!hasSameInfoAsPrev && !(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\n this._myScrollOffset += message.myLines.length + this._mySetup.myLinesBetweenMessages;\n }\n }\n\n _updateAllTexts() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n for (let key in PP.ConsoleVRWidget.MessageType) {\n this._updateText(PP.ConsoleVRWidget.MessageType[key]);\n }\n }\n }\n\n _updateNotifyIcon(message) {\n if (!(this._myTypeFilters[message.myType]) && this._myScrollOffset > 0) {\n this._setNotifyIconActive(true);\n }\n }\n\n _updateScroll(dt) {\n if (this._myScrollUp) {\n this._myScrollTimer += dt;\n while (this._myScrollTimer > this._mySetup.myScrollDelay) {\n this._myScrollTimer -= this._mySetup.myScrollDelay;\n this._myScrollOffset += this._mySetup.myScrollAmount;\n }\n } else if (this._myScrollDown) {\n this._myScrollTimer += dt;\n while (this._myScrollTimer > this._mySetup.myScrollDelay) {\n this._myScrollTimer -= this._mySetup.myScrollDelay;\n this._myScrollOffset -= this._mySetup.myScrollAmount;\n }\n }\n\n this._clampScrollOffset();\n\n if (this._myScrollUp || this._myScrollDown) {\n this._updateAllTexts();\n }\n\n if (this._myScrollOffset == 0) {\n this._setNotifyIconActive(false);\n }\n }\n\n _clampScrollOffset() {\n let maxScroll = this._getMaxScrollOffset();\n this._myScrollOffset = Math.min(Math.max(this._myScrollOffset, 0), maxScroll); //clamp \n }\n\n _getMaxScrollOffset() {\n return Math.max(this._getLinesCount() - this._mySetup.myMaxLines, 0);\n }\n\n _getLinesCount() {\n let linesCount = 0;\n for (let message of this._myMessages) {\n if (!this._myTypeFilters[message.myType]) {\n linesCount += message.myLines.length + this._mySetup.myLinesBetweenMessages;\n }\n }\n linesCount -= this._mySetup.myLinesBetweenMessages; //empty line is added only between messages\n linesCount = Math.max(linesCount, 0);\n\n return linesCount;\n }\n\n //Listener section\n\n _addListeners() {\n let ui = this._myUI;\n\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let cursorTarget = ui.myFilterButtonsCursorTargetComponents[PP.ConsoleVRWidget.MessageType[key]];\n let backgroundMaterial = ui.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n let textMaterial = ui.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n\n cursorTarget.addTripleClickFunction(this._resetFilters.bind(this, PP.ConsoleVRWidget.MessageType[key]));\n cursorTarget.addDoubleClickFunction(this._filterAllButOne.bind(this, PP.ConsoleVRWidget.MessageType[key], textMaterial));\n cursorTarget.addClickFunction(this._toggleFilter.bind(this, PP.ConsoleVRWidget.MessageType[key], textMaterial));\n cursorTarget.addHoverFunction(this._filterHover.bind(this, PP.ConsoleVRWidget.MessageType[key], backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._filterUnHover.bind(this, PP.ConsoleVRWidget.MessageType[key], backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myClearButtonCursorTargetComponent;\n let backgroundMaterial = ui.myClearButtonBackgroundComponent.material;\n\n cursorTarget.addClickFunction(this._clearConsole.bind(this, false, null));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._genericUnHover.bind(this, backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myUpButtonCursorTargetComponent;\n let backgroundMaterial = ui.myUpButtonBackgroundComponent.material;\n\n cursorTarget.addDoubleClickFunction(this._instantScrollUp.bind(this, true));\n cursorTarget.addDownFunction(this._setScrollUp.bind(this, true));\n cursorTarget.addUpFunction(this._setScrollUp.bind(this, false));\n cursorTarget.addUnHoverFunction(this._setScrollUp.bind(this, false));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._genericUnHover.bind(this, backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myDownButtonCursorTargetComponent;\n let backgroundMaterial = ui.myDownButtonBackgroundComponent.material;\n\n cursorTarget.addDoubleClickFunction(this._instantScrollDown.bind(this));\n cursorTarget.addDownFunction(this._setScrollDown.bind(this, true));\n cursorTarget.addUpFunction(this._setScrollDown.bind(this, false));\n cursorTarget.addUnHoverFunction(this._setScrollDown.bind(this, false));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._genericUnHover.bind(this, backgroundMaterial));\n }\n\n {\n let cursorTarget = ui.myNotifyIconCursorTargetComponent;\n let backgroundMaterial = ui.myNotifyIconBackgroundComponent.material;\n\n cursorTarget.addClickFunction(this._instantScrollDown.bind(this));\n cursorTarget.addHoverFunction(this._genericHover.bind(this, backgroundMaterial));\n cursorTarget.addUnHoverFunction(this._notifyIconUnHover.bind(this));\n }\n\n ui.myPointerCursorTargetComponent.addHoverFunction(this._setGamepadScrollActive.bind(this, true));\n ui.myPointerCursorTargetComponent.addUnHoverFunction(this._setGamepadScrollActive.bind(this, false));\n }\n\n _resetFilters(messageType) {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = false;\n filterTextMaterial.color = this._mySetup.myMessageTypeColors[PP.ConsoleVRWidget.MessageType[key]];\n if (PP.ConsoleVRWidget.MessageType[key] != messageType) {\n backgroundMaterial.color = this._mySetup.myBackgroundColor;\n }\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _filterAllButOne(messageType) {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n for (let key in PP.ConsoleVRWidget.MessageType) {\n let backgroundMaterial = this._myUI.myFilterButtonsBackgroundComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n let filterTextMaterial = this._myUI.myFilterButtonsTextComponents[PP.ConsoleVRWidget.MessageType[key]].material;\n if (PP.ConsoleVRWidget.MessageType[key] != messageType) {\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = true;\n backgroundMaterial.color = this._mySetup.myFilterButtonDisabledBackgroundColor;\n filterTextMaterial.color = this._mySetup.myFilterButtonDisabledTextColor;\n } else {\n this._myTypeFilters[PP.ConsoleVRWidget.MessageType[key]] = false;\n filterTextMaterial.color = this._mySetup.myMessageTypeColors[messageType];\n }\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _toggleFilter(messageType, textMaterial) {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n\n this._myTypeFilters[messageType] = !this._myTypeFilters[messageType];\n if (this._myTypeFilters[messageType]) {\n textMaterial.color = this._mySetup.myFilterButtonDisabledTextColor;\n } else {\n textMaterial.color = this._mySetup.myMessageTypeColors[messageType];\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _clearConsole(codeDrivenClear = false, sender = null) {\n if (this._myWidgetFrame.myIsWidgetVisible || codeDrivenClear) {\n this._myMessages = [];\n this._clampScrollOffset();\n this._updateAllTexts();\n\n if (codeDrivenClear) {\n switch (sender) {\n case PP.ConsoleVRWidget.Sender.BROWSER_CONSOLE:\n this._myOldBrowserConsoleClear.apply(console);\n break;\n case PP.ConsoleVRWidget.Sender.CONSOLE_VR:\n this._myOldConsoleVRClear.apply(PP.ConsoleVR);\n break;\n default:\n break;\n }\n } else if (this._mySetup.myClearBrowserConsoleWhenClearPressed) {\n PP.ConsoleVR._myRealClear();\n }\n }\n }\n\n _setScrollUp(value) {\n if (this._myWidgetFrame.myIsWidgetVisible || !value) {\n if (value) {\n this._myScrollTimer = 0;\n }\n\n this._myScrollUp = value;\n }\n }\n\n _setScrollDown(value) {\n if (this._myWidgetFrame.myIsWidgetVisible || !value) {\n if (value) {\n this._myScrollTimer = 0;\n }\n\n this._myScrollDown = value;\n }\n }\n\n _instantScrollUp() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._myScrollOffset = this._getMaxScrollOffset();\n this._updateAllTexts();\n }\n }\n\n _instantScrollDown() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._myScrollOffset = 0;\n this._setNotifyIconActive(false);\n this._updateAllTexts();\n }\n }\n\n _setNotifyIconActive(active) {\n this._myUI.myNotifyIconPanel.pp_setActiveHierarchy(active && this._myWidgetFrame.myIsWidgetVisible);\n }\n\n _notifyIconUnHover() {\n let material = this._myUI.myNotifyIconBackgroundComponent.material;\n material.color = this._mySetup.myNotifyIconColor;\n }\n\n _filterHover(messageType, material) {\n this._genericHover(material);\n }\n\n _filterUnHover(messageType, material) {\n if (this._myTypeFilters[messageType]) {\n material.color = this._mySetup.myFilterButtonDisabledBackgroundColor;\n } else {\n material.color = this._mySetup.myBackgroundColor;\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n //Gamepad section\n\n _updateGamepadsExtraActions(dt) {\n if (this._myLeftGamepad && this._myRightGamepad) {\n if ((this._myLeftGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).isPressStart() && this._myRightGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).myIsPressed) ||\n (this._myRightGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).isPressStart() && this._myLeftGamepad.getButtonInfo(PP.ButtonType.THUMBSTICK).myIsPressed)) {\n this._toggleVisibility();\n }\n\n this._myPulseTimer = Math.max(this._myPulseTimer - dt, 0);\n\n this._updateScrollWithThumbstick(dt);\n }\n }\n\n _toggleVisibility() {\n this._myWidgetFrame.toggleVisibility();\n }\n\n _widgetVisibleChanged(visible) {\n this._myUI.setVisible(visible);\n if (visible) {\n this._updateAllTexts();\n }\n }\n\n _updateScrollWithThumbstick(dt) {\n if (this._myWidgetFrame.myIsWidgetVisible && this._myGamepadScrollActive) {\n let axes = [0, 0];\n if (this._mySetup.myScrollThumbstickHandedness == PP.ToolHandedness.LEFT) {\n axes = this._myLeftGamepad.getAxesInfo().myAxes;\n } else if (this._mySetup.myScrollThumbstickHandedness == PP.ToolHandedness.RIGHT) {\n axes = this._myRightGamepad.getAxesInfo().myAxes;\n }\n\n if (Math.abs(axes[1]) > this._mySetup.myScrollThumbstickMinThreshold) {\n this._myScrollThumbstickTimer += dt;\n\n while (this._myScrollThumbstickTimer > this._mySetup.myScrollThumbstickDelay) {\n this._myScrollThumbstickTimer -= this._mySetup.myScrollThumbstickDelay;\n\n let normalizedScrollAmount = (Math.abs(axes[1]) - this._mySetup.myScrollThumbstickMinThreshold) / (1 - this._mySetup.myScrollThumbstickMinThreshold);\n this._myScrollOffset += Math.sign(axes[1]) * normalizedScrollAmount * this._mySetup.myScrollThumbstickAmount;\n }\n\n this._clampScrollOffset();\n this._updateAllTexts();\n } else {\n this._myScrollThumbstickTimer = 0;\n }\n }\n }\n\n _pulseGamepad() {\n if (this._myLeftGamepad && this._myRightGamepad) {\n let pulseType = this._myAdditionalSetup.myPulseOnNewMessage;\n let pulseEnabled = pulseType == PP.ConsoleVRWidget.PulseOnNewMessage.ALWAYS || (!this._myWidgetFrame.myIsWidgetVisible && pulseType == PP.ConsoleVRWidget.PulseOnNewMessage.WHEN_HIDDEN);\n if (pulseEnabled && this._myPulseTimer == 0) {\n if (this._myAdditionalSetup.myHandedness == PP.ToolHandedness.RIGHT) {\n this._myRightGamepad.pulse(this._mySetup.myPulseIntensity, this._mySetup.myPulseDuration);\n } else {\n this._myLeftGamepad.pulse(this._mySetup.myPulseIntensity, this._mySetup.myPulseDuration);\n }\n this._myPulseTimer = this._mySetup.myPulseDelay;\n }\n }\n }\n\n _isSimpleArray(array) {\n if (this._isSpecialSimpleArray(array)) {\n return true;\n } else if (Array.isArray(array)) {\n let isBuiltIn = true;\n for (let element of array) {\n if (element instanceof Object) {\n isBuiltIn = false;\n break;\n }\n }\n\n return isBuiltIn;\n }\n\n return false;\n }\n\n _isSpecialSimpleArray(item) {\n return item && item.constructor &&\n (\n item.constructor.name == \"Uint32Array\" ||\n item.constructor.name == \"Int32Array\" ||\n item.constructor.name == \"Float32Array\" ||\n item.constructor.name == \"Float64Array\"\n );\n }\n\n _setGamepadScrollActive(active) {\n this._myGamepadScrollActive = active;\n\n if (!this._mySetup.myGamepadScrollOnlyOnHover) {\n this._myGamepadScrollActive = true;\n }\n }\n\n _jsonReplacer(key, value) {\n if (value instanceof Map) {\n return Array.from(value.entries());\n } else if (this._isSimpleArray(value)) {\n let array = value;\n if (this._isSpecialSimpleArray(array)) {\n let arrayCopy = []; // Special arrays like Float32Array do not print like Array\n for (let i = 0; i < array.length; i++) {\n arrayCopy[i] = array[i];\n }\n\n array = arrayCopy;\n }\n\n let stringifiedArray = JSON.stringify(array);\n stringifiedArray = stringifiedArray.split(\",\").join(\", \");\n return stringifiedArray;\n } else {\n return value;\n }\n }\n};\n\nPP.ConsoleVRWidget.ConsoleFunction = {\n INFO: 0,\n WARN: 1,\n ERROR: 2,\n LOG: 3,\n DEBUG: 4,\n ASSERT: 5\n};\n\nPP.ConsoleVRWidget.Sender = {\n BROWSER_CONSOLE: 0,\n CONSOLE_VR: 1,\n WINDOW: 2\n};\n\nPP.ConsoleVRWidget.PulseOnNewMessage = {\n NEVER: 0,\n ALWAYS: 1,\n WHEN_HIDDEN: 2,\n};\n\nPP.ConsoleVRWidget.MessageType = {\n INFO: 0,\n WARN: 1,\n ERROR: 2,\n LOG: 3\n};\n\nPP.ConsoleVRWidget.Message = class Message {\n constructor(messageType, messageLines) {\n this.myType = messageType;\n this.myLines = messageLines;\n\n this._myOriginalText = messageLines.join(\"\\n\");\n\n this._myMessagesCount = 1;\n }\n\n hasSameInfo(message) {\n return this._myOriginalText == message._myOriginalText && this.myType == message.myType;\n }\n\n increaseCount() {\n this._myMessagesCount += 1;\n\n let countString = ((\"(x\").concat(this._myMessagesCount)).concat(\") \");\n\n let text = this._myOriginalText.slice(0);\n text = countString.concat(text);\n this.myLines = text.split(\"\\n\");\n }\n};\n\nPP.ConsoleVR = {\n _myRealLog: console.log,\n _myRealError: console.error,\n _myRealWarn: console.warn,\n _myRealInfo: console.info,\n _myRealDebug: console.debug,\n _myRealAssert: console.assert,\n _myRealClear: console.clear,\n _myForwardToBrowserConsole: true,\n\n log: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealLog.apply(console, args);\n }\n },\n error: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealError.apply(console, args);\n }\n },\n warn: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealWarn.apply(console, args);\n }\n },\n info: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealInfo.apply(console, args);\n }\n },\n debug: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealDebug.apply(console, args);\n }\n },\n assert: function (...args) {\n if (this._myForwardToBrowserConsole) {\n this._myRealAssert.apply(console, args);\n }\n },\n clear: function () {\n if (this._myForwardToBrowserConsole) {\n this._myRealClear.apply(console);\n }\n },\n setForwardToBrowserConsole: function (forwardToBrowserConsole) {\n this._myForwardToBrowserConsole = forwardToBrowserConsole;\n },\n isForwardToBrowserConsole: function () {\n return this._myForwardToBrowserConsole;\n }\n};", "WL.registerComponent('pp-console-vr', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['none', 'left', 'right'], default: 'none' },\r\n _myOverrideBrowserConsole: { type: WL.Type.Bool, default: true },\r\n _myShowOnStart: { type: WL.Type.Bool, default: false },\r\n _myShowVisibilityButton: { type: WL.Type.Bool, default: false },\r\n _myPulseOnNewMessage: { type: WL.Type.Enum, values: ['never', 'always', 'when hidden'], default: 'never' }\r\n}, {\r\n init: function () {\r\n this._myWidget = new PP.ConsoleVRWidget();\r\n\r\n this._myStarted = false;\r\n },\r\n start: function () {\r\n let additionalSetup = {};\r\n additionalSetup.myHandedness = [null, 'left', 'right'][this._myHandedness];\r\n additionalSetup.myOverrideBrowserConsole = this._myOverrideBrowserConsole;\r\n additionalSetup.myShowOnStart = this._myShowOnStart;\r\n additionalSetup.myShowVisibilityButton = this._myShowVisibilityButton;\r\n additionalSetup.myPulseOnNewMessage = this._myPulseOnNewMessage;\r\n additionalSetup.myPlaneMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque;\r\n additionalSetup.myTextMaterial = PP.myDefaultResources.myMaterials.myText;\r\n\r\n this._myWidget.start(this.object, additionalSetup);\r\n\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._myStarted = true;\r\n },\r\n update: function (dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this._myWidget.setVisible(false);\r\n this._myWidget.setVisible(this._myWidgetVisibleBackup);\r\n }\r\n\r\n this._myWidget.update(dt);\r\n },\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n },\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n\r\n this._myWidget.setVisible(false);\r\n }\r\n },\r\n});\r\n", "//Don't move inside easy_object_tuners folder, otherwise it won't resolve the parent class dependency\r\n\r\nPP.EasyObjectTuner = class EasyObjectTuner {\r\n constructor(object, variableName, setAsDefault, useTuneTarget) {\r\n this._myObject = object;\r\n this._myUseTuneTarget = useTuneTarget;\r\n this._mySetAsDefault = setAsDefault;\r\n\r\n this._myEasyObject = this._myObject;\r\n if (this._myUseTuneTarget) {\r\n this._myEasyObject = PP.myEasyTuneTarget;\r\n }\r\n this._myPrevEasyObject = null;\r\n\r\n let variableNamePrefix = this._getVariableNamePrefix();\r\n\r\n if (variableName == \"\") {\r\n this._myEasyTuneVariableName = variableNamePrefix.concat(this._myObject.objectId);\r\n } else {\r\n this._myEasyTuneVariableName = variableNamePrefix.concat(variableName);\r\n }\r\n }\r\n\r\n start() {\r\n let easyTuneVariable = this._createEasyTuneVariable(this._myEasyTuneVariableName);\r\n\r\n PP.myEasyTuneVariables.add(easyTuneVariable);\r\n if (this._mySetAsDefault) {\r\n PP.setEasyTuneWidgetActiveVariable(this._myEasyTuneVariableName);\r\n }\r\n }\r\n\r\n update(dt) {\r\n if (PP.myEasyTuneVariables.isActive(this._myEasyTuneVariableName)) {\r\n if (this._myUseTuneTarget) {\r\n this._myEasyObject = PP.myEasyTuneTarget;\r\n }\r\n\r\n if (this._myPrevEasyObject != this._myEasyObject) {\r\n this._myPrevEasyObject = this._myEasyObject;\r\n if (this._myEasyObject) {\r\n let value = this._getObjectValue(this._myEasyObject);\r\n PP.myEasyTuneVariables.set(this._myEasyTuneVariableName, value, true);\r\n } else {\r\n let value = this._getDefaultValue();\r\n PP.myEasyTuneVariables.set(this._myEasyTuneVariableName, value, true);\r\n }\r\n }\r\n\r\n if (this._myEasyObject) {\r\n this._updateObjectValue(this._myEasyObject, PP.myEasyTuneVariables.get(this._myEasyTuneVariableName));\r\n }\r\n }\r\n }\r\n\r\n updateVariableValue(value) {\r\n PP.myEasyTuneVariables.set(this._myEasyTuneVariableName, value);\r\n }\r\n};", "WL.registerComponent(\"pp-easy-light-attenuation\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false }\r\n\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyLightAttenuation(this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyLightAttenuation = class EasyLightAttenuation extends PP.EasyObjectTuner {\r\n constructor(object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n let nameFirstPart = \"Light Attenuation \";\r\n return nameFirstPart;\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneNumber(variableName, this._getDefaultValue(), 0.01, 3, 0, 1);\r\n }\r\n\r\n _getObjectValue(object) {\r\n let attenuation = this._getLightAttenuation(object);\r\n return attenuation;\r\n }\r\n\r\n _getDefaultValue() {\r\n return 0;\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n let attenuation = value;\r\n\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n light.color[3] = attenuation;\r\n }\r\n }\r\n\r\n _getLightAttenuation(object) {\r\n let attenuation = this._getDefaultValue();\r\n\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n attenuation = light.color[3];\r\n }\r\n\r\n return attenuation;\r\n }\r\n};", "WL.registerComponent(\"pp-easy-light-color\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _myColorModel: { type: WL.Type.Enum, values: ['rgb', 'hsv'] }\r\n\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyLightColor(this._myColorModel, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyLightColor = class EasyLightColor extends PP.EasyObjectTuner {\r\n constructor(colorModel, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myColorModel = colorModel;\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == 0) {\r\n nameFirstPart = \"Light RGB \";\r\n } else {\r\n nameFirstPart = \"Light HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneIntArray(variableName, this._getDefaultValue(), 100, 0, 255);\r\n }\r\n\r\n _getObjectValue(object) {\r\n let color = null;\r\n\r\n let lightColor = this._getLightColor(object);\r\n if (lightColor) {\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbCodeToHuman(lightColor);\r\n } else {\r\n color = PP.ColorUtils.hsvCodeToHuman(PP.ColorUtils.rgbToHsv(lightColor));\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n _getDefaultValue() {\r\n return PP.vec3_create();\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n let color = value;\r\n\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbHumanToCode(color);\r\n } else {\r\n color = PP.ColorUtils.hsvToRgb(PP.ColorUtils.hsvHumanToCode(color));\r\n }\r\n\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n light.color[0] = color[0];\r\n light.color[1] = color[1];\r\n light.color[2] = color[2];\r\n light.color[3] = light.color[3];\r\n }\r\n\r\n if ((PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed) ||\r\n (PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed)) {\r\n\r\n let hsvColor = PP.ColorUtils.color1To255(PP.ColorUtils.rgbToHsv(color));\r\n let rgbColor = PP.ColorUtils.color1To255(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n\r\n _getLightColor(object) {\r\n let color = null;\r\n let light = object.pp_getComponent(\"light\");\r\n if (light) {\r\n color = light.color.slice(0, 3);\r\n }\r\n\r\n return color;\r\n }\r\n};", "WL.registerComponent(\"pp-easy-mesh-color\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myColorModel: { type: WL.Type.Enum, values: ['rgb', 'hsv'], default: 'hsv' },\r\n _myColorType: { type: WL.Type.Enum, values: ['color', 'diffuse color', 'ambient color', 'specular color', 'emissive color', 'fog color', 'ambient factor'], default: 'color' },\r\n\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyMeshColor(this._myColorModel, this._myColorType, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyMeshColor = class EasyMeshColor extends PP.EasyObjectTuner {\r\n constructor(colorModel, colorType, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myColorModel = colorModel;\r\n this._myColorType = colorType;\r\n this._myColorVariableNames = ['color', 'diffuseColor', 'ambientColor', 'specularColor', 'emissiveColor', 'fogColor', 'ambientFactor',];\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n let nameFirstPart = null;\r\n\r\n if (this._myColorModel == 0) {\r\n nameFirstPart = \"Mesh RGB \";\r\n } else {\r\n nameFirstPart = \"Mesh HSV \";\r\n }\r\n\r\n return nameFirstPart;\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n if (this._myColorType == 6) {\r\n return new PP.EasyTuneNumberArray(variableName, this._getDefaultValue(), 0.1, 3, 0, 1);\r\n }\r\n return new PP.EasyTuneIntArray(variableName, this._getDefaultValue(), 100, 0, 255);\r\n }\r\n\r\n _getObjectValue(object) {\r\n let color = null;\r\n\r\n let meshMaterial = this._getMeshMaterial(object);\r\n if (meshMaterial) {\r\n if (this._myColorType != 6) {\r\n color = meshMaterial[this._myColorVariableNames[this._myColorType]].pp_clone();\r\n\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbCodeToHuman(color);\r\n } else {\r\n color = PP.ColorUtils.hsvCodeToHuman(PP.ColorUtils.rgbToHsv(color));\r\n }\r\n } else {\r\n color = [meshMaterial[this._myColorVariableNames[this._myColorType]]];\r\n }\r\n } else {\r\n color = this._getDefaultValue();\r\n }\r\n\r\n return color;\r\n }\r\n\r\n _getDefaultValue() {\r\n if (this._myColorType == 6) {\r\n return [0];\r\n }\r\n\r\n return PP.vec4_create();\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n let color = value;\r\n\r\n if (this._myColorType != 6) {\r\n if (this._myColorModel == 0) {\r\n color = PP.ColorUtils.rgbHumanToCode(color);\r\n } else {\r\n color = PP.ColorUtils.hsvToRgb(PP.ColorUtils.hsvHumanToCode(color));\r\n }\r\n }\r\n\r\n let meshMaterial = this._getMeshMaterial(object);\r\n if (meshMaterial) {\r\n meshMaterial[this._myColorVariableNames[this._myColorType]] = color;\r\n }\r\n\r\n if (this._myColorType != 6) {\r\n if ((PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed) ||\r\n (PP.myLeftGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && PP.myRightGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed)) {\r\n\r\n let hsvColor = PP.ColorUtils.color1To255(PP.ColorUtils.rgbToHsv(color));\r\n let rgbColor = PP.ColorUtils.color1To255(color);\r\n\r\n console.log(\"RGB:\", rgbColor.vec_toString(0), \"- HSV:\", hsvColor.vec_toString(0));\r\n }\r\n }\r\n }\r\n\r\n _getMeshMaterial(object) {\r\n let material = null;\r\n let mesh = object.pp_getComponentHierarchy(\"mesh\");\r\n if (mesh) {\r\n material = mesh.material;\r\n }\r\n\r\n return material;\r\n }\r\n};", "WL.registerComponent(\"pp-easy-scale\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _myIsLocal: { type: WL.Type.Bool, default: false },\r\n _myScaleAsOne: { type: WL.Type.Bool, default: true }, // Edit all scale values together\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyScale(this._myIsLocal, this._myScaleAsOne, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyScale = class EasyScale extends PP.EasyObjectTuner {\r\n constructor(isLocal, scaleAsOne, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myIsLocal = isLocal;\r\n this._myScaleAsOne = scaleAsOne;\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n return \"Scale \";\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneNumberArray(variableName, this._getDefaultValue(), 1, 3, 0.001, null, this._myScaleAsOne);\r\n }\r\n\r\n _getObjectValue(object) {\r\n return this._myIsLocal ? object.pp_getScaleLocal() : object.pp_getScaleWorld();\r\n }\r\n\r\n _getDefaultValue() {\r\n return PP.vec3_create(1, 1, 1);\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n if (this._myIsLocal) {\r\n object.pp_setScaleLocal(value);\r\n } else {\r\n object.pp_setScaleWorld(value);\r\n }\r\n }\r\n};", "WL.registerComponent(\"pp-easy-set-tune-target-child-number\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myEasyTuneVariableName = \"Target Child \";\r\n\r\n if (this._myVariableName == \"\") {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this.object.objectId);\r\n } else {\r\n this._myEasyTuneVariableName = this._myEasyTuneVariableName.concat(this._myVariableName);\r\n }\r\n\r\n let childrenCount = this.object.pp_getChildren().length;\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n PP.myEasyTuneVariables.add(new PP.EasyTuneInt(this._myEasyTuneVariableName, 0, 10, min, max));\r\n if (this._mySetAsDefault) {\r\n PP.setEasyTuneWidgetActiveVariable(this._myEasyTuneVariableName);\r\n }\r\n\r\n this._myCurrentChildIndex = -1;\r\n this._myCurrentChildrenCount = childrenCount;\r\n },\r\n update: function () {\r\n if (PP.myEasyTuneVariables.isActive(this._myEasyTuneVariableName)) {\r\n let childrenCount = this.object.pp_getChildren().length;\r\n if (childrenCount != this._myCurrentChildrenCount) {\r\n this._myCurrentChildrenCount = childrenCount;\r\n\r\n let min = 1;\r\n let max = childrenCount;\r\n if (childrenCount == 0) {\r\n min = 0;\r\n max = 0;\r\n }\r\n\r\n let easyTuneVariable = PP.myEasyTuneVariables.getEasyTuneVariable(this._myEasyTuneVariableName);\r\n easyTuneVariable.setMin(min);\r\n easyTuneVariable.setMax(max);\r\n }\r\n\r\n let childIndex = PP.myEasyTuneVariables.get(this._myEasyTuneVariableName);\r\n if (childIndex != this._myCurrentChildIndex) {\r\n if (childIndex == 0 && this._myCurrentChildIndex != -1) {\r\n PP.myEasyTuneTarget = null;\r\n } else if (childIndex > 0) {\r\n PP.myEasyTuneTarget = this.object.pp_getChildren()[childIndex - 1];\r\n }\r\n\r\n this._myCurrentChildIndex = childIndex;\r\n }\r\n }\r\n }\r\n});", "WL.registerComponent(\"pp-easy-set-tune-target-grab\", {\r\n}, {\r\n init: function () {\r\n },\r\n start: function () {\r\n this._myGrabber = this.object.pp_getComponent(\"pp-grabber-hand\");\r\n },\r\n update: function () {\r\n },\r\n _onRelease: function (grabber, grabbable) {\r\n PP.myEasyTuneTarget = grabbable.object;\r\n },\r\n _onGrab: function (grabber, grabbable) {\r\n //PP.myEasyTuneTarget = null;\r\n },\r\n onActivate() {\r\n this._myGrabber.registerGrabEventListener(this, this._onGrab.bind(this));\r\n this._myGrabber.registerThrowEventListener(this, this._onRelease.bind(this));\r\n },\r\n onDeactivate() {\r\n this._myGrabber.unregisterGrabEventListener(this);\r\n this._myGrabber.unregisterThrowEventListener(this);\r\n }\r\n});", "WL.registerComponent(\"pp-easy-transform\", {\r\n _myVariableName: { type: WL.Type.String, default: \"\" },\r\n _mySetAsDefault: { type: WL.Type.Bool, default: false },\r\n _myUseTuneTarget: { type: WL.Type.Bool, default: false },\r\n _myIsLocal: { type: WL.Type.Bool, default: false },\r\n _myScaleAsOne: { type: WL.Type.Bool, default: true }, // Edit all scale values together\r\n}, {\r\n init: function () {\r\n this._myEasyObjectTuner = new PP.EasyTransform(this._myIsLocal, this._myScaleAsOne, this.object, this._myVariableName, this._mySetAsDefault, this._myUseTuneTarget);\r\n },\r\n start: function () {\r\n this._myEasyObjectTuner.start();\r\n },\r\n update: function (dt) {\r\n this._myEasyObjectTuner.update(dt);\r\n }\r\n});\r\n\r\nPP.EasyTransform = class EasyTransform extends PP.EasyObjectTuner {\r\n constructor(isLocal, scaleAsOne, object, variableName, setAsDefault, useTuneTarget) {\r\n super(object, variableName, setAsDefault, useTuneTarget);\r\n this._myIsLocal = isLocal;\r\n this._myScaleAsOne = scaleAsOne;\r\n }\r\n\r\n _getVariableNamePrefix() {\r\n return \"Transform \";\r\n }\r\n\r\n _createEasyTuneVariable(variableName) {\r\n return new PP.EasyTuneTransform(variableName, this._getDefaultValue(), this._myScaleAsOne);\r\n }\r\n\r\n _getObjectValue(object) {\r\n return this._myIsLocal ? object.pp_getTransformLocal() : object.pp_getTransformWorld();\r\n }\r\n\r\n _getDefaultValue() {\r\n return PP.mat4_create();\r\n }\r\n\r\n _updateObjectValue(object, value) {\r\n if (this._myIsLocal) {\r\n object.pp_setTransformLocal(value);\r\n } else {\r\n object.pp_setTransformWorld(value);\r\n }\r\n }\r\n};", "\nPP.EasyTuneBoolArrayWidget = class EasyTuneBoolArrayWidget {\n\n constructor(arraySize, gamepad) {\n this._myGamepad = gamepad;\n\n this._mySetup = new PP.EasyTuneBoolArrayWidgetSetup(arraySize);\n this._myUI = new PP.EasyTuneBoolArrayWidgetUI();\n\n this._myVariable = null;\n\n this._myIsVisible = true;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myAppendToVariableName = \"\";\n\n this._myValueEditIndex = 0;\n this._myValueButtonEditIntensity = 0;\n this._myValueButtonEditIntensityTimer = 0;\n this._myValueEditActive = false;\n\n this._myScrollVariableActive = false;\n this._myScrollDirection = 0;\n this._myScrollVariableTimer = 0;\n this._myHasScrolled = false;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n\n if ((typeof appendToVariableName) !== 'undefined') {\n this._myAppendToVariableName = appendToVariableName;\n } else {\n this._myAppendToVariableName = \"\";\n }\n\n this._refreshUI();\n }\n\n isScrollVariableActive() {\n return this._myScrollVariableActive;\n }\n\n getScrollVariableDirection() {\n return this._myScrollDirection;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n this._myScrollVariableActive = active;\n this._myScrollDirection = scrollDirection;\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = false;\n }\n\n _refreshUI() {\n if (this._myVariable) {\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._myUI.myValueTextComponents[i].text = (this._myVariable.myValue[i]) ? \"true\" : \"false\";\n }\n }\n }\n\n setVisible(visible) {\n if (visible) {\n this._refreshUI();\n }\n this._myUI.setVisible(visible);\n\n this._myIsVisible = visible;\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setAdditionalButtonsActive(additionalSetup.myEnableAdditionalButtons);\n\n this._addListeners();\n }\n\n update(dt) {\n if (this._isActive()) {\n this._updateValue(dt);\n this._updateScrollVariable(dt);\n }\n }\n\n _updateValue(dt) {\n let stickVariableIntensity = 0;\n\n if (this._myGamepad) {\n stickVariableIntensity = this._myGamepad.getAxesInfo().myAxes[1];\n }\n\n let valueIntensity = 0;\n if (this._myValueEditActive) {\n valueIntensity = stickVariableIntensity;\n } else if (this._myValueButtonEditIntensity != 0) {\n if (this._myValueButtonEditIntensityTimer <= 0) {\n valueIntensity = this._myValueButtonEditIntensity;\n } else {\n this._myValueButtonEditIntensityTimer -= dt;\n }\n }\n\n if (Math.abs(valueIntensity) > this._mySetup.myThumbstickToggleThreshold) {\n this._myVariable.myValue[this._myValueEditIndex] = valueIntensity > 0;\n this._refreshUI();\n }\n }\n\n _updateScrollVariable(dt) {\n if (this._myScrollVariableActive) {\n if (this._myScrollVariableTimer <= 0) {\n this._scrollVariableRequest(this._myScrollDirection);\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = true;\n } else {\n this._myScrollVariableTimer -= dt;\n }\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myVariableLabelCursorTargetComponent.addClickFunction(this._resetAllValues.bind(this));\n ui.myVariableLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myVariableLabelText));\n ui.myVariableLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myVariableLabelText, this._mySetup.myVariableLabelTextScale));\n\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n\n ui.myValueIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n\n ui.myValueCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, i));\n ui.myValueCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], true));\n ui.myValueCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], false));\n }\n }\n }\n\n _setValueEditIntensity(index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myValueButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n this._myValueEditIndex = index;\n }\n\n this._myValueButtonEditIntensity = value;\n }\n }\n\n _setValueEditActive(index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n this._myValueEditIndex = index;\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myValueTextScale;\n }\n\n this._myValueEditActive = active;\n }\n }\n\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\n if (this._isActive() || !active) {\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\n let oldScrollDirection = this._myScrollDirection;\n\n this.setScrollVariableActive(active, scrollDirection);\n\n if (forceScroll) {\n this._scrollVariableRequest(oldScrollDirection);\n }\n }\n }\n\n _scrollVariableRequest(amount) {\n if (this._isActive() && amount != 0) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n }\n\n _resetValue(index) {\n if (this._isActive()) {\n this._myVariable.myValue[index] = this._myVariable.myInitialValue[index];\n this._myUI.myValueTextComponents[index].text = (this._myVariable.myValue[index]) ? \"true\" : \"false\";\n }\n }\n\n _resetAllValues() {\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._resetValue(i);\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n _genericTextHover(text) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n }\n\n _genericTextUnHover(text, originalScale) {\n text.scalingWorld = originalScale;\n }\n};", "\nPP.EasyTuneBoolArrayWidgetUI = class EasyTuneBoolArrayWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myAdditionalButtonsActive = true;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n if (visible) {\n this.setAdditionalButtonsActive(this._myAdditionalButtonsActive);\n }\n }\n\n setAdditionalButtonsActive(active) {\n this._myAdditionalButtonsActive = active;\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myValueDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n this.myVariableLabelCursorTarget = WL.scene.addObject(this.myVariableLabelPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n\n this.myValuesPanel = WL.scene.addObject(this.myDisplayPanel);\n\n this.myValuePanels = [];\n this.myValueTexts = [];\n this.myValueCursorTargets = [];\n\n this.myValueIncreaseButtonPanels = [];\n this.myValueIncreaseButtonBackgrounds = [];\n this.myValueIncreaseButtonTexts = [];\n this.myValueIncreaseButtonCursorTargets = [];\n\n this.myValueDecreaseButtonPanels = [];\n this.myValueDecreaseButtonBackgrounds = [];\n this.myValueDecreaseButtonTexts = [];\n this.myValueDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i] = WL.scene.addObject(this.myValuesPanel);\n this.myValueTexts[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueCursorTargets[i] = WL.scene.addObject(this.myValuePanels[i]);\n\n //Increase/Decrease\n this.myValueIncreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonTexts[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n\n this.myValueDecreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonTexts[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n }\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n this.myVariableLabelCursorTarget.setTranslationLocal(this._mySetup.myVariableLabelCursorTargetPosition);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValuesPanel.setTranslationLocal(this._mySetup.myValuesPanelPosition);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myValueTexts[i].scale(this._mySetup.myValueTextScale);\n this.myValueCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myValueIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myValueIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValueDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myValueDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.addComponent('cursor-target');\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.addComponent('collision');\n this.myVariableLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myVariableLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myVariableLabelCollisionComponent.extents = this._mySetup.myVariableLabelCollisionExtents;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueTextComponents = [];\n this.myValueCursorTargetComponents = [];\n this.myValueCollisionComponents = [];\n\n this.myValueIncreaseButtonBackgroundComponents = [];\n this.myValueIncreaseButtonTextComponents = [];\n this.myValueIncreaseButtonCursorTargetComponents = [];\n this.myValueIncreaseButtonCollisionComponents = [];\n\n this.myValueDecreaseButtonBackgroundComponents = [];\n this.myValueDecreaseButtonTextComponents = [];\n this.myValueDecreaseButtonCursorTargetComponents = [];\n this.myValueDecreaseButtonCollisionComponents = [];\n\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueTextComponents[i] = this.myValueTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueTextComponents[i]);\n this.myValueTextComponents[i].text = \" \";\n\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].addComponent('cursor-target');\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].addComponent('collision');\n this.myValueCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\n this.myValueIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\n this.myValueDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneBoolArrayWidgetSetup = class EasyTuneBoolArrayWidgetSetup {\n\n constructor(arraySize) {\n this.myArraySize = arraySize;\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00802713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00802713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00802713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let distanceFromValue = 0.055;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [0, 0, -0.00001];\n this.myLeftSideButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myRightSideButtonPosition = [0, 0, -0.00001];\n this.myRightSideButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myIncreaseButtonText = \"+\";\n this.myDecreaseButtonText = \"-\";\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myVariableLabelCursorTargetPosition = [0, 0, 0];\n this.myVariableLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myVariableLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromValue, panelZ];\n\n this.myValueTextScale = [0.4, 0.4, 0.4];\n\n this.myValueCursorTargetPosition = [0, 0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\n\n this.myValuePanelsPositions = [];\n this.myValuePanelsPositions[0] = [0, 0, 0];\n for (let i = 1; i < this.myArraySize; i++) {\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].slice(0);\n this.myValuePanelsPositions[i][1] -= this.myDistanceBetweenValues;\n }\n\n //Background\n {\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myDisplayPanelPosition[1] + this.myValuesPanelPosition[1] + valuePanelLastPosition - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n this.myBackPanelPosition = [0, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [backgroundHalfWidth, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myTextHoverScaleMultiplier = [1.25, 1.25, 1.25];\n\n this.myThumbstickToggleThreshold = 0.6;\n this.myButtonEditDelay = 0;\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "\nPP.EasyTuneBoolWidget = class EasyTuneBoolWidget {\n\n constructor(gamepad) {\n this._myGamepad = gamepad;\n\n this._myParentObject = null;\n this._myAdditionalSetup = null;\n\n this._myWidgets = new Map();\n\n this._myVariable = null;\n this._myIsVisible = true;\n\n this._myAppendToVariableName = null;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myCurrentArraySize = 0;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n this._myCurrentArraySize = this._myVariable.myValue.length;\n this._myAppendToVariableName = appendToVariableName;\n\n if (!this._myWidgets.has(this._myCurrentArraySize)) {\n this._createWidget(this._myCurrentArraySize);\n }\n\n this._myWidgets.get(this._myCurrentArraySize).setEasyTuneVariable(variable, appendToVariableName);\n\n this.setVisible(this._myIsVisible);\n }\n\n setVisible(visible) {\n for (let widget of this._myWidgets.values()) {\n widget.setVisible(false);\n }\n\n if (this._myVariable) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).setVisible(visible);\n }\n\n this._myIsVisible = visible;\n }\n\n isScrollVariableActive() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.isScrollVariableActive();\n }\n\n return false;\n }\n\n getScrollVariableDirection() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.getScrollVariableDirection();\n }\n\n return 0;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n widget.setScrollVariableActive(active, scrollDirection);\n }\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myParentObject = parentObject;\n this._myAdditionalSetup = additionalSetup;\n\n this._createWidget(1);\n\n if (this._myVariable) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n\n update(dt) {\n if (this._isActive()) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).update(dt);\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _scrollVariableRequest(amount) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n\n _createWidget(arraySize) {\n this._myWidgets.set(arraySize, new PP.EasyTuneBoolArrayWidget(arraySize, this._myGamepad));\n this._myWidgets.get(arraySize).start(this._myParentObject, this._myAdditionalSetup);\n this._myWidgets.get(arraySize).setVisible(false);\n this._myWidgets.get(arraySize).registerScrollVariableRequestEventListener(this, this._scrollVariableRequest.bind(this));\n }\n\n _sizeChangedCheck() {\n if (this._myVariable.myValue.length != this._myCurrentArraySize) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n};", "\r\nPP.EasyTuneNoneWidget = class EasyTuneNoneWidget {\r\n\r\n constructor() {\r\n this._mySetup = new PP.EasyTuneNoneWidgetSetup();\r\n this._myUI = new PP.EasyTuneNoneWidgetUI();\r\n\r\n this._myVariable = null;\r\n\r\n this._myIsVisible = true;\r\n\r\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\r\n\r\n this._myAppendToVariableName = \"\";\r\n\r\n this._myScrollVariableActive = false;\r\n this._myScrollDirection = 0;\r\n this._myScrollVariableTimer = 0;\r\n this._myHasScrolled = false;\r\n }\r\n\r\n setEasyTuneVariable(variable, appendToVariableName) {\r\n this._myVariable = variable;\r\n\r\n if ((typeof appendToVariableName) !== 'undefined') {\r\n this._myAppendToVariableName = appendToVariableName;\r\n } else {\r\n this._myAppendToVariableName = \"\";\r\n }\r\n\r\n this._refreshUI();\r\n }\r\n\r\n isScrollVariableActive() {\r\n return this._myScrollVariableActive;\r\n }\r\n\r\n getScrollVariableDirection() {\r\n return this._myScrollDirection;\r\n }\r\n\r\n setScrollVariableActive(active, scrollDirection) {\r\n this._myScrollVariableActive = active;\r\n this._myScrollDirection = scrollDirection;\r\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\r\n this._myHasScrolled = false;\r\n }\r\n\r\n _refreshUI() {\r\n if (this._myVariable) {\r\n if (this._myVariable.myName != null) {\r\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\r\n } else {\r\n let name = \"Unknown\";\r\n this._myUI.myVariableLabelTextComponent.text = name.concat(this._myAppendToVariableName);\r\n }\r\n }\r\n }\r\n\r\n setVisible(visible) {\r\n if (visible) {\r\n this._refreshUI();\r\n }\r\n this._myUI.setVisible(visible);\r\n\r\n this._myIsVisible = visible;\r\n }\r\n\r\n registerScrollVariableRequestEventListener(id, callback) {\r\n this._myScrollVariableRequestCallbacks.set(id, callback);\r\n }\r\n\r\n unregisterScrollVariableRequestEventListener(id) {\r\n this._myScrollVariableRequestCallbacks.delete(id);\r\n }\r\n\r\n start(parentObject, additionalSetup) {\r\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\r\n\r\n this._addListeners();\r\n }\r\n\r\n update(dt) {\r\n if (this._isActive()) {\r\n this._updateScrollVariable(dt);\r\n }\r\n }\r\n\r\n _updateScrollVariable(dt) {\r\n if (this._myScrollVariableActive) {\r\n if (this._myScrollVariableTimer <= 0) {\r\n this._scrollVariableRequest(this._myScrollDirection);\r\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\r\n this._myHasScrolled = true;\r\n } else {\r\n this._myScrollVariableTimer -= dt;\r\n }\r\n }\r\n }\r\n\r\n _isActive() {\r\n return this._myIsVisible && this._myVariable;\r\n }\r\n\r\n _addListeners() {\r\n let ui = this._myUI;\r\n\r\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\r\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\r\n\r\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\r\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\r\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\r\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\r\n }\r\n\r\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\r\n if (this._isActive() || !active) {\r\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\r\n let oldScrollDirection = this._myScrollDirection;\r\n\r\n this.setScrollVariableActive(active, scrollDirection);\r\n\r\n if (forceScroll) {\r\n this._scrollVariableRequest(oldScrollDirection);\r\n }\r\n }\r\n }\r\n\r\n _scrollVariableRequest(amount) {\r\n if (this._isActive() && amount != 0) {\r\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\r\n callback(amount);\r\n }\r\n }\r\n }\r\n\r\n _genericHover(material) {\r\n material.color = this._mySetup.myButtonHoverColor;\r\n }\r\n\r\n _genericUnHover(material) {\r\n material.color = this._mySetup.myBackgroundColor;\r\n }\r\n};", "\nPP.EasyTuneNoneWidgetUI = class EasyTuneNoneWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n\n this.myTypeNotSupportedPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myTypeNotSupportedText = WL.scene.addObject(this.myTypeNotSupportedPanel);\n this.myTypeNotSupportedCursorTarget = WL.scene.addObject(this.myTypeNotSupportedPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n\n this.myTypeNotSupportedPanel.setTranslationLocal(this._mySetup.myTypeNotSupportedPanelPosition);\n this.myTypeNotSupportedText.scale(this._mySetup.myTypeNotSupportedTextScale);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myTypeNotSupportedTextComponent = this.myTypeNotSupportedText.addComponent('text');\n this._setupTextComponent(this.myTypeNotSupportedTextComponent);\n this.myTypeNotSupportedTextComponent.text = this._mySetup.myTypeNotSupportedText;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneNoneWidgetSetup = class EasyTuneNoneWidgetSetup {\n\n constructor() {\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00804713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00804713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00804713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [0, 0, -0.00001];\n this.myLeftSideButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myRightSideButtonPosition = [0, 0, -0.00001];\n this.myRightSideButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myTypeNotSupportedPanelPosition = [0, -0.03, panelZ];\n this.myTypeNotSupportedTextScale = [0.275, 0.275, 0.275];\n this.myTypeNotSupportedText = \"Type Not Supported\";\n\n this.myValueCursorTargetPosition = [0, 0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n //Background\n {\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myDisplayPanelPosition[1] + this.myTypeNotSupportedPanelPosition[1] - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n this.myBackPanelPosition = [0, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [backgroundHalfWidth, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "\nPP.EasyTuneNumberArrayWidget = class EasyTuneNumberArrayWidget {\n\n constructor(arraySize, gamepad) {\n this._myGamepad = gamepad;\n\n this._mySetup = new PP.EasyTuneNumberArrayWidgetSetup(arraySize);\n this._myUI = new PP.EasyTuneNumberArrayWidgetUI();\n\n this._myVariable = null;\n\n this._myIsVisible = true;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myAppendToVariableName = \"\";\n\n this._myValueEditIndex = -1;\n\n this._myValueButtonEditIntensity = 0;\n this._myValueButtonEditIntensityTimer = 0;\n this._myStepButtonEditIntensity = 0;\n this._myStepButtonEditIntensityTimer = 0;\n\n this._myValueEditActive = false;\n this._myStepEditActive = false;\n\n this._myValueRealValue = null;\n this._myStepMultiplierValue = null;\n this._myStepFastEdit = false;\n\n this._myScrollVariableActive = false;\n this._myScrollDirection = 0;\n this._myScrollVariableTimer = 0;\n this._myHasScrolled = false;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n\n if ((typeof appendToVariableName) !== 'undefined') {\n this._myAppendToVariableName = appendToVariableName;\n } else {\n this._myAppendToVariableName = \"\";\n }\n\n if (this._myValueEditIndex >= 0) {\n this._myValueRealValue = this._myVariable.myValue[this._myValueEditIndex];\n }\n\n this._refreshUI();\n }\n\n isScrollVariableActive() {\n return this._myScrollVariableActive;\n }\n\n getScrollVariableDirection() {\n return this._myScrollDirection;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n this._myScrollVariableActive = active;\n this._myScrollDirection = scrollDirection;\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = false;\n }\n\n _refreshUI() {\n if (this._myVariable) {\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._myUI.myValueTextComponents[i].text = this._myVariable.myValue[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n\n this._myUI.myStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myStepPerSecond);\n }\n }\n\n setVisible(visible) {\n if (visible) {\n this._refreshUI();\n }\n this._myUI.setVisible(visible);\n\n this._myIsVisible = visible;\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setAdditionalButtonsActive(additionalSetup.myEnableAdditionalButtons);\n\n this._addListeners();\n }\n\n update(dt) {\n if (this._isActive()) {\n this._updateValue(dt);\n this._updateScrollVariable(dt);\n }\n }\n\n _updateValue(dt) {\n let stickVariableIntensity = 0;\n\n if (this._myGamepad) {\n let y = this._myGamepad.getAxesInfo().myAxes[1];\n\n if (Math.abs(y) > this._mySetup.myEditThumbstickMinThreshold) {\n let normalizedEditAmount = (Math.abs(y) - this._mySetup.myEditThumbstickMinThreshold) / (1 - this._mySetup.myEditThumbstickMinThreshold);\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\n }\n }\n\n let valueIntensity = 0;\n if (this._myValueEditActive) {\n valueIntensity = stickVariableIntensity;\n } else if (this._myValueButtonEditIntensity != 0) {\n if (this._myValueButtonEditIntensityTimer <= 0) {\n valueIntensity = this._myValueButtonEditIntensity;\n } else {\n this._myValueButtonEditIntensityTimer -= dt;\n }\n }\n\n if (valueIntensity != 0) {\n let amountToAdd = valueIntensity * this._myVariable.myStepPerSecond * dt;\n\n this._myValueRealValue += amountToAdd;\n\n if (this._myVariable.myMin != null && this._myVariable.myMax != null) {\n this._myValueRealValue = Math.pp_clamp(this._myValueRealValue, this._myVariable.myMin, this._myVariable.myMax);\n } else if (this._myVariable.myMin != null) {\n this._myValueRealValue = Math.max(this._myValueRealValue, this._myVariable.myMin);\n } else if (this._myVariable.myMax != null) {\n this._myValueRealValue = Math.min(this._myValueRealValue, this._myVariable.myMax);\n }\n\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable.myDecimalPlaces);\n\n if (this._myVariable.myEditAllValuesTogether) {\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n let difference = newValue - this._myVariable.myValue[this._myValueEditIndex];\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._myVariable.myValue[i] = Math.round((this._myVariable.myValue[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n\n if (this._myVariable.myMin != null && this._myVariable.myMax != null) {\n this._myVariable.myValue[i] = Math.pp_clamp(this._myVariable.myValue[i], this._myVariable.myMin, this._myVariable.myMax);\n } else if (this._myVariable.myMin != null) {\n this._myVariable.myValue[i] = Math.max(this._myVariable.myValue[i], this._myVariable.myMin);\n } else if (this._myVariable.myMax != null) {\n this._myVariable.myValue[i] = Math.min(this._myVariable.myValue[i], this._myVariable.myMax);\n }\n\n this._myUI.myValueTextComponents[i].text = this._myVariable.myValue[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n\n } else {\n this._myVariable.myValue[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n\n if (this._myVariable.myMin != null && this._myVariable.myMax != null) {\n this._myVariable.myValue[this._myValueEditIndex] = Math.pp_clamp(this._myVariable.myValue[this._myValueEditIndex], this._myVariable.myMin, this._myVariable.myMax);\n } else if (this._myVariable.myMin != null) {\n this._myVariable.myValue[this._myValueEditIndex] = Math.max(this._myVariable.myValue[this._myValueEditIndex], this._myVariable.myMin);\n } else if (this._myVariable.myMax != null) {\n this._myVariable.myValue[this._myValueEditIndex] = Math.min(this._myVariable.myValue[this._myValueEditIndex], this._myVariable.myMax);\n }\n\n this._myUI.myValueTextComponents[this._myValueEditIndex].text = this._myVariable.myValue[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n }\n } else {\n this._myValueRealValue = this._myVariable.myValue[this._myValueEditIndex];\n }\n\n let stepIntensity = 0;\n if (this._myStepEditActive) {\n stepIntensity = stickVariableIntensity;\n } else if (this._myStepButtonEditIntensity != 0) {\n if (this._myStepButtonEditIntensityTimer <= 0) {\n stepIntensity = this._myStepButtonEditIntensity;\n } else {\n this._myStepButtonEditIntensityTimer -= dt;\n }\n }\n\n if (stepIntensity != 0) {\n let amountToAdd = 0;\n if (this._myStepFastEdit) {\n amountToAdd = Math.sign(stepIntensity) * 1;\n this._myStepFastEdit = false;\n } else {\n amountToAdd = stepIntensity * this._mySetup.myStepMultiplierStepPerSecond * dt;\n }\n\n this._myStepMultiplierValue += amountToAdd;\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\n if (Math.sign(this._myStepMultiplierValue) > 0) {\n this._myStepMultiplierValue -= 1;\n this._changeStep(this._myVariable.myStepPerSecond * 10);\n } else {\n this._myStepMultiplierValue += 1;\n this._changeStep(this._myVariable.myStepPerSecond * 0.1);\n }\n }\n } else {\n this._myStepMultiplierValue = 0;\n this._myStepFastEdit = true;\n }\n }\n\n _updateScrollVariable(dt) {\n if (this._myScrollVariableActive) {\n if (this._myScrollVariableTimer <= 0) {\n this._scrollVariableRequest(this._myScrollDirection);\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = true;\n } else {\n this._myScrollVariableTimer -= dt;\n }\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myVariableLabelCursorTargetComponent.addClickFunction(this._resetAllValues.bind(this));\n ui.myVariableLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myVariableLabelText));\n ui.myVariableLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myVariableLabelText, this._mySetup.myVariableLabelTextScale));\n\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, 1));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, i, -1));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, i, 0));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, i, 0));\n\n ui.myValueIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueIncreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n ui.myValueDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myValueDecreaseButtonBackgroundComponents[i].material));\n\n ui.myValueCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, i));\n ui.myValueCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], true));\n ui.myValueCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, i, ui.myValueTexts[i], false));\n }\n\n ui.myStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this));\n ui.myStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, ui.myStepText, true));\n ui.myStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, ui.myStepText, false));\n\n ui.myStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 1));\n ui.myStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 1));\n ui.myStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, -1));\n ui.myStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, -1));\n ui.myStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0));\n ui.myStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0));\n\n ui.myStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\n ui.myStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myStepIncreaseButtonBackgroundComponent.material));\n ui.myStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\n ui.myStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myStepDecreaseButtonBackgroundComponent.material));\n }\n\n _setValueEditIntensity(index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myValueButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n this._myValueRealValue = this._myVariable.myValue[index];\n this._myValueEditIndex = index;\n }\n\n this._myValueButtonEditIntensity = value;\n }\n }\n\n _setStepEditIntensity(value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myStepButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n }\n\n this._myStepButtonEditIntensity = value;\n }\n }\n\n _setValueEditActive(index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n this._myValueRealValue = this._myVariable.myValue[index];\n this._myValueEditIndex = index;\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myValueTextScale;\n }\n\n this._myValueEditActive = active;\n }\n }\n\n _setStepEditActive(text, active) {\n if (this._isActive() || !active) {\n if (active) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myStepTextScale;\n }\n\n this._myStepEditActive = active;\n }\n }\n\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\n if (this._isActive() || !active) {\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\n let oldScrollDirection = this._myScrollDirection;\n\n this.setScrollVariableActive(active, scrollDirection);\n\n if (forceScroll) {\n this._scrollVariableRequest(oldScrollDirection);\n }\n }\n }\n\n _scrollVariableRequest(amount) {\n if (this._isActive() && amount != 0) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n }\n\n _resetValue(index) {\n if (this._isActive()) {\n this._myVariable.myValue[index] = this._myVariable.myInitialValue[index];\n this._myUI.myValueTextComponents[index].text = this._myVariable.myValue[index].toFixed(this._myVariable.myDecimalPlaces);\n }\n }\n\n _resetAllValues() {\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this._resetValue(i);\n }\n }\n\n _resetStep() {\n if (this._isActive()) {\n this._changeStep(this._myVariable.myInitialStepPerSecond);\n }\n }\n\n _changeStep(step) {\n step = Math.pp_roundDecimal(step, 10);\n this._myVariable.myStepPerSecond = step;\n this._myUI.myStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myStepPerSecond);\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n _genericTextHover(text) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n }\n\n _genericTextUnHover(text, originalScale) {\n text.scalingWorld = originalScale;\n }\n};", "\nPP.EasyTuneNumberArrayWidgetUI = class EasyTuneNumberArrayWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myAdditionalButtonsActive = true;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n if (visible) {\n this.setAdditionalButtonsActive(this._myAdditionalButtonsActive);\n }\n }\n\n setAdditionalButtonsActive(active) {\n this._myAdditionalButtonsActive = active;\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myValueDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createStepSkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n this.myVariableLabelCursorTarget = WL.scene.addObject(this.myVariableLabelPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n\n this.myValuesPanel = WL.scene.addObject(this.myDisplayPanel);\n\n this.myValuePanels = [];\n this.myValueTexts = [];\n this.myValueCursorTargets = [];\n\n this.myValueIncreaseButtonPanels = [];\n this.myValueIncreaseButtonBackgrounds = [];\n this.myValueIncreaseButtonTexts = [];\n this.myValueIncreaseButtonCursorTargets = [];\n\n this.myValueDecreaseButtonPanels = [];\n this.myValueDecreaseButtonBackgrounds = [];\n this.myValueDecreaseButtonTexts = [];\n this.myValueDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i] = WL.scene.addObject(this.myValuesPanel);\n this.myValueTexts[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueCursorTargets[i] = WL.scene.addObject(this.myValuePanels[i]);\n\n //Increase/Decrease\n this.myValueIncreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonTexts[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n this.myValueIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueIncreaseButtonPanels[i]);\n\n this.myValueDecreaseButtonPanels[i] = WL.scene.addObject(this.myValuePanels[i]);\n this.myValueDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonTexts[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n this.myValueDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myValueDecreaseButtonPanels[i]);\n }\n }\n\n _createStepSkeleton() {\n this.myStepPanel = WL.scene.addObject(this.myPivotObject);\n this.myStepText = WL.scene.addObject(this.myStepPanel);\n this.myStepCursorTarget = WL.scene.addObject(this.myStepPanel);\n\n //Increase/Decrease\n this.myStepIncreaseButtonPanel = WL.scene.addObject(this.myStepPanel);\n this.myStepIncreaseButtonBackground = WL.scene.addObject(this.myStepIncreaseButtonPanel);\n this.myStepIncreaseButtonText = WL.scene.addObject(this.myStepIncreaseButtonPanel);\n this.myStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myStepIncreaseButtonPanel);\n\n this.myStepDecreaseButtonPanel = WL.scene.addObject(this.myStepPanel);\n this.myStepDecreaseButtonBackground = WL.scene.addObject(this.myStepDecreaseButtonPanel);\n this.myStepDecreaseButtonText = WL.scene.addObject(this.myStepDecreaseButtonPanel);\n this.myStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myStepDecreaseButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setStepTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n this.myVariableLabelCursorTarget.setTranslationLocal(this._mySetup.myVariableLabelCursorTargetPosition);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValuesPanel.setTranslationLocal(this._mySetup.myValuesPanelPosition);\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValuePanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myValueTexts[i].scale(this._mySetup.myValueTextScale);\n this.myValueCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myValueIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myValueIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myValueDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myValueDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myValueDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myValueDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myValueDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n }\n\n _setStepTransforms() {\n this.myStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myStepText.scale(this._mySetup.myStepTextScale);\n this.myStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addStepComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.addComponent('cursor-target');\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.addComponent('collision');\n this.myVariableLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myVariableLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myVariableLabelCollisionComponent.extents = this._mySetup.myVariableLabelCollisionExtents;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueTextComponents = [];\n this.myValueCursorTargetComponents = [];\n this.myValueCollisionComponents = [];\n\n this.myValueIncreaseButtonBackgroundComponents = [];\n this.myValueIncreaseButtonTextComponents = [];\n this.myValueIncreaseButtonCursorTargetComponents = [];\n this.myValueIncreaseButtonCollisionComponents = [];\n\n this.myValueDecreaseButtonBackgroundComponents = [];\n this.myValueDecreaseButtonTextComponents = [];\n this.myValueDecreaseButtonCursorTargetComponents = [];\n this.myValueDecreaseButtonCollisionComponents = [];\n\n\n for (let i = 0; i < this._mySetup.myArraySize; i++) {\n this.myValueTextComponents[i] = this.myValueTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueTextComponents[i]);\n this.myValueTextComponents[i].text = \" \";\n\n this.myValueCursorTargetComponents[i] = this.myValueCursorTargets[i].addComponent('cursor-target');\n this.myValueCollisionComponents[i] = this.myValueCursorTargets[i].addComponent('collision');\n this.myValueCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myValueIncreaseButtonBackgroundComponents[i] = this.myValueIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueIncreaseButtonTextComponents[i] = this.myValueIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueIncreaseButtonTextComponents[i]);\n this.myValueIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myValueIncreaseButtonCursorTargetComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueIncreaseButtonCollisionComponents[i] = this.myValueIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myValueDecreaseButtonBackgroundComponents[i] = this.myValueDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myValueDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myValueDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myValueDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myValueDecreaseButtonTextComponents[i] = this.myValueDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myValueDecreaseButtonTextComponents[i]);\n this.myValueDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myValueDecreaseButtonCursorTargetComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myValueDecreaseButtonCollisionComponents[i] = this.myValueDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myValueDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myValueDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myValueDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n }\n\n _addStepComponents() {\n this.myStepTextComponent = this.myStepText.addComponent('text');\n this._setupTextComponent(this.myStepTextComponent);\n this.myStepTextComponent.text = \" \";\n\n this.myStepCursorTargetComponent = this.myStepCursorTarget.addComponent('cursor-target');\n this.myStepCollisionComponent = this.myStepCursorTarget.addComponent('collision');\n this.myStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myStepIncreaseButtonBackgroundComponent = this.myStepIncreaseButtonBackground.addComponent('mesh');\n this.myStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myStepIncreaseButtonTextComponent = this.myStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myStepIncreaseButtonTextComponent);\n this.myStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myStepIncreaseButtonCursorTargetComponent = this.myStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myStepIncreaseButtonCollisionComponent = this.myStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myStepDecreaseButtonBackgroundComponent = this.myStepDecreaseButtonBackground.addComponent('mesh');\n this.myStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myStepDecreaseButtonTextComponent = this.myStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myStepDecreaseButtonTextComponent);\n this.myStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myStepDecreaseButtonCursorTargetComponent = this.myStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myStepDecreaseButtonCollisionComponent = this.myStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneNumberArrayWidgetSetup = class EasyTuneNumberArrayWidgetSetup {\n\n constructor(arraySize) {\n this.myArraySize = arraySize;\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00803713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00803713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00803713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let distanceFromValue = 0.055;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [0, 0, -0.00001];\n this.myLeftSideButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myRightSideButtonPosition = [0, 0, -0.00001];\n this.myRightSideButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myIncreaseButtonText = \"+\";\n this.myDecreaseButtonText = \"-\";\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myVariableLabelCursorTargetPosition = [0, 0, 0];\n this.myVariableLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myVariableLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n this.myValuesPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromValue, panelZ];\n\n this.myValueTextScale = [0.4, 0.4, 0.4];\n\n this.myValueCursorTargetPosition = [0, 0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myDistanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\n\n this.myValuePanelsPositions = [];\n this.myValuePanelsPositions[0] = [0, 0, 0];\n for (let i = 1; i < this.myArraySize; i++) {\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].slice(0);\n this.myValuePanelsPositions[i][1] -= this.myDistanceBetweenValues;\n }\n\n //Step\n let valuePanelLastPosition = (this.myValuePanelsPositions[this.myArraySize - 1]) ? this.myValuePanelsPositions[this.myArraySize - 1][1] : 0;\n this.myStepPanelPosition = [0, this.myDisplayPanelPosition[1] + this.myValuesPanelPosition[1] + valuePanelLastPosition - distanceFromValue, panelZ];\n this.myStepTextScale = [0.19, 0.19, 0.19];\n this.myStepStartString = \"Step: \";\n\n this.myStepCursorTargetPosition = [0, 0, 0];\n this.myStepCursorTargetPosition[2] = colliderZPosition - this.myStepPanelPosition[2];\n this.myStepCollisionExtents = [0.065, 0.0175, 1];\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n //Background\n {\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myStepPanelPosition[1] - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n this.myBackPanelPosition = [0, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [backgroundHalfWidth, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myTextHoverScaleMultiplier = [1.25, 1.25, 1.25];\n\n this.myEditThumbstickMinThreshold = 0.35;\n this.myStepMultiplierStepPerSecond = 2.25;\n this.myButtonEditDelay = 0;\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "\nPP.EasyTuneNumberWidget = class EasyTuneNumberWidget {\n\n constructor(gamepad) {\n this._myGamepad = gamepad;\n\n this._myParentObject = null;\n this._myAdditionalSetup = null;\n\n this._myWidgets = new Map();\n\n this._myVariable = null;\n this._myIsVisible = true;\n\n this._myAppendToVariableName = null;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myCurrentArraySize = 0;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n this._myCurrentArraySize = this._myVariable.myValue.length;\n this._myAppendToVariableName = appendToVariableName;\n\n if (!this._myWidgets.has(this._myCurrentArraySize)) {\n this._createWidget(this._myCurrentArraySize);\n }\n\n this._myWidgets.get(this._myCurrentArraySize).setEasyTuneVariable(variable, appendToVariableName);\n\n this.setVisible(this._myIsVisible);\n }\n\n setVisible(visible) {\n for (let widget of this._myWidgets.values()) {\n widget.setVisible(false);\n }\n\n if (this._myVariable) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).setVisible(visible);\n }\n\n this._myIsVisible = visible;\n }\n\n isScrollVariableActive() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.isScrollVariableActive();\n }\n\n return false;\n }\n\n getScrollVariableDirection() {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n return widget.getScrollVariableDirection();\n }\n\n return 0;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n let widget = this._myWidgets.get(this._myCurrentArraySize);\n if (widget) {\n widget.setScrollVariableActive(active, scrollDirection);\n }\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myParentObject = parentObject;\n this._myAdditionalSetup = additionalSetup;\n\n this._createWidget(1);\n\n if (this._myVariable) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n\n update(dt) {\n if (this._isActive()) {\n this._sizeChangedCheck();\n\n this._myWidgets.get(this._myCurrentArraySize).update(dt);\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _scrollVariableRequest(amount) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n\n _createWidget(arraySize) {\n this._myWidgets.set(arraySize, new PP.EasyTuneNumberArrayWidget(arraySize, this._myGamepad));\n this._myWidgets.get(arraySize).start(this._myParentObject, this._myAdditionalSetup);\n this._myWidgets.get(arraySize).setVisible(false);\n this._myWidgets.get(arraySize).registerScrollVariableRequestEventListener(this, this._scrollVariableRequest.bind(this));\n }\n\n _sizeChangedCheck() {\n if (this._myVariable.myValue.length != this._myCurrentArraySize) {\n this.setEasyTuneVariable(this._myVariable, this._myAppendToVariableName);\n }\n }\n};", "PP.EasyTuneTransformWidget = class EasyTuneTransformWidget {\n\n constructor(gamepad) {\n this._myGamepad = gamepad;\n\n this._mySetup = new PP.EasyTuneTransformWidgetSetup();\n this._myUI = new PP.EasyTuneTransformWidgetUI();\n\n this._myVariable = null;\n\n this._myIsVisible = true;\n\n this._myScrollVariableRequestCallbacks = new Map(); // Signature: callback(scrollAmount)\n\n this._myAppendToVariableName = \"\";\n\n this._myValueButtonEditIntensity = 0;\n this._myValueButtonEditIntensityTimer = 0;\n this._myStepButtonEditIntensity = 0;\n this._myStepButtonEditIntensityTimer = 0;\n\n this._myValueEditActive = false;\n this._myStepEditActive = false;\n\n this._myValueRealValue = null;\n this._myComponentStepValue = null;\n this._myStepMultiplierValue = null;\n this._myStepFastEdit = false;\n\n this._myValueEditIndex = -1;\n this._myComponentIndex = 0;\n this._myStepIndex = 0;\n\n this._myScrollVariableActive = false;\n this._myScrollDirection = 0;\n this._myScrollVariableTimer = 0;\n this._myHasScrolled = false;\n }\n\n setEasyTuneVariable(variable, appendToVariableName) {\n this._myVariable = variable;\n\n if ((typeof appendToVariableName) !== 'undefined') {\n this._myAppendToVariableName = appendToVariableName;\n } else {\n this._myAppendToVariableName = \"\";\n }\n\n this._refreshUI();\n }\n\n isScrollVariableActive() {\n return this._myScrollVariableActive;\n }\n\n getScrollVariableDirection() {\n return this._myScrollDirection;\n }\n\n setScrollVariableActive(active, scrollDirection) {\n this._myScrollVariableActive = active;\n this._myScrollDirection = scrollDirection;\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = false;\n }\n\n _refreshUI() {\n if (this._myVariable) {\n this._myUI.myVariableLabelTextComponent.text = this._myVariable.myName.concat(this._myAppendToVariableName);\n\n for (let i = 0; i < 3; i++) {\n this._myUI.myPositionTextComponents[i].text = this._myVariable.myPosition[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n this._myUI.myPositionStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myPositionStepPerSecond);\n\n for (let i = 0; i < 3; i++) {\n this._myUI.myRotationTextComponents[i].text = this._myVariable.myRotation[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n this._myUI.myRotationStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myRotationStepPerSecond);\n\n for (let i = 0; i < 3; i++) {\n this._myUI.myScaleTextComponents[i].text = this._myVariable.myScale[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n this._myUI.myScaleStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myScaleStepPerSecond);\n }\n }\n\n setVisible(visible) {\n if (visible) {\n this._refreshUI();\n }\n this._myUI.setVisible(visible);\n\n this._myIsVisible = visible;\n }\n\n registerScrollVariableRequestEventListener(id, callback) {\n this._myScrollVariableRequestCallbacks.set(id, callback);\n }\n\n unregisterScrollVariableRequestEventListener(id) {\n this._myScrollVariableRequestCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setAdditionalButtonsActive(additionalSetup.myEnableAdditionalButtons);\n\n this._addListeners();\n }\n\n update(dt) {\n if (this._isActive()) {\n this._updateValue(dt);\n this._updateScrollVariable(dt);\n }\n }\n\n _updateValue(dt) {\n let stickVariableIntensity = 0;\n\n if (this._myGamepad) {\n let y = this._myGamepad.getAxesInfo().myAxes[1];\n\n if (Math.abs(y) > this._mySetup.myEditThumbstickMinThreshold) {\n let normalizedEditAmount = (Math.abs(y) - this._mySetup.myEditThumbstickMinThreshold) / (1 - this._mySetup.myEditThumbstickMinThreshold);\n stickVariableIntensity = Math.sign(y) * normalizedEditAmount;\n }\n }\n\n let valueIntensity = 0;\n if (this._myValueEditActive) {\n valueIntensity = stickVariableIntensity;\n } else if (this._myValueButtonEditIntensity != 0) {\n if (this._myValueButtonEditIntensityTimer <= 0) {\n valueIntensity = this._myValueButtonEditIntensity;\n } else {\n this._myValueButtonEditIntensityTimer -= dt;\n }\n }\n\n if (valueIntensity != 0) {\n let amountToAdd = valueIntensity * this._myComponentStepValue * dt;\n\n this._myValueRealValue += amountToAdd;\n\n let decimalPlacesMultiplier = Math.pow(10, this._myVariable.myDecimalPlaces);\n\n switch (this._myComponentIndex) {\n case 0:\n this._myVariable.myPosition[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myUI.myPositionTextComponents[this._myValueEditIndex].text = this._myVariable.myPosition[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 1:\n if (this._myValueRealValue > 180) {\n while (this._myValueRealValue > 180) {\n this._myValueRealValue -= 180;\n }\n this._myValueRealValue = -180 + this._myValueRealValue;\n }\n\n if (this._myValueRealValue < -180) {\n while (this._myValueRealValue < - 180) {\n this._myValueRealValue += 180;\n }\n this._myValueRealValue = 180 - this._myValueRealValue;\n }\n\n this._myVariable.myRotation[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myUI.myRotationTextComponents[this._myValueEditIndex].text = this._myVariable.myRotation[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 2:\n if (this._myValueRealValue <= 0) {\n this._myValueRealValue = 1 / decimalPlacesMultiplier;\n }\n\n if (this._myVariable.myScaleAsOne) {\n let newValue = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n let difference = newValue - this._myVariable.myScale[this._myValueEditIndex];\n\n for (let i = 0; i < 3; i++) {\n this._myVariable.myScale[i] = Math.round((this._myVariable.myScale[i] + difference) * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myVariable.myScale[i] = Math.max(this._myVariable.myScale[i], 1 / decimalPlacesMultiplier);\n this._myUI.myScaleTextComponents[i].text = this._myVariable.myScale[i].toFixed(this._myVariable.myDecimalPlaces);\n }\n } else {\n this._myVariable.myScale[this._myValueEditIndex] = Math.round(this._myValueRealValue * decimalPlacesMultiplier + Number.EPSILON) / decimalPlacesMultiplier;\n this._myVariable.myScale[this._myValueEditIndex] = Math.max(this._myVariable.myScale[this._myValueEditIndex], 1 / decimalPlacesMultiplier);\n this._myUI.myScaleTextComponents[this._myValueEditIndex].text = this._myVariable.myScale[this._myValueEditIndex].toFixed(this._myVariable.myDecimalPlaces);\n }\n break;\n }\n } else {\n switch (this._myComponentIndex) {\n case 0:\n this._myValueRealValue = this._myVariable.myPosition[this._myValueEditIndex];\n break;\n case 1:\n this._myValueRealValue = this._myVariable.myRotation[this._myValueEditIndex];\n break;\n case 2:\n this._myValueRealValue = this._myVariable.myScale[this._myValueEditIndex];\n break;\n }\n }\n\n let stepIntensity = 0;\n if (this._myStepEditActive) {\n stepIntensity = stickVariableIntensity;\n } else if (this._myStepButtonEditIntensity != 0) {\n if (this._myStepButtonEditIntensityTimer <= 0) {\n stepIntensity = this._myStepButtonEditIntensity;\n } else {\n this._myStepButtonEditIntensityTimer -= dt;\n }\n }\n\n if (stepIntensity != 0) {\n let amountToAdd = 0;\n if (this._myStepFastEdit) {\n amountToAdd = Math.sign(stepIntensity) * 1;\n this._myStepFastEdit = false;\n } else {\n amountToAdd = stepIntensity * this._mySetup.myStepMultiplierStepPerSecond * dt;\n }\n\n this._myStepMultiplierValue += amountToAdd;\n if (Math.abs(this._myStepMultiplierValue) >= 1) {\n let stepValue = 0;\n switch (this._myStepIndex) {\n case 0:\n stepValue = this._myVariable.myPositionStepPerSecond;\n break;\n case 1:\n stepValue = this._myVariable.myRotationStepPerSecond;\n break;\n case 2:\n stepValue = this._myVariable.myScaleStepPerSecond;\n break;\n default:\n stepValue = 0;\n }\n if (Math.sign(this._myStepMultiplierValue) > 0) {\n this._myStepMultiplierValue -= 1;\n this._changeStep(this._myStepIndex, stepValue * 10);\n } else {\n this._myStepMultiplierValue += 1;\n this._changeStep(this._myStepIndex, stepValue * 0.1);\n }\n }\n } else {\n this._myStepMultiplierValue = 0;\n this._myStepFastEdit = true;\n }\n }\n\n _updateScrollVariable(dt) {\n if (this._myScrollVariableActive) {\n if (this._myScrollVariableTimer <= 0) {\n this._scrollVariableRequest(this._myScrollDirection);\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n this._myHasScrolled = true;\n } else {\n this._myScrollVariableTimer -= dt;\n }\n }\n }\n\n _isActive() {\n return this._myIsVisible && this._myVariable;\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myVariableLabelCursorTargetComponent.addClickFunction(this._resetAllValues.bind(this));\n ui.myVariableLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myVariableLabelText));\n ui.myVariableLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myVariableLabelText, this._mySetup.myVariableLabelTextScale));\n\n ui.myNextButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, 1, false));\n ui.myNextButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myNextButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myNextButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n ui.myNextButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myNextButtonBackgroundComponent.material));\n\n ui.myPreviousButtonCursorTargetComponent.addDownFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addDownOnHoverFunction(this._setScrollVariableActive.bind(this, true, -1, false));\n ui.myPreviousButtonCursorTargetComponent.addUpFunction(this._setScrollVariableActive.bind(this, false, 0, false));\n ui.myPreviousButtonCursorTargetComponent.addUpWithNoDownFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._setScrollVariableActive.bind(this, false, 0, true));\n ui.myPreviousButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n ui.myPreviousButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPreviousButtonBackgroundComponent.material));\n\n ui.myPositionLabelCursorTargetComponent.addClickFunction(this._resetComponentValues.bind(this, 0));\n ui.myPositionLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myPositionLabelText));\n ui.myPositionLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myPositionLabelText, this._mySetup.myComponentLabelTextScale));\n for (let i = 0; i < 3; i++) {\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 0, i, 1));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, 1));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 0, i, -1));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, -1));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 0, i, 0));\n\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\n ui.myPositionIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionIncreaseButtonBackgroundComponents[i].material));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\n ui.myPositionDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionDecreaseButtonBackgroundComponents[i].material));\n\n ui.myPositionCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, 0, i));\n ui.myPositionCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, 0, i, ui.myPositionTexts[i], true));\n ui.myPositionCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, 0, i, ui.myPositionTexts[i], false));\n }\n\n ui.myRotationLabelCursorTargetComponent.addClickFunction(this._resetComponentValues.bind(this, 1));\n ui.myRotationLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myRotationLabelText));\n ui.myRotationLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myRotationLabelText, this._mySetup.myComponentLabelTextScale));\n for (let i = 0; i < 3; i++) {\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 1, i, 1));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, 1));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 1, i, -1));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, -1));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 1, i, 0));\n\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\n ui.myRotationIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationIncreaseButtonBackgroundComponents[i].material));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\n ui.myRotationDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationDecreaseButtonBackgroundComponents[i].material));\n\n ui.myRotationCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, 1, i));\n ui.myRotationCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, 1, i, ui.myRotationTexts[i], true));\n ui.myRotationCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, 1, i, ui.myRotationTexts[i], false));\n }\n\n ui.myScaleLabelCursorTargetComponent.addClickFunction(this._resetComponentValues.bind(this, 2));\n ui.myScaleLabelCursorTargetComponent.addHoverFunction(this._genericTextHover.bind(this, ui.myScaleLabelText));\n ui.myScaleLabelCursorTargetComponent.addUnHoverFunction(this._genericTextUnHover.bind(this, ui.myScaleLabelText, this._mySetup.myComponentLabelTextScale));\n for (let i = 0; i < 3; i++) {\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 2, i, 1));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, 1));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addDownFunction(this._setValueEditIntensity.bind(this, 2, i, -1));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addDownOnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, -1));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUpFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUpWithNoDownFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._setValueEditIntensity.bind(this, 2, i, 0));\n\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\n ui.myScaleIncreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleIncreaseButtonBackgroundComponents[i].material));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addHoverFunction(this._genericHover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\n ui.myScaleDecreaseButtonCursorTargetComponents[i].addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleDecreaseButtonBackgroundComponents[i].material));\n\n ui.myScaleCursorTargetComponents[i].addClickFunction(this._resetValue.bind(this, 2, i));\n ui.myScaleCursorTargetComponents[i].addHoverFunction(this._setValueEditActive.bind(this, 2, i, ui.myScaleTexts[i], true));\n ui.myScaleCursorTargetComponents[i].addUnHoverFunction(this._setValueEditActive.bind(this, 2, i, ui.myScaleTexts[i], false));\n }\n\n ui.myPositionStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this, 0));\n ui.myPositionStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, 0, ui.myPositionStepText, true));\n ui.myPositionStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, 0, ui.myPositionStepText, false));\n\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 0, 1));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 0, 1));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 0, -1));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 0, -1));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 0, 0));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 0, 0));\n\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\n ui.myPositionStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionStepIncreaseButtonBackgroundComponent.material));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\n ui.myPositionStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myPositionStepDecreaseButtonBackgroundComponent.material));\n\n ui.myRotationStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this, 1));\n ui.myRotationStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, 1, ui.myRotationStepText, true));\n ui.myRotationStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, 1, ui.myRotationStepText, false));\n\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 1, 1));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 1, 1));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 1, -1));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 1, -1));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 1, 0));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 1, 0));\n\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\n ui.myRotationStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationStepIncreaseButtonBackgroundComponent.material));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\n ui.myRotationStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myRotationStepDecreaseButtonBackgroundComponent.material));\n\n ui.myScaleStepCursorTargetComponent.addClickFunction(this._resetStep.bind(this, 2));\n ui.myScaleStepCursorTargetComponent.addHoverFunction(this._setStepEditActive.bind(this, 2, ui.myScaleStepText, true));\n ui.myScaleStepCursorTargetComponent.addUnHoverFunction(this._setStepEditActive.bind(this, 2, ui.myScaleStepText, false));\n\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 2, 1));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 2, 1));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addDownFunction(this._setStepEditIntensity.bind(this, 2, -1));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addDownOnHoverFunction(this._setStepEditIntensity.bind(this, 2, -1));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUpFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUpWithNoDownFunction(this._setStepEditIntensity.bind(this, 2, 0));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._setStepEditIntensity.bind(this, 2, 0));\n\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\n ui.myScaleStepIncreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleStepIncreaseButtonBackgroundComponent.material));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\n ui.myScaleStepDecreaseButtonCursorTargetComponent.addUnHoverFunction(this._genericUnHover.bind(this, ui.myScaleStepDecreaseButtonBackgroundComponent.material));\n\n }\n\n _setValueEditIntensity(componentIndex, index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n switch (componentIndex) {\n case 0:\n this._myValueRealValue = this._myVariable.myPosition[index];\n this._myComponentStepValue = this._myVariable.myPositionStepPerSecond;\n break;\n case 1:\n this._myValueRealValue = this._myVariable.myRotation[index];\n this._myComponentStepValue = this._myVariable.myRotationStepPerSecond;\n break;\n case 2:\n this._myValueRealValue = this._myVariable.myScale[index];\n this._myComponentStepValue = this._myVariable.myScaleStepPerSecond;\n break;\n }\n\n this._myValueButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n this._myValueEditIndex = index;\n this._myComponentIndex = componentIndex;\n }\n\n this._myValueButtonEditIntensity = value;\n }\n }\n\n _setStepEditIntensity(index, value) {\n if (this._isActive() || value == 0) {\n if (value != 0) {\n this._myStepButtonEditIntensityTimer = this._mySetup.myButtonEditDelay;\n }\n\n this._myStepButtonEditIntensity = value;\n\n this._myStepIndex = index;\n }\n }\n\n _setValueEditActive(componentIndex, index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n switch (componentIndex) {\n case 0:\n this._myValueRealValue = this._myVariable.myPosition[index];\n this._myComponentStepValue = this._myVariable.myPositionStepPerSecond;\n break;\n case 1:\n this._myValueRealValue = this._myVariable.myRotation[index];\n this._myComponentStepValue = this._myVariable.myRotationStepPerSecond;\n break;\n case 2:\n this._myValueRealValue = this._myVariable.myScale[index];\n this._myComponentStepValue = this._myVariable.myScaleStepPerSecond;\n break;\n }\n\n this._myValueEditIndex = index;\n this._myComponentIndex = componentIndex;\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myValueTextScale;\n }\n\n this._myValueEditActive = active;\n }\n }\n\n _setStepEditActive(index, text, active) {\n if (this._isActive() || !active) {\n if (active) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n } else {\n text.scalingWorld = this._mySetup.myStepTextScale;\n }\n\n this._myStepEditActive = active;\n this._myStepIndex = index;\n }\n }\n\n _setScrollVariableActive(active, scrollDirection, skipForceScroll) {\n if (this._isActive() || !active) {\n let forceScroll = !active && !this._myHasScrolled && !skipForceScroll;\n let oldScrollDirection = this._myScrollDirection;\n\n this.setScrollVariableActive(active, scrollDirection);\n\n if (forceScroll) {\n this._scrollVariableRequest(oldScrollDirection);\n }\n }\n }\n\n _scrollVariableRequest(amount) {\n if (this._isActive() && amount != 0) {\n for (let callback of this._myScrollVariableRequestCallbacks.values()) {\n callback(amount);\n }\n }\n }\n\n _resetValue(componentIndex, index) {\n if (this._isActive()) {\n switch (componentIndex) {\n case 0:\n this._myVariable.myPosition[index] = this._myVariable.myInitialPosition[index];\n this._myUI.myPositionTextComponents[index].text = this._myVariable.myPosition[index].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 1:\n this._myVariable.myRotation[index] = this._myVariable.myInitialRotation[index];\n this._myUI.myRotationTextComponents[index].text = this._myVariable.myRotation[index].toFixed(this._myVariable.myDecimalPlaces);\n break;\n case 2:\n this._myVariable.myScale[index] = this._myVariable.myInitialScale[index];\n this._myUI.myScaleTextComponents[index].text = this._myVariable.myScale[index].toFixed(this._myVariable.myDecimalPlaces);\n break;\n default:\n initialValue = 0;\n }\n }\n }\n\n _resetAllValues() {\n for (let i = 0; i < 3; i++) {\n this._resetComponentValues(i);\n }\n }\n\n _resetComponentValues(index) {\n for (let i = 0; i < 3; i++) {\n this._resetValue(index, i);\n }\n }\n\n _resetStep(index) {\n if (this._isActive()) {\n let initialValue = 0;\n switch (index) {\n case 0:\n initialValue = this._myVariable.myInitialPositionStepPerSecond;\n break;\n case 1:\n initialValue = this._myVariable.myInitialRotationStepPerSecond;\n break;\n case 2:\n initialValue = this._myVariable.myInitialScaleStepPerSecond;\n break;\n default:\n initialValue = 0;\n }\n\n this._changeStep(index, initialValue);\n }\n }\n\n _changeStep(index, step) {\n step = Math.pp_roundDecimal(step, 10);\n\n switch (index) {\n case 0:\n this._myVariable.myPositionStepPerSecond = step;\n this._myUI.myPositionStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myPositionStepPerSecond);\n break;\n case 1:\n this._myVariable.myRotationStepPerSecond = step;\n this._myUI.myRotationStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myRotationStepPerSecond);\n break;\n case 2:\n this._myVariable.myScaleStepPerSecond = step;\n this._myUI.myScaleStepTextComponent.text = this._mySetup.myStepStartString.concat(this._myVariable.myScaleStepPerSecond);\n break;\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _genericUnHover(material) {\n material.color = this._mySetup.myBackgroundColor;\n }\n\n _genericTextHover(text) {\n text.scale(this._mySetup.myTextHoverScaleMultiplier);\n }\n\n _genericTextUnHover(text, originalScale) {\n text.scalingWorld = originalScale;\n }\n};", "\nPP.EasyTuneTransformWidgetUI = class EasyTuneTransformWidgetUI {\n\n build(parentObject, setup, additionalSetup) {\n this._myParentObject = parentObject;\n this._mySetup = setup;\n this._myAdditionalSetup = additionalSetup;\n\n this._myAdditionalButtonsActive = true;\n\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\n\n this._createSkeleton();\n this._setTransforms();\n this._addComponents();\n\n this._setTransformForNonVR();\n\n if (WL.xrSession) {\n this._onXRSessionStart(WL.xrSession);\n }\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\n }\n\n setVisible(visible) {\n this.myPivotObject.pp_setActiveHierarchy(visible);\n if (visible) {\n this.setAdditionalButtonsActive(this._myAdditionalButtonsActive);\n }\n }\n\n setAdditionalButtonsActive(active) {\n this._myAdditionalButtonsActive = active;\n\n for (let i = 0; i < 3; i++) {\n this.myPositionIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myPositionDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myPositionStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myPositionStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n\n for (let i = 0; i < 3; i++) {\n this.myRotationIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myRotationDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myRotationStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myRotationStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n\n for (let i = 0; i < 3; i++) {\n this.myScaleIncreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myScaleDecreaseButtonPanels[i].pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n this.myScaleStepIncreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n this.myScaleStepDecreaseButtonPanel.pp_setActiveHierarchy(this._myAdditionalButtonsActive);\n }\n\n //Skeleton\n _createSkeleton() {\n this.myPivotObject = WL.scene.addObject(this._myParentObject);\n\n this.myBackPanel = WL.scene.addObject(this.myPivotObject);\n this.myBackBackground = WL.scene.addObject(this.myBackPanel);\n\n this._createDisplaySkeleton();\n this._createStepSkeleton();\n this._createPointerSkeleton();\n }\n\n _createDisplaySkeleton() {\n this.myDisplayPanel = WL.scene.addObject(this.myPivotObject);\n\n this.myVariableLabelPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myVariableLabelText = WL.scene.addObject(this.myVariableLabelPanel);\n this.myVariableLabelCursorTarget = WL.scene.addObject(this.myVariableLabelPanel);\n\n //Next/Previous\n this.myNextButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myNextButtonBackground = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonText = WL.scene.addObject(this.myNextButtonPanel);\n this.myNextButtonCursorTarget = WL.scene.addObject(this.myNextButtonPanel);\n\n this.myPreviousButtonPanel = WL.scene.addObject(this.myVariableLabelPanel);\n this.myPreviousButtonBackground = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonText = WL.scene.addObject(this.myPreviousButtonPanel);\n this.myPreviousButtonCursorTarget = WL.scene.addObject(this.myPreviousButtonPanel);\n\n //Position\n this.myPositionPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myPositionLabelText = WL.scene.addObject(this.myPositionPanel);\n this.myPositionLabelCursorTarget = WL.scene.addObject(this.myPositionPanel);\n\n this.myPositionPanels = [];\n this.myPositionTexts = [];\n this.myPositionCursorTargets = [];\n\n this.myPositionIncreaseButtonPanels = [];\n this.myPositionIncreaseButtonBackgrounds = [];\n this.myPositionIncreaseButtonTexts = [];\n this.myPositionIncreaseButtonCursorTargets = [];\n\n this.myPositionDecreaseButtonPanels = [];\n this.myPositionDecreaseButtonBackgrounds = [];\n this.myPositionDecreaseButtonTexts = [];\n this.myPositionDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < 3; i++) {\n this.myPositionPanels[i] = WL.scene.addObject(this.myPositionPanel);\n this.myPositionTexts[i] = WL.scene.addObject(this.myPositionPanels[i]);\n this.myPositionCursorTargets[i] = WL.scene.addObject(this.myPositionPanels[i]);\n\n //Increase/Decrease\n this.myPositionIncreaseButtonPanels[i] = WL.scene.addObject(this.myPositionPanels[i]);\n this.myPositionIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myPositionIncreaseButtonPanels[i]);\n this.myPositionIncreaseButtonTexts[i] = WL.scene.addObject(this.myPositionIncreaseButtonPanels[i]);\n this.myPositionIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myPositionIncreaseButtonPanels[i]);\n\n this.myPositionDecreaseButtonPanels[i] = WL.scene.addObject(this.myPositionPanels[i]);\n this.myPositionDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myPositionDecreaseButtonPanels[i]);\n this.myPositionDecreaseButtonTexts[i] = WL.scene.addObject(this.myPositionDecreaseButtonPanels[i]);\n this.myPositionDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myPositionDecreaseButtonPanels[i]);\n }\n\n //Rotation\n this.myRotationPanel = WL.scene.addObject(this.myDisplayPanel);\n this.myRotationLabelText = WL.scene.addObject(this.myRotationPanel);\n this.myRotationLabelCursorTarget = WL.scene.addObject(this.myRotationPanel);\n\n this.myRotationPanels = [];\n this.myRotationTexts = [];\n this.myRotationCursorTargets = [];\n\n this.myRotationIncreaseButtonPanels = [];\n this.myRotationIncreaseButtonBackgrounds = [];\n this.myRotationIncreaseButtonTexts = [];\n this.myRotationIncreaseButtonCursorTargets = [];\n\n this.myRotationDecreaseButtonPanels = [];\n this.myRotationDecreaseButtonBackgrounds = [];\n this.myRotationDecreaseButtonTexts = [];\n this.myRotationDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < 3; i++) {\n this.myRotationPanels[i] = WL.scene.addObject(this.myRotationPanel);\n this.myRotationTexts[i] = WL.scene.addObject(this.myRotationPanels[i]);\n this.myRotationCursorTargets[i] = WL.scene.addObject(this.myRotationPanels[i]);\n\n //Increase/Decrease\n this.myRotationIncreaseButtonPanels[i] = WL.scene.addObject(this.myRotationPanels[i]);\n this.myRotationIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myRotationIncreaseButtonPanels[i]);\n this.myRotationIncreaseButtonTexts[i] = WL.scene.addObject(this.myRotationIncreaseButtonPanels[i]);\n this.myRotationIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myRotationIncreaseButtonPanels[i]);\n\n this.myRotationDecreaseButtonPanels[i] = WL.scene.addObject(this.myRotationPanels[i]);\n this.myRotationDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myRotationDecreaseButtonPanels[i]);\n this.myRotationDecreaseButtonTexts[i] = WL.scene.addObject(this.myRotationDecreaseButtonPanels[i]);\n this.myRotationDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myRotationDecreaseButtonPanels[i]);\n }\n\n //Scale\n this.myScalePanel = WL.scene.addObject(this.myDisplayPanel);\n this.myScaleLabelText = WL.scene.addObject(this.myScalePanel);\n this.myScaleLabelCursorTarget = WL.scene.addObject(this.myScalePanel);\n\n this.myScalePanels = [];\n this.myScaleTexts = [];\n this.myScaleCursorTargets = [];\n\n this.myScaleIncreaseButtonPanels = [];\n this.myScaleIncreaseButtonBackgrounds = [];\n this.myScaleIncreaseButtonTexts = [];\n this.myScaleIncreaseButtonCursorTargets = [];\n\n this.myScaleDecreaseButtonPanels = [];\n this.myScaleDecreaseButtonBackgrounds = [];\n this.myScaleDecreaseButtonTexts = [];\n this.myScaleDecreaseButtonCursorTargets = [];\n\n for (let i = 0; i < 3; i++) {\n this.myScalePanels[i] = WL.scene.addObject(this.myScalePanel);\n this.myScaleTexts[i] = WL.scene.addObject(this.myScalePanels[i]);\n this.myScaleCursorTargets[i] = WL.scene.addObject(this.myScalePanels[i]);\n\n //Increase/Decrease\n this.myScaleIncreaseButtonPanels[i] = WL.scene.addObject(this.myScalePanels[i]);\n this.myScaleIncreaseButtonBackgrounds[i] = WL.scene.addObject(this.myScaleIncreaseButtonPanels[i]);\n this.myScaleIncreaseButtonTexts[i] = WL.scene.addObject(this.myScaleIncreaseButtonPanels[i]);\n this.myScaleIncreaseButtonCursorTargets[i] = WL.scene.addObject(this.myScaleIncreaseButtonPanels[i]);\n\n this.myScaleDecreaseButtonPanels[i] = WL.scene.addObject(this.myScalePanels[i]);\n this.myScaleDecreaseButtonBackgrounds[i] = WL.scene.addObject(this.myScaleDecreaseButtonPanels[i]);\n this.myScaleDecreaseButtonTexts[i] = WL.scene.addObject(this.myScaleDecreaseButtonPanels[i]);\n this.myScaleDecreaseButtonCursorTargets[i] = WL.scene.addObject(this.myScaleDecreaseButtonPanels[i]);\n }\n }\n\n _createStepSkeleton() {\n //Position\n this.myPositionStepPanel = WL.scene.addObject(this.myPositionPanel);\n this.myPositionStepText = WL.scene.addObject(this.myPositionStepPanel);\n this.myPositionStepCursorTarget = WL.scene.addObject(this.myPositionStepPanel);\n\n //Increase/Decrease\n this.myPositionStepIncreaseButtonPanel = WL.scene.addObject(this.myPositionStepPanel);\n this.myPositionStepIncreaseButtonBackground = WL.scene.addObject(this.myPositionStepIncreaseButtonPanel);\n this.myPositionStepIncreaseButtonText = WL.scene.addObject(this.myPositionStepIncreaseButtonPanel);\n this.myPositionStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myPositionStepIncreaseButtonPanel);\n\n this.myPositionStepDecreaseButtonPanel = WL.scene.addObject(this.myPositionStepPanel);\n this.myPositionStepDecreaseButtonBackground = WL.scene.addObject(this.myPositionStepDecreaseButtonPanel);\n this.myPositionStepDecreaseButtonText = WL.scene.addObject(this.myPositionStepDecreaseButtonPanel);\n this.myPositionStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myPositionStepDecreaseButtonPanel);\n\n //Rotation\n this.myRotationStepPanel = WL.scene.addObject(this.myRotationPanel);\n this.myRotationStepText = WL.scene.addObject(this.myRotationStepPanel);\n this.myRotationStepCursorTarget = WL.scene.addObject(this.myRotationStepPanel);\n\n //Increase/Decrease\n this.myRotationStepIncreaseButtonPanel = WL.scene.addObject(this.myRotationStepPanel);\n this.myRotationStepIncreaseButtonBackground = WL.scene.addObject(this.myRotationStepIncreaseButtonPanel);\n this.myRotationStepIncreaseButtonText = WL.scene.addObject(this.myRotationStepIncreaseButtonPanel);\n this.myRotationStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myRotationStepIncreaseButtonPanel);\n\n this.myRotationStepDecreaseButtonPanel = WL.scene.addObject(this.myRotationStepPanel);\n this.myRotationStepDecreaseButtonBackground = WL.scene.addObject(this.myRotationStepDecreaseButtonPanel);\n this.myRotationStepDecreaseButtonText = WL.scene.addObject(this.myRotationStepDecreaseButtonPanel);\n this.myRotationStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myRotationStepDecreaseButtonPanel);\n\n //Scale\n this.myScaleStepPanel = WL.scene.addObject(this.myScalePanel);\n this.myScaleStepText = WL.scene.addObject(this.myScaleStepPanel);\n this.myScaleStepCursorTarget = WL.scene.addObject(this.myScaleStepPanel);\n\n //Increase/Decrease\n this.myScaleStepIncreaseButtonPanel = WL.scene.addObject(this.myScaleStepPanel);\n this.myScaleStepIncreaseButtonBackground = WL.scene.addObject(this.myScaleStepIncreaseButtonPanel);\n this.myScaleStepIncreaseButtonText = WL.scene.addObject(this.myScaleStepIncreaseButtonPanel);\n this.myScaleStepIncreaseButtonCursorTarget = WL.scene.addObject(this.myScaleStepIncreaseButtonPanel);\n\n this.myScaleStepDecreaseButtonPanel = WL.scene.addObject(this.myScaleStepPanel);\n this.myScaleStepDecreaseButtonBackground = WL.scene.addObject(this.myScaleStepDecreaseButtonPanel);\n this.myScaleStepDecreaseButtonText = WL.scene.addObject(this.myScaleStepDecreaseButtonPanel);\n this.myScaleStepDecreaseButtonCursorTarget = WL.scene.addObject(this.myScaleStepDecreaseButtonPanel);\n }\n\n _createPointerSkeleton() {\n this.myPointerCursorTarget = WL.scene.addObject(this.myPivotObject);\n }\n\n //Transforms\n _setTransforms() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n\n this.myBackPanel.setTranslationLocal(this._mySetup.myBackPanelPosition);\n this.myBackBackground.scale(this._mySetup.myBackBackgroundScale);\n\n this._setDisplayTransforms();\n this._setStepTransforms();\n this._setPointerTransform();\n }\n\n _setDisplayTransforms() {\n this.myDisplayPanel.setTranslationLocal(this._mySetup.myDisplayPanelPosition);\n\n this.myVariableLabelPanel.setTranslationLocal(this._mySetup.myVariableLabelPanelPosition);\n this.myVariableLabelText.scale(this._mySetup.myVariableLabelTextScale);\n this.myVariableLabelCursorTarget.setTranslationLocal(this._mySetup.myVariableLabelCursorTargetPosition);\n\n //Next/Previous\n this.myNextButtonPanel.setTranslationLocal(this._mySetup.myNextButtonPosition);\n this.myNextButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myNextButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myNextButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myNextButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPreviousButtonPanel.setTranslationLocal(this._mySetup.myPreviousButtonPosition);\n this.myPreviousButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPreviousButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPreviousButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPreviousButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n //Position\n this.myPositionPanel.setTranslationLocal(this._mySetup.myPositionPanelPosition);\n this.myPositionLabelText.scale(this._mySetup.myComponentLabelTextScale);\n this.myPositionLabelCursorTarget.setTranslationLocal(this._mySetup.myComponentLabelCursorTargetPosition);\n\n for (let i = 0; i < 3; i++) {\n this.myPositionPanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myPositionTexts[i].scale(this._mySetup.myValueTextScale);\n this.myPositionCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myPositionIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myPositionIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myPositionIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPositionDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPositionDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myPositionDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n\n //Rotation\n this.myRotationPanel.setTranslationLocal(this._mySetup.myRotationPanelPosition);\n this.myRotationLabelText.scale(this._mySetup.myComponentLabelTextScale);\n this.myRotationLabelCursorTarget.setTranslationLocal(this._mySetup.myComponentLabelCursorTargetPosition);\n\n for (let i = 0; i < 3; i++) {\n this.myRotationPanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myRotationTexts[i].scale(this._mySetup.myValueTextScale);\n this.myRotationCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myRotationIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myRotationIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myRotationIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myRotationDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myRotationDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myRotationDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n\n //Scale\n this.myScalePanel.setTranslationLocal(this._mySetup.myScalePanelPosition);\n this.myScaleLabelText.scale(this._mySetup.myComponentLabelTextScale);\n this.myScaleLabelCursorTarget.setTranslationLocal(this._mySetup.myComponentLabelCursorTargetPosition);\n\n for (let i = 0; i < 3; i++) {\n this.myScalePanels[i].setTranslationLocal(this._mySetup.myValuePanelsPositions[i]);\n this.myScaleTexts[i].scale(this._mySetup.myValueTextScale);\n this.myScaleCursorTargets[i].setTranslationLocal(this._mySetup.myValueCursorTargetPosition);\n\n this.myScaleIncreaseButtonPanels[i].setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myScaleIncreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleIncreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleIncreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myScaleIncreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myScaleDecreaseButtonPanels[i].setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myScaleDecreaseButtonBackgrounds[i].scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleDecreaseButtonTexts[i].setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleDecreaseButtonTexts[i].scale(this._mySetup.mySideButtonTextScale);\n this.myScaleDecreaseButtonCursorTargets[i].setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n }\n }\n\n _setStepTransforms() {\n //Position\n this.myPositionStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myPositionStepText.scale(this._mySetup.myStepTextScale);\n this.myPositionStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myPositionStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myPositionStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPositionStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myPositionStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myPositionStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myPositionStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myPositionStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myPositionStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n //Rotation\n this.myRotationStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myRotationStepText.scale(this._mySetup.myStepTextScale);\n this.myRotationStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myRotationStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myRotationStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myRotationStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myRotationStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myRotationStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myRotationStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myRotationStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myRotationStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n //Scale\n this.myScaleStepPanel.setTranslationLocal(this._mySetup.myStepPanelPosition);\n this.myScaleStepText.scale(this._mySetup.myStepTextScale);\n this.myScaleStepCursorTarget.setTranslationLocal(this._mySetup.myStepCursorTargetPosition);\n\n //Increase/Decrease\n this.myScaleStepIncreaseButtonPanel.setTranslationLocal(this._mySetup.myRightSideButtonPosition);\n this.myScaleStepIncreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleStepIncreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleStepIncreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myScaleStepIncreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n this.myScaleStepDecreaseButtonPanel.setTranslationLocal(this._mySetup.myLeftSideButtonPosition);\n this.myScaleStepDecreaseButtonBackground.scale(this._mySetup.mySideButtonBackgroundScale);\n this.myScaleStepDecreaseButtonText.setTranslationLocal(this._mySetup.mySideButtonTextPosition);\n this.myScaleStepDecreaseButtonText.scale(this._mySetup.mySideButtonTextScale);\n this.myScaleStepDecreaseButtonCursorTarget.setTranslationLocal(this._mySetup.mySideButtonCursorTargetPosition);\n\n }\n\n _setPointerTransform() {\n this.myPointerCursorTarget.setTranslationLocal(this._mySetup.myPointerCursorTargetPosition);\n }\n\n //Components\n _addComponents() {\n this.myBackBackgroundComponent = this.myBackBackground.addComponent('mesh');\n this.myBackBackgroundComponent.mesh = this._myPlaneMesh;\n this.myBackBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myBackBackgroundComponent.material.color = this._mySetup.myBackBackgroundColor;\n\n this._addDisplayComponents();\n this._addStepComponents();\n this._addPointerComponents();\n }\n\n _addDisplayComponents() {\n this.myVariableLabelTextComponent = this.myVariableLabelText.addComponent('text');\n this._setupTextComponent(this.myVariableLabelTextComponent);\n this.myVariableLabelTextComponent.text = \" \";\n\n this.myVariableLabelCursorTargetComponent = this.myVariableLabelCursorTarget.addComponent('cursor-target');\n this.myVariableLabelCollisionComponent = this.myVariableLabelCursorTarget.addComponent('collision');\n this.myVariableLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myVariableLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myVariableLabelCollisionComponent.extents = this._mySetup.myVariableLabelCollisionExtents;\n\n //Next/Previous\n this.myNextButtonBackgroundComponent = this.myNextButtonBackground.addComponent('mesh');\n this.myNextButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myNextButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myNextButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myNextButtonTextComponent = this.myNextButtonText.addComponent('text');\n this._setupTextComponent(this.myNextButtonTextComponent);\n this.myNextButtonTextComponent.text = this._mySetup.myNextButtonText;\n\n this.myNextButtonCursorTargetComponent = this.myNextButtonCursorTarget.addComponent('cursor-target');\n this.myNextButtonCollisionComponent = this.myNextButtonCursorTarget.addComponent('collision');\n this.myNextButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myNextButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myNextButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPreviousButtonBackgroundComponent = this.myPreviousButtonBackground.addComponent('mesh');\n this.myPreviousButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPreviousButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPreviousButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPreviousButtonTextComponent = this.myPreviousButtonText.addComponent('text');\n this._setupTextComponent(this.myPreviousButtonTextComponent);\n this.myPreviousButtonTextComponent.text = this._mySetup.myPreviousButtonText;\n\n this.myPreviousButtonCursorTargetComponent = this.myPreviousButtonCursorTarget.addComponent('cursor-target');\n this.myPreviousButtonCollisionComponent = this.myPreviousButtonCursorTarget.addComponent('collision');\n this.myPreviousButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPreviousButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPreviousButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n //Position\n this.myPositionLabelTextComponent = this.myPositionLabelText.addComponent('text');\n this._setupTextComponent(this.myPositionLabelTextComponent);\n this.myPositionLabelTextComponent.text = this._mySetup.myPositionText;\n\n this.myPositionLabelCursorTargetComponent = this.myPositionLabelCursorTarget.addComponent('cursor-target');\n this.myPositionLabelCollisionComponent = this.myPositionLabelCursorTarget.addComponent('collision');\n this.myPositionLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionLabelCollisionComponent.extents = this._mySetup.myComponentLabelCollisionExtents;\n\n this.myPositionTextComponents = [];\n this.myPositionCursorTargetComponents = [];\n this.myPositionCollisionComponents = [];\n\n this.myPositionIncreaseButtonBackgroundComponents = [];\n this.myPositionIncreaseButtonTextComponents = [];\n this.myPositionIncreaseButtonCursorTargetComponents = [];\n this.myPositionIncreaseButtonCollisionComponents = [];\n\n this.myPositionDecreaseButtonBackgroundComponents = [];\n this.myPositionDecreaseButtonTextComponents = [];\n this.myPositionDecreaseButtonCursorTargetComponents = [];\n this.myPositionDecreaseButtonCollisionComponents = [];\n\n for (let i = 0; i < 3; i++) {\n this.myPositionTextComponents[i] = this.myPositionTexts[i].addComponent('text');\n this._setupTextComponent(this.myPositionTextComponents[i]);\n this.myPositionTextComponents[i].text = \" \";\n\n this.myPositionCursorTargetComponents[i] = this.myPositionCursorTargets[i].addComponent('cursor-target');\n this.myPositionCollisionComponents[i] = this.myPositionCursorTargets[i].addComponent('collision');\n this.myPositionCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myPositionIncreaseButtonBackgroundComponents[i] = this.myPositionIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myPositionIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myPositionIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionIncreaseButtonTextComponents[i] = this.myPositionIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myPositionIncreaseButtonTextComponents[i]);\n this.myPositionIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myPositionIncreaseButtonCursorTargetComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myPositionIncreaseButtonCollisionComponents[i] = this.myPositionIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myPositionIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPositionDecreaseButtonBackgroundComponents[i] = this.myPositionDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myPositionDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myPositionDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionDecreaseButtonTextComponents[i] = this.myPositionDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myPositionDecreaseButtonTextComponents[i]);\n this.myPositionDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myPositionDecreaseButtonCursorTargetComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myPositionDecreaseButtonCollisionComponents[i] = this.myPositionDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myPositionDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n //Rotation\n this.myRotationLabelTextComponent = this.myRotationLabelText.addComponent('text');\n this._setupTextComponent(this.myRotationLabelTextComponent);\n this.myRotationLabelTextComponent.text = this._mySetup.myRotationText;\n\n this.myRotationLabelCursorTargetComponent = this.myRotationLabelCursorTarget.addComponent('cursor-target');\n this.myRotationLabelCollisionComponent = this.myRotationLabelCursorTarget.addComponent('collision');\n this.myRotationLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationLabelCollisionComponent.extents = this._mySetup.myComponentLabelCollisionExtents;\n\n this.myRotationTextComponents = [];\n this.myRotationCursorTargetComponents = [];\n this.myRotationCollisionComponents = [];\n\n this.myRotationIncreaseButtonBackgroundComponents = [];\n this.myRotationIncreaseButtonTextComponents = [];\n this.myRotationIncreaseButtonCursorTargetComponents = [];\n this.myRotationIncreaseButtonCollisionComponents = [];\n\n this.myRotationDecreaseButtonBackgroundComponents = [];\n this.myRotationDecreaseButtonTextComponents = [];\n this.myRotationDecreaseButtonCursorTargetComponents = [];\n this.myRotationDecreaseButtonCollisionComponents = [];\n\n for (let i = 0; i < 3; i++) {\n this.myRotationTextComponents[i] = this.myRotationTexts[i].addComponent('text');\n this._setupTextComponent(this.myRotationTextComponents[i]);\n this.myRotationTextComponents[i].text = \" \";\n\n this.myRotationCursorTargetComponents[i] = this.myRotationCursorTargets[i].addComponent('cursor-target');\n this.myRotationCollisionComponents[i] = this.myRotationCursorTargets[i].addComponent('collision');\n this.myRotationCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myRotationIncreaseButtonBackgroundComponents[i] = this.myRotationIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myRotationIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myRotationIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationIncreaseButtonTextComponents[i] = this.myRotationIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myRotationIncreaseButtonTextComponents[i]);\n this.myRotationIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myRotationIncreaseButtonCursorTargetComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myRotationIncreaseButtonCollisionComponents[i] = this.myRotationIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myRotationIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myRotationDecreaseButtonBackgroundComponents[i] = this.myRotationDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myRotationDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myRotationDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationDecreaseButtonTextComponents[i] = this.myRotationDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myRotationDecreaseButtonTextComponents[i]);\n this.myRotationDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myRotationDecreaseButtonCursorTargetComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myRotationDecreaseButtonCollisionComponents[i] = this.myRotationDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myRotationDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n //Scale\n this.myScaleLabelTextComponent = this.myScaleLabelText.addComponent('text');\n this._setupTextComponent(this.myScaleLabelTextComponent);\n this.myScaleLabelTextComponent.text = this._mySetup.myScaleText;\n\n this.myScaleLabelCursorTargetComponent = this.myScaleLabelCursorTarget.addComponent('cursor-target');\n this.myScaleLabelCollisionComponent = this.myScaleLabelCursorTarget.addComponent('collision');\n this.myScaleLabelCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleLabelCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleLabelCollisionComponent.extents = this._mySetup.myComponentLabelCollisionExtents;\n\n this.myScaleTextComponents = [];\n this.myScaleCursorTargetComponents = [];\n this.myScaleCollisionComponents = [];\n\n this.myScaleIncreaseButtonBackgroundComponents = [];\n this.myScaleIncreaseButtonTextComponents = [];\n this.myScaleIncreaseButtonCursorTargetComponents = [];\n this.myScaleIncreaseButtonCollisionComponents = [];\n\n this.myScaleDecreaseButtonBackgroundComponents = [];\n this.myScaleDecreaseButtonTextComponents = [];\n this.myScaleDecreaseButtonCursorTargetComponents = [];\n this.myScaleDecreaseButtonCollisionComponents = [];\n\n for (let i = 0; i < 3; i++) {\n this.myScaleTextComponents[i] = this.myScaleTexts[i].addComponent('text');\n this._setupTextComponent(this.myScaleTextComponents[i]);\n this.myScaleTextComponents[i].text = \" \";\n\n this.myScaleCursorTargetComponents[i] = this.myScaleCursorTargets[i].addComponent('cursor-target');\n this.myScaleCollisionComponents[i] = this.myScaleCursorTargets[i].addComponent('collision');\n this.myScaleCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleCollisionComponents[i].extents = this._mySetup.myValueCollisionExtents;\n\n //Increase/Decrease\n this.myScaleIncreaseButtonBackgroundComponents[i] = this.myScaleIncreaseButtonBackgrounds[i].addComponent('mesh');\n this.myScaleIncreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myScaleIncreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleIncreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleIncreaseButtonTextComponents[i] = this.myScaleIncreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myScaleIncreaseButtonTextComponents[i]);\n this.myScaleIncreaseButtonTextComponents[i].text = this._mySetup.myIncreaseButtonText;\n\n this.myScaleIncreaseButtonCursorTargetComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myScaleIncreaseButtonCollisionComponents[i] = this.myScaleIncreaseButtonCursorTargets[i].addComponent('collision');\n this.myScaleIncreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleIncreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleIncreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myScaleDecreaseButtonBackgroundComponents[i] = this.myScaleDecreaseButtonBackgrounds[i].addComponent('mesh');\n this.myScaleDecreaseButtonBackgroundComponents[i].mesh = this._myPlaneMesh;\n this.myScaleDecreaseButtonBackgroundComponents[i].material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleDecreaseButtonBackgroundComponents[i].material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleDecreaseButtonTextComponents[i] = this.myScaleDecreaseButtonTexts[i].addComponent('text');\n this._setupTextComponent(this.myScaleDecreaseButtonTextComponents[i]);\n this.myScaleDecreaseButtonTextComponents[i].text = this._mySetup.myDecreaseButtonText;\n\n this.myScaleDecreaseButtonCursorTargetComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].addComponent('cursor-target');\n this.myScaleDecreaseButtonCollisionComponents[i] = this.myScaleDecreaseButtonCursorTargets[i].addComponent('collision');\n this.myScaleDecreaseButtonCollisionComponents[i].collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleDecreaseButtonCollisionComponents[i].group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleDecreaseButtonCollisionComponents[i].extents = this._mySetup.mySideButtonCollisionExtents;\n }\n }\n\n _addStepComponents() {\n //Position\n this.myPositionStepTextComponent = this.myPositionStepText.addComponent('text');\n this._setupTextComponent(this.myPositionStepTextComponent);\n this.myPositionStepTextComponent.text = \" \";\n\n this.myPositionStepCursorTargetComponent = this.myPositionStepCursorTarget.addComponent('cursor-target');\n this.myPositionStepCollisionComponent = this.myPositionStepCursorTarget.addComponent('collision');\n this.myPositionStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myPositionStepIncreaseButtonBackgroundComponent = this.myPositionStepIncreaseButtonBackground.addComponent('mesh');\n this.myPositionStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPositionStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionStepIncreaseButtonTextComponent = this.myPositionStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myPositionStepIncreaseButtonTextComponent);\n this.myPositionStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myPositionStepIncreaseButtonCursorTargetComponent = this.myPositionStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myPositionStepIncreaseButtonCollisionComponent = this.myPositionStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myPositionStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myPositionStepDecreaseButtonBackgroundComponent = this.myPositionStepDecreaseButtonBackground.addComponent('mesh');\n this.myPositionStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myPositionStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myPositionStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myPositionStepDecreaseButtonTextComponent = this.myPositionStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myPositionStepDecreaseButtonTextComponent);\n this.myPositionStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myPositionStepDecreaseButtonCursorTargetComponent = this.myPositionStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myPositionStepDecreaseButtonCollisionComponent = this.myPositionStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myPositionStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPositionStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPositionStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n //Rotation\n this.myRotationStepTextComponent = this.myRotationStepText.addComponent('text');\n this._setupTextComponent(this.myRotationStepTextComponent);\n this.myRotationStepTextComponent.text = \" \";\n\n this.myRotationStepCursorTargetComponent = this.myRotationStepCursorTarget.addComponent('cursor-target');\n this.myRotationStepCollisionComponent = this.myRotationStepCursorTarget.addComponent('collision');\n this.myRotationStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myRotationStepIncreaseButtonBackgroundComponent = this.myRotationStepIncreaseButtonBackground.addComponent('mesh');\n this.myRotationStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myRotationStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationStepIncreaseButtonTextComponent = this.myRotationStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myRotationStepIncreaseButtonTextComponent);\n this.myRotationStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myRotationStepIncreaseButtonCursorTargetComponent = this.myRotationStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myRotationStepIncreaseButtonCollisionComponent = this.myRotationStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myRotationStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myRotationStepDecreaseButtonBackgroundComponent = this.myRotationStepDecreaseButtonBackground.addComponent('mesh');\n this.myRotationStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myRotationStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myRotationStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myRotationStepDecreaseButtonTextComponent = this.myRotationStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myRotationStepDecreaseButtonTextComponent);\n this.myRotationStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myRotationStepDecreaseButtonCursorTargetComponent = this.myRotationStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myRotationStepDecreaseButtonCollisionComponent = this.myRotationStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myRotationStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myRotationStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myRotationStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n //Scale\n this.myScaleStepTextComponent = this.myScaleStepText.addComponent('text');\n this._setupTextComponent(this.myScaleStepTextComponent);\n this.myScaleStepTextComponent.text = \" \";\n\n this.myScaleStepCursorTargetComponent = this.myScaleStepCursorTarget.addComponent('cursor-target');\n this.myScaleStepCollisionComponent = this.myScaleStepCursorTarget.addComponent('collision');\n this.myScaleStepCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleStepCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleStepCollisionComponent.extents = this._mySetup.myStepCollisionExtents;\n\n //Increase/Decrease\n this.myScaleStepIncreaseButtonBackgroundComponent = this.myScaleStepIncreaseButtonBackground.addComponent('mesh');\n this.myScaleStepIncreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myScaleStepIncreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleStepIncreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleStepIncreaseButtonTextComponent = this.myScaleStepIncreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myScaleStepIncreaseButtonTextComponent);\n this.myScaleStepIncreaseButtonTextComponent.text = this._mySetup.myIncreaseButtonText;\n\n this.myScaleStepIncreaseButtonCursorTargetComponent = this.myScaleStepIncreaseButtonCursorTarget.addComponent('cursor-target');\n this.myScaleStepIncreaseButtonCollisionComponent = this.myScaleStepIncreaseButtonCursorTarget.addComponent('collision');\n this.myScaleStepIncreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleStepIncreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleStepIncreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n\n this.myScaleStepDecreaseButtonBackgroundComponent = this.myScaleStepDecreaseButtonBackground.addComponent('mesh');\n this.myScaleStepDecreaseButtonBackgroundComponent.mesh = this._myPlaneMesh;\n this.myScaleStepDecreaseButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\n this.myScaleStepDecreaseButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\n\n this.myScaleStepDecreaseButtonTextComponent = this.myScaleStepDecreaseButtonText.addComponent('text');\n this._setupTextComponent(this.myScaleStepDecreaseButtonTextComponent);\n this.myScaleStepDecreaseButtonTextComponent.text = this._mySetup.myDecreaseButtonText;\n\n this.myScaleStepDecreaseButtonCursorTargetComponent = this.myScaleStepDecreaseButtonCursorTarget.addComponent('cursor-target');\n this.myScaleStepDecreaseButtonCollisionComponent = this.myScaleStepDecreaseButtonCursorTarget.addComponent('collision');\n this.myScaleStepDecreaseButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myScaleStepDecreaseButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myScaleStepDecreaseButtonCollisionComponent.extents = this._mySetup.mySideButtonCollisionExtents;\n }\n\n _addPointerComponents() {\n this.myPointerCollisionComponent = this.myPointerCursorTarget.addComponent('collision');\n this.myPointerCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\n this.myPointerCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\n this.myPointerCollisionComponent.extents = this._mySetup.myPointerCollisionExtents;\n }\n\n _setupTextComponent(textComponent) {\n textComponent.alignment = this._mySetup.myTextAlignment;\n textComponent.justification = this._mySetup.myTextJustification;\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\n textComponent.material.color = this._mySetup.myTextColor;\n textComponent.text = \"\";\n }\n\n _onXRSessionStart() {\n this._setTransformForVR();\n }\n\n _onXRSessionEnd() {\n this._setTransformForNonVR();\n }\n\n _setTransformForVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[this._myAdditionalSetup.myHandedness]);\n }\n\n _setTransformForNonVR() {\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectPositions[PP.ToolHandedness.NONE]);\n }\n};", "PP.EasyTuneTransformWidgetSetup = class EasyTuneTransformWidgetSetup {\n\n constructor() {\n this._initializeBuildSetup();\n this._initializeRuntimeSetup();\n }\n\n _initializeBuildSetup() {\n //General\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\n\n this.myCursorTargetCollisionCollider = 2; // box\n this.myCursorTargetCollisionGroup = 7;\n this.myCursorTargetCollisionThickness = 0.001;\n\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\n\n this.myTextAlignment = 2; // center\n this.myTextJustification = 2; // middle\n this.myTextColor = this.myDefaultTextColor;\n\n //Pivot\n this.myPivotObjectPositions = [];\n this.myPivotObjectPositions[PP.ToolHandedness.NONE] = [0, 0, 0.00805713];\n this.myPivotObjectPositions[PP.ToolHandedness.LEFT] = [-0.04, 0.02, 0.00805713]; //little \"random\" z offset to avoid glitching with other widgets\n this.myPivotObjectPositions[PP.ToolHandedness.RIGHT] = [-0.08, 0.02, 0.00805713];\n\n let panelZ = 0.01;\n let distanceFromBorder = 0.0125;\n let distanceFromValue = 0.055;\n let colliderZPosition = 0.017;\n let backgroundHalfWidth = 0.2;\n\n this.mySideButtonBackgroundScale = [0.015, 0.015, 1];\n this.mySideButtonTextScale = [0.18, 0.18, 0.18];\n this.mySideButtonTextPosition = [0, 0, 0.007];\n\n this.mySideButtonCursorTargetPosition = [0, 0, 0];\n this.mySideButtonCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.mySideButtonCollisionExtents = this.mySideButtonBackgroundScale.slice(0);\n this.mySideButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myLeftSideButtonPosition = [-0.13, 0, 0];\n this.myRightSideButtonPosition = [-this.myLeftSideButtonPosition[0], 0, 0];\n\n this.myPreviousButtonPosition = [0, 0, -0.00001];\n this.myPreviousButtonPosition[0] = -backgroundHalfWidth + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n\n this.myNextButtonPosition = [0, 0, -0.00001];\n this.myNextButtonPosition[0] = backgroundHalfWidth - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myIncreaseButtonText = \"+\";\n this.myDecreaseButtonText = \"-\";\n\n //Display\n this.myDisplayPanelPosition = [0, 0.1, 0];\n\n this.myVariableLabelPanelPosition = [0, 0.025, panelZ];\n this.myVariableLabelTextScale = [0.19, 0.19, 0.19];\n\n this.myVariableLabelCursorTargetPosition = [0, 0, 0];\n this.myVariableLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myVariableLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myVariableLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myNextButtonText = \">\";\n this.myPreviousButtonText = \"<\";\n\n let distanceBetweenComponents = Math.abs(this.myNextButtonPosition[0]) + Math.abs(this.myRightSideButtonPosition[0]);\n let distanceFromVariableLabel = 0.045;\n this.myPositionPanelPosition = [0, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, panelZ];\n this.myRotationPanelPosition = [this.myPositionPanelPosition[0] + distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, panelZ];\n this.myScalePanelPosition = [this.myPositionPanelPosition[0] - distanceBetweenComponents, this.myVariableLabelPanelPosition[1] - distanceFromVariableLabel, panelZ];\n\n this.myPositionText = \"Position\";\n this.myRotationText = \"Rotation\";\n this.myScaleText = \"Scale\";\n\n this.myComponentLabelTextScale = [0.19, 0.19, 0.19];\n this.myComponentLabelCursorTargetPosition = [0, 0, 0];\n this.myComponentLabelCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myComponentLabelCollisionExtents = [0.065, 0.0175, 1];\n this.myComponentLabelCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n this.myValueTextScale = [0.4, 0.4, 0.4];\n\n this.myValueCursorTargetPosition = [0, 0.0, 0];\n this.myValueCursorTargetPosition[2] = colliderZPosition - panelZ;\n this.myValueCollisionExtents = [0.065, 0.02, 1];\n this.myValueCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n let distanceBetweenValues = this.mySideButtonBackgroundScale[1] * 2 + 0.015;\n\n this.myValuePanelsPositions = [];\n this.myValuePanelsPositions[0] = [0, -distanceFromValue, 0];\n for (let i = 1; i < 3; i++) {\n this.myValuePanelsPositions[i] = this.myValuePanelsPositions[i - 1].slice(0);\n this.myValuePanelsPositions[i][1] -= distanceBetweenValues;\n }\n\n //Step\n let valuePanelLastPosition = this.myValuePanelsPositions[2][1];\n this.myStepPanelPosition = [0, valuePanelLastPosition - distanceFromValue, 0];\n this.myStepTextScale = [0.19, 0.19, 0.19];\n this.myStepStartString = \"Step: \";\n\n this.myStepCursorTargetPosition = [0, 0, 0];\n this.myStepCursorTargetPosition[2] = colliderZPosition - this.myStepPanelPosition[2];\n this.myStepCollisionExtents = [0.065, 0.0175, 1];\n this.myStepCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n\n //Background\n {\n let maxY = this.myDisplayPanelPosition[1] + this.myVariableLabelPanelPosition[1] + this.mySideButtonBackgroundScale[1] + distanceFromBorder * 1.25;\n let minY = this.myDisplayPanelPosition[1] + this.myPositionPanelPosition[1] + this.myStepPanelPosition[1] - distanceFromBorder * 1.25 - this.mySideButtonBackgroundScale[1];\n\n let maxX = this.myDisplayPanelPosition[0] + this.myRotationPanelPosition[0] + this.myRightSideButtonPosition[0] + this.mySideButtonBackgroundScale[0] + distanceFromBorder;\n let minX = this.myDisplayPanelPosition[0] + this.myScalePanelPosition[0] + this.myLeftSideButtonPosition[0] - this.mySideButtonBackgroundScale[0] - distanceFromBorder;\n\n this.myBackPanelPosition = [(maxX + minX) / 2, (maxY + minY) / 2, 0];\n this.myBackBackgroundScale = [(maxX - minX) / 2, (maxY - minY) / 2, 1];\n this.myBackBackgroundColor = [70 / 255, 70 / 255, 70 / 255, 1];\n }\n\n //Pointer\n this.myPointerCollisionExtents = this.myBackBackgroundScale.slice(0);\n this.myPointerCollisionExtents[2] = this.myCursorTargetCollisionThickness;\n this.myPointerCursorTargetPosition = this.myBackPanelPosition.slice(0);\n this.myPointerCursorTargetPosition[2] = colliderZPosition - 0.0001; // a little behind the button target to avoid hiding it\n }\n\n _initializeRuntimeSetup() {\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\n this.myTextHoverScaleMultiplier = [1.25, 1.25, 1.25];\n\n this.myEditThumbstickMinThreshold = 0.35;\n this.myStepMultiplierStepPerSecond = 2.25;\n this.myButtonEditDelay = 0;\n\n this.myScrollVariableDelay = 0.5;\n }\n};", "PP.EasyTuneWidget = class EasyTuneWidget {\n\n constructor() {\n this._myIsStarted = false;\n this._myStartVariable = null;\n\n this._myWidgetFrame = new PP.WidgetFrame(\"E\", 1);\n this._myWidgetFrame.registerWidgetVisibleChangedEventListener(this, this._widgetVisibleChanged.bind(this));\n\n this._mySetup = new PP.EasyTuneWidgetSetup();\n this._myAdditionalSetup = null;\n\n this._myWidgets = [];\n\n this._myEasyTuneVariables = null;\n this._myEasyTuneLastSize = 0;\n this._myVariableNames = null;\n\n this._myCurrentWidget = null;\n this._myCurrentVariable = null;\n\n this._myScrollVariableTimer = 0;\n\n this._myGamepad = null;\n\n this._myRefreshVariablesTimer = 0;\n\n this._myDirty = false;\n }\n\n setActiveVariable(variableName) {\n if (!this._myIsStarted) {\n this._myStartVariable = variableName;\n } else if (this._myEasyTuneVariables.has(variableName)) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(variableName);\n this._selectCurrentWidget();\n } else {\n console.log(\"Can't set easy tune active variable\");\n }\n }\n\n refresh() {\n if (this._myWidgetFrame.myIsWidgetVisible) {\n this._myDirty = true;\n }\n }\n\n setVisible(visible) {\n this._myWidgetFrame.setVisible(visible);\n }\n\n isVisible() {\n return this._myWidgetFrame.isVisible();\n }\n\n start(parentObject, additionalSetup, easyTuneVariables) {\n this._myRightGamepad = PP.myRightGamepad; //@EDIT get right gamepad here based on how you store it in your game\n this._myLeftGamepad = PP.myLeftGamepad; //@EDIT get left gamepad here based on how you store it in your game\n if (this._mySetup.myGamepadHandedness == PP.ToolHandedness.RIGHT) {\n this._myGamepad = this._myRightGamepad;\n } else if (this._mySetup.myGamepadHandedness == PP.ToolHandedness.LEFT) {\n this._myGamepad = this._myLeftGamepad;\n }\n\n this._myIsStarted = true;\n\n this._myAdditionalSetup = additionalSetup;\n\n this._myWidgetFrame.start(parentObject, additionalSetup);\n\n this._myEasyTuneVariables = easyTuneVariables;\n this._myEasyTuneLastSize = this._myEasyTuneVariables.size;\n this._myVariableNames = Array.from(this._myEasyTuneVariables.keys());\n\n if (this._myEasyTuneVariables.size > 0) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myVariableNames[0]);\n }\n\n if (this._myStartVariable) {\n if (this._myEasyTuneVariables.has(this._myStartVariable)) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myStartVariable);\n } else {\n console.log(\"Can't set easy tune active variable\");\n }\n }\n\n this._initializeWidgets();\n }\n\n update(dt) {\n this._myWidgetFrame.update(dt);\n\n if (this._myEasyTuneVariables.size != this._myEasyTuneLastSize || this._myDirty) {\n this._refreshEasyTuneVariables();\n }\n\n if (this._myWidgetFrame.myIsWidgetVisible && this._myEasyTuneVariables.size > 0) {\n if (this._mySetup.myRefreshVariablesDelay != null) {\n this._myRefreshVariablesTimer += dt;\n if (this._myRefreshVariablesTimer > this._mySetup.myRefreshVariablesDelay) {\n this._myRefreshVariablesTimer = 0;\n this._refreshEasyTuneVariables();\n }\n }\n\n if (this._myCurrentWidget) {\n this._myCurrentWidget.update(dt);\n }\n\n if (this._myAdditionalSetup.myEnableGamepadScrollVariable) {\n this._updateGamepadScrollVariable(dt);\n }\n }\n\n this._updateGamepadWidgetVisibility();\n\n this._updateActiveVariable();\n }\n\n _initializeWidgets() {\n this._myWidgets[PP.EasyTuneVariableType.NONE] = new PP.EasyTuneNoneWidget();\n this._myWidgets[PP.EasyTuneVariableType.NUMBER] = new PP.EasyTuneNumberWidget(this._myGamepad);\n this._myWidgets[PP.EasyTuneVariableType.BOOL] = new PP.EasyTuneBoolWidget(this._myGamepad);\n this._myWidgets[PP.EasyTuneVariableType.TRANSFORM] = new PP.EasyTuneTransformWidget(this._myGamepad);\n\n for (let item of this._myWidgets) {\n item.start(this._myWidgetFrame.getWidgetObject(), this._myAdditionalSetup);\n item.setVisible(false);\n item.registerScrollVariableRequestEventListener(this, this._scrollVariable.bind(this));\n }\n\n this._selectCurrentWidget();\n }\n\n _selectCurrentWidget() {\n if (this._myEasyTuneVariables.size <= 0) {\n return;\n }\n\n let scrollVariableActive = false;\n let scrollVariableDirection = 0;\n\n if (this._myCurrentWidget) {\n scrollVariableActive = this._myCurrentWidget.isScrollVariableActive();\n scrollVariableDirection = this._myCurrentWidget.getScrollVariableDirection();\n\n this._myCurrentWidget.setVisible(false);\n }\n\n if (this._myCurrentVariable.myType in this._myWidgets) {\n this._myCurrentWidget = this._myWidgets[this._myCurrentVariable.myType];\n } else {\n this._myCurrentWidget = this._myWidgets[PP.EasyTuneVariableType.NONE];\n }\n\n this._myCurrentWidget.setEasyTuneVariable(this._myCurrentVariable, this._createIndexString());\n this._myCurrentWidget.setVisible(this._myWidgetFrame.myIsWidgetVisible);\n this._myCurrentWidget.setScrollVariableActive(scrollVariableActive, scrollVariableDirection);\n }\n\n _refreshEasyTuneVariables() {\n this._myVariableNames = Array.from(this._myEasyTuneVariables.keys());\n this._myEasyTuneLastSize = this._myEasyTuneVariables.size;\n\n if (this._myEasyTuneVariables.size > 0) {\n if (this._myCurrentVariable && this._myEasyTuneVariables.has(this._myCurrentVariable.myName)) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myCurrentVariable.myName);\n } else {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myVariableNames[0]);\n }\n\n this._selectCurrentWidget();\n } else {\n this._myCurrentVariable = null;\n if (this._myCurrentWidget) {\n this._myCurrentWidget.setVisible(false);\n this._myCurrentWidget = null;\n }\n }\n\n this._myDirty = false;\n }\n\n _updateGamepadWidgetVisibility() {\n if (this._myGamepad) {\n if ((this._myGamepad.getButtonInfo(PP.ButtonType.BOTTOM_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).myIsPressed) ||\n (this._myGamepad.getButtonInfo(PP.ButtonType.TOP_BUTTON).isPressStart() && this._myGamepad.getButtonInfo(PP.ButtonType.BOTTOM_BUTTON).myIsPressed)) {\n this._toggleVisibility();\n }\n }\n }\n\n _toggleVisibility() {\n this._myWidgetFrame.toggleVisibility();\n }\n\n _widgetVisibleChanged(visible) {\n for (let widget of this._myWidgets) {\n widget.setVisible(false);\n }\n\n if (this._myCurrentWidget) {\n if (this._myEasyTuneVariables.size > 0) {\n this._myCurrentWidget.setVisible(visible);\n } else {\n this._myCurrentWidget.setVisible(false);\n }\n }\n\n if (visible) {\n this._refreshEasyTuneVariables();\n }\n }\n\n _updateGamepadScrollVariable(dt) {\n if (this._myGamepad && (!this._mySetup.myScrollVariableButtonType || this._myGamepad.getButtonInfo(this._mySetup.myScrollVariableButtonType).myIsPressed)) {\n let x = this._myGamepad.getAxesInfo().myAxes[0];\n let y = this._myGamepad.getAxesInfo().myAxes[1];\n if (Math.abs(x) > this._mySetup.myScrollVariableMinXThreshold && Math.abs(y) < this._mySetup.myScrollVariableMaxYThreshold) {\n this._myScrollVariableTimer += dt;\n while (this._myScrollVariableTimer > this._mySetup.myScrollVariableDelay) {\n this._myScrollVariableTimer -= this._mySetup.myScrollVariableDelay;\n this._scrollVariable(Math.sign(x));\n }\n } else {\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n }\n } else {\n this._myScrollVariableTimer = this._mySetup.myScrollVariableDelay;\n }\n }\n\n _scrollVariable(amount) {\n if (this._myEasyTuneVariables.size <= 0) {\n return;\n }\n\n let variableIndex = this._getVariableIndex(this._myCurrentVariable);\n if (variableIndex >= 0) {\n let newIndex = (((variableIndex + amount) % this._myVariableNames.length) + this._myVariableNames.length) % this._myVariableNames.length; //manage negative numbers\n if (this._myEasyTuneVariables.has(this._myVariableNames[newIndex])) {\n this._myCurrentVariable = this._myEasyTuneVariables.get(this._myVariableNames[newIndex]);\n this._selectCurrentWidget();\n } else {\n this._refreshEasyTuneVariables();\n }\n } else {\n this._refreshEasyTuneVariables();\n }\n }\n\n _createIndexString() {\n let indexString = \" (\";\n let index = (this._getVariableIndex(this._myCurrentVariable) + 1).toString();\n let length = (this._myEasyTuneVariables.size).toString();\n while (index.length < length.length) {\n index = \"0\".concat(index);\n }\n\n indexString = indexString.concat(index).concat(\" - \").concat(length).concat(\")\");\n\n return indexString;\n }\n\n _getVariableIndex(variable) {\n let variableIndex = this._myVariableNames.indexOf(variable.myName);\n return variableIndex;\n }\n\n _updateActiveVariable() {\n this._myEasyTuneVariables.forEach(function (value) {\n value.myIsActive = false;\n });\n\n if (this._myWidgetFrame.myIsWidgetVisible && this._myCurrentVariable) {\n this._myCurrentVariable.myIsActive = true;\n }\n }\n};", "PP.EasyTuneWidgetSetup = class EasyTuneWidgetSetup {\n\n constructor() {\n this._initializeRuntimeSetup();\n }\n\n _initializeRuntimeSetup() {\n this.myGamepadHandedness = PP.ToolHandedness.RIGHT;\n\n this.myScrollVariableDelay = 0.5;\n this.myScrollVariableMinXThreshold = 0.6;\n this.myScrollVariableMaxYThreshold = 0.25;\n this.myScrollVariableButtonType = null;\n\n this.myRefreshVariablesDelay = null;\n }\n};", "//Variable Map\nPP.EasyTuneVariables = class EasyTuneVariables {\n constructor() {\n this._myMap = new Map();\n }\n\n add(variable) {\n this._myMap.set(variable.myName, variable);\n }\n\n remove(variableName) {\n this._myMap.delete(variableName);\n }\n\n get(variableName) {\n let variable = this._myMap.get(variableName);\n if (variable) {\n return variable.getValue();\n }\n\n return null;\n }\n\n set(variableName, value, resetInitialValue = false) {\n let variable = this._myMap.get(variableName);\n if (variable) {\n variable.setValue(value, resetInitialValue);\n }\n }\n\n isActive(variableName) {\n let variable = this._myMap.get(variableName);\n if (variable) {\n return variable.myIsActive;\n }\n\n return false;\n }\n\n getEasyTuneVariable(variableName) {\n return this._myMap.get(variableName);\n }\n\n _getInternalMap() {\n return this._myMap;\n }\n\n registerValueChangedEventListener(variableName, callbackID, callback) {\n this._myMap.get(variableName).registerValueChangedEventListener(callbackID, callback);\n }\n\n unregisterValueChangedEventListener(variableName, callbackID, callback) {\n this._myMap.get(variableName).unregisterValueChangedEventListener(callbackID);\n }\n};\n\n//Variable Types\nPP.EasyTuneVariableType = {\n NONE: 0,\n NUMBER: 1,\n BOOL: 2,\n TRANSFORM: 3\n};\n\nPP.EasyTuneVariable = class EasyTuneVariable {\n constructor(name, type) {\n this.myName = name.slice(0);\n this.myType = type;\n\n this.myValue = null;\n this.myInitialValue = null;\n\n this.myIsActive = false;\n\n this._myValueChangedCallbacks = new Map(); // Signature: callback(name, value)\n }\n\n getValue() {\n return this.myValue;\n }\n\n setValue(value, resetInitialValue = false) {\n let oldValue = this.myValue;\n this.myValue = value;\n\n if (resetInitialValue) {\n PP.EasyTuneVariable.prototype.setInitialValue.call(this, value);\n }\n\n PP.refreshEasyTuneWidget();\n\n if (oldValue != value) {\n this._triggerValueChangedCallback();\n }\n }\n\n setInitialValue(value) {\n this.myInitialValue = value;\n }\n\n registerValueChangedEventListener(id, callback) {\n this._myValueChangedCallbacks.set(id, callback);\n }\n\n unregisterValueChangedEventListener(id) {\n this._myValueChangedCallbacks.delete(id);\n }\n\n _triggerValueChangedCallback() {\n if (this._myValueChangedCallbacks.size > 0) {\n this._myValueChangedCallbacks.forEach(function (callback) { callback(this.myName, this.getValue()); }.bind(this));\n }\n }\n};\n\nPP.EasyTuneVariableArray = class EasyTuneVariableArray extends PP.EasyTuneVariable {\n constructor(name, type, value) {\n super(name, type);\n\n PP.EasyTuneVariableArray.prototype.setValue.call(this, value, true);\n }\n\n getValue() {\n return this.myValue.slice(0);\n }\n\n setValue(value, resetInitialValue = false) {\n let oldValue = this.myValue;\n this.myValue = value.slice(0);\n\n if (resetInitialValue) {\n PP.EasyTuneVariableArray.prototype.setInitialValue.call(this, value);\n }\n\n PP.refreshEasyTuneWidget();\n\n if (oldValue == null || !oldValue.pp_equals(value)) {\n this._triggerValueChangedCallback();\n }\n }\n\n setInitialValue(value) {\n this.myInitialValue = value.slice(0);\n }\n};\n\n//NUMBER\n\nPP.EasyTuneNumberArray = class EasyTuneNumberArray extends PP.EasyTuneVariableArray {\n constructor(name, value, stepPerSecond, decimalPlaces, min = null, max = null, editAllValuesTogether = false) {\n super(name, PP.EasyTuneVariableType.NUMBER, value);\n\n this.myDecimalPlaces = decimalPlaces;\n this.myStepPerSecond = stepPerSecond;\n\n this.myInitialStepPerSecond = this.myStepPerSecond;\n\n this.myMin = min;\n this.myMax = max;\n\n this.myEditAllValuesTogether = editAllValuesTogether;\n\n this._clampValue(true);\n }\n\n setMax(max) {\n this.myMax = max;\n this._clampValue(false);\n }\n\n setMin(min) {\n this.myMin = min;\n this._clampValue(false);\n }\n\n _clampValue(resetInitialValue) {\n let clampedValue = this.myValue.vec_clamp(this.myMin, this.myMax);\n\n if (!resetInitialValue) {\n let clampedInitialValue = this.myInitialValue.vec_clamp(this.myMin, this.myMax);\n let initialValueChanged = !clampedInitialValue.vec_equals(this.myInitialValue, 0.00001);\n if (initialValueChanged) {\n PP.EasyTuneVariableArray.prototype.setInitialValue.call(this, clampedInitialValue);\n }\n }\n\n PP.EasyTuneVariableArray.prototype.setValue.call(this, clampedValue, resetInitialValue);\n }\n};\n\nPP.EasyTuneNumber = class EasyTuneNumber extends PP.EasyTuneNumberArray {\n constructor(name, value, stepPerSecond, decimalPlaces, min, max) {\n super(name, [value], stepPerSecond, decimalPlaces, min, max);\n }\n\n getValue() {\n return this.myValue[0];\n }\n\n setValue(value, resetInitialValue = false) {\n super.setValue([value], resetInitialValue);\n }\n\n setInitialValue(value) {\n super.setValue([value]);\n }\n};\n\nPP.EasyTuneInt = class EasyTuneInt extends PP.EasyTuneNumber {\n constructor(name, value, stepPerSecond, min, max) {\n super(name, value, stepPerSecond, 0, min, max);\n }\n};\n\nPP.EasyTuneIntArray = class EasyTuneIntArray extends PP.EasyTuneNumberArray {\n constructor(name, value, stepPerSecond, min, max) {\n let tempValue = value.slice(0);\n\n for (let i = 0; i < value.length; i++) {\n tempValue[i] = Math.round(tempValue[i]);\n }\n\n super(name, tempValue, stepPerSecond, 0, Math.round(min), Math.round(max));\n }\n};\n\n//BOOL\n\nPP.EasyTuneBoolArray = class EasyTuneBoolArray extends PP.EasyTuneVariableArray {\n constructor(name, value) {\n super(name, PP.EasyTuneVariableType.BOOL, value);\n }\n};\n\nPP.EasyTuneBool = class EasyTuneBool extends PP.EasyTuneBoolArray {\n constructor(name, value) {\n super(name, [value]);\n }\n\n getValue() {\n return this.myValue[0];\n }\n\n setValue(value, resetInitialValue = false) {\n super.setValue([value], resetInitialValue);\n }\n\n setInitialValue(value) {\n super.setValue([value]);\n }\n};\n\n//EASY TUNE EASY TRANSFORM\n\nPP.EasyTuneTransform = class EasyTuneTransform extends PP.EasyTuneVariable {\n constructor(name, value, scaleAsOne = true, positionStepPerSecond = 1, rotationStepPerSecond = 50, scaleStepPerSecond = 1) {\n super(name, PP.EasyTuneVariableType.TRANSFORM);\n\n this.myDecimalPlaces = 3;\n\n this.myPosition = value.mat4_getPosition();\n this.myRotation = value.mat4_getRotationDegrees();\n this.myScale = value.mat4_getScale();\n\n let decimalPlacesMultiplier = Math.pow(10, this.myDecimalPlaces);\n for (let i = 0; i < 3; i++) {\n this.myScale[i] = Math.max(this.myScale[i], 1 / decimalPlacesMultiplier);\n }\n\n this.myScaleAsOne = scaleAsOne;\n\n this.myPositionStepPerSecond = positionStepPerSecond;\n this.myRotationStepPerSecond = rotationStepPerSecond;\n this.myScaleStepPerSecond = scaleStepPerSecond;\n\n this.myInitialPosition = this.myPosition.vec3_clone();\n this.myInitialRotation = this.myRotation.vec3_clone();\n this.myInitialScale = this.myScale.vec3_clone();\n\n this.myInitialPositionStepPerSecond = this.myPositionStepPerSecond;\n this.myInitialRotationStepPerSecond = this.myRotationStepPerSecond;\n this.myInitialScaleStepPerSecond = this.myScaleStepPerSecond;\n\n this.myTransform = PP.mat4_create();\n this.myTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n\n this.myTempTransform = PP.mat4_create();\n }\n\n getValue() {\n this.myTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n return this.myTransform.slice(0);\n }\n\n setValue(value, resetInitialValue = false) {\n this.myTempTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n\n value.mat4_getPosition(this.myPosition);\n value.mat4_getRotationDegrees(this.myRotation);\n value.mat4_getScale(this.myScale);\n\n this.myTransform.mat4_setPositionRotationDegreesScale(this.myPosition, this.myRotation, this.myScale);\n\n if (resetInitialValue) {\n PP.EasyTuneTransform.prototype.setInitialValue.call(this, value);\n }\n\n PP.refreshEasyTuneWidget();\n\n if (!this.myTempTransform.pp_equals(this.myTransform)) {\n this._triggerValueChangedCallback();\n }\n }\n\n setInitialValue(value) {\n this.myInitialPosition = value.mat4_getPosition();\n this.myInitialRotation = value.mat4_getRotationDegrees();\n this.myInitialScale = value.mat4_getScale();\n }\n};", "WL.registerComponent('pp-easy-tune', {\r\n _myHandedness: { type: WL.Type.Enum, values: ['none', 'left', 'right'], default: 'none' },\r\n _myShowOnStart: { type: WL.Type.Bool, default: false },\r\n _myShowVisibilityButton: { type: WL.Type.Bool, default: false },\r\n _myEnableGamepadScrollVariable: { type: WL.Type.Bool, default: true }\r\n}, {\r\n init: function () {\r\n //Examples\r\n //Number: PP.myEasyTuneVariables.add(new PP.EasyTuneNumber(\"Float\", 1.00, 0.1, 3));\r\n //Number Array: PP.myEasyTuneVariables.add(new PP.EasyTuneNumberArray(\"Float Array\", [1.00,2.00,3.00], 0.1, 3));\r\n //Int: PP.myEasyTuneVariables.add(new PP.EasyTuneInt(\"Int\", 1, 1));\r\n //Int Array: PP.myEasyTuneVariables.add(new PP.EasyTuneIntArray(\"Int Array\", [1,2,3], 1));\r\n //Bool: PP.myEasyTuneVariables.add(new PP.EasyTuneBool(\"Bool\", false));\r\n //Bool Array: PP.myEasyTuneVariables.add(new PP.EasyTuneBoolArray(\"Bool Array\", [false, true, false]));\r\n //Transform: PP.myEasyTuneVariables.add(new PP.EasyTuneTransform(\"Transform\", PP.mat4_create(), true));\r\n\r\n PP.myEasyTuneVariables = new PP.EasyTuneVariables();\r\n\r\n this._myWidget = new PP.EasyTuneWidget();\r\n\r\n PP._setEasyTuneWidgetActiveVariableCallbacks.push(function (variableName) {\r\n this._myWidget.setActiveVariable(variableName);\r\n }.bind(this));\r\n\r\n PP._refreshEasyTuneWidgetCallbacks.push(function () {\r\n this._myWidget.refresh();\r\n }.bind(this));\r\n\r\n this._myStarted = false;\r\n },\r\n start: function () {\r\n\r\n let additionalSetup = {};\r\n additionalSetup.myHandedness = [null, 'left', 'right'][this._myHandedness];\r\n additionalSetup.myShowOnStart = this._myShowOnStart;\r\n additionalSetup.myShowVisibilityButton = this._myShowVisibilityButton;\r\n additionalSetup.myEnableAdditionalButtons = true;\r\n additionalSetup.myEnableGamepadScrollVariable = this._myEnableGamepadScrollVariable;\r\n additionalSetup.myPlaneMaterial = PP.myDefaultResources.myMaterials.myFlatOpaque;\r\n additionalSetup.myTextMaterial = PP.myDefaultResources.myMaterials.myText;\r\n\r\n this._myWidget.start(this.object, additionalSetup, PP.myEasyTuneVariables._getInternalMap());\r\n\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n this._mySetVisibleNextUpdate = false;\r\n\r\n this._myStarted = true;\r\n },\r\n update: function (dt) {\r\n if (this._mySetVisibleNextUpdate) {\r\n this._mySetVisibleNextUpdate = false;\r\n this._myWidget.setVisible(false);\r\n this._myWidget.setVisible(this._myWidgetVisibleBackup);\r\n }\r\n\r\n this._myWidget.update(dt);\r\n },\r\n onActivate() {\r\n this._mySetVisibleNextUpdate = true;\r\n },\r\n onDeactivate() {\r\n if (this._myStarted) {\r\n this._myWidgetVisibleBackup = this._myWidget.isVisible();\r\n\r\n this._myWidget.setVisible(false);\r\n }\r\n },\r\n});\r\n\r\nPP.myEasyTuneVariables = null;\r\n\r\nPP.myEasyTuneTarget = null;\r\n\r\nPP.setEasyTuneWidgetActiveVariable = function (variableName) {\r\n for (let callback of PP._setEasyTuneWidgetActiveVariableCallbacks) {\r\n callback(variableName);\r\n }\r\n};\r\n\r\nPP._setEasyTuneWidgetActiveVariableCallbacks = [];\r\n\r\nPP.refreshEasyTuneWidget = function () {\r\n for (let callback of PP._refreshEasyTuneWidgetCallbacks) {\r\n callback();\r\n }\r\n};\r\n\r\nPP._refreshEasyTuneWidgetCallbacks = [];", "PP.WidgetFrameSetup = class WidgetFrameSetup {\r\n\r\n constructor(widgetLetterID, buttonsColumnIndex) {\r\n\r\n this._initializeBuildSetup(widgetLetterID, buttonsColumnIndex);\r\n this._initializeRuntimeSetup();\r\n }\r\n\r\n _initializeBuildSetup(widgetLetterID, buttonsColumnIndex) {\r\n //General\r\n this.myBackgroundColor = [46 / 255, 46 / 255, 46 / 255, 1];\r\n\r\n this.myCursorTargetCollisionCollider = 2; // box\r\n this.myCursorTargetCollisionGroup = 7;\r\n this.myCursorTargetCollisionThickness = 0.001;\r\n\r\n this.myDefaultTextColor = [255 / 255, 255 / 255, 255 / 255, 1];\r\n\r\n this.myTextAlignment = 2; // center\r\n this.myTextJustification = 2; // middle\r\n this.myTextColor = this.myDefaultTextColor;\r\n\r\n this.myVisibilityButtonBackgroundScale = [0.015, 0.015, 1];\r\n this.myVisibilityButtonTextPosition = [0, 0, 0.007];\r\n this.myVisibilityButtonTextScale = [0.18, 0.18, 0.18];\r\n\r\n let distanceBetweenToolsVisibilityButtons = 0.01;\r\n let buttonXOffset = this.myVisibilityButtonBackgroundScale[0] * (2 * buttonsColumnIndex) + distanceBetweenToolsVisibilityButtons * buttonsColumnIndex;\r\n\r\n this.myVisibilityButtonPosition = [];\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.NONE] = {};\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.NONE].myPosition = [-0.3 + buttonXOffset, -0.205, 0.035];\r\n\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.LEFT] = {};\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.LEFT].myPosition = [-0.2 + buttonXOffset, 0.025, 0.015];\r\n\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.RIGHT] = {};\r\n this.myVisibilityButtonPosition[PP.ToolHandedness.RIGHT].myPosition = [0.2 - buttonXOffset, 0.025, 0.015];\r\n\r\n this.myVisibilityButtonText = widgetLetterID;\r\n\r\n this.myVisibilityButtonCursorTargetPosition = [0, 0, 0];\r\n this.myVisibilityButtonCursorTargetPosition[2] = this.myVisibilityButtonTextPosition[2];\r\n this.myVisibilityButtonCollisionExtents = this.myVisibilityButtonBackgroundScale.slice(0);\r\n this.myVisibilityButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n\r\n this.myFlagButtonBackgroundScale = [0.0125, 0.0125, 1];\r\n this.myFlagButtonTextPosition = [0, 0, 0.007];\r\n this.myFlagButtonTextScale = [0.15, 0.15, 0.15];\r\n\r\n let distanceBetweenFlagButtons = 0.0075;\r\n let pinFlagIndex = 0;\r\n let pinButtonYOffset = this.myVisibilityButtonBackgroundScale[1] + this.myFlagButtonBackgroundScale[1] + distanceBetweenFlagButtons +\r\n this.myFlagButtonBackgroundScale[1] * (2 * pinFlagIndex) + distanceBetweenFlagButtons * pinFlagIndex;\r\n\r\n this.myPinButtonPosition = [];\r\n this.myPinButtonPosition[PP.ToolHandedness.NONE] = {};\r\n this.myPinButtonPosition[PP.ToolHandedness.NONE].myPosition = this.myVisibilityButtonPosition[PP.ToolHandedness.NONE].myPosition.slice(0);\r\n this.myPinButtonPosition[PP.ToolHandedness.NONE].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[PP.ToolHandedness.LEFT] = {};\r\n this.myPinButtonPosition[PP.ToolHandedness.LEFT].myPosition = this.myVisibilityButtonPosition[PP.ToolHandedness.LEFT].myPosition.slice(0);\r\n this.myPinButtonPosition[PP.ToolHandedness.LEFT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonPosition[PP.ToolHandedness.RIGHT] = {};\r\n this.myPinButtonPosition[PP.ToolHandedness.RIGHT].myPosition = this.myVisibilityButtonPosition[PP.ToolHandedness.RIGHT].myPosition.slice(0);\r\n this.myPinButtonPosition[PP.ToolHandedness.RIGHT].myPosition[1] += pinButtonYOffset;\r\n\r\n this.myPinButtonText = \"P\";\r\n\r\n this.myPinButtonCursorTargetPosition = [0, 0, 0];\r\n this.myPinButtonCursorTargetPosition[2] = this.myFlagButtonTextPosition[2];\r\n this.myPinButtonCollisionExtents = this.myFlagButtonBackgroundScale.slice(0);\r\n this.myPinButtonCollisionExtents[2] = this.myCursorTargetCollisionThickness;\r\n }\r\n\r\n _initializeRuntimeSetup() {\r\n this._initializeObjectsTransforms();\r\n\r\n this.myButtonHoverColor = [150 / 255, 150 / 255, 150 / 255, 1];\r\n this.myButtonDisabledTextColor = this.myBackgroundColor;\r\n this.myButtonDisabledBackgroundColor = [110 / 255, 110 / 255, 110 / 255, 1];\r\n }\r\n\r\n _initializeObjectsTransforms() {\r\n this.myPivotObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation = [-0.645, 0.425, 0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation = [-0.645, -0.425, -0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation = [-0.645, 0.425, 0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation = [-0.645, -0.425, -0.25, 0.584];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myRotation);\r\n\r\n /*\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myPosition = [-0.04, 0.045, -0.055];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation = [0, 0.536, -0.43, 0.727];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myRotation);\r\n\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myPosition = [0.04, 0.045, -0.055];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation = [0, -0.536, 0.43, 0.727];\r\n this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation.quat_normalize(this.myPivotObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myRotation);\r\n */\r\n\r\n this.myWidgetObjectTransforms = this._createDefaultObjectTransforms();\r\n\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.LEFT].myPosition = [0.1, 0.23, -0.02];\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.GAMEPAD][PP.ToolHandedness.RIGHT].myPosition = [0.07, 0.23, -0.02];\r\n\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.LEFT].myPosition = [0.1, 0.23, -0.02];\r\n this.myWidgetObjectTransforms[PP.ToolInputSourceType.TRACKED_HAND][PP.ToolHandedness.RIGHT].myPosition = [0.07, 0.23, -0.02];\r\n\r\n this._myPivotObjectDistanceFromNonVRHead = 0.6;\r\n }\r\n\r\n _createDefaultObjectTransforms() {\r\n let defaultObjectTransforms = [];\r\n\r\n for (let inputSourceTypeKey in PP.ToolInputSourceType) {\r\n let inputSourceType = PP.ToolInputSourceType[inputSourceTypeKey];\r\n defaultObjectTransforms[inputSourceType] = [];\r\n for (let handednessKey in PP.ToolHandedness) {\r\n let handedness = PP.ToolHandedness[handednessKey];\r\n defaultObjectTransforms[inputSourceType][handedness] = {};\r\n defaultObjectTransforms[inputSourceType][handedness].myPosition = [0, 0, 0];\r\n defaultObjectTransforms[inputSourceType][handedness].myRotation = [0, 0, 0, 1];\r\n }\r\n }\r\n\r\n return defaultObjectTransforms;\r\n }\r\n};", "\r\nPP.WidgetFrameUI = class WidgetFrameUI {\r\n\r\n constructor() {\r\n this._myInputSourceType = null;\r\n\r\n this._myParentObject = null;\r\n this._myIsPinned = false;\r\n\r\n this._myWidgetVisible = true;\r\n this._myVisibilityButtonVisible = true;\r\n }\r\n\r\n build(parentObject, setup, additionalSetup) {\r\n this._myParentObject = parentObject;\r\n this._mySetup = setup;\r\n this._myAdditionalSetup = additionalSetup;\r\n this._myPlaneMesh = PP.MeshUtils.createPlaneMesh();\r\n\r\n this._createSkeleton();\r\n this._setTransforms();\r\n this._addComponents();\r\n\r\n this._setTransformForNonVR();\r\n\r\n if (WL.xrSession) {\r\n this._onXRSessionStart(WL.xrSession);\r\n }\r\n WL.onXRSessionStart.push(this._onXRSessionStart.bind(this));\r\n WL.onXRSessionEnd.push(this._onXRSessionEnd.bind(this));\r\n }\r\n\r\n setWidgetVisible(visible) {\r\n this._myWidgetVisible = visible;\r\n this.myFlagsButtonPanel.pp_setActiveHierarchy(visible);\r\n if (visible) {\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n\r\n setVisibilityButtonVisible(visible) {\r\n this._myVisibilityButtonVisible = visible;\r\n this.myVisibilityButtonPanel.pp_setActiveHierarchy(visible);\r\n }\r\n\r\n setPinned(pinned) {\r\n if (pinned != this._myIsPinned) {\r\n this._myIsPinned = pinned;\r\n if (this._myIsPinned) {\r\n this.myPivotObject.pp_setParent(null);\r\n } else {\r\n this.myPivotObject.pp_setParent(this.myFixForwardObject);\r\n\r\n if (!PP.XRUtils.isXRSessionActive()) {\r\n this._setTransformForNonVR();\r\n }\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n }\r\n }\r\n\r\n update(dt) {\r\n this._updateObjectsTransforms(false);\r\n }\r\n\r\n _updateObjectsTransforms(forceRefreshObjectsTransforms) {\r\n if (PP.XRUtils.isXRSessionActive()) {\r\n let inputSourceType = PP.InputUtils.getInputSourceTypeByHandedness(this._myAdditionalSetup.myHandedness);\r\n\r\n if (inputSourceType != this._myInputSourceType || forceRefreshObjectsTransforms) {\r\n this._myInputSourceType = inputSourceType;\r\n\r\n if (!this._myIsPinned) {\r\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myPivotObject.resetRotation();\r\n this.myPivotObject.rotateObject(this._mySetup.myPivotObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myRotation);\r\n\r\n this.myWidgetObject.setTranslationLocal(this._mySetup.myWidgetObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myWidgetObject.resetRotation();\r\n this.myWidgetObject.rotateObject(this._mySetup.myWidgetObjectTransforms[this._myInputSourceType][this._myAdditionalSetup.myHandedness].myRotation);\r\n\r\n this.myVisibilityButtonPanel.setTranslationLocal(this._mySetup.myVisibilityButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myPinButtonPanel.setTranslationLocal(this._mySetup.myPinButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n }\r\n }\r\n } else {\r\n this.myVisibilityButtonPanel.pp_setActiveHierarchy(this._myWidgetVisible || this._myVisibilityButtonVisible);\r\n }\r\n }\r\n\r\n //Skeleton\r\n _createSkeleton() {\r\n this.myFixForwardObject = WL.scene.addObject(this._myParentObject);\r\n this.myFixForwardObject.pp_rotateObject([0, 180, 0]);\r\n this.myPivotObject = WL.scene.addObject(this.myFixForwardObject);\r\n this.myWidgetObject = WL.scene.addObject(this.myPivotObject);\r\n\r\n this.myVisibilityButtonPanel = WL.scene.addObject(this.myPivotObject);\r\n this.myVisibilityButtonBackground = WL.scene.addObject(this.myVisibilityButtonPanel);\r\n this.myVisibilityButtonText = WL.scene.addObject(this.myVisibilityButtonPanel);\r\n this.myVisibilityButtonCursorTarget = WL.scene.addObject(this.myVisibilityButtonPanel);\r\n\r\n this.myFlagsButtonPanel = WL.scene.addObject(this.myPivotObject);\r\n\r\n this.myPinButtonPanel = WL.scene.addObject(this.myFlagsButtonPanel);\r\n this.myPinButtonBackground = WL.scene.addObject(this.myPinButtonPanel);\r\n this.myPinButtonText = WL.scene.addObject(this.myPinButtonPanel);\r\n this.myPinButtonCursorTarget = WL.scene.addObject(this.myPinButtonPanel);\r\n\r\n this.myNonVRParentObject = WL.scene.addObject(PP.myPlayerObjects.myNonVRCamera);\r\n this.myNonVRParentObject.pp_translateLocal([0, 0, -this._mySetup._myPivotObjectDistanceFromNonVRHead]);\r\n this.myNonVRParentObject.pp_lookToLocal([0, 0, 1], [0, 1, 0]);\r\n\r\n }\r\n\r\n //Transforms\r\n _setTransforms() {\r\n this.myPivotObject.setDirty();\r\n\r\n this.myVisibilityButtonPanel.setTranslationLocal(this._mySetup.myVisibilityButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n this.myVisibilityButtonBackground.scale(this._mySetup.myVisibilityButtonBackgroundScale);\r\n this.myVisibilityButtonText.setTranslationLocal(this._mySetup.myVisibilityButtonTextPosition);\r\n this.myVisibilityButtonText.scale(this._mySetup.myVisibilityButtonTextScale);\r\n this.myVisibilityButtonCursorTarget.setTranslationLocal(this._mySetup.myVisibilityButtonCursorTargetPosition);\r\n\r\n this.myPinButtonPanel.setTranslationLocal(this._mySetup.myPinButtonPosition[this._myAdditionalSetup.myHandedness].myPosition);\r\n\r\n this.myPinButtonBackground.scale(this._mySetup.myFlagButtonBackgroundScale);\r\n this.myPinButtonText.setTranslationLocal(this._mySetup.myFlagButtonTextPosition);\r\n this.myPinButtonText.scale(this._mySetup.myFlagButtonTextScale);\r\n this.myPinButtonCursorTarget.setTranslationLocal(this._mySetup.myPinButtonCursorTargetPosition);\r\n }\r\n\r\n //Components\r\n _addComponents() {\r\n this.myVisibilityButtonBackgroundComponent = this.myVisibilityButtonBackground.addComponent('mesh');\r\n this.myVisibilityButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myVisibilityButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\r\n this.myVisibilityButtonBackgroundComponent.material.color = this._mySetup.myBackgroundColor;\r\n\r\n this.myVisibilityButtonTextComponent = this.myVisibilityButtonText.addComponent('text');\r\n this._setupButtonTextComponent(this.myVisibilityButtonTextComponent);\r\n this.myVisibilityButtonTextComponent.text = this._mySetup.myVisibilityButtonText;\r\n\r\n this.myVisibilityButtonCursorTargetComponent = this.myVisibilityButtonCursorTarget.addComponent('cursor-target');\r\n this.myVisibilityButtonCollisionComponent = this.myVisibilityButtonCursorTarget.addComponent('collision');\r\n this.myVisibilityButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\r\n this.myVisibilityButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\r\n this.myVisibilityButtonCollisionComponent.extents = this._mySetup.myVisibilityButtonCollisionExtents;\r\n\r\n this.myPinButtonBackgroundComponent = this.myPinButtonBackground.addComponent('mesh');\r\n this.myPinButtonBackgroundComponent.mesh = this._myPlaneMesh;\r\n this.myPinButtonBackgroundComponent.material = this._myAdditionalSetup.myPlaneMaterial.clone();\r\n this.myPinButtonBackgroundComponent.material.color = this._mySetup.myButtonDisabledBackgroundColor;\r\n\r\n this.myPinButtonTextComponent = this.myPinButtonText.addComponent('text');\r\n this._setupButtonTextComponent(this.myPinButtonTextComponent);\r\n this.myPinButtonTextComponent.material.color = this._mySetup.myButtonDisabledTextColor;\r\n this.myPinButtonTextComponent.text = this._mySetup.myPinButtonText;\r\n\r\n this.myPinButtonCursorTargetComponent = this.myPinButtonCursorTarget.addComponent('cursor-target');\r\n\r\n this.myPinButtonCollisionComponent = this.myPinButtonCursorTarget.addComponent('collision');\r\n this.myPinButtonCollisionComponent.collider = this._mySetup.myCursorTargetCollisionCollider;\r\n this.myPinButtonCollisionComponent.group = 1 << this._mySetup.myCursorTargetCollisionGroup;\r\n this.myPinButtonCollisionComponent.extents = this._mySetup.myPinButtonCollisionExtents;\r\n }\r\n\r\n _setupButtonTextComponent(textComponent) {\r\n textComponent.alignment = this._mySetup.myTextAlignment;\r\n textComponent.justification = this._mySetup.myTextJustification;\r\n textComponent.material = this._myAdditionalSetup.myTextMaterial.clone();\r\n textComponent.material.color = this._mySetup.myTextColor;\r\n textComponent.text = \"\";\r\n }\r\n\r\n _onXRSessionStart() {\r\n this.myVisibilityButtonPanel.pp_setActiveHierarchy(this._myVisibilityButtonVisible);\r\n\r\n this._setTransformForVR();\r\n }\r\n\r\n _onXRSessionEnd() {\r\n this._setTransformForNonVR();\r\n }\r\n\r\n _setTransformForVR() {\r\n this.myFixForwardObject.pp_setParent(this._myParentObject);\r\n\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n this.myFixForwardObject.pp_rotateObject([0, 180, 0]);\r\n\r\n this._updateObjectsTransforms(true);\r\n }\r\n\r\n _setTransformForNonVR() {\r\n if (!this._myIsPinned) {\r\n this.myFixForwardObject.pp_setParent(this.myNonVRParentObject);\r\n this.myFixForwardObject.pp_resetTransformLocal();\r\n\r\n this.myPivotObject.setTranslationLocal(this._mySetup.myPivotObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myPosition);\r\n this.myPivotObject.resetRotation();\r\n this.myPivotObject.rotateObject(this._mySetup.myPivotObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myRotation);\r\n\r\n this.myWidgetObject.setTranslationLocal(this._mySetup.myWidgetObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myPosition);\r\n this.myWidgetObject.resetRotation();\r\n this.myWidgetObject.rotateObject(this._mySetup.myWidgetObjectTransforms[PP.ToolInputSourceType.NONE][PP.ToolHandedness.NONE].myRotation);\r\n\r\n this.myVisibilityButtonPanel.setTranslationLocal(this._mySetup.myVisibilityButtonPosition[PP.ToolHandedness.NONE].myPosition);\r\n this.myPinButtonPanel.setTranslationLocal(this._mySetup.myPinButtonPosition[PP.ToolHandedness.NONE].myPosition);\r\n }\r\n }\r\n};", "\nPP.WidgetFrame = class WidgetFrame {\n\n constructor(widgetLetterID, buttonsColumnIndex) {\n this.myIsWidgetVisible = true;\n this.myIsPinned = false;\n\n this._mySetup = new PP.WidgetFrameSetup(widgetLetterID, buttonsColumnIndex);\n this._myAdditionalSetup = null;\n\n this._myUI = new PP.WidgetFrameUI();\n this._myShowVisibilityButton = false;\n\n this._myWidgetVisibleChangedCallbacks = new Map(); // Signature: callback(isWidgetVisible)\n this._myPinChangedCallbacks = new Map(); // Signature: callback(isPinned)\n }\n\n getWidgetObject() {\n return this._myUI.myWidgetObject;\n }\n\n setVisible(visible) {\n this.myIsWidgetVisible = !visible;\n this._toggleVisibility(false, true);\n }\n\n isVisible() {\n return this.myIsWidgetVisible;\n }\n\n toggleVisibility() {\n this._toggleVisibility(false, true);\n }\n\n togglePin() {\n this._togglePin(false);\n }\n\n registerWidgetVisibleChangedEventListener(id, callback) {\n this._myWidgetVisibleChangedCallbacks.set(id, callback);\n }\n\n unregisterWidgetVisibleChangedEventListener(id) {\n this._myWidgetVisibleChangedCallbacks.delete(id);\n }\n\n registerPinChangedEventListener(id, callback) {\n this._myPinChangedCallbacks.set(id, callback);\n }\n\n unregisterPinChangedEventListener(id) {\n this._myPinChangedCallbacks.delete(id);\n }\n\n start(parentObject, additionalSetup) {\n this._myAdditionalSetup = additionalSetup;\n\n this._myUI.build(parentObject, this._mySetup, additionalSetup);\n this._myUI.setVisibilityButtonVisible(additionalSetup.myShowVisibilityButton);\n this._myShowVisibilityButton = additionalSetup.myShowVisibilityButton;\n if (!additionalSetup.myShowOnStart) {\n this._toggleVisibility(false, false);\n }\n\n this._addListeners();\n }\n\n update(dt) {\n this._myUI.update(dt);\n }\n\n _addListeners() {\n let ui = this._myUI;\n\n ui.myPinButtonCursorTargetComponent.addClickFunction(this._togglePin.bind(this, true));\n ui.myPinButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myPinButtonBackgroundComponent.material));\n ui.myPinButtonCursorTargetComponent.addUnHoverFunction(this._pinUnHover.bind(this, ui.myPinButtonBackgroundComponent.material));\n\n ui.myVisibilityButtonCursorTargetComponent.addClickFunction(this._toggleVisibility.bind(this, true, true));\n ui.myVisibilityButtonCursorTargetComponent.addHoverFunction(this._genericHover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\n ui.myVisibilityButtonCursorTargetComponent.addUnHoverFunction(this._visibilityUnHover.bind(this, ui.myVisibilityButtonBackgroundComponent.material));\n }\n\n _toggleVisibility(isButton, notify) {\n this.myIsWidgetVisible = !this.myIsWidgetVisible;\n\n this._myUI.setWidgetVisible(this.myIsWidgetVisible);\n\n let textMaterial = this._myUI.myVisibilityButtonTextComponent.material;\n let backgroundMaterial = this._myUI.myVisibilityButtonBackgroundComponent.material;\n if (this.myIsWidgetVisible) {\n textMaterial.color = this._mySetup.myDefaultTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myBackgroundColor;\n }\n } else {\n textMaterial.color = this._mySetup.myButtonDisabledTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n\n if (notify) {\n for (let callback of this._myWidgetVisibleChangedCallbacks.values()) {\n callback(this.myIsWidgetVisible);\n }\n }\n\n this._myUI.setVisibilityButtonVisible(this._myShowVisibilityButton);\n }\n\n _togglePin(isButton) {\n if (this.myIsWidgetVisible) {\n this.myIsPinned = !this.myIsPinned;\n\n this._myUI.setPinned(this.myIsPinned);\n\n let textMaterial = this._myUI.myPinButtonTextComponent.material;\n let backgroundMaterial = this._myUI.myPinButtonBackgroundComponent.material;\n if (this.myIsPinned) {\n textMaterial.color = this._mySetup.myDefaultTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myBackgroundColor;\n }\n } else {\n textMaterial.color = this._mySetup.myButtonDisabledTextColor;\n if (!isButton) {\n backgroundMaterial.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n\n for (let callback of this._myPinChangedCallbacks.values()) {\n callback(this.myIsPinned);\n }\n }\n }\n\n _genericHover(material) {\n material.color = this._mySetup.myButtonHoverColor;\n }\n\n _visibilityUnHover(material) {\n if (this.myIsWidgetVisible) {\n material.color = this._mySetup.myBackgroundColor;\n } else {\n material.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n\n _pinUnHover(material) {\n if (this.myIsPinned) {\n material.color = this._mySetup.myBackgroundColor;\n } else {\n material.color = this._mySetup.myButtonDisabledBackgroundColor;\n }\n }\n};", "//PP\r\n\r\nrequire('./pp/pp');\r\n\r\n//\tPLUGIN\r\nrequire('./pp/plugin/component_mods/clone_component_mod');\r\nrequire('./pp/plugin/component_mods/cursor_component_mod');\r\nrequire('./pp/plugin/component_mods/cursor_target_component_mod');\r\nrequire('./pp/plugin/component_mods/mouse_look_component_mod');\r\n\r\nrequire('./pp/plugin/extensions/array_extension');\r\nrequire('./pp/plugin/extensions/object_extension');\r\nrequire('./pp/plugin/extensions/math_extension');\r\n\r\n//\tAUDIO\r\nrequire('./pp/audio/spatial_audio_listener');\r\nrequire('./pp/audio/audio_manager_component');\r\nrequire('./pp/audio/audio_manager');\r\nrequire('./pp/audio/audio_player');\r\nrequire('./pp/audio/audio_setup');\r\nrequire('./pp/audio/mute_everything');\r\n\r\n//\tCAULDRON\r\nrequire('./pp/cauldron/benchmarks/max_physx');\r\nrequire('./pp/cauldron/benchmarks/max_visible_triangles');\r\n\r\nrequire('./pp/cauldron/cauldron/number_over_value');\r\nrequire('./pp/cauldron/cauldron/object_pool_manager');\r\nrequire('./pp/cauldron/cauldron/physx_collision_collector');\r\nrequire('./pp/cauldron/cauldron/save_manager');\r\nrequire('./pp/cauldron/cauldron/timer');\r\n\r\nrequire('./pp/cauldron/components/clear_console_on_xr_session_start');\r\nrequire('./pp/cauldron/components/set_active');\r\nrequire('./pp/cauldron/components/adjust_hierarchy_physx_scale');\r\nrequire('./pp/cauldron/components/get_player_objects');\r\nrequire('./pp/cauldron/components/get_default_resources');\r\nrequire('./pp/cauldron/components/show_fps');\r\n\r\nrequire('./pp/cauldron/fsm/fsm');\r\nrequire('./pp/cauldron/fsm/state');\r\nrequire('./pp/cauldron/fsm/transition');\r\nrequire('./pp/cauldron/fsm/states/timer_state');\r\n\r\nrequire('./pp/cauldron/utils/ca_utils');\r\nrequire('./pp/cauldron/utils/color_utils');\r\nrequire('./pp/cauldron/utils/mesh_utils');\r\nrequire('./pp/cauldron/utils/save_utils');\r\nrequire('./pp/cauldron/utils/text_utils');\r\nrequire('./pp/cauldron/utils/xr_utils');\r\n\r\nrequire('./pp/cauldron/physics/physics_utils');\r\nrequire('./pp/cauldron/physics/physics_raycast_data');\r\nrequire('./pp/cauldron/physics/physics_layer_flags');\r\n\r\nrequire('./pp/cauldron/visual/visual_manager');\r\n\r\nrequire('./pp/cauldron/visual/elements/visual_element_types');\r\nrequire('./pp/cauldron/visual/elements/visual_line');\r\nrequire('./pp/cauldron/visual/elements/visual_mesh');\r\nrequire('./pp/cauldron/visual/elements/visual_point');\r\nrequire('./pp/cauldron/visual/elements/visual_arrow');\r\nrequire('./pp/cauldron/visual/elements/visual_text');\r\nrequire('./pp/cauldron/visual/elements/visual_transform');\r\nrequire('./pp/cauldron/visual/elements/visual_raycast');\r\nrequire('./pp/cauldron/visual/elements/visual_torus');\r\n\r\nrequire('./pp/cauldron/visual/components/visual_manager_component');\r\n\r\n//\tDEBUG\r\nrequire('./pp/debug/debug_manager');\r\nrequire('./pp/debug/debug_visual_manager');\r\n\r\nrequire('./pp/debug/components/debug_transform_component');\r\nrequire('./pp/debug/components/debug_manager_component');\r\n\r\n//\tGAMEPLAY\r\nrequire('./pp/gameplay/cauldron/direction_2D_to_3D_converter');\r\n\r\nrequire('./pp/gameplay/grab_throw/grabbable');\r\nrequire('./pp/gameplay/grab_throw/grabber_hand');\r\n\r\n//\tINPUT\r\nrequire('./pp/input/cauldron/finger_cursor');\r\nrequire('./pp/input/cauldron/input_types');\r\nrequire('./pp/input/cauldron/input_utils');\r\nrequire('./pp/input/cauldron/keyboard');\r\nrequire('./pp/input/cauldron/mouse');\r\nrequire('./pp/input/cauldron/input_manager');\r\nrequire('./pp/input/cauldron/input_manager_component');\r\nrequire('./pp/input/cauldron/switch_hand_object');\r\nrequire('./pp/input/cauldron/tracked_hand_draw_joint');\r\nrequire('./pp/input/cauldron/tracked_hand_draw_all_joints');\r\nrequire('./pp/input/cauldron/tracked_hand_draw_skin');\r\n\r\nrequire('./pp/input/gamepad/gamepad_buttons');\r\nrequire('./pp/input/gamepad/base_gamepad');\r\nrequire('./pp/input/gamepad/universal_gamepad');\r\nrequire('./pp/input/gamepad/gamepad_cores/gamepad_core');\r\nrequire('./pp/input/gamepad/gamepad_cores/xr_gamepad_core');\r\nrequire('./pp/input/gamepad/gamepad_cores/keyboard_gamepad_core');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_mesh_animator');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_manager');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_utils');\r\nrequire('./pp/input/gamepad/cauldron/gamepad_control_scheme');\r\n\r\nrequire('./pp/input/pose/base_pose.js');\r\nrequire('./pp/input/pose/hand_pose');\r\nrequire('./pp/input/pose/head_pose');\r\nrequire('./pp/input/pose/tracked_hand_joint_pose');\r\nrequire('./pp/input/pose/tracked_hand_pose');\r\nrequire('./pp/input/pose/components/set_player_height');\r\nrequire('./pp/input/pose/components/set_hand_local_transform');\r\nrequire('./pp/input/pose/components/set_head_local_transform');\r\nrequire('./pp/input/pose/components/set_vr_head_local_transform');\r\nrequire('./pp/input/pose/components/set_non_vr_head_local_transform');\r\nrequire('./pp/input/pose/components/set_tracked_hand_joint_local_transform');\r\nrequire('./pp/input/pose/components/copy_hand_transform');\r\nrequire('./pp/input/pose/components/copy_head_transform');\r\nrequire('./pp/input/pose/components/copy_player_transform');\r\nrequire('./pp/input/pose/components/copy_player_pivot_transform');\r\n\r\n//\tTOOL\r\nrequire('./pp/tool/cauldron/cauldron/tool_types');\r\nrequire('./pp/tool/cauldron/components/tool_cursor');\r\n\r\nrequire('./pp/tool/console_vr/console_vr_widget_setup');\r\nrequire('./pp/tool/console_vr/console_vr_widget_ui');\r\nrequire('./pp/tool/console_vr/console_vr_widget');\r\nrequire('./pp/tool/console_vr/console_vr');\r\n\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_object_tuner');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_light_attenuation');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_light_color');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_mesh_color');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_scale');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_set_tune_target_child_number');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_set_tune_target_grab');\r\nrequire('./pp/tool/easy_tune/easy_object_tuners/easy_transform');\r\n\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_array_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_bool_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_none_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_array_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_number_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget_ui');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_transform_widget_setup');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget');\r\nrequire('./pp/tool/easy_tune/easy_tune_widgets/easy_tune_widget_setup');\r\n\r\nrequire('./pp/tool/easy_tune/easy_tune_variables');\r\nrequire('./pp/tool/easy_tune/easy_tune');\r\n\r\nrequire('./pp/tool/widget_frame/widget_frame_setup');\r\nrequire('./pp/tool/widget_frame/widget_frame_ui');\r\nrequire('./pp/tool/widget_frame/widget_frame');"], + "mappings": "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", + "names": ["require_pp", "__commonJSMin", "require_clone_component_mod", "__commonJSMin", "clonedObject", "deepCloneParams", "extraData", "clonedComponent", "common_exports", "__export", "ARRAY_TYPE", "EPSILON", "RANDOM", "equals", "setMatrixArrayType", "toRadian", "type", "a", "degree", "b", "init_common", "__esmMin", "y", "i", "mat3_exports", "__export", "add", "adjoint", "clone", "copy", "create", "determinant", "equals", "exactEquals", "frob", "fromMat2d", "fromMat4", "fromQuat", "fromRotation", "fromScaling", "fromTranslation", "fromValues", "identity", "invert", "mul", "multiply", "multiplyScalar", "multiplyScalarAndAdd", "normalFromMat4", "projection", "rotate", "scale", "set", "str", "sub", "subtract", "translate", "transpose", "out", "ARRAY_TYPE", "a", "m00", "m01", "m02", "m10", "m11", "m12", "m20", "m21", "m22", "a01", "a02", "a12", "a00", "a10", "a11", "a20", "a21", "a22", "b01", "b11", "b21", "det", "b", "b00", "b02", "b10", "b12", "b20", "b22", "v", "x", "y", "rad", "s", "c", "q", "z", "w", "x2", "y2", "z2", "xx", "yx", "yy", "zx", "zy", "zz", "wx", "wy", "wz", "a03", "a13", "a23", "a30", "a31", "a32", "a33", "b03", "b04", "b05", "b06", "b07", "b08", "b09", "width", "height", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "EPSILON", "init_mat3", "__esmMin", "init_common", "mat4_exports", "__export", "add", "adjoint", "clone", "copy", "create", "determinant", "equals", "exactEquals", "frob", "fromQuat", "fromQuat2", "fromRotation", "fromRotationTranslation", "fromRotationTranslationScale", "fromRotationTranslationScaleOrigin", "fromScaling", "fromTranslation", "fromValues", "fromXRotation", "fromYRotation", "fromZRotation", "frustum", "getRotation", "getScaling", "getTranslation", "identity", "invert", "lookAt", "mul", "multiply", "multiplyScalar", "multiplyScalarAndAdd", "ortho", "orthoNO", "orthoZO", "perspective", "perspectiveFromFieldOfView", "perspectiveNO", "perspectiveZO", "rotate", "rotateX", "rotateY", "rotateZ", "scale", "set", "str", "sub", "subtract", "targetTo", "translate", "transpose", "out", "ARRAY_TYPE", "a", "m00", "m01", "m02", "m03", "m10", "m11", "m12", "m13", "m20", "m21", "m22", "m23", "m30", "m31", "m32", "m33", "a01", "a02", "a03", "a12", "a13", "a23", "a00", "a10", "a11", "a20", "a21", "a22", "a30", "a31", "a32", "a33", "b00", "b01", "b02", "b03", "b04", "b05", "b06", "b07", "b08", "b09", "b10", "b11", "det", "b", "b0", "b1", "b2", "b3", "v", "x", "y", "z", "rad", "axis", "len", "s", "t", "b12", "b20", "b21", "b22", "EPSILON", "c", "q", "w", "x2", "y2", "z2", "xx", "xy", "xz", "yy", "yz", "zz", "wx", "wy", "wz", "translation", "bx", "by", "bz", "bw", "ax", "ay", "az", "aw", "magnitude", "mat", "scaling", "is1", "is2", "is3", "sm11", "sm12", "sm13", "sm21", "sm22", "sm23", "sm31", "sm32", "sm33", "trace", "S", "sx", "sy", "sz", "o", "ox", "oy", "oz", "out0", "out1", "out2", "out4", "out5", "out6", "out8", "out9", "out10", "yx", "zx", "zy", "left", "right", "bottom", "top", "near", "far", "rl", "tb", "nf", "fovy", "aspect", "f", "fov", "upTan", "downTan", "leftTan", "rightTan", "xScale", "yScale", "lr", "bt", "eye", "center", "up", "x0", "x1", "y0", "y1", "z0", "z1", "eyex", "eyey", "eyez", "upx", "upy", "upz", "centerx", "centery", "centerz", "target", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a14", "a15", "b4", "b5", "b6", "b7", "b8", "b9", "b13", "b14", "b15", "init_mat4", "__esmMin", "init_common", "vec3_exports", "__export", "add", "angle", "bezier", "ceil", "clone", "copy", "create", "cross", "dist", "distance", "div", "divide", "dot", "equals", "exactEquals", "floor", "forEach", "fromValues", "hermite", "inverse", "len", "length", "lerp", "max", "min", "mul", "multiply", "negate", "normalize", "random", "rotateX", "rotateY", "rotateZ", "round", "scale", "scaleAndAdd", "set", "sqrDist", "sqrLen", "squaredDistance", "squaredLength", "str", "sub", "subtract", "transformMat3", "transformMat4", "transformQuat", "zero", "out", "ARRAY_TYPE", "a", "x", "y", "z", "b", "ax", "ay", "az", "bx", "by", "bz", "t", "c", "d", "factorTimes2", "factor1", "factor2", "factor3", "factor4", "inverseFactor", "inverseFactorTimesTwo", "r", "RANDOM", "zScale", "m", "w", "q", "qx", "qy", "qz", "qw", "uvx", "uvy", "uvz", "uuvx", "uuvy", "uuvz", "w2", "rad", "p", "mag1", "mag2", "mag", "cosine", "a0", "a1", "a2", "b0", "b1", "b2", "EPSILON", "init_vec3", "__esmMin", "init_common", "vec", "stride", "offset", "count", "fn", "arg", "i", "l", "vec4_exports", "__export", "add", "ceil", "clone", "copy", "create", "cross", "dist", "distance", "div", "divide", "dot", "equals", "exactEquals", "floor", "forEach", "fromValues", "inverse", "len", "length", "lerp", "max", "min", "mul", "multiply", "negate", "normalize", "random", "round", "scale", "scaleAndAdd", "set", "sqrDist", "sqrLen", "squaredDistance", "squaredLength", "str", "sub", "subtract", "transformMat4", "transformQuat", "zero", "out", "ARRAY_TYPE", "a", "x", "y", "z", "w", "b", "u", "v", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "t", "ax", "ay", "az", "aw", "v1", "v2", "v3", "v4", "s1", "s2", "RANDOM", "d", "m", "q", "qx", "qy", "qz", "qw", "ix", "iy", "iz", "iw", "a0", "a1", "a2", "a3", "b0", "b1", "b2", "b3", "EPSILON", "init_vec4", "__esmMin", "init_common", "vec", "stride", "offset", "count", "fn", "arg", "i", "l", "quat_exports", "__export", "add", "calculateW", "clone", "conjugate", "copy", "create", "dot", "equals", "exactEquals", "exp", "fromEuler", "fromMat3", "fromValues", "getAngle", "getAxisAngle", "identity", "invert", "len", "length", "lerp", "ln", "mul", "multiply", "normalize", "pow", "random", "rotateX", "rotateY", "rotateZ", "rotationTo", "scale", "set", "setAxes", "setAxisAngle", "slerp", "sqlerp", "sqrLen", "squaredLength", "str", "out", "ARRAY_TYPE", "axis", "rad", "out_axis", "q", "EPSILON", "a", "b", "dotproduct", "ax", "ay", "az", "aw", "bx", "by", "bz", "bw", "x", "y", "z", "w", "et", "s", "t", "omega", "cosom", "sinom", "scale0", "scale1", "u1", "RANDOM", "u2", "u3", "sqrt1MinusU1", "sqrtU1", "a0", "a1", "a2", "a3", "invDot", "m", "fTrace", "fRoot", "i", "j", "k", "halfToRad", "sx", "cx", "sy", "cy", "sz", "cz", "init_quat", "__esmMin", "init_common", "init_mat3", "init_vec3", "init_vec4", "tmpvec3", "xUnitVec3", "yUnitVec3", "cross", "temp1", "temp2", "c", "d", "matr", "view", "right", "up", "quat2_exports", "__export", "add", "clone", "conjugate", "copy", "create", "dot", "equals", "exactEquals", "fromMat4", "fromRotation", "fromRotationTranslation", "fromRotationTranslationValues", "fromTranslation", "fromValues", "getDual", "getReal", "getTranslation", "identity", "invert", "len", "length", "lerp", "mul", "multiply", "normalize", "rotateAroundAxis", "rotateByQuatAppend", "rotateByQuatPrepend", "rotateX", "rotateY", "rotateZ", "scale", "set", "setDual", "setReal", "sqrLen", "squaredLength", "str", "translate", "dq", "ARRAY_TYPE", "a", "x1", "y1", "z1", "w1", "x2", "y2", "z2", "w2", "ax", "ay", "az", "out", "q", "t", "bx", "by", "bz", "bw", "outer", "getRotation", "aw", "v", "ax1", "ay1", "az1", "aw1", "bx1", "by1", "bz1", "ax2", "ay2", "az2", "aw2", "rad", "qx", "qy", "qz", "qw", "axis", "EPSILON", "axisLength", "s", "b", "ax0", "ay0", "az0", "aw0", "bw1", "bx0", "by0", "bz0", "bw0", "mt", "sqlen", "magnitude", "a0", "a1", "a2", "a3", "b0", "b1", "b2", "b3", "a_dot_b", "a4", "a5", "a6", "a7", "b4", "b5", "b6", "b7", "init_quat2", "__esmMin", "init_common", "init_quat", "init_mat4", "vec2_exports", "__export", "add", "angle", "ceil", "clone", "copy", "create", "cross", "dist", "distance", "div", "divide", "dot", "equals", "exactEquals", "floor", "forEach", "fromValues", "inverse", "len", "length", "lerp", "max", "min", "mul", "multiply", "negate", "normalize", "random", "rotate", "round", "scale", "scaleAndAdd", "set", "sqrDist", "sqrLen", "squaredDistance", "squaredLength", "str", "sub", "subtract", "transformMat2", "transformMat2d", "transformMat3", "transformMat4", "zero", "out", "ARRAY_TYPE", "a", "x", "y", "b", "z", "t", "ax", "ay", "r", "RANDOM", "m", "rad", "p0", "p1", "sinC", "cosC", "x1", "y1", "x2", "y2", "mag", "cosine", "a0", "a1", "b0", "b1", "EPSILON", "init_vec2", "__esmMin", "init_common", "vec", "stride", "offset", "count", "fn", "arg", "i", "l", "init_esm", "__esmMin", "init_common", "init_mat3", "init_mat4", "init_quat", "init_quat2", "init_vec2", "init_vec3", "init_vec4", "cursor_component_mod_exports", "init_cursor_component_mod", "__esmMin", "init_esm", "sceneLoaded", "index", "inputComp", "onXRSessionStart", "viewComponent", "onClick", "onPointerMove", "onPointerDown", "onPointerUp", "mat4_exports", "onViewportResize", "hitPosition", "dist", "vec3_exports", "visible", "dt", "doClick", "p", "rayHit", "cursorTarget", "s", "onSessionEnd", "e", "onSelect", "onSelectStart", "onSelectEnd", "bounds", "clientX", "clientY", "w", "h", "left", "top", "f", "require_cursor_target_component_mod", "__commonJSMin", "object", "cursor", "f", "arr", "value", "index", "dt", "require_mouse_look_component_mod", "__commonJSMin", "viewForward", "viewUp", "referenceUp", "referenceUpNegate", "referenceRight", "newUp", "e", "minAngle", "maxVerticalAngle", "angleWithUp", "fixAngle", "array_extension_exports", "init_array_extension", "__esmMin", "init_esm", "callback", "elementToFind", "elementsEqualCallback", "elementFound", "index", "indexes", "element", "elementRemoved", "arrayRemoved", "elementsRemoved", "currentElement", "elementToRemove", "length", "array", "copyCallback", "cloneCallback", "clone", "equals", "i", "decimalPlaces", "message", "value", "out", "start", "end", "fixedStart", "fixedEnd", "min", "max", "vector", "epsilon", "x", "y", "vec2_exports", "vec3_exports", "z", "quat", "mat4", "positiveDirection", "signedLength", "upAxis", "crossAxis", "angle", "common_exports", "quat_exports", "axis", "componentAlong", "thisAxisLength", "thisAxisLengthSigned", "vectorAxisLength", "vectorAxisLengthSigned", "componentAlongThis", "componentAlongVector", "zeroSign", "angleSigned", "up", "thisToAxis", "fixedProjectAlongAxis", "projectAlongAxis", "angleWithAlongAxis", "lengthToRemove", "planeNormal", "thisToPlane", "rotation", "zero", "origin", "parentTransform", "inverse", "mat4_exports", "parentTransformMatrix", "position", "one", "mat3_exports", "direction", "rotationQuat", "rotationAxis", "signedAngle", "pivotAxis", "thisFlat", "directionFlat", "to", "interpolationValue", "easingFunction", "lerpValue", "w", "vec4_exports", "rotationMatrix", "left", "forward", "backward", "down", "right", "parentQuat", "invertQuat", "mat3", "leftAxis", "forwardAxis", "radiansRotation", "degreesRotation", "quat2_exports", "quat2", "parentTransformQuat", "transformMatrix", "scale", "transformMatrixNoScale", "inverseScale", "tempScale", "convertTransform", "transformQuat", "fixedAxes", "fixedAxesFixSignMap", "fixedLeft", "fixedUp", "fixedForward", "currentAxis", "rotationMat", "axes", "priority", "firstAxis", "secondAxis", "thirdAxis", "secondAxisValid", "thirdAxisValid", "secondAxisIndex", "thirdAxisIndex", "fixSignMap", "key", "prefixes", "found", "prefix", "object_extension_exports", "init_object_extension", "__esmMin", "init_esm", "position", "vec3_exports", "rotation", "value", "index", "array", "quat", "quat_exports", "mat3_exports", "scale", "transform", "transformQuat", "quat2_exports", "mat4_exports", "axes", "forward", "backward", "up", "down", "left", "right", "degreesRotation", "vector", "transformMatrixNoScale", "inverseScale", "one", "zero", "identity", "translation", "amount", "direction", "rotationQuat", "currentRotationQuat", "angle", "axis", "common_exports", "origin", "transformToRotate", "transformToRotateConjugate", "defaultQuat", "convertedPosition", "convertedAxis", "internalUp", "newParent", "keepTransform", "matrix", "resultPosition", "resultDirection", "resultTransform", "convertTransform", "type", "paramsOrActive", "active", "params", "component", "descendants", "descendant", "object", "children", "child", "components", "descendantsComponents", "descendantComponents", "childComponents", "applyToHierarchy", "deepClone", "componentName", "variableName", "componentMap", "overrideValue", "clonedObject", "objectsToCloneData", "objectsToCloneComponentsData", "cloneData", "parent", "objectToClone", "currentClonedObject", "cloneChild", "childToInclude", "childToIgnore", "componentsToCloneData", "cloneComponent", "componentsToPostProcessData", "componentToClone", "clonedComponent", "currentClonedComponent", "isCloneable", "objects", "tab", "newLine", "startObject", "endObject", "nameLabel", "idLabel", "componentsLabel", "typeLabel", "childrenLabel", "startComponents", "endComponents", "startChildren", "endChildren", "separator", "newLineTab", "objectString", "i", "childString", "emptyName", "name", "hierarchy", "descendantsQueue", "otherObject", "count", "componentAmountMap", "amountMap", "objectAmount", "typeAmount", "mat3", "quatRotation", "radiansRotation", "min", "max", "objectsToReserve", "componentsToReserve", "componentCount", "fixedAxes", "fixedAxesFixSignMap", "fixedLeft", "fixedUp", "fixedForward", "currentAxis", "rotationAxis", "rotationMat", "priority", "isLocal", "firstAxis", "secondAxis", "thirdAxis", "secondAxisValid", "thirdAxisValid", "crossAxis", "secondAxisIndex", "thirdAxisIndex", "fixSignMap", "key", "prefixes", "found", "prefix", "require_math_extension", "__commonJSMin", "value", "start", "end", "fixedStart", "fixedEnd", "min", "max", "zeroSign", "sign", "angle", "number", "decimalPlaces", "factor", "originRangeStart", "originRangeEnd", "newRangeStart", "newRangeEnd", "clampedValue", "newValue", "args", "random", "randomIndex", "from", "to", "interpolationValue", "t", "easingFunction", "lerpValue", "clampedFrom", "clampedTo", "distance", "usePositiveRange", "clampedAngle", "useShortestAngle", "isInside", "anglePositive", "startPositive", "endPositive", "temp", "key", "prefixes", "found", "prefix", "require_howler", "__commonJSMin", "exports", "HowlerGlobal", "self", "Howler", "vol", "setupAudioContext", "i", "ids", "j", "sound", "muted", "ext", "test", "audioTest", "mpegTest", "ua", "checkOpera", "isOldOpera", "checkSafari", "safariVersion", "isOldSafari", "unlock", "e", "audioNode", "source", "testPlay", "audio", "handleSuspension", "Howl", "o", "url", "str", "Sound", "loadBuffer", "sprite", "internal", "id", "num", "soundId", "seek", "duration", "timeout", "start", "stop", "setParams", "node", "playWebAudio", "playHtml5", "play", "err", "loadedNoReadyState", "listener", "args", "index", "from", "to", "len", "currentTime", "end", "isGroup", "diff", "steps", "stepLen", "lastTick", "tick", "loop", "rate", "playing", "seekAndEmit", "emitSeek", "realTime", "rateSeek", "sounds", "remCache", "cache", "event", "fn", "once", "events", "isId", "keys", "msg", "task", "limit", "cnt", "isIOS", "checkIE", "howl", "parent", "volume", "loadSound", "data", "dataView", "decodeAudioData", "xhr", "key", "code", "safeXhrSend", "arraybuffer", "error", "success", "buffer", "iOS", "appVersion", "version", "safari", "pan", "x", "y", "z", "xUp", "yUp", "zUp", "or", "_super", "pannerType", "setupPanner", "pa", "panner", "type", "spatial_audio_listener_exports", "import_howler", "init_spatial_audio_listener", "__esmMin", "require_audio_manager_component", "__commonJSMin", "dt", "audio_manager_exports", "import_howler", "init_audio_manager", "__esmMin", "audioSetupID", "id", "audioSetup", "preload", "volume", "mute", "require_audio_player", "__commonJSMin", "audioSetupOrAudioFilePath", "eventKey", "audioID", "checkOnlyLast", "isPlaying", "fromVolume", "toVolume", "duration", "updateOnlyLast", "position", "pitch", "rate", "volume", "spatial", "audioEvent", "listenerID", "callback", "event", "callbacks", "require_audio_setup", "__commonJSMin", "audioFilePath", "audioSetup", "pitch", "rate", "mute_everything_exports", "import_howler", "init_mute_everything", "__esmMin", "dt", "max_physx_exports", "init_max_physx", "__esmMin", "init_esm", "i", "dt", "debugActive", "staticCollisions", "collector", "dynamicCollisions", "kinematicCollisions", "totalCollisions", "fpsString", "fps", "physX", "strength", "raycastCount", "distance", "origin", "direction", "raycastResult", "isStatic", "isDynamic", "maxCount", "physXList", "cloves", "angleForClove", "minDistance", "maxDistance", "minExtraRotation", "maxExtraRotation", "upDirection", "horizontalDirection", "verticalDirection", "rotationAxis", "vec3_exports", "j", "extraAxisRotation", "extraUpRotation", "physXDirection", "position", "scale", "shape", "physXComponent", "require_max_visible_triangles", "__commonJSMin", "dt", "frameRate", "isLagging", "reset", "count", "plane", "gridSize", "spaceBetween", "totalSpaceBetween", "planeSize", "currentCount", "i", "j", "position", "meshComponent", "poolParams", "isStart", "elementToRemove", "averageDT", "trianglesAmount", "squaresAmount", "row", "column", "closestSqrt", "meshParams", "x", "y", "vertexParams", "firstTriangle", "secondTriangle", "require_number_over_value", "__commonJSMin", "startNumber", "endNumber", "startInterpolationValue", "endInterpolationValue", "easingFunction", "roundingFunction", "interpolationValue", "lerpInterpolationValue", "lerpNumber", "number", "currentNumber", "clampedNumber", "clampedCurrentNumber", "numberToRound", "roundedNumber", "startRange", "endRange", "randomValue", "average", "min", "max", "require_object_pool_manager", "__commonJSMin", "poolID", "poolObject", "objectPoolParams", "pool", "amount", "percentage", "object", "amountToAdd", "released", "size", "log", "i", "clone", "active", "first", "second", "equals", "require_physx_collision_collector", "__commonJSMin", "physXComponent", "isTrigger", "active", "dt", "callbackID", "callback", "type", "objectFound", "object", "element", "collisionsToEnd", "physX", "collision", "require_save_manager", "__commonJSMin", "delay", "delayed", "cache", "dt", "id", "value", "overrideDelaySavesCommit", "sameValue", "failed", "isCommitSaveDelayed", "callback", "callbackMap", "result", "isCommitSavesDelayed", "defaultValue", "functionName", "loadFromCache", "saveResult", "session", "event", "callbackID", "valueID", "valueIDMap", "require_timer", "__commonJSMin", "duration", "autoStart", "dt", "percentage", "callback", "id", "require_clear_console_on_xr_session_start", "__commonJSMin", "dt", "require_set_active", "__commonJSMin", "dt", "require_adjust_hierarchy_physx_scale", "__commonJSMin", "dt", "scale", "physXComponents", "physX", "require_get_player_objects", "__commonJSMin", "require_get_default_resources", "__commonJSMin", "require_show_fps", "__commonJSMin", "visualParams", "playerTransformQuat", "dt", "fps", "require_fsm", "__commonJSMin", "stateID", "stateObject", "transitionID", "fromStateData", "toStateData", "transitionObject", "skipStateFunction", "args", "performType", "performDelayedType", "state", "cloneObject", "stateData", "fromStateID", "toStateID", "transition", "fromMap", "transitionData", "initStateID", "initTransition", "initTransitionObject", "initStateData", "callback", "callbackMap", "dt", "i", "performDelayed", "transitions", "transitionsPerStateMap", "transitionMap", "transitionsToState", "toDelete", "fromTransitions", "hasTransition", "deepClone", "cloneFSM", "entry", "fromStateMap", "tEntry", "fromState", "toState", "isDeepCloneable", "active", "debugLogName", "showDelayedInfo", "callbackID", "iniStateID", "iniStateIDMap", "transitionIDMap", "value", "transitionMapValue", "element", "currentlyPerformedTransition", "consoleArguments", "transitionToPerform", "transitionIDMaps", "require_state", "__commonJSMin", "dt", "fsm", "args", "state", "transition", "require_transition", "__commonJSMin", "fsm", "initState", "args", "transition", "require_timer_state", "__commonJSMin", "duration", "transitionToPerformOnEnd", "transitionArgs", "callback", "id", "dt", "fsm", "transition", "state", "require_ca_utils", "__commonJSMin", "useDummyServer", "dummyServer", "leaderboardID", "isAscending", "isAroundPlayer", "scoresAmount", "callbackOnDone", "callbackOnError", "overrideUseDummyServer", "user", "userName", "result", "userValid", "value", "error", "scoreToSubmit", "leaderboard", "require_color_utils", "__commonJSMin", "rgb", "hsv", "r", "g", "b", "max", "min", "d", "h", "s", "v", "i", "f", "p", "q", "t", "color", "result", "require_mesh_utils", "__commonJSMin", "vertexCount", "meshParams", "i", "vertexParams", "firstTriangle", "secondTriangle", "meshCreationParams", "indexData", "triangle", "indexDataUnsignedInt", "mesh", "positionAttribute", "textureCoordinatesAttribute", "normalAttribute", "colorAttribute", "vertex", "position", "textureCoordinates", "normal", "color", "clonedIndexData", "clonedMesh", "clonedPositionAttribute", "clonedTextureCoordinatesAttribute", "clonedNormalAttribute", "clonedColorAttribute", "invertedIndexData", "invertedMesh", "invertedPositionAttribute", "invertedTextureCoordinatesAttribute", "invertedNormalAttribute", "invertedColorAttribute", "object", "alpha", "meshComponents", "meshComponent", "material", "cloneMaterial", "require_save_utils", "__commonJSMin", "id", "value", "defaultValue", "item", "require_text_utils", "__commonJSMin", "object", "textComponents", "textComponent", "require_xr_utils", "__commonJSMin", "require_physics_utils", "__commonJSMin", "layerFlagAmount", "layerFlagNames", "objectsEqualCallback", "first", "second", "raycastSetup", "raycastResult", "internalRaycastResult", "currentValidHitIndex", "validHitsCount", "i", "isHitValid", "isHitInsideCollision", "hit", "hitsToRemove", "require_physics_raycast_data", "__commonJSMin", "setup", "ignoreHitsInsideCollision", "firstHit", "hit", "hits", "hitIndex", "removedHit", "result", "copyHitCallback", "currentElement", "elementToCopy", "i", "length", "require_physics_layer_flags", "__commonJSMin", "indexOrName", "active", "index", "mask", "isActive", "layerMask", "layerFlags", "require_visual_manager", "__commonJSMin", "active", "dt", "visualElementParams", "lifetimeSeconds", "idToReuse", "visualElement", "idReused", "visualElementMap", "elementID", "visualElementPair", "visualElementType", "amount", "pool", "difference", "idsToRemove", "visualElementMapEntry", "id", "params", "element", "type", "objectPoolParams", "object", "require_visual_element_types", "__commonJSMin", "require_visual_line", "__commonJSMin", "start", "end", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "scaleLine", "translateLine", "forward", "require_visual_mesh", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "require_visual_point", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "require_visual_arrow", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "end", "translateRoot", "scaleArrow", "direction", "forward", "visualLineParams", "require_visual_text", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "require_visual_transform", "__commonJSMin", "params", "visible", "autoRefresh", "dt", "clonedParams", "clone", "axes", "scale", "position", "maxValue", "value", "visualLineParams", "require_visual_raycast", "__commonJSMin", "result", "params", "visible", "hitsToShow", "i", "visualRaycastHit", "autoRefresh", "dt", "raycastDistance", "visualRaycastParams", "visualRaycastHitParams", "clonedParams", "clone", "require_visual_torus", "__commonJSMin", "params", "visible", "segmentToShow", "i", "visualSegment", "autoRefresh", "dt", "clonedParams", "clone", "segmentStart", "segmentEnd", "segmentDirection", "fixedSegmentStart", "fixedSegmentEnd", "up", "sliceAngle", "extraLength", "visualSegmentParams", "require_visual_manager_component", "__commonJSMin", "dt", "require_debug_manager", "__commonJSMin", "dt", "require_debug_visual_manager", "__commonJSMin", "lifetimeSeconds", "start", "direction", "length", "color", "thickness", "visualParams", "end", "position", "radius", "text", "transform", "alignment", "justification", "raycastResult", "showOnlyFirstHit", "hitNormalLength", "require_debug_transform_component", "__commonJSMin", "dt", "require_debug_manager_component", "__commonJSMin", "dt", "require_direction_2D_to_3D_converter", "__commonJSMin", "params", "direction2D", "referenceTransformQuat", "directionUp", "outDirection3D", "forward", "right", "directionUpNegate", "forwardScaled", "rightScaled", "angleForwardWithDirectionUp", "angleRightWithDirectionUp", "require_grabbable", "__commonJSMin", "grabber", "callback", "linearVelocity", "angularVelocity", "angularVelocityDegrees", "angularVelocityRadians", "id", "require_grabber_hand", "__commonJSMin", "dt", "grabButton", "throwButton", "id", "callback", "grabbablesToGrab", "collisions", "i", "grabbable", "grabberPosition", "first", "second", "firstPosition", "secondPosition", "firstDistance", "secondDistance", "grabbableToGrab", "grabbableData", "linearVelocity", "angularVelocity", "grabber", "element", "handPose", "linearVelocityHistory", "speed", "speedEaseMultiplier", "directionCurrentWeight", "lastDirectionIndex", "direction", "currentDirection", "angularVelocityHistory", "j", "color", "useGrabbableAsVelocitySource", "linearVelocityHistorySize", "angularVelocityHistorySize", "require_finger_cursor", "__commonJSMin", "dt", "overlaps", "overlapTarget", "i", "target", "tip", "session", "referenceSpace", "require_input_types", "__commonJSMin", "require_input_utils", "__commonJSMin", "index", "handedness", "inputSourceType", "inputSource", "i", "input", "oppositeHandedness", "jointType", "jointTypeKey", "jointTypeIndexKey", "require_keyboard", "__commonJSMin", "keyType", "isPressed", "isPressStart", "isPressEnd", "dt", "keyInfo", "event", "require_mouse", "__commonJSMin", "typeKey", "dt", "buttonInfo", "buttonInfoType", "isPressed", "isPressStart", "isPressEnd", "active", "out", "mousePosition", "distanceFromCamera", "originWorld", "directionWorld", "right", "up", "directionLocal", "projectionMatrixInvert", "raycastSetup", "raycastResult", "delay", "event", "bounds", "require_input_manager", "__commonJSMin", "dt", "require_input_manager_component", "__commonJSMin", "dt", "handPoseParams", "leftXRGamepadCore", "rightXRGamepadCore", "leftKeyboardGamepadCore", "rightKeyboardGamepadCore", "require_switch_hand_object", "__commonJSMin", "dt", "inputSourceType", "require_tracked_hand_draw_joint", "__commonJSMin", "dt", "mesh", "require_tracked_hand_draw_all_joints", "__commonJSMin", "dt", "jointTypeKey", "jointType", "jointObject", "require_tracked_hand_draw_skin", "__commonJSMin", "dt", "jointObject", "jointType", "jointPose", "skinJointIDs", "i", "require_gamepad_buttons", "__commonJSMin", "ButtonInfo", "type", "handedness", "multiplePressCount", "multipleTouchCount", "value", "AxesInfo", "PulseInfo", "require_base_gamepad", "__commonJSMin", "handedness", "key", "typeKey", "eventKey", "buttonType", "buttonEvent", "id", "callback", "axesEvent", "intensity", "duration", "maxDelay", "dt", "item", "button", "buttonData", "buttonInfo", "buttonCallbacks", "callbacksMap", "hapticActuators", "hapticActuator", "info", "require_universal_gamepad", "__commonJSMin", "handedness", "id", "gamepadCore", "handPose", "core", "isActive", "dt", "buttonType", "buttonData", "coreButtonData", "axesData", "coreAxesData", "hapticActuators", "require_gamepad_core", "__commonJSMin", "handedness", "dt", "buttonType", "require_xr_gamepad_core", "__commonJSMin", "handedness", "handPoseParams", "dt", "buttonType", "buttonData", "gamepadButton", "touchButton", "axes", "internalAxes", "hapticActuators", "isPressed", "session", "event", "require_keyboard_gamepad_core", "__commonJSMin", "handedness", "handPose", "active", "dt", "buttonType", "buttonData", "axes", "require_gamepad_mesh_animator", "__commonJSMin", "gamepad", "upTranslation", "buttonInfo", "translation", "rotation", "axesInfo", "leftRotation", "forwardRotation", "require_gamepad_manager", "__commonJSMin", "dt", "handedness", "gamepad", "gamepads", "require_gamepad_utils", "__commonJSMin", "simultaneousPressMaxDelay", "simultaneousTouchMaxDelay", "gamepadButtonTypesList", "multiplePressCount", "realGamepadButtonTypesList", "gamepadButtonTypes", "key", "isOnePressStart", "gamepad", "i", "buttonType", "areButtonPressedRecently", "button", "isOnePressEnd", "areButtonNotPressedRecently", "isOneTouchStart", "multipleTouchCount", "areButtonTouchedRecently", "isOneTouchEnd", "areButtonNotTouchedRecently", "require_gamepad_control_scheme", "__commonJSMin", "dt", "visible", "text", "distanceFromButton", "lineLength", "referenceObject", "thumbstickPositionLocal", "thumbstickUpLocal", "differenceOnUp", "buttonObject", "startOffset", "endOffset", "parentObject", "buttonPosition", "referenceForward", "referenceRight", "referenceUp", "lineStart", "lineEnd", "textOffset", "textPosition", "start", "end", "lineDirection", "length", "lineMesh", "thickness", "position", "forward", "up", "textObject", "textComponent", "require_base_pose", "__commonJSMin", "basePoseParams", "referenceObject", "fixForward", "forceEmulatedVelocities", "dt", "xrFrame", "xrPose", "manualStart", "session", "referenceSpace", "position", "transform", "rotationQuat", "playerRotationQuat", "up", "transformQuat", "playerTransformQuat", "rotationDegrees", "rotationRadians", "prevRotationRadians", "require_hand_pose", "__commonJSMin", "handedness", "handPoseParams", "fixTrackedHandRotation", "xrFrame", "manualStart", "session", "event", "item", "rotationQuat", "playerRotationQuat", "up", "right", "forward", "forwardRotation", "require_head_pose", "__commonJSMin", "xrFrame", "require_tracked_hand_joint_pose", "__commonJSMin", "handedness", "trackedHandJointType", "basePoseParams", "xrFrame", "dt", "xrPose", "manualStart", "session", "event", "item", "require_tracked_hand_pose", "__commonJSMin", "addAllJointTypes", "typeKey", "handedness", "trackedHandPoseParams", "jointType", "trackedHandJointPose", "jointPoseKey", "dt", "jointPoseTypeIndex", "element", "referenceObject", "fixForward", "forceEmulatedVelocities", "require_set_player_height", "__commonJSMin", "localPosition", "require_set_hand_local_transform", "__commonJSMin", "handPoseTransform", "dt", "require_set_head_local_transform", "__commonJSMin", "headPoseTransform", "nonVRCameraRotation", "nonVRCameraUp", "nonVRCameraPosition", "dt", "require_set_vr_head_local_transform", "__commonJSMin", "headPoseTransform", "dt", "require_set_non_vr_head_local_transform", "__commonJSMin", "dt", "nonVRCameraRotation", "nonVRCameraUp", "nonVRCameraPosition", "require_set_tracked_hand_joint_local_transform", "__commonJSMin", "dt", "require_copy_hand_transform", "__commonJSMin", "dt", "hand", "require_copy_head_transform", "__commonJSMin", "dt", "head", "require_copy_player_transform", "__commonJSMin", "dt", "player", "require_copy_player_pivot_transform", "__commonJSMin", "dt", "playerPivot", "require_tool_types", "__commonJSMin", "require_tool_cursor", "__commonJSMin", "cursorMeshObject", "cursorMeshComponent", "cursorComponent", "fingerCursorObject", "fingerCollisionSize", "meshComponent", "transformQuat", "dt", "isUsingHand", "i", "input", "object", "targetComponent", "require_console_vr_widget_setup", "__commonJSMin", "xPaddingPercentage", "yPaddingPercentage", "xPosition", "yPosition", "numberOfButtons", "buttonsHorizontalSpace", "numberOfSpacesBetweenButtons", "spaceWidth", "halfButtonWidth", "initialPosition", "spaceBetweenMessagesAndButtons", "pointerCollisionHalfHeight", "require_console_vr_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "key", "messagesBackgroundMeshComp", "textComp", "buttonBackgroundMeshComp", "buttonTextComp", "buttonCursorTargetComp", "buttonCollisionComp", "collisionComp", "textComponent", "require_console_vr_widget", "__commonJSMin", "key", "visible", "parentObject", "additionalSetup", "errorEvent", "dt", "messageType", "consoleText", "linesCount", "i", "scrollLinesToSkip", "message", "messageLines", "linesToSkip", "additionalEmptyLines", "emptyLinesToSkip", "emptyLinesToShow", "j", "linesToShow", "consoleFunction", "sender", "args", "formattedText", "lines", "stringifiedArgs", "item", "stringifiedItem", "linesBetweenItems", "cache", "value", "messageText", "linesToSplit", "lineToSplit", "spacesAtStart", "spaceToAdd", "lineSplits", "firstSub", "secondSub", "text", "spaces", "hasSameInfoAsPrev", "lastMessage", "maxScroll", "ui", "cursorTarget", "backgroundMaterial", "textMaterial", "filterTextMaterial", "codeDrivenClear", "active", "material", "axes", "normalizedScrollAmount", "pulseType", "array", "isBuiltIn", "element", "arrayCopy", "stringifiedArray", "countString", "forwardToBrowserConsole", "require_console_vr", "__commonJSMin", "additionalSetup", "dt", "require_easy_object_tuner", "__commonJSMin", "object", "variableName", "setAsDefault", "useTuneTarget", "variableNamePrefix", "easyTuneVariable", "dt", "value", "require_easy_light_attenuation", "__commonJSMin", "dt", "object", "variableName", "setAsDefault", "useTuneTarget", "value", "attenuation", "light", "require_easy_light_color", "__commonJSMin", "dt", "colorModel", "object", "variableName", "setAsDefault", "useTuneTarget", "nameFirstPart", "color", "lightColor", "value", "light", "hsvColor", "rgbColor", "require_easy_mesh_color", "__commonJSMin", "dt", "colorModel", "colorType", "object", "variableName", "setAsDefault", "useTuneTarget", "nameFirstPart", "color", "meshMaterial", "value", "hsvColor", "rgbColor", "material", "mesh", "require_easy_scale", "__commonJSMin", "dt", "isLocal", "scaleAsOne", "object", "variableName", "setAsDefault", "useTuneTarget", "value", "require_easy_set_tune_target_child_number", "__commonJSMin", "childrenCount", "min", "max", "easyTuneVariable", "childIndex", "require_easy_set_tune_target_grab", "__commonJSMin", "grabber", "grabbable", "require_easy_transform", "__commonJSMin", "dt", "isLocal", "scaleAsOne", "object", "variableName", "setAsDefault", "useTuneTarget", "value", "require_easy_tune_bool_array_widget", "__commonJSMin", "arraySize", "gamepad", "variable", "appendToVariableName", "active", "scrollDirection", "i", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "stickVariableIntensity", "valueIntensity", "ui", "index", "value", "text", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "material", "originalScale", "require_easy_tune_bool_array_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "active", "i", "textComponent", "require_easy_tune_bool_array_widget_setup", "__commonJSMin", "arraySize", "panelZ", "distanceFromBorder", "distanceFromValue", "colliderZPosition", "backgroundHalfWidth", "i", "valuePanelLastPosition", "maxY", "minY", "require_easy_tune_bool_widget", "__commonJSMin", "gamepad", "variable", "appendToVariableName", "visible", "widget", "active", "scrollDirection", "id", "callback", "parentObject", "additionalSetup", "dt", "amount", "arraySize", "require_easy_tune_none_widget", "__commonJSMin", "variable", "appendToVariableName", "active", "scrollDirection", "name", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "ui", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "material", "require_easy_tune_none_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "textComponent", "require_easy_tune_none_widget_setup", "__commonJSMin", "panelZ", "distanceFromBorder", "colliderZPosition", "backgroundHalfWidth", "maxY", "minY", "require_easy_tune_number_array_widget", "__commonJSMin", "arraySize", "gamepad", "variable", "appendToVariableName", "active", "scrollDirection", "i", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "stickVariableIntensity", "y", "normalizedEditAmount", "valueIntensity", "amountToAdd", "decimalPlacesMultiplier", "difference", "stepIntensity", "ui", "index", "value", "text", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "step", "material", "originalScale", "require_easy_tune_number_array_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "active", "i", "textComponent", "require_easy_tune_number_array_widget_setup", "__commonJSMin", "arraySize", "panelZ", "distanceFromBorder", "distanceFromValue", "colliderZPosition", "backgroundHalfWidth", "i", "valuePanelLastPosition", "maxY", "minY", "require_easy_tune_number_widget", "__commonJSMin", "gamepad", "variable", "appendToVariableName", "visible", "widget", "active", "scrollDirection", "id", "callback", "parentObject", "additionalSetup", "dt", "amount", "arraySize", "require_easy_tune_transform_widget", "__commonJSMin", "gamepad", "variable", "appendToVariableName", "active", "scrollDirection", "i", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "stickVariableIntensity", "y", "normalizedEditAmount", "valueIntensity", "amountToAdd", "decimalPlacesMultiplier", "difference", "stepIntensity", "stepValue", "ui", "componentIndex", "index", "value", "text", "skipForceScroll", "forceScroll", "oldScrollDirection", "amount", "initialValue", "step", "material", "originalScale", "require_easy_tune_transform_widget_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "active", "i", "textComponent", "require_easy_tune_transform_widget_setup", "__commonJSMin", "panelZ", "distanceFromBorder", "distanceFromValue", "colliderZPosition", "backgroundHalfWidth", "distanceBetweenComponents", "distanceFromVariableLabel", "distanceBetweenValues", "i", "valuePanelLastPosition", "maxY", "minY", "maxX", "minX", "require_easy_tune_widget", "__commonJSMin", "variableName", "visible", "parentObject", "additionalSetup", "easyTuneVariables", "dt", "item", "scrollVariableActive", "scrollVariableDirection", "widget", "x", "y", "amount", "variableIndex", "newIndex", "indexString", "index", "length", "variable", "value", "require_easy_tune_widget_setup", "__commonJSMin", "require_easy_tune_variables", "__commonJSMin", "variable", "variableName", "value", "resetInitialValue", "callbackID", "callback", "name", "type", "oldValue", "id", "stepPerSecond", "decimalPlaces", "min", "max", "editAllValuesTogether", "clampedValue", "clampedInitialValue", "tempValue", "i", "scaleAsOne", "positionStepPerSecond", "rotationStepPerSecond", "scaleStepPerSecond", "decimalPlacesMultiplier", "require_easy_tune", "__commonJSMin", "variableName", "additionalSetup", "dt", "callback", "require_widget_frame_setup", "__commonJSMin", "widgetLetterID", "buttonsColumnIndex", "distanceBetweenToolsVisibilityButtons", "buttonXOffset", "distanceBetweenFlagButtons", "pinFlagIndex", "pinButtonYOffset", "defaultObjectTransforms", "inputSourceTypeKey", "inputSourceType", "handednessKey", "handedness", "require_widget_frame_ui", "__commonJSMin", "parentObject", "setup", "additionalSetup", "visible", "pinned", "dt", "forceRefreshObjectsTransforms", "inputSourceType", "textComponent", "require_widget_frame", "__commonJSMin", "widgetLetterID", "buttonsColumnIndex", "visible", "id", "callback", "parentObject", "additionalSetup", "dt", "ui", "isButton", "notify", "textMaterial", "backgroundMaterial", "material"] } diff --git a/wle_pp/wle_pp_bundler/js/pp/input/gamepad/cauldron/gamepad_control_scheme.js b/wle_pp/wle_pp_bundler/js/pp/input/gamepad/cauldron/gamepad_control_scheme.js index 90b939b..311184e 100644 --- a/wle_pp/wle_pp_bundler/js/pp/input/gamepad/cauldron/gamepad_control_scheme.js +++ b/wle_pp/wle_pp_bundler/js/pp/input/gamepad/cauldron/gamepad_control_scheme.js @@ -1,12 +1,8 @@ WL.registerComponent('pp-gamepad-control-scheme', { - _myStartVisible: { type: WL.Type.Bool, default: true }, + _myShowOnStart: { type: WL.Type.Bool, default: true }, _myHandedness: { type: WL.Type.Enum, values: ['left', 'right'], default: 'left' }, - _myTextScaleMultiplier: { type: WL.Type.Float, default: 1 }, - _myLineLengthMultiplier: { type: WL.Type.Float, default: 1 }, - _myLineThicknessMultiplier: { type: WL.Type.Float, default: 1 }, - _mySelectText: { type: WL.Type.String, default: "" }, _mySqueezeText: { type: WL.Type.String, default: "" }, _myThumbstickText: { type: WL.Type.String, default: "" }, @@ -19,6 +15,12 @@ WL.registerComponent('pp-gamepad-control-scheme', { _myBottomButton: { type: WL.Type.Object, default: null }, _myTopButton: { type: WL.Type.Object, default: null }, + _myTextScaleMultiplier: { type: WL.Type.Float, default: 1 }, + _myTextOffsetMultiplier: { type: WL.Type.Float, default: 1 }, + _myLineLengthMultiplier: { type: WL.Type.Float, default: 1 }, + _myLineThicknessMultiplier: { type: WL.Type.Float, default: 1 }, + _myDistanceFromButtonsMultiplier: { type: WL.Type.Float, default: 1 }, + _myTextMaterial: { type: WL.Type.Material }, _myLineMaterial: { type: WL.Type.Material } }, { @@ -35,22 +37,23 @@ WL.registerComponent('pp-gamepad-control-scheme', { this._mySetVisibleNextUpdate = false; this._createControlScheme(); - this.setVisible(this._myStartVisible); + this.setVisible(this._myShowOnStart); + + this._myVisibleBackup = this._myVisible; }, update: function (dt) { if (this._mySetVisibleNextUpdate) { this._mySetVisibleNextUpdate = false; this.setVisible(false); - this.setVisible(this._myVisible); + this.setVisible(this._myVisibleBackup); } }, onActivate() { this._mySetVisibleNextUpdate = true; }, onDeactivate() { - let backupVisible = this._myVisible; + this._myVisibleBackup = this._myVisible; this.setVisible(false); - this._myVisible = backupVisible; }, isVisible() { return this._myVisible; @@ -94,10 +97,7 @@ WL.registerComponent('pp-gamepad-control-scheme', { _createControlScheme() { this._myRootObject = this.object.pp_addObject(); - let objectScale = this.object.pp_getScale(); - this.object.pp_resetScale(); - - let distanceFromButton = 0.015; + let distanceFromButton = 0.02 * this._myDistanceFromButtonsMultiplier; let lineLength = 0.0935 * this._myLineLengthMultiplier; let referenceObject = this._myThumbstick; @@ -123,27 +123,40 @@ WL.registerComponent('pp-gamepad-control-scheme', { this._myThumbstickObject); this._myThumbstickTextComponent.text = this._myThumbstickText; - this._myBottomButtonObject = this._myRootObject.pp_addObject(); - this._myBottomButtonTextComponent = this._addScheme(this._myBottomButton, referenceObject, - [0, distanceFromButton, 0], - [0, 0, -lineLength], - this._myBottomButtonObject); - this._myBottomButtonTextComponent.text = this._myBottomButtonText; + let thumbstickPositionLocal = this._myThumbstick.pp_getPositionLocal(); + let thumbstickUpLocal = this._myThumbstick.pp_getUpLocal(); - this._myTopButtonObject = this._myRootObject.pp_addObject(); - this._myTopButtonTextComponent = this._addScheme(this._myTopButton, referenceObject, - [0, distanceFromButton, 0], - [-lineLength * this._myControlSchemeDirection, 0, 0].vec3_rotateAxis(-45 * this._myControlSchemeDirection, [0, 1, 0]), - this._myTopButtonObject); - this._myTopButtonTextComponent.text = this._myTopButtonText; + { + let bottomButtonPositionLocal = this._myBottomButton.pp_getPositionLocal(); + let difference = bottomButtonPositionLocal.vec3_sub(thumbstickPositionLocal); + let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal); + + this._myBottomButtonObject = this._myRootObject.pp_addObject(); + this._myBottomButtonTextComponent = this._addScheme(this._myBottomButton, referenceObject, + [0, distanceFromButton - differenceOnUp, 0], + [0, 0, -lineLength], + this._myBottomButtonObject); + this._myBottomButtonTextComponent.text = this._myBottomButtonText; + } - this.object.pp_setScale(objectScale); + { + let topButtonPositionLocal = this._myTopButton.pp_getPositionLocal(); + let difference = topButtonPositionLocal.vec3_sub(thumbstickPositionLocal); + let differenceOnUp = difference.vec3_valueAlongAxis(thumbstickUpLocal); + + this._myTopButtonObject = this._myRootObject.pp_addObject(); + this._myTopButtonTextComponent = this._addScheme(this._myTopButton, referenceObject, + [0, distanceFromButton - differenceOnUp, 0], + [-lineLength * this._myControlSchemeDirection, 0, 0].vec3_rotateAxis(-45 * this._myControlSchemeDirection, [0, 1, 0]), + this._myTopButtonObject); + this._myTopButtonTextComponent.text = this._myTopButtonText; + } }, _addScheme(buttonObject, referenceObject, startOffset, endOffset, parentObject) { - let buttonPosition = buttonObject.pp_getPosition(); - let referenceForward = referenceObject.pp_getForward(); - let referenceRight = referenceObject.pp_getRight(); - let referenceUp = referenceObject.pp_getUp(); + let buttonPosition = buttonObject.pp_getPositionLocal(); + let referenceForward = referenceObject.pp_getForwardLocal(); + let referenceRight = referenceObject.pp_getRightLocal(); + let referenceUp = referenceObject.pp_getUpLocal(); let lineStart = buttonPosition.vec3_add(referenceRight.vec3_scale(startOffset[0])); lineStart.vec3_add(referenceUp.vec3_scale(startOffset[1]), lineStart); @@ -153,7 +166,7 @@ WL.registerComponent('pp-gamepad-control-scheme', { lineEnd.vec3_add(referenceUp.vec3_scale(endOffset[1]), lineEnd); lineEnd.vec3_add(referenceForward.vec3_scale(endOffset[2]), lineEnd); - let textOffset = 0.01; + let textOffset = 0.01 * this._myTextOffsetMultiplier; let textPosition = lineEnd.vec3_add(referenceForward.vec3_scale(-textOffset)); this._addLine(lineStart, lineEnd, parentObject); @@ -170,21 +183,21 @@ WL.registerComponent('pp-gamepad-control-scheme', { lineObject = lineRootObject.pp_addObject(); let lineMesh = lineObject.addComponent('mesh'); - lineMesh.mesh = PP.myDefaultResources.myMeshes.myCube; + lineMesh.mesh = PP.myDefaultResources.myMeshes.myCylinder; lineMesh.material = this._myLineMaterialFinal; - lineRootObject.pp_setPosition(start); + lineRootObject.pp_setPositionLocal(start); let thickness = 0.001 * this._myLineThicknessMultiplier; - lineObject.pp_scaleObject([thickness / 2, thickness / 2, length / 2]); + lineObject.pp_scaleObject([thickness / 2, length / 2, thickness / 2]); - lineObject.pp_lookTo(lineDirection); - lineObject.pp_translateObject([0, 0, length / 2]); + lineObject.pp_setUpLocal(lineDirection); + lineObject.pp_translateObject([0, length / 2, 0]); }, _addText(position, forward, up, parentObject) { let textObject = parentObject.pp_addObject(); - textObject.pp_setPosition(position); - textObject.pp_lookTo(up, forward); + textObject.pp_setPositionLocal(position); + textObject.pp_lookToLocal(up, forward); textObject.pp_scaleObject(0.0935 * this._myTextScaleMultiplier); let textComponent = textObject.pp_addComponent("text"); diff --git a/wle_pp/wle_pp_bundler/js/pp/tool/cauldron/components/tool_cursor.js b/wle_pp/wle_pp_bundler/js/pp/tool/cauldron/components/tool_cursor.js index 6aa59c7..1f2b811 100644 --- a/wle_pp/wle_pp_bundler/js/pp/tool/cauldron/components/tool_cursor.js +++ b/wle_pp/wle_pp_bundler/js/pp/tool/cauldron/components/tool_cursor.js @@ -6,16 +6,9 @@ WL.registerComponent('pp-tool-cursor', { init: function () { this._myHandednessString = ['left', 'right'][this._myHandedness]; - if (this._myHandedness == 0) { - this._myCursorPosition = [-0.01, -0.024, -0.05]; - } else { - this._myCursorPosition = [0.01, -0.024, -0.05]; - } - - this._myCursorRotation = [-0.382, 0, 0, 0.924]; - this._myCursorRotation.quat_normalize(this._myCursorRotation); + this._myCursorPosition = [0, -0.035, -0.05]; + this._myCursorRotation = [-30, 0, 0]; this._myCursorMeshScale = [0.0025, 0.0025, 0.0025]; - this._myCursorColor = [255 / 255, 255 / 255, 255 / 255, 1]; this._myCursorTargetCollisionGroup = 7; @@ -25,8 +18,8 @@ WL.registerComponent('pp-tool-cursor', { this._myFixForwardObject.pp_rotateObject([0, 180, 0]); this._myCursorObjectVR = WL.scene.addObject(this._myFixForwardObject); - this._myCursorObjectVR.setTranslationLocal(this._myCursorPosition); - this._myCursorObjectVR.rotateObject(this._myCursorRotation); + this._myCursorObjectVR.pp_setPositionLocal(this._myCursorPosition); + this._myCursorObjectVR.pp_rotateObject(this._myCursorRotation); { let cursorMeshObject = WL.scene.addObject(this._myCursorObjectVR); diff --git a/wle_pp/wle_pp_bundler/package-lock.json b/wle_pp/wle_pp_bundler/package-lock.json index 546c6c9..b134da4 100644 --- a/wle_pp/wle_pp_bundler/package-lock.json +++ b/wle_pp/wle_pp_bundler/package-lock.json @@ -1,16 +1,16 @@ { "name": "wle_pp", - "version": "0.2.5", + "version": "0.2.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "wle_pp", - "version": "0.2.5", + "version": "0.2.6", "license": "ISC", "dependencies": { - "@wonderlandengine/components": "^0.8.16", - "gl-matrix": "^3.4.3" + "gl-matrix": "^3.4.3", + "howler": "^2.2.3" }, "devDependencies": { "esbuild": "^0.14.54" @@ -32,15 +32,6 @@ "node": ">=12" } }, - "node_modules/@wonderlandengine/components": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/@wonderlandengine/components/-/components-0.8.16.tgz", - "integrity": "sha512-YekBfe0SAZeH3qCweqOaLk2iKUzNFDmrnA4Axddc++CNgLwsUyJe6x5dkBdxJw5afJ9OPhQrHkkNZtGCmcOKqw==", - "dependencies": { - "gl-matrix": "^3.3.0", - "howler": "^2.2.1" - } - }, "node_modules/esbuild": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", @@ -416,15 +407,6 @@ "dev": true, "optional": true }, - "@wonderlandengine/components": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/@wonderlandengine/components/-/components-0.8.16.tgz", - "integrity": "sha512-YekBfe0SAZeH3qCweqOaLk2iKUzNFDmrnA4Axddc++CNgLwsUyJe6x5dkBdxJw5afJ9OPhQrHkkNZtGCmcOKqw==", - "requires": { - "gl-matrix": "^3.3.0", - "howler": "^2.2.1" - } - }, "esbuild": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", diff --git a/wle_pp/wle_pp_bundler/package.json b/wle_pp/wle_pp_bundler/package.json index fe16381..4fe70d1 100644 --- a/wle_pp/wle_pp_bundler/package.json +++ b/wle_pp/wle_pp_bundler/package.json @@ -1,6 +1,6 @@ { "name": "wle_pp", - "version": "0.2.5", + "version": "0.2.6", "description": "A library for the Wonderland Engine", "main": "./js/bundle.js", "exports": "./js/bundle.js", @@ -13,8 +13,8 @@ "esbuild": "^0.14.54" }, "dependencies": { - "@wonderlandengine/components": "^0.8.16", - "gl-matrix": "^3.4.3" + "gl-matrix": "^3.4.3", + "howler": "^2.2.3" }, "files": [ "js"