diff --git a/README.md b/README.md index 9d45678..6adf3c0 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,7 @@ let characterController = new CharacterController(player, camera, scene); ``` -## API ( version 0.4.0 ) +## API ( version 0.4.4 ) #### To Instantiate @@ -252,6 +252,8 @@ let agMap:{} = { - forwardFacing - Optional. If the avatar's face is forward facing (positive Z direction) set this to true. By default it is false. +Note: If camera is set to null then the camera will not follow the character and keybaord will not controll the character. You can use this for an NPC which you can move around programmatically. See the section on "Controlling Avatar programmatically". + If using animation ranges the player skeleton is expected to have the animation ranges named as follows - idle @@ -272,7 +274,8 @@ If using animation ranges the player skeleton is expected to have the animation - strafeRightFast - slideDown -If an animation is not provided then the controller will not play that animation and will continue playing the animation it was playing just before. +If a particular animation is not provided then the controller will not play that animation and will continue playing the animation it was playing just before. +Note that if no animations are provided then no animations will be played. This, thus, can be used to move an non skeleton based mesh around. Note that there are some animations with name ending with string "Fast". If these are not present then the controller will play the non-fast version but at twice the speed. @@ -461,6 +464,7 @@ cc.turnRight(b: boolean); cc.strafeLeft(b: boolean); cc.strafeRight(b: boolean); cc.jump(b: boolean); +cc.fall(); ``` Example: @@ -470,6 +474,10 @@ cc.walk(true); // will start walking the Avatar. cc.walk(false); // will stop walking the Avatar. ``` +A word about cc.fall(). The CharacterController doesn't constantly check if the user is "grounded". This is to prevent needless computation. Once the Avatar is on a ground/floor it assumes the Avatar will continue to stand on that ground/floor until the user uses keys to move the Avatar. +In some use cases the ground/floor might move away and thus leave the Avatar hanging in mid air. In such cases use cc.fall() to force the Avatar to fall to the next gound/floor below. + + #### Enabling/Disabling the KeyBoard controll Sometimes, when you are controlling the movement of the Avatar programmatically as shown above, you might want to disable the keyboard. @@ -531,6 +539,31 @@ setStepOffset(0.5); The avatar can only move up a step if the height of the step is less than or equal to the "stepOffset". By default the value is 0.25. +#### To set/change the setup step sound. + +``` +setSound(Babylon.Sound); +``` + +Example + +``` + let sound = new BABYLON.Sound( + "footstep", + "./sounds/footstep_carpet_000.ogg", + scene, + () => { + cc.setSound(sound); + }, + { loop: false } + ); +``` + +The above will load sound from file "footstep_carpet_000.ogg" and when loaded will set the Avatar step sound to that. +This sound will be played for all actions except idle. +The sound will be played twice per cycle of the animation. +The rate will be set automatically based on frames and fps of animation + #### To change avatar or skeleton at ``` diff --git a/dist-old/CharacterController.d.ts b/dist-old/CharacterController.d.ts new file mode 100644 index 0000000..37d5039 --- /dev/null +++ b/dist-old/CharacterController.d.ts @@ -0,0 +1,244 @@ +import { Skeleton, ArcRotateCamera, Vector3, Mesh, Scene, AnimationGroup, Sound } from "babylonjs"; +export declare class CharacterController { + private _avatar; + private _skeleton; + private _camera; + private _scene; + getScene(): Scene; + private _gravity; + private _minSlopeLimit; + private _maxSlopeLimit; + private _sl1; + private _sl2; + private _stepOffset; + private _vMoveTot; + private _vMovStartPos; + private _actionMap; + private _cameraElastic; + private _cameraTarget; + private _noFirstPerson; + setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number): void; + setStepOffset(stepOffset: number): void; + setWalkSpeed(n: number): void; + setRunSpeed(n: number): void; + setBackSpeed(n: number): void; + setBackFastSpeed(n: number): void; + setJumpSpeed(n: number): void; + setLeftSpeed(n: number): void; + setLeftFastSpeed(n: number): void; + setRightSpeed(n: number): void; + setRightFastSpeed(n: number): void; + setTurnSpeed(n: number): void; + setTurnFastSpeed(n: number): void; + setGravity(n: number): void; + setAnimationGroups(agMap: {}): void; + setAnimationRanges(arMap: {}): void; + setActionMap(inActMap: ActionMap): string; + getActionMap(): ActionMap; + getSettings(): CCSettings; + setSettings(ccs: CCSettings): void; + private _setAnim; + enableBlending(n: number): void; + disableBlending(): void; + setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean): void; + _stepSound: Sound; + setSound(sound: Sound): void; + setWalkKey(key: string): void; + setWalkBackKey(key: string): void; + setTurnLeftKey(key: string): void; + setTurnRightKey(key: string): void; + setStrafeLeftKey(key: string): void; + setStrafeRightKey(key: string): void; + setJumpKey(key: string): void; + setCameraElasticity(b: boolean): void; + setElasticiSteps(n: number): void; + makeObstructionInvisible(b: boolean): void; + setCameraTarget(v: Vector3): void; + cameraCollisionChanged(): void; + setNoFirstPerson(b: boolean): void; + private _checkAnimRanges; + private _checkFastAnims; + private _copySlowAnims; + private _mode; + private _saveMode; + setMode(n: number): void; + getMode(): number; + setTurningOff(b: boolean): void; + isTurningOff(): boolean; + private _isLHS_RHS; + private _signLHS_RHS; + private _setRHS; + private _ffSign; + private _rhsSign; + private _ff; + private _av2cam; + setFaceForward(b: boolean): void; + isFaceForward(): boolean; + private checkAGs; + private _containsAG; + private _getRoot; + private _started; + start(): void; + stop(): void; + private _stopAnim; + pauseAnim(): void; + resumeAnim(): void; + private _prevActData; + private _avStartPos; + private _grounded; + private _freeFallDist; + private _fallFrameCountMin; + private _fallFrameCount; + private _inFreeFall; + private _wasWalking; + private _wasRunning; + private _moveVector; + private _isAvFacingCamera; + private _moveAVandCamera; + private _soundLoopTime; + private _sndId; + private _jumpStartPosY; + private _jumpTime; + private _doJump; + private _calcJumpDist; + private _endJump; + private _areVectorsEqual; + private _verticalSlope; + private _movFallTime; + private _sign; + private _isTurning; + private _noRot; + private _doMove; + private _rotateAV2C; + private _rotateAVnC; + private _endFreeFall; + private _idleFallTime; + private _doIdle; + private _groundFrameCount; + private _groundFrameMax; + private _groundIt; + private _unGroundIt; + private _savedCameraCollision; + private _inFP; + private _updateTargetValue; + private _makeMeshInvisible; + private _visiblityMap; + private _restoreVisiblity; + private _ray; + private _rayDir; + private _cameraSkin; + private _prevPickedMeshes; + private _pickedMeshes; + private _makeInvisible; + private _elasticSteps; + private _alreadyInvisible; + private _handleObstruction; + private _isSeeAble; + private _move; + anyMovement(): boolean; + private _onKeyDown; + private _onKeyUp; + private _ekb; + isKeyBoardEnabled(): boolean; + enableKeyBoard(b: boolean): void; + private _addkeylistener; + private _removekeylistener; + walk(b: boolean): void; + walkBack(b: boolean): void; + walkBackFast(b: boolean): void; + run(b: boolean): void; + turnLeft(b: boolean): void; + turnLeftFast(b: boolean): void; + turnRight(b: boolean): void; + turnRightFast(b: boolean): void; + strafeLeft(b: boolean): void; + strafeLeftFast(b: boolean): void; + strafeRight(b: boolean): void; + strafeRightFast(b: boolean): void; + jump(): void; + fall(): void; + idle(): void; + private _act; + private _renderer; + private _handleKeyUp; + private _handleKeyDown; + private _isAG; + isAg(): boolean; + private _findSkel; + private _root; + setAvatar(avatar: Mesh, faceForward?: boolean): boolean; + getAvatar(): Mesh; + setAvatarSkeleton(skeleton: Skeleton): void; + private _skelDrivenByAG; + getSkeleton(): Skeleton; + private _hasAnims; + private _hasCam; + constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward?: boolean); +} +export declare class ActionData { + id: string; + speed: number; + ds: number; + sound: Sound; + key: string; + dk: string; + name: string; + ag: AnimationGroup; + loop: boolean; + rate: number; + exist: boolean; + constructor(id?: string, speed?: number, key?: string); + reset(): void; +} +export declare class ActionMap { + walk: ActionData; + walkBack: ActionData; + walkBackFast: ActionData; + idle: ActionData; + idleJump: ActionData; + run: ActionData; + runJump: ActionData; + fall: ActionData; + turnLeft: ActionData; + turnLeftFast: ActionData; + turnRight: ActionData; + turnRightFast: ActionData; + strafeLeft: ActionData; + strafeLeftFast: ActionData; + strafeRight: ActionData; + strafeRightFast: ActionData; + slideBack: ActionData; + reset(): void; +} +export declare class CCSettings { + faceForward: boolean; + gravity: number; + minSlopeLimit: number; + maxSlopeLimit: number; + stepOffset: number; + cameraElastic: boolean; + elasticSteps: number; + makeInvisble: boolean; + cameraTarget: Vector3; + noFirstPerson: boolean; + topDown: boolean; + turningOff: boolean; + keyboard: boolean; + sound: Sound; +} diff --git a/dist-old/CharacterController.js b/dist-old/CharacterController.js new file mode 100644 index 0000000..c37b0ef --- /dev/null +++ b/dist-old/CharacterController.js @@ -0,0 +1,2 @@ +!function(t,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i(require("babylonjs"));else if("function"==typeof define&&define.amd)define(["babylonjs"],i);else{var s="object"==typeof exports?i(require("babylonjs")):i(t.BABYLON);for(var h in s)("object"==typeof exports?exports:t)[h]=s[h]}}(self,(t=>(()=>{"use strict";var i={247:i=>{i.exports=t}},s={};function h(t){var n=s[t];if(void 0!==n)return n.exports;var e=s[t]={exports:{}};return i[t](e,e.exports,h),e.exports}h.n=t=>{var i=t&&t.t?()=>t.default:()=>t;return h.d(i,{a:i}),i},h.d=(t,i)=>{for(var s in i)h.o(i,s)&&!h.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},h.o=(t,i)=>Object.prototype.hasOwnProperty.call(t,i),h.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"t",{value:!0})};var n={};return(()=>{h.r(n),h.d(n,{ActionData:()=>e,ActionMap:()=>r,CCSettings:()=>u,CharacterController:()=>i});var t=h(247),i=function(){function i(i,h,n,e,u){void 0===u&&(u=!1);var f=this;this.i=null,this.h=null,this.u=9.8,this.l=30,this.v=45,this.k=Math.PI*this.l/180,this.M=Math.PI*this.v/180,this.p=.25,this.j=0,this.O=t.Vector3.Zero(),this.g=new r,this.C=!0,this.F=t.Vector3.Zero(),this.A=!1,this.L=0,this.R=0,this.S=!1,this.q=-1,this.B=!1,this.I=!1,this.J=null,this._=t.Vector3.Zero(),this.D=!1,this.T=0,this.G=50,this.H=0,this.K=!1,this.N=!1,this.P=!1,this.U=700,this.V=null,this.W=0,this.X=0,this.Y=0,this.Z=1,this.$=!1,this.tt=!1,this.it=0,this.st=0,this.ht=10,this.nt=!0,this.et=!1,this.rt=new Map,this.ut=new t.Ray(t.Vector3.Zero(),t.Vector3.One(),1),this.ft=t.Vector3.Zero(),this.ot=.5,this.ct=new Array,this.lt=!1,this.vt=50,this.bt=!1,this.wt=!0,this.kt=!1,this.Mt=!1,this.dt=!0,this.jt=h,null==this.jt&&(this.dt=!1,this.setMode(1)),this.yt=n,this.setAvatar(i,u)||console.error("unable to set avatar");null!=e&&this.setActionMap(e),this.kt||null==this.h||this.Ot(this.h),this.kt,this.dt&&(this.nt=this.jt.checkCollisions),this.gt=new s,this.xt=function(){f.Ct()},this.Ft=function(t){f.At(t)},this.Lt=function(t){f.Rt(t)}}return i.prototype.getScene=function(){return this.yt},i.prototype.setSlopeLimit=function(t,i){this.l=t,this.v=i,this.k=Math.PI*this.l/180,this.M=Math.PI*this.v/180},i.prototype.setStepOffset=function(t){this.p=t},i.prototype.setWalkSpeed=function(t){this.g.walk.speed=t},i.prototype.setRunSpeed=function(t){this.g.run.speed=t},i.prototype.setBackSpeed=function(t){this.g.walkBack.speed=t},i.prototype.setBackFastSpeed=function(t){this.g.walkBackFast.speed=t},i.prototype.setJumpSpeed=function(t){this.g.idleJump.speed=t,this.g.runJump.speed=t},i.prototype.setLeftSpeed=function(t){this.g.strafeLeft.speed=t},i.prototype.setLeftFastSpeed=function(t){this.g.strafeLeftFast.speed=t},i.prototype.setRightSpeed=function(t){this.g.strafeRight.speed=t},i.prototype.setRightFastSpeed=function(t){this.g.strafeLeftFast.speed=t},i.prototype.setTurnSpeed=function(t){this.g.turnLeft.speed=t*Math.PI/180,this.g.turnRight.speed=t*Math.PI/180},i.prototype.setTurnFastSpeed=function(t){this.g.turnLeftFast.speed=t*Math.PI/180,this.g.turnRightFast.speed=t*Math.PI/180},i.prototype.setGravity=function(t){this.u=t},i.prototype.setAnimationGroups=function(t){null!=this.J&&this.J.exist&&this.J.ag.stop(),this.kt=!0,this.setActionMap(t)},i.prototype.setAnimationRanges=function(t){this.kt=!1,this.setActionMap(t)},i.prototype.setActionMap=function(i){for(var s,h=!1,n=0,r=Object.keys(this.g);n-1)return!0}return!1},i.prototype.Gt=function(t){return null==t.parent?t:this.Gt(t.parent)},i.prototype.start=function(){this.B||(this.B=!0,this.gt.reset(),this.Y=0,this.it=.001,this.D=!1,this.Ht(),this.wt&&this.Kt(),this.yt.registerBeforeRender(this.xt))},i.prototype.stop=function(){this.B&&(this.B=!1,this.yt.unregisterBeforeRender(this.xt),this.Nt(),this.J=null)},i.prototype.pauseAnim=function(){this.I=!0,null!=this.J&&this.J.exist&&(this.kt?this.J.ag.stop():this.yt.stopAnimation(this.h),null!=this.J.sound&&this.J.sound.stop(),clearInterval(this.V),this.yt.unregisterBeforeRender(this.xt))},i.prototype.resumeAnim=function(){this.I=!1,this.J=null,this.yt.registerBeforeRender(this.xt)},i.prototype.Pt=function(){return this.dt?t.Vector3.Dot(this.i.forward,this.i.position.subtract(this.jt.position))<0?1:-1:1},i.prototype.Ct=function(){this._.copyFrom(this.i.position);var t=null,i=this.yt.getEngine().getDeltaTime()/1e3;if(this.gt.Qt&&!this.K?(this.D=!1,this.it=0,t=this.Ut(i)):this.anyMovement()||this.K?(this.D=!1,this.it=0,t=this.Vt(i)):this.K||(t=this.Wt(i)),!this.I&&this.Mt&&null!=t&&this.J!==t){if(t.exist){var s=void 0,h=30;if(this.kt)null!=this.J&&this.J.exist&&this.J.ag.stop(),t.ag.start(t.loop,t.rate),h=t.ag.targetedAnimations[0].animation.framePerSecond,s=t.ag.to-t.ag.from;else h=this.h.beginAnimation(t.name,t.loop,t.rate).getAnimations()[0].animation.framePerSecond,s=this.h.getAnimationRange(t.name).to-this.h.getAnimationRange(t.name).from;null!=this.J&&null!=this.J.sound&&this.J.sound.stop(),clearInterval(this.V),null!=t.sound&&(t.sound.play(),this.V=setInterval((function(){t.sound.play()}),1e3*s/(h*Math.abs(t.rate)*2)))}this.J=t}this.Ht()},i.prototype.Ut=function(i){var s=null;s=this.g.runJump,0===this.X&&(this.W=this.i.position.y),this.X=this.X+i;var h,n=0,e=0;if(this.P||this.N?(this.P?n=this.g.run.speed*i:this.N&&(n=this.g.walk.speed*i),(h=this.Xt.clone()).y=0,(h=h.normalize()).scaleToRef(n,h),e=this.Yt(this.g.runJump.speed,i),h.y=e):(e=this.Yt(this.g.idleJump.speed,i),h=new t.Vector3(0,e,0),s=this.g.idleJump),this.i.moveWithCollisions(h),e<0)if(this.i.position.y>this._.y||this.i.position.y===this._.y&&h.length()>.001)this.Zt();else if(this.i.position.y0?this.g.strafeLeftFast:this.g.strafeRightFast):h=-this.zt*n>0?this.g.strafeLeft:this.g.strafeRight,this.Xt=this.i.calcMovePOV(n*e,-this.T,0),s=!0;break;case this.gt.ei:n=-this.q*this.Pt(),e=this.g.strafeRight.speed*t,this.gt.ni?(e=this.g.strafeRightFast.speed*t,h=-this.zt*n>0?this.g.strafeLeftFast:this.g.strafeRightFast):h=-this.zt*n>0?this.g.strafeLeft:this.g.strafeRight,this.Xt=this.i.calcMovePOV(n*e,-this.T,0),s=!0;break;case this.gt.ri||this.tt&&0==this.L:this.gt.ni?(this.P=!0,e=this.g.run.speed*t,h=this.g.run):(this.N=!0,e=this.g.walk.speed*t,h=this.g.walk),this.Xt=this.i.calcMovePOV(0,-this.T,this.zt*e),s=!0;break;case this.gt.ui:e=this.g.walkBack.speed*t,this.gt.ni?(e=this.g.walkBackFast.speed*t,h=this.g.walkBackFast):h=this.g.walkBack,this.Xt=this.i.calcMovePOV(0,-this.T,-this.zt*e),s=!0}}if(s&&this.Xt.length()>.001)if(this.i.moveWithCollisions(this.Xt),this.i.position.y>this._.y){var r=this.i.position.subtract(this._),u=this.ti(r);u>=this.M?this.p>0?(0==this.j&&this.O.copyFrom(this._),this.j=this.j+(this.i.position.y-this._.y),this.j>this.p&&(this.j=0,this.i.position.copyFrom(this.O),this.fi())):(this.i.position.copyFrom(this._),this.fi()):(this.j=0,u>this.k?(this.H=0,this.K=!1):this.fi())}else if(this.i.position.ythis.G&&(h=this.g.fall)):this.ti(r)<=this.k?this.fi():(this.H=0,this.K=!1)}else this.fi();return h},i.prototype.ii=function(){if(this.dt&&1!=this.L){var t=this.dt?this.Tt-this.jt.alpha:0;if(this.tt)switch(!0){case this.gt.ri&&this.gt.ai:this.i.rotation.y=t+this.Dt*Math.PI/4;break;case this.gt.ri&&this.gt.oi:this.i.rotation.y=t-this.Dt*Math.PI/4;break;case this.gt.ui&&this.gt.ai:this.i.rotation.y=t+3*this.Dt*Math.PI/4;break;case this.gt.ui&&this.gt.oi:this.i.rotation.y=t-3*this.Dt*Math.PI/4;break;case this.gt.ri:this.i.rotation.y=t;break;case this.gt.ui:this.i.rotation.y=t+Math.PI;break;case this.gt.ai:this.i.rotation.y=t+this.Dt*Math.PI/2;break;case this.gt.oi:this.i.rotation.y=t-this.Dt*Math.PI/2}else this.dt&&(this.i.rotation.y=t)}},i.prototype.si=function(t,i,s){if((!this.tt||0!=this.L)&&!this.gt.hi&&!this.gt.ei&&(this.gt.oi||this.gt.ai)){var h=this.g.turnLeft.speed*s;this.gt.ni&&(h*=2);var n=void 0;1==this.L?(this.$||(this.Z=-this.zt*this.Pt(),this.S&&(this.Z=-this.Z),this.$=!0),n=this.Z,this.gt.oi?this.gt.ri||(this.gt.ui?n=-this.Z:t=this.Z>0?this.g.turnRight:this.g.turnLeft):this.gt.ri?n=-this.Z:this.gt.ui||(n=-this.Z,t=this.Z>0?this.g.turnLeft:this.g.turnRight)):(n=1,this.gt.oi?(this.gt.ui&&(n=-1),i||(t=this.g.turnLeft)):(this.gt.ri&&(n=-1),i||(n=-1,t=this.g.turnRight)),this.dt&&(this.jt.alpha=this.jt.alpha+this.Dt*h*n)),this.i.rotation.y=this.i.rotation.y+h*n}return t},i.prototype.fi=function(){this.Y=0,this.H=0,this.K=!1},i.prototype.Wt=function(i){if(this.D)return this.g.idle;this.N=!1,this.P=!1,this.Y=0;var s=this.g.idle;if(this.H=0,0===i)this.T=5;else{var h=this.it*this.u;this.T=h*i+this.u*i*i/2,this.it=this.it+i}if(this.T<.01)return s;var n=new t.Vector3(0,-this.T,0);if(this.i.moveWithCollisions(n),this.i.position.y>this._.y||this.i.position.y===this._.y)this.ci();else if(this.i.position.ythis.ht&&(this.D=!0,this.it=0)},i.prototype.li=function(){this.D=!1,this.st=0},i.prototype.Ht=function(){this.dt&&(0==this.j&&this.i.position.addToRef(this.F,this.jt.target),this.jt.radius>this.jt.lowerRadiusLimit&&(this.C||this.lt)&&this.vi(),this.jt.radius<=this.jt.lowerRadiusLimit?this.A||this.et||(this.bi(this.i),this.jt.checkCollisions=!1,this.R=this.L,this.L=0,this.et=!0):this.et&&(this.et=!1,this.L=this.R,this.wi(this.i),this.jt.checkCollisions=this.nt))},i.prototype.bi=function(i){var s=this;this.rt.set(i,i.visibility),i.visibility=0,i.getChildMeshes(!1,(function(i){return i instanceof t.Mesh&&(s.rt.set(i,i.visibility),i.visibility=0),!1}))},i.prototype.wi=function(i){var s=this;i.visibility=this.rt.get(i),i.getChildMeshes(!1,(function(i){return i instanceof t.Mesh&&(i.visibility=s.rt.get(i)),!1}))},i.prototype.vi=function(){var t=this;this.jt.position.subtractToRef(this.jt.target,this.ft),this.ut.origin=this.jt.target,this.ut.length=this.ft.length(),this.ut.direction=this.ft.normalize();var i=this.yt.multiPickWithRay(this.ut,(function(i){return i!=t.i}));if(this.lt)if(this.ki=this.ct,i.length>0){this.ct=new Array;for(var s=0,h=i;s0){if(!(1!=i.length||this.Mi(i[0].pickedMesh)||i[0].pickedMesh.checkCollisions&&this.jt.checkCollisions))return;for(var o=null,c=0;c0?h[0].skeleton:null},i.prototype.pi=function(t){return null==t.parent?t:this.pi(t.parent)},i.prototype.setAvatar=function(i,s){void 0===s&&(s=!1);var h=this.pi(i);return h instanceof t.Mesh?(this.i=h,this.h=this.di(i),this.kt=this.Et(i,this.yt.animationGroups,!0),this.g.reset(),this.kt||null==this.h||this.Ot(this.h),this.Jt(i),this.setFaceForward(s),!0):(console.error("Cannot move this mesh. The root node of the mesh provided is not a mesh"),!1)},i.prototype.getAvatar=function(){return this.i},i.prototype.setAvatarSkeleton=function(t){this.h=t,null!=this.h&&this.ji(t)?this.kt=!0:this.kt=!1,this.kt||null==this.h||this.Ot(this.h)},i.prototype.ji=function(t){var i=this;return t.animations.some((function(t){return i.yt.animationGroups.some((function(i){return i.children.some((function(i){return i.animation==t}))}))}))},i.prototype.getSkeleton=function(){return this.h},i}(),s=function(){function t(){this.ri=!1,this.ui=!1,this.ai=!1,this.oi=!1,this.ei=!1,this.hi=!1,this.Qt=!1,this.ni=!1,this.reset()}return t.prototype.reset=function(){this.ri=!1,this.ui=!1,this.ai=!1,this.oi=!1,this.ei=!1,this.hi=!1,this.Qt=!1,this.ni=!1},t}(),e=function(){function t(t,i,s){void 0===i&&(i=1),this.name="",this.loop=!0,this.rate=1,this.exist=!1,this.id=t,this.speed=i,this.ds=i,this.key=s,this.dk=s}return t.prototype.reset=function(){this.name="",this.speed=this.ds,this.key=this.dk,this.loop=!0,this.rate=1,this.sound=null,this.exist=!1},t}(),r=function(){function t(){this.walk=new e("walk",3,"w"),this.walkBack=new e("walkBack",1.5,"s"),this.walkBackFast=new e("walkBackFast",3,"na"),this.idle=new e("idle",0,"na"),this.idleJump=new e("idleJump",6," "),this.run=new e("run",6,"na"),this.runJump=new e("runJump",6,"na"),this.fall=new e("fall",0,"na"),this.turnLeft=new e("turnLeft",Math.PI/8,"a"),this.turnLeftFast=new e("turnLeftFast",Math.PI/4,"na"),this.turnRight=new e("turnRight",Math.PI/8,"d"),this.turnRightFast=new e("turnRightFast",Math.PI/4,"na"),this.strafeLeft=new e("strafeLeft",1.5,"q"),this.strafeLeftFast=new e("strafeLeftFast",3,"na"),this.strafeRight=new e("strafeRight",1.5,"e"),this.strafeRightFast=new e("strafeRightFast",3,"na"),this.slideBack=new e("slideBack",0,"na")}return t.prototype.reset=function(){for(var t=0,i=Object.keys(this);t {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__247__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\r\n Skeleton,\r\n ArcRotateCamera,\r\n Vector3,\r\n Mesh,\r\n Node,\r\n Scene,\r\n Ray,\r\n PickingInfo,\r\n AnimationGroup,\r\n TransformNode,\r\n TargetedAnimation,\r\n Matrix,\r\n DeepImmutable,\r\n AbstractMesh,\r\n PlaySoundAction,\r\n InstancedMesh,\r\n Sound,\r\n AnimationRange,\r\n Animatable,\r\n AnimationEvent,\r\n int\r\n} from \"babylonjs\";\r\n\r\n\r\nexport class CharacterController {\r\n\r\n private _avatar: Mesh = null;\r\n private _skeleton: Skeleton = null;\r\n private _camera: ArcRotateCamera;\r\n private _scene: Scene;\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n\r\n private _gravity: number = 9.8;\r\n //slopeLimit in degrees\r\n private _minSlopeLimit: number = 30;\r\n private _maxSlopeLimit: number = 45;\r\n //slopeLimit in radians\r\n private _sl1: number = Math.PI * this._minSlopeLimit / 180;\r\n private _sl2: number = Math.PI * this._maxSlopeLimit / 180;\r\n\r\n //The av will step up a stair only if it is closer to the ground than the indicated value.\r\n private _stepOffset: number = 0.25;\r\n //toal amount by which the av has moved up\r\n private _vMoveTot: number = 0;\r\n //position of av when it started moving up\r\n private _vMovStartPos: Vector3 = Vector3.Zero();\r\n\r\n\r\n private _actionMap: ActionMap = new ActionMap();\r\n\r\n private _cameraElastic: boolean = true;\r\n private _cameraTarget: Vector3 = Vector3.Zero();\r\n //should we go into first person view when camera is near avatar (radius is lowerradius limit)\r\n private _noFirstPerson: boolean = false;\r\n\r\n\r\n\r\n public setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number) {\r\n this._minSlopeLimit = minSlopeLimit;\r\n this._maxSlopeLimit = maxSlopeLimit;\r\n\r\n this._sl1 = Math.PI * this._minSlopeLimit / 180;\r\n this._sl2 = Math.PI * this._maxSlopeLimit / 180;\r\n }\r\n\r\n /**\r\n * The av will step up a stair only if it is closer to the ground than the indicated value.\r\n * Default value is 0.25 m\r\n */\r\n public setStepOffset(stepOffset: number) {\r\n this._stepOffset = stepOffset;\r\n }\r\n\r\n public setWalkSpeed(n: number) {\r\n this._actionMap.walk.speed = n;\r\n }\r\n public setRunSpeed(n: number) {\r\n this._actionMap.run.speed = n;\r\n }\r\n public setBackSpeed(n: number) {\r\n this._actionMap.walkBack.speed = n;\r\n }\r\n public setBackFastSpeed(n: number) {\r\n this._actionMap.walkBackFast.speed = n;\r\n }\r\n public setJumpSpeed(n: number) {\r\n this._actionMap.idleJump.speed = n;\r\n this._actionMap.runJump.speed = n;\r\n }\r\n public setLeftSpeed(n: number) {\r\n this._actionMap.strafeLeft.speed = n;\r\n }\r\n public setLeftFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n public setRightSpeed(n: number) {\r\n this._actionMap.strafeRight.speed = n;\r\n }\r\n public setRightFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n // get turnSpeed in degrees per second.\r\n // store in radians per second\r\n public setTurnSpeed(n: number) {\r\n this._actionMap.turnLeft.speed = n * Math.PI / 180;\r\n this._actionMap.turnRight.speed = n * Math.PI / 180;\r\n }\r\n public setTurnFastSpeed(n: number) {\r\n this._actionMap.turnLeftFast.speed = n * Math.PI / 180;\r\n this._actionMap.turnRightFast.speed = n * Math.PI / 180;\r\n }\r\n public setGravity(n: number) {\r\n this._gravity = n;\r\n }\r\n\r\n /**\r\n * Use this to provide animationGroups to the character controller.\r\n * Provide the AnimationGroups using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animationGroup.\r\n * Example:\r\n * let myWalkAnimationGroup:AnimationGroup = ...;\r\n * let agMap:{} = {\r\n * \"walk\":myWalkAnimationGroup,\r\n * \"run\" : {\"ag\":myRunAnimationGroup,\"rate\":1},\r\n * \"idle\" : {\"ag\":myIdleAnimationGroup,\"loop\":true,\"rate\":1},\r\n * ....\r\n * ....\r\n * }\r\n * \r\n * @param agMap a map of character controller animation name to animationGroup\r\n */\r\n public setAnimationGroups(agMap: {}) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n this._isAG = true;\r\n this.setActionMap(agMap);\r\n }\r\n\r\n /**\r\n * Use this to provide AnimationRanges to the character controller.\r\n * Provide the AnimationRanges using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animation range name or an object with animation range data.\r\n * example:\r\n * let arMap = {\r\n * \"walk\":\"myWalk\",\r\n * \"run\" : {\"name\":\"myRun\",\"rate\":1},\r\n * \"idle\" : {\"name\":\"myIdle\",\"loop\":true,\"rate\":1},\r\n * ....\r\n * }\r\n * \r\n * @param arMap a map of character controller animation name to animationRange data\r\n */\r\n\r\n public setAnimationRanges(arMap: {}) {\r\n this._isAG = false;\r\n this.setActionMap(arMap);\r\n }\r\n\r\n /**\r\n * updates action data in the cc actionMap\r\n * with action data from the provided/input actionMap \r\n * \r\n * \r\n * return \"ar\" or \"ag\" depending on if the data provided\r\n * was animation range or animation group data respt.\r\n * \r\n * TODO should validate provided data.\r\n * In other words if animation range provided make sure\r\n * the range exist in the skeleton\r\n * or if animation group provided make sure the animation group\r\n * can be played on this avataor\r\n * \r\n * @param inActMap \r\n * @returns \r\n */\r\n public setActionMap(inActMap: ActionMap): string {\r\n let agMap: boolean = false;\r\n let inActData: ActionData;\r\n\r\n\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.exist = false;\r\n\r\n inActData = inActMap[ccActData.id];\r\n //in previous version of cc the key value was AnimationGroup rather than ActionData\r\n //lets accomodate that for backward compatibility\r\n if (inActData != null) {\r\n if (inActData instanceof AnimationGroup) {\r\n ccActData.ag = inActData;\r\n ccActData.name = ccActData.ag.name;\r\n ccActData.exist = true;\r\n agMap = true;\r\n this._hasAnims = true;\r\n } else if (inActData.exist) {\r\n this._hasAnims = true;\r\n ccActData.exist = true;\r\n if (inActData instanceof Object) {\r\n if (inActData.ag) {\r\n ccActData.ag = inActData.ag;\r\n agMap = true;\r\n }\r\n if (inActData.name) {\r\n ccActData.name = inActData.name;\r\n }\r\n if (inActData.loop != null) ccActData.loop = inActData.loop;\r\n if (inActData.rate) ccActData.rate = inActData.rate;\r\n if (inActData.speed) ccActData.speed = inActData.speed;\r\n // if (actDataI.key) actDataO.key = actDataI.key;\r\n if (inActData.sound) ccActData.sound = inActData.sound;\r\n } else {\r\n ccActData.name = inActData;\r\n }\r\n }\r\n }\r\n }\r\n this._checkFastAnims();\r\n //force to play new anims\r\n this._prevActData = null;\r\n if (agMap) return \"ag\"; else return \"ar\";\r\n }\r\n\r\n public getActionMap(): ActionMap {\r\n let map: ActionMap = new ActionMap();\r\n\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let actDataI = this._actionMap[key];\r\n\r\n if (!(actDataI instanceof ActionData)) continue;\r\n if (!actDataI.exist) continue;\r\n\r\n let actDataO: ActionData = map[actDataI.id];\r\n actDataO.ag = actDataI.ag;\r\n actDataO.name = actDataI.name;\r\n actDataO.loop = actDataI.loop;\r\n actDataO.rate = actDataI.rate;\r\n actDataO.speed = actDataI.speed;\r\n actDataO.key = actDataI.key;\r\n actDataO.sound = actDataI.sound;\r\n actDataO.exist = actDataI.exist;\r\n }\r\n\r\n return map;\r\n }\r\n\r\n public getSettings(): CCSettings {\r\n let ccs: CCSettings = new CCSettings();\r\n ccs.faceForward = this.isFaceForward();\r\n ccs.topDown = this.getMode() == 1 ? true : false;\r\n ccs.turningOff = this.isTurningOff();\r\n ccs.cameraTarget = this._cameraTarget.clone();\r\n ccs.cameraElastic = this._cameraElastic;\r\n ccs.elasticSteps = this._elasticSteps;\r\n ccs.makeInvisble = this._makeInvisible;\r\n ccs.gravity = this._gravity;\r\n ccs.keyboard = this._ekb;\r\n ccs.maxSlopeLimit = this._maxSlopeLimit;\r\n ccs.minSlopeLimit = this._minSlopeLimit;\r\n ccs.noFirstPerson = this._noFirstPerson;\r\n ccs.stepOffset = this._stepOffset;\r\n ccs.sound = this._stepSound;\r\n\r\n return ccs;\r\n }\r\n\r\n public setSettings(ccs: CCSettings) {\r\n this.setFaceForward(ccs.faceForward);\r\n this.setMode(ccs.topDown ? 1 : 0);\r\n this.setTurningOff(ccs.turningOff);\r\n this.setCameraTarget(ccs.cameraTarget);\r\n this.setCameraElasticity(ccs.cameraElastic);\r\n this.setElasticiSteps(ccs.elasticSteps);\r\n this.makeObstructionInvisible(ccs.makeInvisble);\r\n this.setGravity(ccs.gravity);\r\n this.enableKeyBoard(ccs.keyboard);\r\n this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit);\r\n this.setNoFirstPerson(ccs.noFirstPerson);\r\n this.setStepOffset(ccs.stepOffset);\r\n this.setSound(ccs.sound);\r\n\r\n }\r\n\r\n private _setAnim(anim: ActionData, animName?: string | AnimationGroup, rate?: number, loop?: boolean) {\r\n\r\n //animation range need skeleton\r\n if (!this._isAG && this._skeleton == null) return;\r\n\r\n if (animName != null) {\r\n if (this._isAG) {\r\n if (!(animName instanceof AnimationGroup)) return;\r\n anim.ag = animName;\r\n anim.exist = true;\r\n } else {\r\n if (this._skeleton.getAnimationRange(anim.name) != null) {\r\n anim.name = animName;\r\n anim.exist = true;\r\n } else {\r\n anim.exist = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (loop != null) anim.loop = loop;\r\n if (rate != null) anim.rate = rate;\r\n }\r\n\r\n public enableBlending(n: number) {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let act = this._actionMap[key];\r\n if (!(act instanceof ActionData)) continue;\r\n if (act.exist) {\r\n let ar: AnimationGroup = act.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = true;\r\n ta.animation.blendingSpeed = n;\r\n }\r\n }\r\n }\r\n } else {\r\n if (this._skeleton !== null)\r\n this._skeleton.enableBlending(n);\r\n }\r\n }\r\n\r\n public disableBlending() {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (anim.exist) {\r\n let ar: AnimationGroup = anim.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //setters for animations\r\n public setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walk, rangeName, rate, loop);\r\n }\r\n public setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.run, rangeName, rate, loop);\r\n }\r\n public setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBack, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack);\r\n }\r\n public setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop);\r\n }\r\n public setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.slideBack, rangeName, rate, loop);\r\n }\r\n public setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idle, rangeName, rate, loop);\r\n }\r\n public setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n }\r\n public setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop);\r\n }\r\n public setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n }\r\n public setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop);\r\n }\r\n public setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n }\r\n public setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop);\r\n }\r\n public setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n public setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop);\r\n }\r\n public setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idleJump, rangeName, rate, loop);\r\n }\r\n public setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.runJump, rangeName, rate, loop);\r\n }\r\n public setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.fall, rangeName, rate, loop);\r\n }\r\n\r\n\r\n _stepSound: Sound;\r\n // setters for sound\r\n public setSound(sound: Sound) {\r\n if (sound == null) return;\r\n this._stepSound = sound;\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n sound.loop = false;\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.sound = sound;\r\n ccActData.sound.attachToMesh(this._avatar);\r\n }\r\n this._actionMap.idle.sound = null;\r\n this._actionMap.fall.sound = null;\r\n this._actionMap.slideBack.sound = null;\r\n }\r\n\r\n\r\n // setters for keys\r\n public setWalkKey(key: string) {\r\n this._actionMap.walk.key = key.toLowerCase();\r\n }\r\n public setWalkBackKey(key: string) {\r\n this._actionMap.walkBack.key = key.toLowerCase();\r\n }\r\n public setTurnLeftKey(key: string) {\r\n this._actionMap.turnLeft.key = key.toLowerCase();\r\n }\r\n public setTurnRightKey(key: string) {\r\n this._actionMap.turnRight.key = key.toLowerCase();\r\n }\r\n public setStrafeLeftKey(key: string) {\r\n this._actionMap.strafeLeft.key = key.toLowerCase();\r\n }\r\n public setStrafeRightKey(key: string) {\r\n this._actionMap.strafeRight.key = key.toLowerCase();\r\n }\r\n public setJumpKey(key: string) {\r\n this._actionMap.idleJump.key = key.toLowerCase();\r\n }\r\n\r\n public setCameraElasticity(b: boolean) {\r\n this._cameraElastic = b;\r\n }\r\n\r\n public setElasticiSteps(n: number) {\r\n this._elasticSteps = n;\r\n }\r\n\r\n public makeObstructionInvisible(b: boolean) {\r\n this._makeInvisible = b;\r\n }\r\n public setCameraTarget(v: Vector3) {\r\n this._cameraTarget.copyFrom(v);\r\n }\r\n\r\n\r\n /**\r\n * user should call this whenever the user changes the camera checkCollision \r\n * property\r\n * \r\n */\r\n public cameraCollisionChanged() {\r\n this._savedCameraCollision = this._camera.checkCollisions;\r\n }\r\n public setNoFirstPerson(b: boolean) {\r\n this._noFirstPerson = b;\r\n }\r\n\r\n /**\r\n * if av has the required anim (walk, run etc) then \r\n * mark that anim as existing\r\n * \r\n * @param skel \r\n */\r\n\r\n private _checkAnimRanges(skel: Skeleton) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (skel != null) {\r\n if (skel.getAnimationRange(anim.id) != null) {\r\n anim.name = anim.id;\r\n anim.exist = true;\r\n this._hasAnims = true;\r\n }\r\n } else {\r\n anim.exist = false;\r\n }\r\n }\r\n this._checkFastAnims();\r\n }\r\n\r\n /**\r\n * if fast anims do not exist then use their slow counterpart as them but double the rate at which they play\r\n */\r\n private _checkFastAnims() {\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack)\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n\r\n private _copySlowAnims(f: ActionData, s: ActionData) {\r\n if (f.exist) return;\r\n if (!s.exist) return;\r\n f.exist = true;\r\n f.ag = s.ag;\r\n f.name = s.name;\r\n f.rate = s.rate * 2;\r\n }\r\n\r\n /**\r\n * Use this to make the character controller suitable for a isometeric/top down games or fps/third person game.\r\n * 1 In isometric/top down games the camera direction has no bearing on avatar movement.\r\n * 0 In fps/third person game rotating the camera around the avatar , rotates the avatar too.\r\n * \r\n * cannot switch mode to 0 if no camera avaiable.\r\n */\r\n private _mode = 0;\r\n private _saveMode = 0;\r\n public setMode(n: number) {\r\n //cannot switch mode to 0 if no camera avaiable.\r\n if (this._hasCam) {\r\n this._mode = n;\r\n this._saveMode = n;\r\n } else {\r\n this._mode = 1;\r\n this._saveMode = 1;\r\n }\r\n }\r\n public getMode() {\r\n return this._mode;\r\n }\r\n /**\r\n * Use this to set turning off.\r\n * When turining is off \r\n * a) turn left or turn right keys result in avatar facing and moving left or right with respect to camera.\r\n * b) walkback/runback key results in avatar facing back and walking/running towards camera.\r\n * \r\n * This setting has no effect when mode is 1.\r\n * \r\n * @param b \r\n */\r\n public setTurningOff(b: boolean) {\r\n this._noRot = b;\r\n }\r\n public isTurningOff() {\r\n return this._noRot;\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * BABYLONJS GLB models are RHS and exhibit this behavior\r\n * \r\n */\r\n private _isLHS_RHS = false;\r\n private _signLHS_RHS = -1;\r\n private _setRHS(mesh: TransformNode) {\r\n const meshMatrix: Matrix = mesh.getWorldMatrix();\r\n const _localX = Vector3.FromArray(meshMatrix.m, 0);\r\n const _localY = Vector3.FromArray(meshMatrix.m, 4);\r\n const _localZ = Vector3.FromArray(meshMatrix.m, 8);\r\n const actualZ = Vector3.Cross(_localX, _localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, _localZ) < 0) {\r\n this._isLHS_RHS = true;\r\n this._signLHS_RHS = 1;\r\n }\r\n else {\r\n this._isLHS_RHS = false;\r\n this._signLHS_RHS = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Use setFaceForward(true|false) to indicate that the avatar's face points forward (true) or backward (false).\r\n * The avatar's face points forward if its face is looking in positive local Z axis direction\r\n */\r\n private _ffSign: number;\r\n private _rhsSign: number;\r\n private _ff: boolean;\r\n //in mode 0, av2cam is used to align avatar with camera , with camera always facing avatar's back\r\n //note:camera alpha is measured anti-clockwise , avatar rotation is measured clockwise \r\n private _av2cam;\r\n public setFaceForward(b: boolean) {\r\n this._ff = b;\r\n\r\n this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1;\r\n\r\n if (!this._hasCam) {\r\n this._av2cam = 0;\r\n this._ffSign = 1;\r\n return;\r\n }\r\n\r\n if (this._isLHS_RHS) {\r\n this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2;\r\n this._ffSign = b ? 1 : -1;\r\n } else {\r\n this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2;\r\n this._ffSign = b ? -1 : 1;\r\n }\r\n\r\n }\r\n\r\n public isFaceForward() {\r\n return this._ff;\r\n }\r\n\r\n private checkAGs(agMap: {}) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (agMap[anim.name] != null) {\r\n anim.ag = agMap[anim.name];\r\n anim.exist = true;\r\n }\r\n }\r\n }\r\n\r\n // check if any of the mesh on the node tree is refrenced by any animation group\r\n private _containsAG(node: Node, ags: AnimationGroup[], fromRoot: boolean) {\r\n let r: Node;\r\n let ns: Node[];\r\n\r\n if (fromRoot) {\r\n r = this._getRoot(node);\r\n ns = r.getChildren((n) => { return (n instanceof TransformNode) }, false);\r\n } else {\r\n r = node;\r\n ns = [r];\r\n }\r\n\r\n for (let ag of ags) {\r\n let tas: TargetedAnimation[] = ag.targetedAnimations;\r\n for (let ta of tas) {\r\n if (ns.indexOf(ta.target) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //get the root of Node\r\n private _getRoot(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._getRoot(tn.parent);\r\n }\r\n\r\n private _started: boolean = false;\r\n public start() {\r\n if (this._started) return;\r\n this._started = true;\r\n this._act.reset();\r\n this._movFallTime = 0;\r\n //first time we enter render loop, delta time is zero\r\n this._idleFallTime = 0.001;\r\n this._grounded = false;\r\n this._updateTargetValue();\r\n if (this._ekb) this._addkeylistener();\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public stop() {\r\n if (!this._started) return;\r\n this._started = false;\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this._removekeylistener();\r\n this._prevActData = null;\r\n }\r\n\r\n /**\r\n * use pauseAnim to stop the charactere controller from playing\r\n * any animation on the character\r\n * use this when you want to play your animation instead\r\n * see also resumeAnim()\r\n */\r\n private _stopAnim: boolean = false;\r\n public pauseAnim() {\r\n this._stopAnim = true;\r\n\r\n if (this._prevActData != null && this._prevActData.exist) {\r\n //stop current animation\r\n if (this._isAG) {\r\n this._prevActData.ag.stop();\r\n } else {\r\n //this._scene.stopAnimation(this._skeleton, this._prevActData.name);\r\n this._scene.stopAnimation(this._skeleton);\r\n //this._scene.stopAllAnimations();\r\n }\r\n //stop current sound\r\n if (this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n }\r\n }\r\n\r\n /**\r\n * use resumeAnim to resume the character controller playing\r\n * animations on the character.\r\n * see also pauseAnim()\r\n */\r\n public resumeAnim() {\r\n this._stopAnim = false;\r\n this._prevActData = null;\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n private _prevActData: ActionData = null;\r\n private _avStartPos: Vector3 = Vector3.Zero();\r\n private _grounded: boolean = false;\r\n //distance by which AV would move down if in freefall\r\n private _freeFallDist: number = 0;\r\n\r\n //how many minimum contiguos frames should the AV have been in free fall\r\n //before we assume AV is in big freefall.\r\n //we will use this to remove animation flicker during move down a slope (fall, move, fall move etc)\r\n //TODO: base this on slope - large slope large count\r\n private _fallFrameCountMin: number = 50;\r\n private _fallFrameCount: number = 0;\r\n\r\n private _inFreeFall: boolean = false;\r\n private _wasWalking: boolean = false;\r\n private _wasRunning: boolean = false;\r\n private _moveVector: Vector3;\r\n\r\n //used only in mode 1\r\n //value 1 or -1 , -1 if avatar is facing camera\r\n //private _notFacingCamera = 1;\r\n\r\n private _isAvFacingCamera(): number {\r\n if (!this._hasCam) return 1;\r\n if (Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) return 1\r\n else return -1;\r\n }\r\n\r\n private _moveAVandCamera() {\r\n this._avStartPos.copyFrom(this._avatar.position);\r\n let actData: ActionData = null;\r\n const dt: number = this._scene.getEngine().getDeltaTime() / 1000;\r\n\r\n if (this._act._jump && !this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doJump(dt);\r\n } else if (this.anyMovement() || this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doMove(dt);\r\n } else if (!this._inFreeFall) {\r\n actData = this._doIdle(dt);\r\n }\r\n if (!this._stopAnim && this._hasAnims && actData != null) {\r\n if (this._prevActData !== actData) {\r\n if (actData.exist) {\r\n\r\n //animation frame counts\r\n let c: number;\r\n let fps: number = 30;\r\n\r\n if (this._isAG) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n actData.ag.start(actData.loop, actData.rate);\r\n fps = actData.ag.targetedAnimations[0].animation.framePerSecond;\r\n c = (actData.ag.to - actData.ag.from);\r\n } else {\r\n let a: Animatable = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate);\r\n fps = a.getAnimations()[0].animation.framePerSecond;\r\n c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from;\r\n }\r\n\r\n //SOUND\r\n //TODO do sound as animationevent.\r\n if (this._prevActData != null && this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n if (actData.sound != null) {\r\n actData.sound.play();\r\n //play sound twice during the animation\r\n this._sndId = setInterval(() => { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2));\r\n }\r\n }\r\n this._prevActData = actData;\r\n }\r\n }\r\n this._updateTargetValue();\r\n return;\r\n }\r\n\r\n private _soundLoopTime = 700;\r\n private _sndId = null;\r\n\r\n //verical position of AV when it is about to start a jump\r\n private _jumpStartPosY: number = 0;\r\n //for how long the AV has been in the jump\r\n private _jumpTime: number = 0;\r\n private _doJump(dt: number): ActionData {\r\n\r\n let actData: ActionData = null;\r\n actData = this._actionMap.runJump;\r\n if (this._jumpTime === 0) {\r\n this._jumpStartPosY = this._avatar.position.y;\r\n }\r\n\r\n this._jumpTime = this._jumpTime + dt;\r\n\r\n let forwardDist: number = 0;\r\n let jumpDist: number = 0;\r\n let disp: Vector3;\r\n\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n if (this._wasRunning || this._wasWalking) {\r\n if (this._wasRunning) {\r\n forwardDist = this._actionMap.run.speed * dt;\r\n } else if (this._wasWalking) {\r\n forwardDist = this._actionMap.walk.speed * dt;\r\n }\r\n //find out in which horizontal direction the AV was moving when it started the jump\r\n disp = this._moveVector.clone();\r\n disp.y = 0;\r\n disp = disp.normalize();\r\n disp.scaleToRef(forwardDist, disp);\r\n jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt);\r\n disp.y = jumpDist;\r\n } else {\r\n jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt);\r\n disp = new Vector3(0, jumpDist, 0);\r\n actData = this._actionMap.idleJump;\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y/2;\r\n }\r\n //moveWithCollision only seems to happen if length of displacment is atleast 0.001\r\n this._avatar.moveWithCollisions(disp);\r\n if (jumpDist < 0) {\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y;\r\n //check if going up a slope or back on flat ground \r\n if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) {\r\n this._endJump();\r\n } else if (this._avatar.position.y < this._jumpStartPosY) {\r\n //the avatar is below the point from where it started the jump\r\n //so it is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than acceptable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endJump();\r\n }\r\n } else {\r\n actData = this._actionMap.fall;\r\n }\r\n }\r\n }\r\n return actData;\r\n }\r\n\r\n private _calcJumpDist(speed: number, dt: number): number {\r\n //up velocity at the begining of the lastt frame (v=u+at)\r\n let js: number = speed - this._gravity * this._jumpTime;\r\n //distance travelled up since last frame to this frame (s=ut+1/2*at^2)\r\n let jumpDist: number = js * dt - 0.5 * this._gravity * dt * dt;\r\n return jumpDist;\r\n }\r\n\r\n /**\r\n * does cleanup at the end of a jump\r\n */\r\n private _endJump() {\r\n this._act._jump = false;\r\n this._jumpTime = 0;\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n }\r\n\r\n /**\r\n * checks if two vectors v1 and v2 are equal within a precision of p\r\n */\r\n private _areVectorsEqual(v1: Vector3, v2: Vector3, p: number) {\r\n return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p));\r\n }\r\n\r\n /*\r\n * returns the slope (in radians) of a vector in the vertical plane\r\n */\r\n private _verticalSlope(v: Vector3): number {\r\n return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z)));\r\n }\r\n\r\n //for how long has the av been falling while moving\r\n private _movFallTime: number = 0;\r\n private _sign = 1;\r\n private _isTurning = false;\r\n private _noRot = false;\r\n private _doMove(dt: number): ActionData {\r\n\r\n //initial down velocity\r\n const u: number = this._movFallTime * this._gravity\r\n //calculate the distance by which av should fall down since last frame\r\n //assuming it is in freefall\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n\r\n this._movFallTime = this._movFallTime + dt;\r\n\r\n let moving: boolean = false;\r\n let actdata: ActionData = null;\r\n\r\n if (this._inFreeFall) {\r\n this._moveVector.y = -this._freeFallDist;\r\n moving = true;\r\n }\r\n\r\n\r\n //rotate avatar with respect to camera direction. \r\n this._rotateAV2C();\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n actdata = this._rotateAVnC(actdata, moving, dt);\r\n\r\n //now that avatar is rotated properly, construct the vector to move the avatar \r\n //donot move the avatar if avatar is in freefall\r\n\r\n if (!this._inFreeFall) {\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n\r\n let sign: number;\r\n let horizDist: number = 0;\r\n switch (true) {\r\n case (this._act._stepLeft):\r\n sign = this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeLeftFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._stepRight):\r\n sign = -this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeRight.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeRightFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._walk || (this._noRot && this._mode == 0)):\r\n if (this._act._speedMod) {\r\n this._wasRunning = true;\r\n horizDist = this._actionMap.run.speed * dt;\r\n actdata = this._actionMap.run;\r\n } else {\r\n this._wasWalking = true;\r\n horizDist = this._actionMap.walk.speed * dt;\r\n actdata = this._actionMap.walk;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n case (this._act._walkback):\r\n horizDist = this._actionMap.walkBack.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.walkBackFast.speed * dt;\r\n actdata = this._actionMap.walkBackFast;\r\n } else {\r\n actdata = this._actionMap.walkBack;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n }\r\n }\r\n\r\n // move the avatar\r\n\r\n if (moving) {\r\n if (this._moveVector.length() > 0.001) {\r\n this._avatar.moveWithCollisions(this._moveVector);\r\n //walking up a slope\r\n if (this._avatar.position.y > this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n const _slp: number = this._verticalSlope(actDisp);\r\n if (_slp >= this._sl2) {\r\n //this._climbingSteps=true;\r\n //is av trying to go up steps\r\n if (this._stepOffset > 0) {\r\n if (this._vMoveTot == 0) {\r\n //if just started climbing note down the position\r\n this._vMovStartPos.copyFrom(this._avStartPos);\r\n }\r\n this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y);\r\n if (this._vMoveTot > this._stepOffset) {\r\n //move av back to its position at begining of steps\r\n this._vMoveTot = 0;\r\n this._avatar.position.copyFrom(this._vMovStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n //move av back to old position\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n this._vMoveTot = 0;\r\n if (_slp > this._sl1) {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n } else {\r\n //continue walking\r\n this._endFreeFall();\r\n }\r\n }\r\n } else if ((this._avatar.position.y) < this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or walk?\r\n //if slope is less steeper than acceptable then walk else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endFreeFall();\r\n } else {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n } else {\r\n this._inFreeFall = true;\r\n this._fallFrameCount++;\r\n //AV could be running down a slope which mean freefall,run,frefall run ...\r\n //to remove anim flicker, check if AV has been falling down continously for last few consecutive frames\r\n //before changing to free fall animation\r\n if (this._fallFrameCount > this._fallFrameCountMin) {\r\n actdata = this._actionMap.fall;\r\n }\r\n }\r\n } else {\r\n this._endFreeFall();\r\n }\r\n }\r\n }\r\n return actdata;\r\n }\r\n\r\n /**\r\n * rotate avatar with respect to camera direction. \r\n */\r\n private _rotateAV2C() {\r\n if (this._hasCam)\r\n if (this._mode != 1) {\r\n let ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0;\r\n if (this._noRot) {\r\n switch (true) {\r\n case (this._act._walk && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walk && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walk):\r\n this._avatar.rotation.y = ca;\r\n break;\r\n case (this._act._walkback):\r\n this._avatar.rotation.y = ca + Math.PI;\r\n break;\r\n case (this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2;\r\n break;\r\n case (this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2;\r\n break;\r\n }\r\n } else {\r\n if (this._hasCam)\r\n this._avatar.rotation.y = ca;\r\n }\r\n }\r\n }\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n private _rotateAVnC(anim: ActionData, moving: boolean, dt: number): ActionData {\r\n if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) {\r\n let turnAngle = this._actionMap.turnLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n turnAngle = 2 * turnAngle;\r\n }\r\n let a;\r\n if (this._mode == 1) {\r\n // while turining, the avatar could start facing away from camera and end up facing camera.\r\n // we should not switch turning direction during this transition\r\n if (!this._isTurning) {\r\n // if (this._act.name != this._act.prevName) {\r\n // this._act.prevName = this._act.name;\r\n this._sign = -this._ffSign * this._isAvFacingCamera();\r\n if (this._isLHS_RHS) this._sign = - this._sign;\r\n this._isTurning = true;\r\n }\r\n a = this._sign;\r\n if (this._act._turnLeft) {\r\n if (this._act._walk) { }\r\n else if (this._act._walkback) a = -this._sign;\r\n else {\r\n anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft;\r\n }\r\n } else {\r\n if (this._act._walk) a = -this._sign;\r\n else if (this._act._walkback) { }\r\n else {\r\n a = -this._sign;\r\n anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight;\r\n }\r\n }\r\n } else {\r\n a = 1;\r\n if (this._act._turnLeft) {\r\n if (this._act._walkback) a = -1;\r\n if (!moving) anim = this._actionMap.turnLeft;\r\n } else {\r\n if (this._act._walk) a = -1;\r\n if (!moving) { a = -1; anim = this._actionMap.turnRight; }\r\n }\r\n if (this._hasCam)\r\n this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a;\r\n }\r\n\r\n this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a;\r\n }\r\n return anim;\r\n }\r\n\r\n private _endFreeFall(): void {\r\n this._movFallTime = 0;\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n\r\n //for how long has the av been falling while idle (not moving)\r\n private _idleFallTime: number = 0;\r\n private _doIdle(dt: number): ActionData {\r\n if (this._grounded) {\r\n return this._actionMap.idle;\r\n }\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n this._movFallTime = 0;\r\n let anim: ActionData = this._actionMap.idle;\r\n this._fallFrameCount = 0;\r\n\r\n\r\n if (dt === 0) {\r\n this._freeFallDist = 5;\r\n } else {\r\n const u: number = this._idleFallTime * this._gravity\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n this._idleFallTime = this._idleFallTime + dt;\r\n }\r\n //if displacement is less than 0.01(? need to verify further) then \r\n //moveWithDisplacement down against a surface seems to push the AV up by a small amount!!\r\n if (this._freeFallDist < 0.01) return anim;\r\n const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0);\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n this._avatar.moveWithCollisions(disp);\r\n if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n } else if (this._avatar.position.y < this._avStartPos.y) {\r\n //AV is going down. \r\n //AV is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than accebtable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n } else {\r\n this._unGroundIt();\r\n anim = this._actionMap.slideBack;\r\n }\r\n } else {\r\n anim = this._actionMap.fall;\r\n }\r\n }\r\n return anim;\r\n }\r\n\r\n private _groundFrameCount = 0;\r\n private _groundFrameMax = 10;\r\n /**\r\n * donot ground immediately\r\n * wait few more frames\r\n */\r\n private _groundIt(): void {\r\n this._groundFrameCount++;\r\n if (this._groundFrameCount > this._groundFrameMax) {\r\n this._grounded = true;\r\n this._idleFallTime = 0;\r\n }\r\n }\r\n private _unGroundIt() {\r\n this._grounded = false;\r\n this._groundFrameCount = 0;\r\n }\r\n\r\n private _savedCameraCollision: boolean = true;\r\n private _inFP = false;\r\n private _updateTargetValue() {\r\n if (!this._hasCam) return;\r\n //donot move camera if av is trying to clinb steps\r\n if (this._vMoveTot == 0)\r\n this._avatar.position.addToRef(this._cameraTarget, this._camera.target);\r\n\r\n if (this._camera.radius > this._camera.lowerRadiusLimit) { if (this._cameraElastic || this._makeInvisible) this._handleObstruction(); }\r\n\r\n //if user so desire, make the AV invisible if camera comes close to it\r\n if (this._camera.radius <= this._camera.lowerRadiusLimit) {\r\n if (!this._noFirstPerson && !this._inFP) {\r\n this._makeMeshInvisible(this._avatar);\r\n this._camera.checkCollisions = false;\r\n this._saveMode = this._mode;\r\n this._mode = 0;\r\n this._inFP = true;\r\n }\r\n } else {\r\n if (this._inFP) {\r\n this._inFP = false;\r\n this._mode = this._saveMode;\r\n this._restoreVisiblity(this._avatar);\r\n this._camera.checkCollisions = this._savedCameraCollision;\r\n }\r\n }\r\n }\r\n\r\n // make mesh and all its children invisible\r\n // store their current visibility state so that we can restore them later on\r\n private _makeMeshInvisible(mesh: Mesh) {\r\n\r\n this._visiblityMap.set(mesh, mesh.visibility);\r\n mesh.visibility = 0;\r\n\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) {\r\n this._visiblityMap.set(n, n.visibility);\r\n n.visibility = 0;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n private _visiblityMap: Map = new Map();\r\n\r\n //restore mesh visibility to previous state\r\n private _restoreVisiblity(mesh: Mesh) {\r\n mesh.visibility = this._visiblityMap.get(mesh);\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) n.visibility = this._visiblityMap.get(n);\r\n return false;\r\n });\r\n }\r\n\r\n private _ray: Ray = new Ray(Vector3.Zero(), Vector3.One(), 1);\r\n private _rayDir: Vector3 = Vector3.Zero();\r\n //camera seems to get stuck into things\r\n //should move camera away from things by a value of cameraSkin\r\n private _cameraSkin: number = 0.5;\r\n private _prevPickedMeshes: AbstractMesh[];\r\n private _pickedMeshes: AbstractMesh[] = new Array();;\r\n private _makeInvisible = false;\r\n private _elasticSteps = 50;\r\n private _alreadyInvisible: AbstractMesh[];\r\n\r\n /**\r\n * The following method handles the use case wherein some mesh\r\n * comes between the avatar and the camera thus obstructing the view\r\n * of the avatar.\r\n * Two ways this can be handled\r\n * a) make the obstructing mesh invisible\r\n * instead of invisible a better option would have been to make semi transparent.\r\n * Unfortunately, unlike mesh, mesh instances do not \"visibility\" setting)\r\n * Every alternate frame make mesh visible and invisible to give the impression of semi-transparent.\r\n * b) move the camera in front of the obstructing mesh\r\n */\r\n private _handleObstruction() {\r\n\r\n //get vector from av (camera.target) to camera\r\n this._camera.position.subtractToRef(this._camera.target, this._rayDir);\r\n //start ray from av to camera\r\n this._ray.origin = this._camera.target;\r\n this._ray.length = this._rayDir.length();\r\n this._ray.direction = this._rayDir.normalize();\r\n\r\n //TODO \r\n //handle case were pick is with a child of avatar, avatar atatchment. etc\r\n const pis: PickingInfo[] = this._scene.multiPickWithRay(this._ray, (mesh) => {\r\n if (mesh == this._avatar) return false;\r\n else return true;\r\n });\r\n\r\n\r\n if (this._makeInvisible) {\r\n this._prevPickedMeshes = this._pickedMeshes;\r\n if (pis.length > 0) {\r\n this._pickedMeshes = new Array();\r\n for (let pi of pis) {\r\n if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) {\r\n pi.pickedMesh.isVisible = false;\r\n this._pickedMeshes.push(pi.pickedMesh);\r\n }\r\n }\r\n for (let pm of this._prevPickedMeshes) {\r\n if (!this._pickedMeshes.includes(pm)) {\r\n pm.isVisible = true;\r\n }\r\n }\r\n } else {\r\n for (let pm of this._prevPickedMeshes) {\r\n pm.isVisible = true;\r\n }\r\n this._prevPickedMeshes.length = 0;\r\n }\r\n }\r\n\r\n if (this._cameraElastic) {\r\n if (pis.length > 0) {\r\n // postion the camera in front of the mesh that is obstructing camera\r\n\r\n //if only one obstruction and it is invisible then if it is not collidable or our camera is not collidable then do nothing\r\n if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) return;\r\n\r\n //if our camera is collidable then we donot want it to get stuck behind another collidable obsrtucting mesh\r\n let pp: Vector3 = null;\r\n\r\n //we will asume the order of picked meshes is from closest to avatar to furthest\r\n //we should get the first one which is visible or invisible and collidable\r\n for (let i = 0; i < pis.length; i++) {\r\n let pm = pis[i].pickedMesh;\r\n if (this._isSeeAble(pm)) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n } else if (pm.checkCollisions) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n }\r\n }\r\n if (pp == null) return;\r\n\r\n const c2p: Vector3 = this._camera.position.subtract(pp);\r\n //note that when camera is collidable, changing the orbital camera radius may not work.\r\n //changing the radius moves the camera forward (with collision?) and collision can interfere with movement\r\n //\r\n //in every cylce we are dividing the distance to tarvel by same number of steps.\r\n //as we get closer to destination the speed will thus slow down.\r\n //when just 1 unit distance left, lets snap to the final position.\r\n //when calculating final position make sure the camera does not get stuck at the pickposition especially\r\n //if collision is on\r\n\r\n const l: number = c2p.length();\r\n if (this._camera.checkCollisions) {\r\n let step: Vector3;\r\n if (l <= 1) {\r\n step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin));\r\n } else {\r\n step = c2p.normalize().scaleInPlace(l / this._elasticSteps);\r\n }\r\n this._camera.position = this._camera.position.subtract(step);\r\n } else {\r\n let step: number;\r\n if (l <= 1) step = l + this._cameraSkin; else step = l / this._elasticSteps;\r\n this._camera.radius = this._camera.radius - (step);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //how many ways can a mesh be invisible?\r\n private _isSeeAble(mesh: AbstractMesh): boolean {\r\n if (!mesh.isVisible) return false;\r\n if (mesh.visibility == 0) return false;\r\n if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) return false;\r\n return true;\r\n //what about vertex color? groan!\r\n }\r\n\r\n\r\n private _move: boolean = false;\r\n public anyMovement(): boolean {\r\n return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight);\r\n }\r\n\r\n private _onKeyDown(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n if (e.repeat) return;\r\n switch (e.key.toLowerCase()) {\r\n case this._actionMap.idleJump.key:\r\n this._act._jump = true;\r\n break;\r\n case \"capslock\":\r\n this._act._speedMod = !this._act._speedMod;\r\n break;\r\n case \"shift\":\r\n this._act._speedMod = true;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = true;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = true;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = true;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = true;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = true;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = true;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _onKeyUp(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n switch (e.key.toLowerCase()) {\r\n case \"shift\":\r\n this._act._speedMod = false;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = false;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = false;\r\n this._isTurning = false;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = false;\r\n this._isTurning = false;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = false;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = false;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = false;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _ekb: boolean = true;\r\n public isKeyBoardEnabled(): boolean {\r\n return this._ekb;\r\n }\r\n public enableKeyBoard(b: boolean) {\r\n this._ekb = b;\r\n if (b) {\r\n this._addkeylistener();\r\n } else {\r\n this._removekeylistener();\r\n }\r\n }\r\n\r\n private _addkeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.addEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.addEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n private _removekeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.removeEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.removeEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n // control movement by commands rather than keyboard.\r\n public walk(b: boolean) {\r\n this._act._walk = b;\r\n }\r\n public walkBack(b: boolean) {\r\n this._act._walkback = b;\r\n }\r\n public walkBackFast(b: boolean) {\r\n this._act._walkback = b;\r\n this._act._speedMod = b;\r\n }\r\n public run(b: boolean) {\r\n this._act._walk = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnLeft(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnLeftFast(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnRight(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnRightFast(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeLeft(b: boolean) {\r\n this._act._stepLeft = b;\r\n }\r\n public strafeLeftFast(b: boolean) {\r\n this._act._stepLeft = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeRight(b: boolean) {\r\n this._act._stepRight = b;\r\n }\r\n public strafeRightFast(b: boolean) {\r\n this._act._stepRight = b;\r\n this._act._speedMod = b;\r\n }\r\n public jump() {\r\n this._act._jump = true;\r\n }\r\n\r\n public fall() {\r\n this._grounded = false;\r\n }\r\n\r\n public idle() {\r\n this._act.reset();\r\n }\r\n\r\n private _act: _Action;\r\n private _renderer: () => void;\r\n private _handleKeyUp: (e) => void;\r\n private _handleKeyDown: (e) => void;\r\n private _isAG: boolean = false;\r\n public isAg() {\r\n return this._isAG;\r\n }\r\n\r\n\r\n\r\n\r\n private _findSkel(n: Node): Skeleton {\r\n let root = this._root(n);\r\n\r\n if (root instanceof Mesh && root.skeleton) return root.skeleton;\r\n\r\n //find all child meshes which have skeletons\r\n let ms = root.getChildMeshes(\r\n false,\r\n (cm) => {\r\n if (cm instanceof Mesh) {\r\n if (cm.skeleton) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n //return the skeleton of the first child mesh\r\n if (ms.length > 0) return ms[0].skeleton; else return null;\r\n\r\n }\r\n\r\n private _root(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._root(tn.parent);\r\n }\r\n\r\n public setAvatar(avatar: Mesh, faceForward: boolean = false): boolean {\r\n\r\n let rootNode = this._root(avatar);\r\n if (rootNode instanceof Mesh) {\r\n this._avatar = rootNode;\r\n } else {\r\n console.error(\"Cannot move this mesh. The root node of the mesh provided is not a mesh\");\r\n return false;\r\n }\r\n\r\n this._skeleton = this._findSkel(avatar);\r\n this._isAG = this._containsAG(avatar, this._scene.animationGroups, true);\r\n\r\n this._actionMap.reset();\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n\r\n this._setRHS(avatar);\r\n this.setFaceForward(faceForward);\r\n\r\n return true;\r\n }\r\n\r\n public getAvatar() {\r\n return this._avatar;\r\n }\r\n\r\n // force a skeleton to be the avatar skeleton\r\n // should not be calling this normally\r\n public setAvatarSkeleton(skeleton: Skeleton) {\r\n this._skeleton = skeleton;\r\n\r\n\r\n if (this._skeleton != null && this._skelDrivenByAG(skeleton)) this._isAG = true; else this._isAG = false;\r\n\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n }\r\n\r\n\r\n // this check if any of this skeleton animations is referenced by any targetedAnimation in any of the animationgroup in the scene.\r\n private _skelDrivenByAG(skeleton: Skeleton) {\r\n return skeleton.animations.some(sa => this._scene.animationGroups.some(ag => ag.children.some(ta => ta.animation == sa)));\r\n }\r\n\r\n public getSkeleton() {\r\n return this._skeleton;\r\n }\r\n\r\n // does this character have any animations ?\r\n // remember we can use meshes without anims as characters too\r\n private _hasAnims: boolean = false;\r\n private _hasCam: boolean = true;\r\n\r\n /**\r\n * The avatar/character can be made up of multiple meshes arranged in a hierarchy.\r\n * As such we will pick the root of the hierarchy as the avatar.\r\n * The root should be a mesh as otherwise we cannot move it with moveWithCollision() method.\r\n * \r\n * Mutiple meshes in the hierarchy may have skeletons (if two or more meshes have skeleton then\r\n * the skeleton will mostly likely be the same). \r\n * So we will pick as avatar skeleton, the skeleton of the first mesh in the hierachy which has\r\n * a skeleton \r\n * \r\n * @param avatar \r\n * @param camera \r\n * @param scene \r\n * @param actionMap/animationGroupMap \r\n * maps actions to animations and other data like speed,sound etc \r\n * or \r\n * for backward compatibility could be AnimationGroup Map\r\n * @param faceForward \r\n */\r\n constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward = false) {\r\n\r\n this._camera = camera;\r\n\r\n //if camera is null assume this would be used to control an NPC\r\n //we cannot use mode 0 as that is dependent on camera being present. so force mode 1\r\n if (this._camera == null) {\r\n this._hasCam = false;\r\n this.setMode(1);\r\n }\r\n this._scene = scene;\r\n\r\n let success = this.setAvatar(avatar, faceForward);\r\n if (!success) {\r\n console.error(\"unable to set avatar\");\r\n }\r\n\r\n\r\n let dataType: string = null;\r\n if (actionMap != null) {\r\n dataType = this.setActionMap(actionMap);\r\n }\r\n\r\n //try to use the existing avatar animations\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n //animation groups\r\n if (this._isAG) {\r\n //TODO\r\n }\r\n\r\n if (this._hasCam) this._savedCameraCollision = this._camera.checkCollisions;\r\n\r\n this._act = new _Action();\r\n\r\n this._renderer = () => { this._moveAVandCamera() };\r\n this._handleKeyUp = (e) => { this._onKeyUp(e) };\r\n this._handleKeyDown = (e) => { this._onKeyDown(e) };\r\n }\r\n}\r\n\r\n\r\n\r\nclass _Action {\r\n\r\n public _walk: boolean = false;\r\n public _walkback: boolean = false;\r\n public _turnRight: boolean = false;\r\n public _turnLeft: boolean = false;\r\n public _stepRight: boolean = false;\r\n public _stepLeft: boolean = false;\r\n public _jump: boolean = false;\r\n\r\n // speed modifier - changes speed of movement\r\n public _speedMod: boolean = false;\r\n\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset() {\r\n this._walk = false;\r\n this._walkback = false;\r\n this._turnRight = false;\r\n this._turnLeft = false;\r\n this._stepRight = false;\r\n this._stepLeft = false;\r\n this._jump = false;\r\n this._speedMod = false;\r\n }\r\n}\r\n\r\nexport class ActionData {\r\n public id: string;\r\n public speed: number;\r\n //_ds default speed. speed is set to this on reset\r\n public ds: number;\r\n public sound: Sound;\r\n public key: string;\r\n //_dk defailt key\r\n public dk: string;\r\n\r\n //animation data\r\n //if _ag is null then assuming animation range and use _name to play animationrange\r\n //instead of name maybe call it arName?\r\n public name: string = \"\";\r\n public ag: AnimationGroup;\r\n public loop: boolean = true;\r\n public rate: number = 1;\r\n\r\n public exist: boolean = false;\r\n\r\n public constructor(id?: string, speed = 1, key?: string) {\r\n this.id = id;\r\n this.speed = speed;\r\n this.ds = speed;\r\n this.key = key;\r\n this.dk = key;\r\n }\r\n\r\n public reset() {\r\n this.name = \"\";\r\n this.speed = this.ds;\r\n this.key = this.dk;\r\n this.loop = true;\r\n this.rate = 1;\r\n this.sound = null;\r\n this.exist = false;\r\n }\r\n\r\n}\r\n\r\n//not really a \"Map\"\r\nexport class ActionMap {\r\n public walk = new ActionData(\"walk\", 3, \"w\");\r\n public walkBack = new ActionData(\"walkBack\", 1.5, \"s\");\r\n public walkBackFast = new ActionData(\"walkBackFast\", 3, \"na\");\r\n public idle = new ActionData(\"idle\", 0, \"na\");\r\n public idleJump = new ActionData(\"idleJump\", 6, \" \");\r\n public run = new ActionData(\"run\", 6, \"na\");\r\n public runJump = new ActionData(\"runJump\", 6, \"na\");\r\n public fall = new ActionData(\"fall\", 0, \"na\");\r\n public turnLeft = new ActionData(\"turnLeft\", Math.PI / 8, \"a\");\r\n public turnLeftFast = new ActionData(\"turnLeftFast\", Math.PI / 4, \"na\");\r\n public turnRight = new ActionData(\"turnRight\", Math.PI / 8, \"d\");\r\n public turnRightFast = new ActionData(\"turnRightFast\", Math.PI / 4, \"na\");\r\n public strafeLeft = new ActionData(\"strafeLeft\", 1.5, \"q\");\r\n public strafeLeftFast = new ActionData(\"strafeLeftFast\", 3, \"na\");\r\n public strafeRight = new ActionData(\"strafeRight\", 1.5, \"e\");\r\n public strafeRightFast = new ActionData(\"strafeRightFast\", 3, \"na\");\r\n public slideBack = new ActionData(\"slideBack\", 0, \"na\");\r\n\r\n public reset() {\r\n let keys: string[] = Object.keys(this);\r\n for (let key of keys) {\r\n let act = this[key];\r\n if (!(act instanceof ActionData)) continue;\r\n act.reset()\r\n }\r\n }\r\n};\r\n\r\nexport class CCSettings {\r\n public faceForward: boolean;\r\n public gravity: number;\r\n public minSlopeLimit: number;\r\n public maxSlopeLimit: number;\r\n public stepOffset: number;\r\n public cameraElastic: boolean = true;\r\n public elasticSteps: number;\r\n public makeInvisble: boolean = true;\r\n public cameraTarget: Vector3 = Vector3.Zero();\r\n public noFirstPerson: boolean = false;\r\n public topDown: boolean = true;\r\n //turningOff takes effect only when topDown is false\r\n public turningOff: boolean = true;\r\n public keyboard: boolean = true;\r\n public sound: Sound;\r\n}\r\n"],"names":["root","factory","exports","module","require","define","amd","a","i","self","__WEBPACK_EXTERNAL_MODULE__247__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","avatar","camera","scene","actionMap","faceForward","_avatar","_skeleton","_gravity","_minSlopeLimit","_maxSlopeLimit","_sl1","Math","PI","this","_sl2","_stepOffset","_vMoveTot","_vMovStartPos","Vector3","_actionMap","ActionMap","_cameraElastic","_cameraTarget","_noFirstPerson","_mode","_saveMode","_isLHS_RHS","_signLHS_RHS","_started","_stopAnim","_prevActData","_avStartPos","_grounded","_freeFallDist","_fallFrameCountMin","_fallFrameCount","_inFreeFall","_wasWalking","_wasRunning","_soundLoopTime","_sndId","_jumpStartPosY","_jumpTime","_movFallTime","_sign","_isTurning","_noRot","_idleFallTime","_groundFrameCount","_groundFrameMax","_savedCameraCollision","_inFP","_visiblityMap","Map","_ray","Ray","_rayDir","_cameraSkin","_pickedMeshes","Array","_makeInvisible","_elasticSteps","_move","_ekb","_isAG","_hasAnims","_hasCam","_camera","setMode","_scene","setAvatar","console","error","setActionMap","_checkAnimRanges","checkCollisions","_act","_Action","_renderer","_moveAVandCamera","_handleKeyUp","e","_onKeyUp","_handleKeyDown","_onKeyDown","getScene","setSlopeLimit","minSlopeLimit","maxSlopeLimit","setStepOffset","stepOffset","setWalkSpeed","walk","speed","setRunSpeed","run","setBackSpeed","walkBack","setBackFastSpeed","walkBackFast","setJumpSpeed","idleJump","runJump","setLeftSpeed","strafeLeft","setLeftFastSpeed","strafeLeftFast","setRightSpeed","strafeRight","setRightFastSpeed","setTurnSpeed","turnLeft","turnRight","setTurnFastSpeed","turnLeftFast","turnRightFast","setGravity","setAnimationGroups","agMap","exist","ag","stop","setAnimationRanges","arMap","inActMap","inActData","keys","ccActionName","ccActData","ActionData","id","AnimationGroup","name","loop","rate","sound","_checkFastAnims","getActionMap","map","actDataI","actDataO","getSettings","ccs","CCSettings","isFaceForward","topDown","getMode","turningOff","isTurningOff","cameraTarget","clone","cameraElastic","elasticSteps","makeInvisble","gravity","keyboard","noFirstPerson","_stepSound","setSettings","setFaceForward","setTurningOff","setCameraTarget","setCameraElasticity","setElasticiSteps","makeObstructionInvisible","enableKeyBoard","setNoFirstPerson","setSound","_setAnim","anim","animName","getAnimationRange","enableBlending","act","targetedAnimations","ta","animation","blendingSpeed","disableBlending","setWalkAnim","rangeName","setRunAnim","setWalkBackAnim","_copySlowAnims","setWalkBackFastAnim","setSlideBackAnim","slideBack","setIdleAnim","idle","setTurnRightAnim","setTurnRightFastAnim","setTurnLeftAnim","setTurnLeftFastAnim","setStrafeRightAnim","strafeRightFast","setStrafeRightFastAnim","setStrafeLeftAnim","setStrafeLeftFastAnim","setIdleJumpAnim","setRunJumpAnim","setFallAnim","fall","ccActionNames","attachToMesh","setWalkKey","toLowerCase","setWalkBackKey","setTurnLeftKey","setTurnRightKey","setStrafeLeftKey","setStrafeRightKey","setJumpKey","b","v","copyFrom","cameraCollisionChanged","skel","f","s","_setRHS","mesh","meshMatrix","getWorldMatrix","_localX","m","_localY","_localZ","actualZ","_ff","_rhsSign","useRightHandedSystem","_av2cam","_ffSign","checkAGs","_containsAG","node","ags","fromRoot","ns","_getRoot","getChildren","TransformNode","indexOf","target","tn","parent","start","reset","_updateTargetValue","_addkeylistener","registerBeforeRender","unregisterBeforeRender","_removekeylistener","pauseAnim","stopAnimation","clearInterval","resumeAnim","_isAvFacingCamera","forward","position","subtract","actData","dt","getEngine","getDeltaTime","_jump","_doJump","anyMovement","_doMove","_doIdle","c","fps","framePerSecond","to","from","beginAnimation","getAnimations","play","setInterval","abs","y","disp","forwardDist","jumpDist","_moveVector","normalize","scaleToRef","_calcJumpDist","moveWithCollisions","length","_endJump","actDisp","_areVectorsEqual","_verticalSlope","v1","v2","p","x","z","atan","sqrt","u","moving","actdata","_rotateAV2C","_rotateAVnC","sign","horizDist","_speedMod","calcMovePOV","_walk","_slp","_endFreeFall","ca","alpha","_turnRight","rotation","_turnLeft","_walkback","_stepLeft","_stepRight","turnAngle","_groundIt","_unGroundIt","addToRef","radius","lowerRadiusLimit","_handleObstruction","_makeMeshInvisible","_restoreVisiblity","set","visibility","getChildMeshes","Mesh","subtractToRef","origin","direction","pis","multiPickWithRay","_prevPickedMeshes","pi","pickedMesh","isVisible","includes","push","pm","_isSeeAble","pp","pickedPoint","c2p","l","step","addInPlace","normalizeToNew","scaleInPlace","material","alphaMode","repeat","isKeyBoardEnabled","canvas","getRenderingCanvas","addEventListener","removeEventListener","jump","isAg","_findSkel","_root","skeleton","ms","cm","rootNode","animationGroups","getAvatar","setAvatarSkeleton","_skelDrivenByAG","animations","some","sa","children","getSkeleton","ds","dk"],"sourceRoot":""} \ No newline at end of file diff --git a/dist-old/CharacterController.max.js b/dist-old/CharacterController.max.js new file mode 100644 index 0000000..a4c7b08 --- /dev/null +++ b/dist-old/CharacterController.max.js @@ -0,0 +1,1592 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("babylonjs")); + else if(typeof define === 'function' && define.amd) + define(["babylonjs"], factory); + else { + var a = typeof exports === 'object' ? factory(require("babylonjs")) : factory(root["BABYLON"]); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})(self, (__WEBPACK_EXTERNAL_MODULE_babylonjs__) => { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "babylonjs": +/*!****************************************************************************************************!*\ + !*** external {"commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs","root":"BABYLON"} ***! + \****************************************************************************************************/ +/***/ ((module) => { + +module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs__; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +/*!************************************!*\ + !*** ./src/CharacterController.ts ***! + \************************************/ +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ActionData": () => (/* binding */ ActionData), +/* harmony export */ "ActionMap": () => (/* binding */ ActionMap), +/* harmony export */ "CCSettings": () => (/* binding */ CCSettings), +/* harmony export */ "CharacterController": () => (/* binding */ CharacterController) +/* harmony export */ }); +/* harmony import */ var babylonjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs */ "babylonjs"); +/* harmony import */ var babylonjs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs__WEBPACK_IMPORTED_MODULE_0__); + +var CharacterController = (function () { + function CharacterController(avatar, camera, scene, actionMap, faceForward) { + if (faceForward === void 0) { faceForward = false; } + var _this = this; + this._avatar = null; + this._skeleton = null; + this._gravity = 9.8; + this._minSlopeLimit = 30; + this._maxSlopeLimit = 45; + this._sl1 = Math.PI * this._minSlopeLimit / 180; + this._sl2 = Math.PI * this._maxSlopeLimit / 180; + this._stepOffset = 0.25; + this._vMoveTot = 0; + this._vMovStartPos = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Zero(); + this._actionMap = new ActionMap(); + this._cameraElastic = true; + this._cameraTarget = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Zero(); + this._noFirstPerson = false; + this._mode = 0; + this._saveMode = 0; + this._isLHS_RHS = false; + this._signLHS_RHS = -1; + this._started = false; + this._stopAnim = false; + this._prevActData = null; + this._avStartPos = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Zero(); + this._grounded = false; + this._freeFallDist = 0; + this._fallFrameCountMin = 50; + this._fallFrameCount = 0; + this._inFreeFall = false; + this._wasWalking = false; + this._wasRunning = false; + this._soundLoopTime = 700; + this._sndId = null; + this._jumpStartPosY = 0; + this._jumpTime = 0; + this._movFallTime = 0; + this._sign = 1; + this._isTurning = false; + this._noRot = false; + this._idleFallTime = 0; + this._groundFrameCount = 0; + this._groundFrameMax = 10; + this._savedCameraCollision = true; + this._inFP = false; + this._visiblityMap = new Map(); + this._ray = new babylonjs__WEBPACK_IMPORTED_MODULE_0__.Ray(babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Zero(), babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.One(), 1); + this._rayDir = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Zero(); + this._cameraSkin = 0.5; + this._pickedMeshes = new Array(); + this._makeInvisible = false; + this._elasticSteps = 50; + this._move = false; + this._ekb = true; + this._isAG = false; + this._hasAnims = false; + this._hasCam = true; + this._camera = camera; + if (this._camera == null) { + this._hasCam = false; + this.setMode(1); + } + this._scene = scene; + var success = this.setAvatar(avatar, faceForward); + if (!success) { + console.error("unable to set avatar"); + } + var dataType = null; + if (actionMap != null) { + dataType = this.setActionMap(actionMap); + } + if (!this._isAG && this._skeleton != null) + this._checkAnimRanges(this._skeleton); + if (this._isAG) { + } + if (this._hasCam) + this._savedCameraCollision = this._camera.checkCollisions; + this._act = new _Action(); + this._renderer = function () { _this._moveAVandCamera(); }; + this._handleKeyUp = function (e) { _this._onKeyUp(e); }; + this._handleKeyDown = function (e) { _this._onKeyDown(e); }; + } + CharacterController.prototype.getScene = function () { + return this._scene; + }; + CharacterController.prototype.setSlopeLimit = function (minSlopeLimit, maxSlopeLimit) { + this._minSlopeLimit = minSlopeLimit; + this._maxSlopeLimit = maxSlopeLimit; + this._sl1 = Math.PI * this._minSlopeLimit / 180; + this._sl2 = Math.PI * this._maxSlopeLimit / 180; + }; + CharacterController.prototype.setStepOffset = function (stepOffset) { + this._stepOffset = stepOffset; + }; + CharacterController.prototype.setWalkSpeed = function (n) { + this._actionMap.walk.speed = n; + }; + CharacterController.prototype.setRunSpeed = function (n) { + this._actionMap.run.speed = n; + }; + CharacterController.prototype.setBackSpeed = function (n) { + this._actionMap.walkBack.speed = n; + }; + CharacterController.prototype.setBackFastSpeed = function (n) { + this._actionMap.walkBackFast.speed = n; + }; + CharacterController.prototype.setJumpSpeed = function (n) { + this._actionMap.idleJump.speed = n; + this._actionMap.runJump.speed = n; + }; + CharacterController.prototype.setLeftSpeed = function (n) { + this._actionMap.strafeLeft.speed = n; + }; + CharacterController.prototype.setLeftFastSpeed = function (n) { + this._actionMap.strafeLeftFast.speed = n; + }; + CharacterController.prototype.setRightSpeed = function (n) { + this._actionMap.strafeRight.speed = n; + }; + CharacterController.prototype.setRightFastSpeed = function (n) { + this._actionMap.strafeLeftFast.speed = n; + }; + CharacterController.prototype.setTurnSpeed = function (n) { + this._actionMap.turnLeft.speed = n * Math.PI / 180; + this._actionMap.turnRight.speed = n * Math.PI / 180; + }; + CharacterController.prototype.setTurnFastSpeed = function (n) { + this._actionMap.turnLeftFast.speed = n * Math.PI / 180; + this._actionMap.turnRightFast.speed = n * Math.PI / 180; + }; + CharacterController.prototype.setGravity = function (n) { + this._gravity = n; + }; + CharacterController.prototype.setAnimationGroups = function (agMap) { + if (this._prevActData != null && this._prevActData.exist) + this._prevActData.ag.stop(); + this._isAG = true; + this.setActionMap(agMap); + }; + CharacterController.prototype.setAnimationRanges = function (arMap) { + this._isAG = false; + this.setActionMap(arMap); + }; + CharacterController.prototype.setActionMap = function (inActMap) { + var agMap = false; + var inActData; + var ccActionNames = Object.keys(this._actionMap); + for (var _i = 0, ccActionNames_1 = ccActionNames; _i < ccActionNames_1.length; _i++) { + var ccActionName = ccActionNames_1[_i]; + var ccActData = this._actionMap[ccActionName]; + if (!(ccActData instanceof ActionData)) + continue; + ccActData.exist = false; + inActData = inActMap[ccActData.id]; + if (inActData != null) { + if (inActData instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.AnimationGroup) { + ccActData.ag = inActData; + ccActData.name = ccActData.ag.name; + ccActData.exist = true; + agMap = true; + this._hasAnims = true; + } + else if (inActData.exist) { + this._hasAnims = true; + ccActData.exist = true; + if (inActData instanceof Object) { + if (inActData.ag) { + ccActData.ag = inActData.ag; + agMap = true; + } + if (inActData.name) { + ccActData.name = inActData.name; + } + if (inActData.loop != null) + ccActData.loop = inActData.loop; + if (inActData.rate) + ccActData.rate = inActData.rate; + if (inActData.speed) + ccActData.speed = inActData.speed; + if (inActData.sound) + ccActData.sound = inActData.sound; + } + else { + ccActData.name = inActData; + } + } + } + } + this._checkFastAnims(); + this._prevActData = null; + if (agMap) + return "ag"; + else + return "ar"; + }; + CharacterController.prototype.getActionMap = function () { + var map = new ActionMap(); + var keys = Object.keys(this._actionMap); + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + var actDataI = this._actionMap[key]; + if (!(actDataI instanceof ActionData)) + continue; + if (!actDataI.exist) + continue; + var actDataO = map[actDataI.id]; + actDataO.ag = actDataI.ag; + actDataO.name = actDataI.name; + actDataO.loop = actDataI.loop; + actDataO.rate = actDataI.rate; + actDataO.speed = actDataI.speed; + actDataO.key = actDataI.key; + actDataO.sound = actDataI.sound; + actDataO.exist = actDataI.exist; + } + return map; + }; + CharacterController.prototype.getSettings = function () { + var ccs = new CCSettings(); + ccs.faceForward = this.isFaceForward(); + ccs.topDown = this.getMode() == 1 ? true : false; + ccs.turningOff = this.isTurningOff(); + ccs.cameraTarget = this._cameraTarget.clone(); + ccs.cameraElastic = this._cameraElastic; + ccs.elasticSteps = this._elasticSteps; + ccs.makeInvisble = this._makeInvisible; + ccs.gravity = this._gravity; + ccs.keyboard = this._ekb; + ccs.maxSlopeLimit = this._maxSlopeLimit; + ccs.minSlopeLimit = this._minSlopeLimit; + ccs.noFirstPerson = this._noFirstPerson; + ccs.stepOffset = this._stepOffset; + ccs.sound = this._stepSound; + return ccs; + }; + CharacterController.prototype.setSettings = function (ccs) { + this.setFaceForward(ccs.faceForward); + this.setMode(ccs.topDown ? 1 : 0); + this.setTurningOff(ccs.turningOff); + this.setCameraTarget(ccs.cameraTarget); + this.setCameraElasticity(ccs.cameraElastic); + this.setElasticiSteps(ccs.elasticSteps); + this.makeObstructionInvisible(ccs.makeInvisble); + this.setGravity(ccs.gravity); + this.enableKeyBoard(ccs.keyboard); + this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit); + this.setNoFirstPerson(ccs.noFirstPerson); + this.setStepOffset(ccs.stepOffset); + this.setSound(ccs.sound); + }; + CharacterController.prototype._setAnim = function (anim, animName, rate, loop) { + if (!this._isAG && this._skeleton == null) + return; + if (animName != null) { + if (this._isAG) { + if (!(animName instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.AnimationGroup)) + return; + anim.ag = animName; + anim.exist = true; + } + else { + if (this._skeleton.getAnimationRange(anim.name) != null) { + anim.name = animName; + anim.exist = true; + } + else { + anim.exist = false; + return; + } + } + } + if (loop != null) + anim.loop = loop; + if (rate != null) + anim.rate = rate; + }; + CharacterController.prototype.enableBlending = function (n) { + if (this._isAG) { + var keys = Object.keys(this._actionMap); + for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) { + var key = keys_2[_i]; + var act = this._actionMap[key]; + if (!(act instanceof ActionData)) + continue; + if (act.exist) { + var ar = act.ag; + for (var _a = 0, _b = ar.targetedAnimations; _a < _b.length; _a++) { + var ta = _b[_a]; + ta.animation.enableBlending = true; + ta.animation.blendingSpeed = n; + } + } + } + } + else { + if (this._skeleton !== null) + this._skeleton.enableBlending(n); + } + }; + CharacterController.prototype.disableBlending = function () { + if (this._isAG) { + var keys = Object.keys(this._actionMap); + for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) { + var key = keys_3[_i]; + var anim = this._actionMap[key]; + if (!(anim instanceof ActionData)) + continue; + if (anim.exist) { + var ar = anim.ag; + for (var _a = 0, _b = ar.targetedAnimations; _a < _b.length; _a++) { + var ta = _b[_a]; + ta.animation.enableBlending = false; + } + } + } + } + }; + CharacterController.prototype.setWalkAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.walk, rangeName, rate, loop); + }; + CharacterController.prototype.setRunAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.run, rangeName, rate, loop); + }; + CharacterController.prototype.setWalkBackAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.walkBack, rangeName, rate, loop); + this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack); + }; + CharacterController.prototype.setWalkBackFastAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop); + }; + CharacterController.prototype.setSlideBackAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.slideBack, rangeName, rate, loop); + }; + CharacterController.prototype.setIdleAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.idle, rangeName, rate, loop); + }; + CharacterController.prototype.setTurnRightAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.turnRight, rangeName, rate, loop); + this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight); + }; + CharacterController.prototype.setTurnRightFastAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop); + }; + CharacterController.prototype.setTurnLeftAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop); + this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft); + }; + CharacterController.prototype.setTurnLeftFastAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop); + }; + CharacterController.prototype.setStrafeRightAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop); + this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight); + }; + CharacterController.prototype.setStrafeRightFastAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop); + }; + CharacterController.prototype.setStrafeLeftAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop); + this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft); + }; + CharacterController.prototype.setStrafeLeftFastAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop); + }; + CharacterController.prototype.setIdleJumpAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.idleJump, rangeName, rate, loop); + }; + CharacterController.prototype.setRunJumpAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.runJump, rangeName, rate, loop); + }; + CharacterController.prototype.setFallAnim = function (rangeName, rate, loop) { + this._setAnim(this._actionMap.fall, rangeName, rate, loop); + }; + CharacterController.prototype.setSound = function (sound) { + if (sound == null) + return; + this._stepSound = sound; + var ccActionNames = Object.keys(this._actionMap); + sound.loop = false; + for (var _i = 0, ccActionNames_2 = ccActionNames; _i < ccActionNames_2.length; _i++) { + var ccActionName = ccActionNames_2[_i]; + var ccActData = this._actionMap[ccActionName]; + if (!(ccActData instanceof ActionData)) + continue; + ccActData.sound = sound; + ccActData.sound.attachToMesh(this._avatar); + } + this._actionMap.idle.sound = null; + this._actionMap.fall.sound = null; + this._actionMap.slideBack.sound = null; + }; + CharacterController.prototype.setWalkKey = function (key) { + this._actionMap.walk.key = key.toLowerCase(); + }; + CharacterController.prototype.setWalkBackKey = function (key) { + this._actionMap.walkBack.key = key.toLowerCase(); + }; + CharacterController.prototype.setTurnLeftKey = function (key) { + this._actionMap.turnLeft.key = key.toLowerCase(); + }; + CharacterController.prototype.setTurnRightKey = function (key) { + this._actionMap.turnRight.key = key.toLowerCase(); + }; + CharacterController.prototype.setStrafeLeftKey = function (key) { + this._actionMap.strafeLeft.key = key.toLowerCase(); + }; + CharacterController.prototype.setStrafeRightKey = function (key) { + this._actionMap.strafeRight.key = key.toLowerCase(); + }; + CharacterController.prototype.setJumpKey = function (key) { + this._actionMap.idleJump.key = key.toLowerCase(); + }; + CharacterController.prototype.setCameraElasticity = function (b) { + this._cameraElastic = b; + }; + CharacterController.prototype.setElasticiSteps = function (n) { + this._elasticSteps = n; + }; + CharacterController.prototype.makeObstructionInvisible = function (b) { + this._makeInvisible = b; + }; + CharacterController.prototype.setCameraTarget = function (v) { + this._cameraTarget.copyFrom(v); + }; + CharacterController.prototype.cameraCollisionChanged = function () { + this._savedCameraCollision = this._camera.checkCollisions; + }; + CharacterController.prototype.setNoFirstPerson = function (b) { + this._noFirstPerson = b; + }; + CharacterController.prototype._checkAnimRanges = function (skel) { + var keys = Object.keys(this._actionMap); + for (var _i = 0, keys_4 = keys; _i < keys_4.length; _i++) { + var key = keys_4[_i]; + var anim = this._actionMap[key]; + if (!(anim instanceof ActionData)) + continue; + if (skel != null) { + if (skel.getAnimationRange(anim.id) != null) { + anim.name = anim.id; + anim.exist = true; + this._hasAnims = true; + } + } + else { + anim.exist = false; + } + } + this._checkFastAnims(); + }; + CharacterController.prototype._checkFastAnims = function () { + this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack); + this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight); + this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft); + this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight); + this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft); + }; + CharacterController.prototype._copySlowAnims = function (f, s) { + if (f.exist) + return; + if (!s.exist) + return; + f.exist = true; + f.ag = s.ag; + f.name = s.name; + f.rate = s.rate * 2; + }; + CharacterController.prototype.setMode = function (n) { + if (this._hasCam) { + this._mode = n; + this._saveMode = n; + } + else { + this._mode = 1; + this._saveMode = 1; + } + }; + CharacterController.prototype.getMode = function () { + return this._mode; + }; + CharacterController.prototype.setTurningOff = function (b) { + this._noRot = b; + }; + CharacterController.prototype.isTurningOff = function () { + return this._noRot; + }; + CharacterController.prototype._setRHS = function (mesh) { + var meshMatrix = mesh.getWorldMatrix(); + var _localX = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.FromArray(meshMatrix.m, 0); + var _localY = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.FromArray(meshMatrix.m, 4); + var _localZ = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.FromArray(meshMatrix.m, 8); + var actualZ = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Cross(_localX, _localY); + if (babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Dot(actualZ, _localZ) < 0) { + this._isLHS_RHS = true; + this._signLHS_RHS = 1; + } + else { + this._isLHS_RHS = false; + this._signLHS_RHS = -1; + } + }; + CharacterController.prototype.setFaceForward = function (b) { + this._ff = b; + this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1; + if (!this._hasCam) { + this._av2cam = 0; + this._ffSign = 1; + return; + } + if (this._isLHS_RHS) { + this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2; + this._ffSign = b ? 1 : -1; + } + else { + this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2; + this._ffSign = b ? -1 : 1; + } + }; + CharacterController.prototype.isFaceForward = function () { + return this._ff; + }; + CharacterController.prototype.checkAGs = function (agMap) { + var keys = Object.keys(this._actionMap); + for (var _i = 0, keys_5 = keys; _i < keys_5.length; _i++) { + var key = keys_5[_i]; + var anim = this._actionMap[key]; + if (!(anim instanceof ActionData)) + continue; + if (agMap[anim.name] != null) { + anim.ag = agMap[anim.name]; + anim.exist = true; + } + } + }; + CharacterController.prototype._containsAG = function (node, ags, fromRoot) { + var r; + var ns; + if (fromRoot) { + r = this._getRoot(node); + ns = r.getChildren(function (n) { return (n instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.TransformNode); }, false); + } + else { + r = node; + ns = [r]; + } + for (var _i = 0, ags_1 = ags; _i < ags_1.length; _i++) { + var ag = ags_1[_i]; + var tas = ag.targetedAnimations; + for (var _a = 0, tas_1 = tas; _a < tas_1.length; _a++) { + var ta = tas_1[_a]; + if (ns.indexOf(ta.target) > -1) { + return true; + } + } + } + return false; + }; + CharacterController.prototype._getRoot = function (tn) { + if (tn.parent == null) + return tn; + return this._getRoot(tn.parent); + }; + CharacterController.prototype.start = function () { + if (this._started) + return; + this._started = true; + this._act.reset(); + this._movFallTime = 0; + this._idleFallTime = 0.001; + this._grounded = false; + this._updateTargetValue(); + if (this._ekb) + this._addkeylistener(); + this._scene.registerBeforeRender(this._renderer); + }; + CharacterController.prototype.stop = function () { + if (!this._started) + return; + this._started = false; + this._scene.unregisterBeforeRender(this._renderer); + this._removekeylistener(); + this._prevActData = null; + }; + CharacterController.prototype.pauseAnim = function () { + this._stopAnim = true; + if (this._prevActData != null && this._prevActData.exist) { + if (this._isAG) { + this._prevActData.ag.stop(); + } + else { + this._scene.stopAnimation(this._skeleton); + } + if (this._prevActData.sound != null) { + this._prevActData.sound.stop(); + } + clearInterval(this._sndId); + this._scene.unregisterBeforeRender(this._renderer); + } + }; + CharacterController.prototype.resumeAnim = function () { + this._stopAnim = false; + this._prevActData = null; + this._scene.registerBeforeRender(this._renderer); + }; + CharacterController.prototype._isAvFacingCamera = function () { + if (!this._hasCam) + return 1; + if (babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) + return 1; + else + return -1; + }; + CharacterController.prototype._moveAVandCamera = function () { + this._avStartPos.copyFrom(this._avatar.position); + var actData = null; + var dt = this._scene.getEngine().getDeltaTime() / 1000; + if (this._act._jump && !this._inFreeFall) { + this._grounded = false; + this._idleFallTime = 0; + actData = this._doJump(dt); + } + else if (this.anyMovement() || this._inFreeFall) { + this._grounded = false; + this._idleFallTime = 0; + actData = this._doMove(dt); + } + else if (!this._inFreeFall) { + actData = this._doIdle(dt); + } + if (!this._stopAnim && this._hasAnims && actData != null) { + if (this._prevActData !== actData) { + if (actData.exist) { + var c = void 0; + var fps = 30; + if (this._isAG) { + if (this._prevActData != null && this._prevActData.exist) + this._prevActData.ag.stop(); + actData.ag.start(actData.loop, actData.rate); + fps = actData.ag.targetedAnimations[0].animation.framePerSecond; + c = (actData.ag.to - actData.ag.from); + } + else { + var a = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate); + fps = a.getAnimations()[0].animation.framePerSecond; + c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from; + } + if (this._prevActData != null && this._prevActData.sound != null) { + this._prevActData.sound.stop(); + } + clearInterval(this._sndId); + if (actData.sound != null) { + actData.sound.play(); + this._sndId = setInterval(function () { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2)); + } + } + this._prevActData = actData; + } + } + this._updateTargetValue(); + return; + }; + CharacterController.prototype._doJump = function (dt) { + var actData = null; + actData = this._actionMap.runJump; + if (this._jumpTime === 0) { + this._jumpStartPosY = this._avatar.position.y; + } + this._jumpTime = this._jumpTime + dt; + var forwardDist = 0; + var jumpDist = 0; + var disp; + if (this._wasRunning || this._wasWalking) { + if (this._wasRunning) { + forwardDist = this._actionMap.run.speed * dt; + } + else if (this._wasWalking) { + forwardDist = this._actionMap.walk.speed * dt; + } + disp = this._moveVector.clone(); + disp.y = 0; + disp = disp.normalize(); + disp.scaleToRef(forwardDist, disp); + jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt); + disp.y = jumpDist; + } + else { + jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt); + disp = new babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3(0, jumpDist, 0); + actData = this._actionMap.idleJump; + } + this._avatar.moveWithCollisions(disp); + if (jumpDist < 0) { + if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) { + this._endJump(); + } + else if (this._avatar.position.y < this._jumpStartPosY) { + var actDisp = this._avatar.position.subtract(this._avStartPos); + if (!(this._areVectorsEqual(actDisp, disp, 0.001))) { + if (this._verticalSlope(actDisp) <= this._sl1) { + this._endJump(); + } + } + else { + actData = this._actionMap.fall; + } + } + } + return actData; + }; + CharacterController.prototype._calcJumpDist = function (speed, dt) { + var js = speed - this._gravity * this._jumpTime; + var jumpDist = js * dt - 0.5 * this._gravity * dt * dt; + return jumpDist; + }; + CharacterController.prototype._endJump = function () { + this._act._jump = false; + this._jumpTime = 0; + this._wasWalking = false; + this._wasRunning = false; + }; + CharacterController.prototype._areVectorsEqual = function (v1, v2, p) { + return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p)); + }; + CharacterController.prototype._verticalSlope = function (v) { + return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z))); + }; + CharacterController.prototype._doMove = function (dt) { + var u = this._movFallTime * this._gravity; + this._freeFallDist = u * dt + this._gravity * dt * dt / 2; + this._movFallTime = this._movFallTime + dt; + var moving = false; + var actdata = null; + if (this._inFreeFall) { + this._moveVector.y = -this._freeFallDist; + moving = true; + } + this._rotateAV2C(); + actdata = this._rotateAVnC(actdata, moving, dt); + if (!this._inFreeFall) { + this._wasWalking = false; + this._wasRunning = false; + var sign = void 0; + var horizDist = 0; + switch (true) { + case (this._act._stepLeft): + sign = this._signLHS_RHS * this._isAvFacingCamera(); + horizDist = this._actionMap.strafeLeft.speed * dt; + if (this._act._speedMod) { + horizDist = this._actionMap.strafeLeftFast.speed * dt; + actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast; + } + else { + actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight; + } + this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0); + moving = true; + break; + case (this._act._stepRight): + sign = -this._signLHS_RHS * this._isAvFacingCamera(); + horizDist = this._actionMap.strafeRight.speed * dt; + if (this._act._speedMod) { + horizDist = this._actionMap.strafeRightFast.speed * dt; + actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast; + } + else { + actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight; + } + this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0); + moving = true; + break; + case (this._act._walk || (this._noRot && this._mode == 0)): + if (this._act._speedMod) { + this._wasRunning = true; + horizDist = this._actionMap.run.speed * dt; + actdata = this._actionMap.run; + } + else { + this._wasWalking = true; + horizDist = this._actionMap.walk.speed * dt; + actdata = this._actionMap.walk; + } + this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist); + moving = true; + break; + case (this._act._walkback): + horizDist = this._actionMap.walkBack.speed * dt; + if (this._act._speedMod) { + horizDist = this._actionMap.walkBackFast.speed * dt; + actdata = this._actionMap.walkBackFast; + } + else { + actdata = this._actionMap.walkBack; + } + this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist); + moving = true; + break; + } + } + if (moving) { + if (this._moveVector.length() > 0.001) { + this._avatar.moveWithCollisions(this._moveVector); + if (this._avatar.position.y > this._avStartPos.y) { + var actDisp = this._avatar.position.subtract(this._avStartPos); + var _slp = this._verticalSlope(actDisp); + if (_slp >= this._sl2) { + if (this._stepOffset > 0) { + if (this._vMoveTot == 0) { + this._vMovStartPos.copyFrom(this._avStartPos); + } + this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y); + if (this._vMoveTot > this._stepOffset) { + this._vMoveTot = 0; + this._avatar.position.copyFrom(this._vMovStartPos); + this._endFreeFall(); + } + } + else { + this._avatar.position.copyFrom(this._avStartPos); + this._endFreeFall(); + } + } + else { + this._vMoveTot = 0; + if (_slp > this._sl1) { + this._fallFrameCount = 0; + this._inFreeFall = false; + } + else { + this._endFreeFall(); + } + } + } + else if ((this._avatar.position.y) < this._avStartPos.y) { + var actDisp = this._avatar.position.subtract(this._avStartPos); + if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) { + if (this._verticalSlope(actDisp) <= this._sl1) { + this._endFreeFall(); + } + else { + this._fallFrameCount = 0; + this._inFreeFall = false; + } + } + else { + this._inFreeFall = true; + this._fallFrameCount++; + if (this._fallFrameCount > this._fallFrameCountMin) { + actdata = this._actionMap.fall; + } + } + } + else { + this._endFreeFall(); + } + } + } + return actdata; + }; + CharacterController.prototype._rotateAV2C = function () { + if (this._hasCam) + if (this._mode != 1) { + var ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0; + if (this._noRot) { + switch (true) { + case (this._act._walk && this._act._turnRight): + this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4; + break; + case (this._act._walk && this._act._turnLeft): + this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4; + break; + case (this._act._walkback && this._act._turnRight): + this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4; + break; + case (this._act._walkback && this._act._turnLeft): + this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4; + break; + case (this._act._walk): + this._avatar.rotation.y = ca; + break; + case (this._act._walkback): + this._avatar.rotation.y = ca + Math.PI; + break; + case (this._act._turnRight): + this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2; + break; + case (this._act._turnLeft): + this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2; + break; + } + } + else { + if (this._hasCam) + this._avatar.rotation.y = ca; + } + } + }; + CharacterController.prototype._rotateAVnC = function (anim, moving, dt) { + if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) { + var turnAngle = this._actionMap.turnLeft.speed * dt; + if (this._act._speedMod) { + turnAngle = 2 * turnAngle; + } + var a = void 0; + if (this._mode == 1) { + if (!this._isTurning) { + this._sign = -this._ffSign * this._isAvFacingCamera(); + if (this._isLHS_RHS) + this._sign = -this._sign; + this._isTurning = true; + } + a = this._sign; + if (this._act._turnLeft) { + if (this._act._walk) { } + else if (this._act._walkback) + a = -this._sign; + else { + anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft; + } + } + else { + if (this._act._walk) + a = -this._sign; + else if (this._act._walkback) { } + else { + a = -this._sign; + anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight; + } + } + } + else { + a = 1; + if (this._act._turnLeft) { + if (this._act._walkback) + a = -1; + if (!moving) + anim = this._actionMap.turnLeft; + } + else { + if (this._act._walk) + a = -1; + if (!moving) { + a = -1; + anim = this._actionMap.turnRight; + } + } + if (this._hasCam) + this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a; + } + this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a; + } + return anim; + }; + CharacterController.prototype._endFreeFall = function () { + this._movFallTime = 0; + this._fallFrameCount = 0; + this._inFreeFall = false; + }; + CharacterController.prototype._doIdle = function (dt) { + if (this._grounded) { + return this._actionMap.idle; + } + this._wasWalking = false; + this._wasRunning = false; + this._movFallTime = 0; + var anim = this._actionMap.idle; + this._fallFrameCount = 0; + if (dt === 0) { + this._freeFallDist = 5; + } + else { + var u = this._idleFallTime * this._gravity; + this._freeFallDist = u * dt + this._gravity * dt * dt / 2; + this._idleFallTime = this._idleFallTime + dt; + } + if (this._freeFallDist < 0.01) + return anim; + var disp = new babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3(0, -this._freeFallDist, 0); + this._avatar.moveWithCollisions(disp); + if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) { + this._groundIt(); + } + else if (this._avatar.position.y < this._avStartPos.y) { + var actDisp = this._avatar.position.subtract(this._avStartPos); + if (!(this._areVectorsEqual(actDisp, disp, 0.001))) { + if (this._verticalSlope(actDisp) <= this._sl1) { + this._groundIt(); + this._avatar.position.copyFrom(this._avStartPos); + } + else { + this._unGroundIt(); + anim = this._actionMap.slideBack; + } + } + else { + anim = this._actionMap.fall; + } + } + return anim; + }; + CharacterController.prototype._groundIt = function () { + this._groundFrameCount++; + if (this._groundFrameCount > this._groundFrameMax) { + this._grounded = true; + this._idleFallTime = 0; + } + }; + CharacterController.prototype._unGroundIt = function () { + this._grounded = false; + this._groundFrameCount = 0; + }; + CharacterController.prototype._updateTargetValue = function () { + if (!this._hasCam) + return; + if (this._vMoveTot == 0) + this._avatar.position.addToRef(this._cameraTarget, this._camera.target); + if (this._camera.radius > this._camera.lowerRadiusLimit) { + if (this._cameraElastic || this._makeInvisible) + this._handleObstruction(); + } + if (this._camera.radius <= this._camera.lowerRadiusLimit) { + if (!this._noFirstPerson && !this._inFP) { + this._makeMeshInvisible(this._avatar); + this._camera.checkCollisions = false; + this._saveMode = this._mode; + this._mode = 0; + this._inFP = true; + } + } + else { + if (this._inFP) { + this._inFP = false; + this._mode = this._saveMode; + this._restoreVisiblity(this._avatar); + this._camera.checkCollisions = this._savedCameraCollision; + } + } + }; + CharacterController.prototype._makeMeshInvisible = function (mesh) { + var _this = this; + this._visiblityMap.set(mesh, mesh.visibility); + mesh.visibility = 0; + mesh.getChildMeshes(false, function (n) { + if (n instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.Mesh) { + _this._visiblityMap.set(n, n.visibility); + n.visibility = 0; + } + return false; + }); + }; + CharacterController.prototype._restoreVisiblity = function (mesh) { + var _this = this; + mesh.visibility = this._visiblityMap.get(mesh); + mesh.getChildMeshes(false, function (n) { + if (n instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.Mesh) + n.visibility = _this._visiblityMap.get(n); + return false; + }); + }; + ; + CharacterController.prototype._handleObstruction = function () { + var _this = this; + this._camera.position.subtractToRef(this._camera.target, this._rayDir); + this._ray.origin = this._camera.target; + this._ray.length = this._rayDir.length(); + this._ray.direction = this._rayDir.normalize(); + var pis = this._scene.multiPickWithRay(this._ray, function (mesh) { + if (mesh == _this._avatar) + return false; + else + return true; + }); + if (this._makeInvisible) { + this._prevPickedMeshes = this._pickedMeshes; + if (pis.length > 0) { + this._pickedMeshes = new Array(); + for (var _i = 0, pis_1 = pis; _i < pis_1.length; _i++) { + var pi = pis_1[_i]; + if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) { + pi.pickedMesh.isVisible = false; + this._pickedMeshes.push(pi.pickedMesh); + } + } + for (var _a = 0, _b = this._prevPickedMeshes; _a < _b.length; _a++) { + var pm = _b[_a]; + if (!this._pickedMeshes.includes(pm)) { + pm.isVisible = true; + } + } + } + else { + for (var _c = 0, _d = this._prevPickedMeshes; _c < _d.length; _c++) { + var pm = _d[_c]; + pm.isVisible = true; + } + this._prevPickedMeshes.length = 0; + } + } + if (this._cameraElastic) { + if (pis.length > 0) { + if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) + return; + var pp = null; + for (var i = 0; i < pis.length; i++) { + var pm = pis[i].pickedMesh; + if (this._isSeeAble(pm)) { + pp = pis[i].pickedPoint; + break; + } + else if (pm.checkCollisions) { + pp = pis[i].pickedPoint; + break; + } + } + if (pp == null) + return; + var c2p = this._camera.position.subtract(pp); + var l = c2p.length(); + if (this._camera.checkCollisions) { + var step = void 0; + if (l <= 1) { + step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin)); + } + else { + step = c2p.normalize().scaleInPlace(l / this._elasticSteps); + } + this._camera.position = this._camera.position.subtract(step); + } + else { + var step = void 0; + if (l <= 1) + step = l + this._cameraSkin; + else + step = l / this._elasticSteps; + this._camera.radius = this._camera.radius - (step); + } + } + } + }; + CharacterController.prototype._isSeeAble = function (mesh) { + if (!mesh.isVisible) + return false; + if (mesh.visibility == 0) + return false; + if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) + return false; + return true; + }; + CharacterController.prototype.anyMovement = function () { + return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight); + }; + CharacterController.prototype._onKeyDown = function (e) { + if (!e.key) + return; + if (e.repeat) + return; + switch (e.key.toLowerCase()) { + case this._actionMap.idleJump.key: + this._act._jump = true; + break; + case "capslock": + this._act._speedMod = !this._act._speedMod; + break; + case "shift": + this._act._speedMod = true; + break; + case "up": + case "arrowup": + case this._actionMap.walk.key: + this._act._walk = true; + break; + case "left": + case "arrowleft": + case this._actionMap.turnLeft.key: + this._act._turnLeft = true; + break; + case "right": + case "arrowright": + case this._actionMap.turnRight.key: + this._act._turnRight = true; + break; + case "down": + case "arrowdown": + case this._actionMap.walkBack.key: + this._act._walkback = true; + break; + case this._actionMap.strafeLeft.key: + this._act._stepLeft = true; + break; + case this._actionMap.strafeRight.key: + this._act._stepRight = true; + break; + } + this._move = this.anyMovement(); + }; + CharacterController.prototype._onKeyUp = function (e) { + if (!e.key) + return; + switch (e.key.toLowerCase()) { + case "shift": + this._act._speedMod = false; + break; + case "up": + case "arrowup": + case this._actionMap.walk.key: + this._act._walk = false; + break; + case "left": + case "arrowleft": + case this._actionMap.turnLeft.key: + this._act._turnLeft = false; + this._isTurning = false; + break; + case "right": + case "arrowright": + case this._actionMap.turnRight.key: + this._act._turnRight = false; + this._isTurning = false; + break; + case "down": + case "arrowdown": + case this._actionMap.walkBack.key: + this._act._walkback = false; + break; + case this._actionMap.strafeLeft.key: + this._act._stepLeft = false; + break; + case this._actionMap.strafeRight.key: + this._act._stepRight = false; + break; + } + this._move = this.anyMovement(); + }; + CharacterController.prototype.isKeyBoardEnabled = function () { + return this._ekb; + }; + CharacterController.prototype.enableKeyBoard = function (b) { + this._ekb = b; + if (b) { + this._addkeylistener(); + } + else { + this._removekeylistener(); + } + }; + CharacterController.prototype._addkeylistener = function () { + var canvas = this._scene.getEngine().getRenderingCanvas(); + canvas.addEventListener("keyup", this._handleKeyUp, false); + canvas.addEventListener("keydown", this._handleKeyDown, false); + }; + CharacterController.prototype._removekeylistener = function () { + var canvas = this._scene.getEngine().getRenderingCanvas(); + canvas.removeEventListener("keyup", this._handleKeyUp, false); + canvas.removeEventListener("keydown", this._handleKeyDown, false); + }; + CharacterController.prototype.walk = function (b) { + this._act._walk = b; + }; + CharacterController.prototype.walkBack = function (b) { + this._act._walkback = b; + }; + CharacterController.prototype.walkBackFast = function (b) { + this._act._walkback = b; + this._act._speedMod = b; + }; + CharacterController.prototype.run = function (b) { + this._act._walk = b; + this._act._speedMod = b; + }; + CharacterController.prototype.turnLeft = function (b) { + this._act._turnLeft = b; + if (!b) + this._isTurning = b; + }; + CharacterController.prototype.turnLeftFast = function (b) { + this._act._turnLeft = b; + if (!b) + this._isTurning = b; + this._act._speedMod = b; + }; + CharacterController.prototype.turnRight = function (b) { + this._act._turnRight = b; + if (!b) + this._isTurning = b; + }; + CharacterController.prototype.turnRightFast = function (b) { + this._act._turnRight = b; + if (!b) + this._isTurning = b; + this._act._speedMod = b; + }; + CharacterController.prototype.strafeLeft = function (b) { + this._act._stepLeft = b; + }; + CharacterController.prototype.strafeLeftFast = function (b) { + this._act._stepLeft = b; + this._act._speedMod = b; + }; + CharacterController.prototype.strafeRight = function (b) { + this._act._stepRight = b; + }; + CharacterController.prototype.strafeRightFast = function (b) { + this._act._stepRight = b; + this._act._speedMod = b; + }; + CharacterController.prototype.jump = function () { + this._act._jump = true; + }; + CharacterController.prototype.fall = function () { + this._grounded = false; + }; + CharacterController.prototype.idle = function () { + this._act.reset(); + }; + CharacterController.prototype.isAg = function () { + return this._isAG; + }; + CharacterController.prototype._findSkel = function (n) { + var root = this._root(n); + if (root instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.Mesh && root.skeleton) + return root.skeleton; + var ms = root.getChildMeshes(false, function (cm) { + if (cm instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.Mesh) { + if (cm.skeleton) { + return true; + } + } + return false; + }); + if (ms.length > 0) + return ms[0].skeleton; + else + return null; + }; + CharacterController.prototype._root = function (tn) { + if (tn.parent == null) + return tn; + return this._root(tn.parent); + }; + CharacterController.prototype.setAvatar = function (avatar, faceForward) { + if (faceForward === void 0) { faceForward = false; } + var rootNode = this._root(avatar); + if (rootNode instanceof babylonjs__WEBPACK_IMPORTED_MODULE_0__.Mesh) { + this._avatar = rootNode; + } + else { + console.error("Cannot move this mesh. The root node of the mesh provided is not a mesh"); + return false; + } + this._skeleton = this._findSkel(avatar); + this._isAG = this._containsAG(avatar, this._scene.animationGroups, true); + this._actionMap.reset(); + if (!this._isAG && this._skeleton != null) + this._checkAnimRanges(this._skeleton); + this._setRHS(avatar); + this.setFaceForward(faceForward); + return true; + }; + CharacterController.prototype.getAvatar = function () { + return this._avatar; + }; + CharacterController.prototype.setAvatarSkeleton = function (skeleton) { + this._skeleton = skeleton; + if (this._skeleton != null && this._skelDrivenByAG(skeleton)) + this._isAG = true; + else + this._isAG = false; + if (!this._isAG && this._skeleton != null) + this._checkAnimRanges(this._skeleton); + }; + CharacterController.prototype._skelDrivenByAG = function (skeleton) { + var _this = this; + return skeleton.animations.some(function (sa) { return _this._scene.animationGroups.some(function (ag) { return ag.children.some(function (ta) { return ta.animation == sa; }); }); }); + }; + CharacterController.prototype.getSkeleton = function () { + return this._skeleton; + }; + return CharacterController; +}()); + +var _Action = (function () { + function _Action() { + this._walk = false; + this._walkback = false; + this._turnRight = false; + this._turnLeft = false; + this._stepRight = false; + this._stepLeft = false; + this._jump = false; + this._speedMod = false; + this.reset(); + } + _Action.prototype.reset = function () { + this._walk = false; + this._walkback = false; + this._turnRight = false; + this._turnLeft = false; + this._stepRight = false; + this._stepLeft = false; + this._jump = false; + this._speedMod = false; + }; + return _Action; +}()); +var ActionData = (function () { + function ActionData(id, speed, key) { + if (speed === void 0) { speed = 1; } + this.name = ""; + this.loop = true; + this.rate = 1; + this.exist = false; + this.id = id; + this.speed = speed; + this.ds = speed; + this.key = key; + this.dk = key; + } + ActionData.prototype.reset = function () { + this.name = ""; + this.speed = this.ds; + this.key = this.dk; + this.loop = true; + this.rate = 1; + this.sound = null; + this.exist = false; + }; + return ActionData; +}()); + +var ActionMap = (function () { + function ActionMap() { + this.walk = new ActionData("walk", 3, "w"); + this.walkBack = new ActionData("walkBack", 1.5, "s"); + this.walkBackFast = new ActionData("walkBackFast", 3, "na"); + this.idle = new ActionData("idle", 0, "na"); + this.idleJump = new ActionData("idleJump", 6, " "); + this.run = new ActionData("run", 6, "na"); + this.runJump = new ActionData("runJump", 6, "na"); + this.fall = new ActionData("fall", 0, "na"); + this.turnLeft = new ActionData("turnLeft", Math.PI / 8, "a"); + this.turnLeftFast = new ActionData("turnLeftFast", Math.PI / 4, "na"); + this.turnRight = new ActionData("turnRight", Math.PI / 8, "d"); + this.turnRightFast = new ActionData("turnRightFast", Math.PI / 4, "na"); + this.strafeLeft = new ActionData("strafeLeft", 1.5, "q"); + this.strafeLeftFast = new ActionData("strafeLeftFast", 3, "na"); + this.strafeRight = new ActionData("strafeRight", 1.5, "e"); + this.strafeRightFast = new ActionData("strafeRightFast", 3, "na"); + this.slideBack = new ActionData("slideBack", 0, "na"); + } + ActionMap.prototype.reset = function () { + var keys = Object.keys(this); + for (var _i = 0, keys_6 = keys; _i < keys_6.length; _i++) { + var key = keys_6[_i]; + var act = this[key]; + if (!(act instanceof ActionData)) + continue; + act.reset(); + } + }; + return ActionMap; +}()); + +; +var CCSettings = (function () { + function CCSettings() { + this.cameraElastic = true; + this.makeInvisble = true; + this.cameraTarget = babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3.Zero(); + this.noFirstPerson = false; + this.topDown = true; + this.turningOff = true; + this.keyboard = true; + } + return CCSettings; +}()); + + +})(); + +/******/ return __webpack_exports__; +/******/ })() +; +}); +//# sourceMappingURL=CharacterController.max.js.map \ No newline at end of file diff --git a/dist-old/CharacterController.max.js.map b/dist-old/CharacterController.max.js.map new file mode 100644 index 0000000..899c19b --- /dev/null +++ b/dist-old/CharacterController.max.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CharacterController.max.js","mappings":"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","sources":["webpack://babylonjs-charactercontroller/webpack/universalModuleDefinition","webpack://babylonjs-charactercontroller/external umd {\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\",\"root\":\"BABYLON\"}","webpack://babylonjs-charactercontroller/webpack/bootstrap","webpack://babylonjs-charactercontroller/webpack/runtime/compat get default export","webpack://babylonjs-charactercontroller/webpack/runtime/define property getters","webpack://babylonjs-charactercontroller/webpack/runtime/hasOwnProperty shorthand","webpack://babylonjs-charactercontroller/webpack/runtime/make namespace object","webpack://babylonjs-charactercontroller/./src/CharacterController.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"babylonjs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"babylonjs\")) : factory(root[\"BABYLON\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, (__WEBPACK_EXTERNAL_MODULE_babylonjs__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\r\n Skeleton,\r\n ArcRotateCamera,\r\n Vector3,\r\n Mesh,\r\n Node,\r\n Scene,\r\n Ray,\r\n PickingInfo,\r\n AnimationGroup,\r\n TransformNode,\r\n TargetedAnimation,\r\n Matrix,\r\n DeepImmutable,\r\n AbstractMesh,\r\n PlaySoundAction,\r\n InstancedMesh,\r\n Sound,\r\n AnimationRange,\r\n Animatable,\r\n AnimationEvent,\r\n int\r\n} from \"babylonjs\";\r\n\r\n\r\nexport class CharacterController {\r\n\r\n private _avatar: Mesh = null;\r\n private _skeleton: Skeleton = null;\r\n private _camera: ArcRotateCamera;\r\n private _scene: Scene;\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n\r\n private _gravity: number = 9.8;\r\n //slopeLimit in degrees\r\n private _minSlopeLimit: number = 30;\r\n private _maxSlopeLimit: number = 45;\r\n //slopeLimit in radians\r\n private _sl1: number = Math.PI * this._minSlopeLimit / 180;\r\n private _sl2: number = Math.PI * this._maxSlopeLimit / 180;\r\n\r\n //The av will step up a stair only if it is closer to the ground than the indicated value.\r\n private _stepOffset: number = 0.25;\r\n //toal amount by which the av has moved up\r\n private _vMoveTot: number = 0;\r\n //position of av when it started moving up\r\n private _vMovStartPos: Vector3 = Vector3.Zero();\r\n\r\n\r\n private _actionMap: ActionMap = new ActionMap();\r\n\r\n private _cameraElastic: boolean = true;\r\n private _cameraTarget: Vector3 = Vector3.Zero();\r\n //should we go into first person view when camera is near avatar (radius is lowerradius limit)\r\n private _noFirstPerson: boolean = false;\r\n\r\n\r\n\r\n public setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number) {\r\n this._minSlopeLimit = minSlopeLimit;\r\n this._maxSlopeLimit = maxSlopeLimit;\r\n\r\n this._sl1 = Math.PI * this._minSlopeLimit / 180;\r\n this._sl2 = Math.PI * this._maxSlopeLimit / 180;\r\n }\r\n\r\n /**\r\n * The av will step up a stair only if it is closer to the ground than the indicated value.\r\n * Default value is 0.25 m\r\n */\r\n public setStepOffset(stepOffset: number) {\r\n this._stepOffset = stepOffset;\r\n }\r\n\r\n public setWalkSpeed(n: number) {\r\n this._actionMap.walk.speed = n;\r\n }\r\n public setRunSpeed(n: number) {\r\n this._actionMap.run.speed = n;\r\n }\r\n public setBackSpeed(n: number) {\r\n this._actionMap.walkBack.speed = n;\r\n }\r\n public setBackFastSpeed(n: number) {\r\n this._actionMap.walkBackFast.speed = n;\r\n }\r\n public setJumpSpeed(n: number) {\r\n this._actionMap.idleJump.speed = n;\r\n this._actionMap.runJump.speed = n;\r\n }\r\n public setLeftSpeed(n: number) {\r\n this._actionMap.strafeLeft.speed = n;\r\n }\r\n public setLeftFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n public setRightSpeed(n: number) {\r\n this._actionMap.strafeRight.speed = n;\r\n }\r\n public setRightFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n // get turnSpeed in degrees per second.\r\n // store in radians per second\r\n public setTurnSpeed(n: number) {\r\n this._actionMap.turnLeft.speed = n * Math.PI / 180;\r\n this._actionMap.turnRight.speed = n * Math.PI / 180;\r\n }\r\n public setTurnFastSpeed(n: number) {\r\n this._actionMap.turnLeftFast.speed = n * Math.PI / 180;\r\n this._actionMap.turnRightFast.speed = n * Math.PI / 180;\r\n }\r\n public setGravity(n: number) {\r\n this._gravity = n;\r\n }\r\n\r\n /**\r\n * Use this to provide animationGroups to the character controller.\r\n * Provide the AnimationGroups using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animationGroup.\r\n * Example:\r\n * let myWalkAnimationGroup:AnimationGroup = ...;\r\n * let agMap:{} = {\r\n * \"walk\":myWalkAnimationGroup,\r\n * \"run\" : {\"ag\":myRunAnimationGroup,\"rate\":1},\r\n * \"idle\" : {\"ag\":myIdleAnimationGroup,\"loop\":true,\"rate\":1},\r\n * ....\r\n * ....\r\n * }\r\n * \r\n * @param agMap a map of character controller animation name to animationGroup\r\n */\r\n public setAnimationGroups(agMap: {}) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n this._isAG = true;\r\n this.setActionMap(agMap);\r\n }\r\n\r\n /**\r\n * Use this to provide AnimationRanges to the character controller.\r\n * Provide the AnimationRanges using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animation range name or an object with animation range data.\r\n * example:\r\n * let arMap = {\r\n * \"walk\":\"myWalk\",\r\n * \"run\" : {\"name\":\"myRun\",\"rate\":1},\r\n * \"idle\" : {\"name\":\"myIdle\",\"loop\":true,\"rate\":1},\r\n * ....\r\n * }\r\n * \r\n * @param arMap a map of character controller animation name to animationRange data\r\n */\r\n\r\n public setAnimationRanges(arMap: {}) {\r\n this._isAG = false;\r\n this.setActionMap(arMap);\r\n }\r\n\r\n /**\r\n * updates action data in the cc actionMap\r\n * with action data from the provided/input actionMap \r\n * \r\n * \r\n * return \"ar\" or \"ag\" depending on if the data provided\r\n * was animation range or animation group data respt.\r\n * \r\n * TODO should validate provided data.\r\n * In other words if animation range provided make sure\r\n * the range exist in the skeleton\r\n * or if animation group provided make sure the animation group\r\n * can be played on this avataor\r\n * \r\n * @param inActMap \r\n * @returns \r\n */\r\n public setActionMap(inActMap: ActionMap): string {\r\n let agMap: boolean = false;\r\n let inActData: ActionData;\r\n\r\n\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.exist = false;\r\n\r\n inActData = inActMap[ccActData.id];\r\n //in previous version of cc the key value was AnimationGroup rather than ActionData\r\n //lets accomodate that for backward compatibility\r\n if (inActData != null) {\r\n if (inActData instanceof AnimationGroup) {\r\n ccActData.ag = inActData;\r\n ccActData.name = ccActData.ag.name;\r\n ccActData.exist = true;\r\n agMap = true;\r\n this._hasAnims = true;\r\n } else if (inActData.exist) {\r\n this._hasAnims = true;\r\n ccActData.exist = true;\r\n if (inActData instanceof Object) {\r\n if (inActData.ag) {\r\n ccActData.ag = inActData.ag;\r\n agMap = true;\r\n }\r\n if (inActData.name) {\r\n ccActData.name = inActData.name;\r\n }\r\n if (inActData.loop != null) ccActData.loop = inActData.loop;\r\n if (inActData.rate) ccActData.rate = inActData.rate;\r\n if (inActData.speed) ccActData.speed = inActData.speed;\r\n // if (actDataI.key) actDataO.key = actDataI.key;\r\n if (inActData.sound) ccActData.sound = inActData.sound;\r\n } else {\r\n ccActData.name = inActData;\r\n }\r\n }\r\n }\r\n }\r\n this._checkFastAnims();\r\n //force to play new anims\r\n this._prevActData = null;\r\n if (agMap) return \"ag\"; else return \"ar\";\r\n }\r\n\r\n public getActionMap(): ActionMap {\r\n let map: ActionMap = new ActionMap();\r\n\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let actDataI = this._actionMap[key];\r\n\r\n if (!(actDataI instanceof ActionData)) continue;\r\n if (!actDataI.exist) continue;\r\n\r\n let actDataO: ActionData = map[actDataI.id];\r\n actDataO.ag = actDataI.ag;\r\n actDataO.name = actDataI.name;\r\n actDataO.loop = actDataI.loop;\r\n actDataO.rate = actDataI.rate;\r\n actDataO.speed = actDataI.speed;\r\n actDataO.key = actDataI.key;\r\n actDataO.sound = actDataI.sound;\r\n actDataO.exist = actDataI.exist;\r\n }\r\n\r\n return map;\r\n }\r\n\r\n public getSettings(): CCSettings {\r\n let ccs: CCSettings = new CCSettings();\r\n ccs.faceForward = this.isFaceForward();\r\n ccs.topDown = this.getMode() == 1 ? true : false;\r\n ccs.turningOff = this.isTurningOff();\r\n ccs.cameraTarget = this._cameraTarget.clone();\r\n ccs.cameraElastic = this._cameraElastic;\r\n ccs.elasticSteps = this._elasticSteps;\r\n ccs.makeInvisble = this._makeInvisible;\r\n ccs.gravity = this._gravity;\r\n ccs.keyboard = this._ekb;\r\n ccs.maxSlopeLimit = this._maxSlopeLimit;\r\n ccs.minSlopeLimit = this._minSlopeLimit;\r\n ccs.noFirstPerson = this._noFirstPerson;\r\n ccs.stepOffset = this._stepOffset;\r\n ccs.sound = this._stepSound;\r\n\r\n return ccs;\r\n }\r\n\r\n public setSettings(ccs: CCSettings) {\r\n this.setFaceForward(ccs.faceForward);\r\n this.setMode(ccs.topDown ? 1 : 0);\r\n this.setTurningOff(ccs.turningOff);\r\n this.setCameraTarget(ccs.cameraTarget);\r\n this.setCameraElasticity(ccs.cameraElastic);\r\n this.setElasticiSteps(ccs.elasticSteps);\r\n this.makeObstructionInvisible(ccs.makeInvisble);\r\n this.setGravity(ccs.gravity);\r\n this.enableKeyBoard(ccs.keyboard);\r\n this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit);\r\n this.setNoFirstPerson(ccs.noFirstPerson);\r\n this.setStepOffset(ccs.stepOffset);\r\n this.setSound(ccs.sound);\r\n\r\n }\r\n\r\n private _setAnim(anim: ActionData, animName?: string | AnimationGroup, rate?: number, loop?: boolean) {\r\n\r\n //animation range need skeleton\r\n if (!this._isAG && this._skeleton == null) return;\r\n\r\n if (animName != null) {\r\n if (this._isAG) {\r\n if (!(animName instanceof AnimationGroup)) return;\r\n anim.ag = animName;\r\n anim.exist = true;\r\n } else {\r\n if (this._skeleton.getAnimationRange(anim.name) != null) {\r\n anim.name = animName;\r\n anim.exist = true;\r\n } else {\r\n anim.exist = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (loop != null) anim.loop = loop;\r\n if (rate != null) anim.rate = rate;\r\n }\r\n\r\n public enableBlending(n: number) {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let act = this._actionMap[key];\r\n if (!(act instanceof ActionData)) continue;\r\n if (act.exist) {\r\n let ar: AnimationGroup = act.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = true;\r\n ta.animation.blendingSpeed = n;\r\n }\r\n }\r\n }\r\n } else {\r\n if (this._skeleton !== null)\r\n this._skeleton.enableBlending(n);\r\n }\r\n }\r\n\r\n public disableBlending() {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (anim.exist) {\r\n let ar: AnimationGroup = anim.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //setters for animations\r\n public setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walk, rangeName, rate, loop);\r\n }\r\n public setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.run, rangeName, rate, loop);\r\n }\r\n public setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBack, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack);\r\n }\r\n public setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop);\r\n }\r\n public setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.slideBack, rangeName, rate, loop);\r\n }\r\n public setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idle, rangeName, rate, loop);\r\n }\r\n public setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n }\r\n public setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop);\r\n }\r\n public setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n }\r\n public setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop);\r\n }\r\n public setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n }\r\n public setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop);\r\n }\r\n public setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n public setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop);\r\n }\r\n public setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idleJump, rangeName, rate, loop);\r\n }\r\n public setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.runJump, rangeName, rate, loop);\r\n }\r\n public setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.fall, rangeName, rate, loop);\r\n }\r\n\r\n\r\n _stepSound: Sound;\r\n // setters for sound\r\n public setSound(sound: Sound) {\r\n if (sound == null) return;\r\n this._stepSound = sound;\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n sound.loop = false;\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.sound = sound;\r\n ccActData.sound.attachToMesh(this._avatar);\r\n }\r\n this._actionMap.idle.sound = null;\r\n this._actionMap.fall.sound = null;\r\n this._actionMap.slideBack.sound = null;\r\n }\r\n\r\n\r\n // setters for keys\r\n public setWalkKey(key: string) {\r\n this._actionMap.walk.key = key.toLowerCase();\r\n }\r\n public setWalkBackKey(key: string) {\r\n this._actionMap.walkBack.key = key.toLowerCase();\r\n }\r\n public setTurnLeftKey(key: string) {\r\n this._actionMap.turnLeft.key = key.toLowerCase();\r\n }\r\n public setTurnRightKey(key: string) {\r\n this._actionMap.turnRight.key = key.toLowerCase();\r\n }\r\n public setStrafeLeftKey(key: string) {\r\n this._actionMap.strafeLeft.key = key.toLowerCase();\r\n }\r\n public setStrafeRightKey(key: string) {\r\n this._actionMap.strafeRight.key = key.toLowerCase();\r\n }\r\n public setJumpKey(key: string) {\r\n this._actionMap.idleJump.key = key.toLowerCase();\r\n }\r\n\r\n public setCameraElasticity(b: boolean) {\r\n this._cameraElastic = b;\r\n }\r\n\r\n public setElasticiSteps(n: number) {\r\n this._elasticSteps = n;\r\n }\r\n\r\n public makeObstructionInvisible(b: boolean) {\r\n this._makeInvisible = b;\r\n }\r\n public setCameraTarget(v: Vector3) {\r\n this._cameraTarget.copyFrom(v);\r\n }\r\n\r\n\r\n /**\r\n * user should call this whenever the user changes the camera checkCollision \r\n * property\r\n * \r\n */\r\n public cameraCollisionChanged() {\r\n this._savedCameraCollision = this._camera.checkCollisions;\r\n }\r\n public setNoFirstPerson(b: boolean) {\r\n this._noFirstPerson = b;\r\n }\r\n\r\n /**\r\n * if av has the required anim (walk, run etc) then \r\n * mark that anim as existing\r\n * \r\n * @param skel \r\n */\r\n\r\n private _checkAnimRanges(skel: Skeleton) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (skel != null) {\r\n if (skel.getAnimationRange(anim.id) != null) {\r\n anim.name = anim.id;\r\n anim.exist = true;\r\n this._hasAnims = true;\r\n }\r\n } else {\r\n anim.exist = false;\r\n }\r\n }\r\n this._checkFastAnims();\r\n }\r\n\r\n /**\r\n * if fast anims do not exist then use their slow counterpart as them but double the rate at which they play\r\n */\r\n private _checkFastAnims() {\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack)\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n\r\n private _copySlowAnims(f: ActionData, s: ActionData) {\r\n if (f.exist) return;\r\n if (!s.exist) return;\r\n f.exist = true;\r\n f.ag = s.ag;\r\n f.name = s.name;\r\n f.rate = s.rate * 2;\r\n }\r\n\r\n /**\r\n * Use this to make the character controller suitable for a isometeric/top down games or fps/third person game.\r\n * 1 In isometric/top down games the camera direction has no bearing on avatar movement.\r\n * 0 In fps/third person game rotating the camera around the avatar , rotates the avatar too.\r\n * \r\n * cannot switch mode to 0 if no camera avaiable.\r\n */\r\n private _mode = 0;\r\n private _saveMode = 0;\r\n public setMode(n: number) {\r\n //cannot switch mode to 0 if no camera avaiable.\r\n if (this._hasCam) {\r\n this._mode = n;\r\n this._saveMode = n;\r\n } else {\r\n this._mode = 1;\r\n this._saveMode = 1;\r\n }\r\n }\r\n public getMode() {\r\n return this._mode;\r\n }\r\n /**\r\n * Use this to set turning off.\r\n * When turining is off \r\n * a) turn left or turn right keys result in avatar facing and moving left or right with respect to camera.\r\n * b) walkback/runback key results in avatar facing back and walking/running towards camera.\r\n * \r\n * This setting has no effect when mode is 1.\r\n * \r\n * @param b \r\n */\r\n public setTurningOff(b: boolean) {\r\n this._noRot = b;\r\n }\r\n public isTurningOff() {\r\n return this._noRot;\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * BABYLONJS GLB models are RHS and exhibit this behavior\r\n * \r\n */\r\n private _isLHS_RHS = false;\r\n private _signLHS_RHS = -1;\r\n private _setRHS(mesh: TransformNode) {\r\n const meshMatrix: Matrix = mesh.getWorldMatrix();\r\n const _localX = Vector3.FromArray(meshMatrix.m, 0);\r\n const _localY = Vector3.FromArray(meshMatrix.m, 4);\r\n const _localZ = Vector3.FromArray(meshMatrix.m, 8);\r\n const actualZ = Vector3.Cross(_localX, _localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, _localZ) < 0) {\r\n this._isLHS_RHS = true;\r\n this._signLHS_RHS = 1;\r\n }\r\n else {\r\n this._isLHS_RHS = false;\r\n this._signLHS_RHS = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Use setFaceForward(true|false) to indicate that the avatar's face points forward (true) or backward (false).\r\n * The avatar's face points forward if its face is looking in positive local Z axis direction\r\n */\r\n private _ffSign: number;\r\n private _rhsSign: number;\r\n private _ff: boolean;\r\n //in mode 0, av2cam is used to align avatar with camera , with camera always facing avatar's back\r\n //note:camera alpha is measured anti-clockwise , avatar rotation is measured clockwise \r\n private _av2cam;\r\n public setFaceForward(b: boolean) {\r\n this._ff = b;\r\n\r\n this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1;\r\n\r\n if (!this._hasCam) {\r\n this._av2cam = 0;\r\n this._ffSign = 1;\r\n return;\r\n }\r\n\r\n if (this._isLHS_RHS) {\r\n this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2;\r\n this._ffSign = b ? 1 : -1;\r\n } else {\r\n this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2;\r\n this._ffSign = b ? -1 : 1;\r\n }\r\n\r\n }\r\n\r\n public isFaceForward() {\r\n return this._ff;\r\n }\r\n\r\n private checkAGs(agMap: {}) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (agMap[anim.name] != null) {\r\n anim.ag = agMap[anim.name];\r\n anim.exist = true;\r\n }\r\n }\r\n }\r\n\r\n // check if any of the mesh on the node tree is refrenced by any animation group\r\n private _containsAG(node: Node, ags: AnimationGroup[], fromRoot: boolean) {\r\n let r: Node;\r\n let ns: Node[];\r\n\r\n if (fromRoot) {\r\n r = this._getRoot(node);\r\n ns = r.getChildren((n) => { return (n instanceof TransformNode) }, false);\r\n } else {\r\n r = node;\r\n ns = [r];\r\n }\r\n\r\n for (let ag of ags) {\r\n let tas: TargetedAnimation[] = ag.targetedAnimations;\r\n for (let ta of tas) {\r\n if (ns.indexOf(ta.target) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //get the root of Node\r\n private _getRoot(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._getRoot(tn.parent);\r\n }\r\n\r\n private _started: boolean = false;\r\n public start() {\r\n if (this._started) return;\r\n this._started = true;\r\n this._act.reset();\r\n this._movFallTime = 0;\r\n //first time we enter render loop, delta time is zero\r\n this._idleFallTime = 0.001;\r\n this._grounded = false;\r\n this._updateTargetValue();\r\n if (this._ekb) this._addkeylistener();\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public stop() {\r\n if (!this._started) return;\r\n this._started = false;\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this._removekeylistener();\r\n this._prevActData = null;\r\n }\r\n\r\n /**\r\n * use pauseAnim to stop the charactere controller from playing\r\n * any animation on the character\r\n * use this when you want to play your animation instead\r\n * see also resumeAnim()\r\n */\r\n private _stopAnim: boolean = false;\r\n public pauseAnim() {\r\n this._stopAnim = true;\r\n\r\n if (this._prevActData != null && this._prevActData.exist) {\r\n //stop current animation\r\n if (this._isAG) {\r\n this._prevActData.ag.stop();\r\n } else {\r\n //this._scene.stopAnimation(this._skeleton, this._prevActData.name);\r\n this._scene.stopAnimation(this._skeleton);\r\n //this._scene.stopAllAnimations();\r\n }\r\n //stop current sound\r\n if (this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n }\r\n }\r\n\r\n /**\r\n * use resumeAnim to resume the character controller playing\r\n * animations on the character.\r\n * see also pauseAnim()\r\n */\r\n public resumeAnim() {\r\n this._stopAnim = false;\r\n this._prevActData = null;\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n private _prevActData: ActionData = null;\r\n private _avStartPos: Vector3 = Vector3.Zero();\r\n private _grounded: boolean = false;\r\n //distance by which AV would move down if in freefall\r\n private _freeFallDist: number = 0;\r\n\r\n //how many minimum contiguos frames should the AV have been in free fall\r\n //before we assume AV is in big freefall.\r\n //we will use this to remove animation flicker during move down a slope (fall, move, fall move etc)\r\n //TODO: base this on slope - large slope large count\r\n private _fallFrameCountMin: number = 50;\r\n private _fallFrameCount: number = 0;\r\n\r\n private _inFreeFall: boolean = false;\r\n private _wasWalking: boolean = false;\r\n private _wasRunning: boolean = false;\r\n private _moveVector: Vector3;\r\n\r\n //used only in mode 1\r\n //value 1 or -1 , -1 if avatar is facing camera\r\n //private _notFacingCamera = 1;\r\n\r\n private _isAvFacingCamera(): number {\r\n if (!this._hasCam) return 1;\r\n if (Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) return 1\r\n else return -1;\r\n }\r\n\r\n private _moveAVandCamera() {\r\n this._avStartPos.copyFrom(this._avatar.position);\r\n let actData: ActionData = null;\r\n const dt: number = this._scene.getEngine().getDeltaTime() / 1000;\r\n\r\n if (this._act._jump && !this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doJump(dt);\r\n } else if (this.anyMovement() || this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doMove(dt);\r\n } else if (!this._inFreeFall) {\r\n actData = this._doIdle(dt);\r\n }\r\n if (!this._stopAnim && this._hasAnims && actData != null) {\r\n if (this._prevActData !== actData) {\r\n if (actData.exist) {\r\n\r\n //animation frame counts\r\n let c: number;\r\n let fps: number = 30;\r\n\r\n if (this._isAG) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n actData.ag.start(actData.loop, actData.rate);\r\n fps = actData.ag.targetedAnimations[0].animation.framePerSecond;\r\n c = (actData.ag.to - actData.ag.from);\r\n } else {\r\n let a: Animatable = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate);\r\n fps = a.getAnimations()[0].animation.framePerSecond;\r\n c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from;\r\n }\r\n\r\n //SOUND\r\n //TODO do sound as animationevent.\r\n if (this._prevActData != null && this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n if (actData.sound != null) {\r\n actData.sound.play();\r\n //play sound twice during the animation\r\n this._sndId = setInterval(() => { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2));\r\n }\r\n }\r\n this._prevActData = actData;\r\n }\r\n }\r\n this._updateTargetValue();\r\n return;\r\n }\r\n\r\n private _soundLoopTime = 700;\r\n private _sndId = null;\r\n\r\n //verical position of AV when it is about to start a jump\r\n private _jumpStartPosY: number = 0;\r\n //for how long the AV has been in the jump\r\n private _jumpTime: number = 0;\r\n private _doJump(dt: number): ActionData {\r\n\r\n let actData: ActionData = null;\r\n actData = this._actionMap.runJump;\r\n if (this._jumpTime === 0) {\r\n this._jumpStartPosY = this._avatar.position.y;\r\n }\r\n\r\n this._jumpTime = this._jumpTime + dt;\r\n\r\n let forwardDist: number = 0;\r\n let jumpDist: number = 0;\r\n let disp: Vector3;\r\n\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n if (this._wasRunning || this._wasWalking) {\r\n if (this._wasRunning) {\r\n forwardDist = this._actionMap.run.speed * dt;\r\n } else if (this._wasWalking) {\r\n forwardDist = this._actionMap.walk.speed * dt;\r\n }\r\n //find out in which horizontal direction the AV was moving when it started the jump\r\n disp = this._moveVector.clone();\r\n disp.y = 0;\r\n disp = disp.normalize();\r\n disp.scaleToRef(forwardDist, disp);\r\n jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt);\r\n disp.y = jumpDist;\r\n } else {\r\n jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt);\r\n disp = new Vector3(0, jumpDist, 0);\r\n actData = this._actionMap.idleJump;\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y/2;\r\n }\r\n //moveWithCollision only seems to happen if length of displacment is atleast 0.001\r\n this._avatar.moveWithCollisions(disp);\r\n if (jumpDist < 0) {\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y;\r\n //check if going up a slope or back on flat ground \r\n if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) {\r\n this._endJump();\r\n } else if (this._avatar.position.y < this._jumpStartPosY) {\r\n //the avatar is below the point from where it started the jump\r\n //so it is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than acceptable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endJump();\r\n }\r\n } else {\r\n actData = this._actionMap.fall;\r\n }\r\n }\r\n }\r\n return actData;\r\n }\r\n\r\n private _calcJumpDist(speed: number, dt: number): number {\r\n //up velocity at the begining of the lastt frame (v=u+at)\r\n let js: number = speed - this._gravity * this._jumpTime;\r\n //distance travelled up since last frame to this frame (s=ut+1/2*at^2)\r\n let jumpDist: number = js * dt - 0.5 * this._gravity * dt * dt;\r\n return jumpDist;\r\n }\r\n\r\n /**\r\n * does cleanup at the end of a jump\r\n */\r\n private _endJump() {\r\n this._act._jump = false;\r\n this._jumpTime = 0;\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n }\r\n\r\n /**\r\n * checks if two vectors v1 and v2 are equal within a precision of p\r\n */\r\n private _areVectorsEqual(v1: Vector3, v2: Vector3, p: number) {\r\n return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p));\r\n }\r\n\r\n /*\r\n * returns the slope (in radians) of a vector in the vertical plane\r\n */\r\n private _verticalSlope(v: Vector3): number {\r\n return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z)));\r\n }\r\n\r\n //for how long has the av been falling while moving\r\n private _movFallTime: number = 0;\r\n private _sign = 1;\r\n private _isTurning = false;\r\n private _noRot = false;\r\n private _doMove(dt: number): ActionData {\r\n\r\n //initial down velocity\r\n const u: number = this._movFallTime * this._gravity\r\n //calculate the distance by which av should fall down since last frame\r\n //assuming it is in freefall\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n\r\n this._movFallTime = this._movFallTime + dt;\r\n\r\n let moving: boolean = false;\r\n let actdata: ActionData = null;\r\n\r\n if (this._inFreeFall) {\r\n this._moveVector.y = -this._freeFallDist;\r\n moving = true;\r\n }\r\n\r\n\r\n //rotate avatar with respect to camera direction. \r\n this._rotateAV2C();\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n actdata = this._rotateAVnC(actdata, moving, dt);\r\n\r\n //now that avatar is rotated properly, construct the vector to move the avatar \r\n //donot move the avatar if avatar is in freefall\r\n\r\n if (!this._inFreeFall) {\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n\r\n let sign: number;\r\n let horizDist: number = 0;\r\n switch (true) {\r\n case (this._act._stepLeft):\r\n sign = this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeLeftFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._stepRight):\r\n sign = -this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeRight.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeRightFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._walk || (this._noRot && this._mode == 0)):\r\n if (this._act._speedMod) {\r\n this._wasRunning = true;\r\n horizDist = this._actionMap.run.speed * dt;\r\n actdata = this._actionMap.run;\r\n } else {\r\n this._wasWalking = true;\r\n horizDist = this._actionMap.walk.speed * dt;\r\n actdata = this._actionMap.walk;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n case (this._act._walkback):\r\n horizDist = this._actionMap.walkBack.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.walkBackFast.speed * dt;\r\n actdata = this._actionMap.walkBackFast;\r\n } else {\r\n actdata = this._actionMap.walkBack;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n }\r\n }\r\n\r\n // move the avatar\r\n\r\n if (moving) {\r\n if (this._moveVector.length() > 0.001) {\r\n this._avatar.moveWithCollisions(this._moveVector);\r\n //walking up a slope\r\n if (this._avatar.position.y > this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n const _slp: number = this._verticalSlope(actDisp);\r\n if (_slp >= this._sl2) {\r\n //this._climbingSteps=true;\r\n //is av trying to go up steps\r\n if (this._stepOffset > 0) {\r\n if (this._vMoveTot == 0) {\r\n //if just started climbing note down the position\r\n this._vMovStartPos.copyFrom(this._avStartPos);\r\n }\r\n this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y);\r\n if (this._vMoveTot > this._stepOffset) {\r\n //move av back to its position at begining of steps\r\n this._vMoveTot = 0;\r\n this._avatar.position.copyFrom(this._vMovStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n //move av back to old position\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n this._vMoveTot = 0;\r\n if (_slp > this._sl1) {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n } else {\r\n //continue walking\r\n this._endFreeFall();\r\n }\r\n }\r\n } else if ((this._avatar.position.y) < this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or walk?\r\n //if slope is less steeper than acceptable then walk else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endFreeFall();\r\n } else {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n } else {\r\n this._inFreeFall = true;\r\n this._fallFrameCount++;\r\n //AV could be running down a slope which mean freefall,run,frefall run ...\r\n //to remove anim flicker, check if AV has been falling down continously for last few consecutive frames\r\n //before changing to free fall animation\r\n if (this._fallFrameCount > this._fallFrameCountMin) {\r\n actdata = this._actionMap.fall;\r\n }\r\n }\r\n } else {\r\n this._endFreeFall();\r\n }\r\n }\r\n }\r\n return actdata;\r\n }\r\n\r\n /**\r\n * rotate avatar with respect to camera direction. \r\n */\r\n private _rotateAV2C() {\r\n if (this._hasCam)\r\n if (this._mode != 1) {\r\n let ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0;\r\n if (this._noRot) {\r\n switch (true) {\r\n case (this._act._walk && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walk && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walk):\r\n this._avatar.rotation.y = ca;\r\n break;\r\n case (this._act._walkback):\r\n this._avatar.rotation.y = ca + Math.PI;\r\n break;\r\n case (this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2;\r\n break;\r\n case (this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2;\r\n break;\r\n }\r\n } else {\r\n if (this._hasCam)\r\n this._avatar.rotation.y = ca;\r\n }\r\n }\r\n }\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n private _rotateAVnC(anim: ActionData, moving: boolean, dt: number): ActionData {\r\n if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) {\r\n let turnAngle = this._actionMap.turnLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n turnAngle = 2 * turnAngle;\r\n }\r\n let a;\r\n if (this._mode == 1) {\r\n // while turining, the avatar could start facing away from camera and end up facing camera.\r\n // we should not switch turning direction during this transition\r\n if (!this._isTurning) {\r\n // if (this._act.name != this._act.prevName) {\r\n // this._act.prevName = this._act.name;\r\n this._sign = -this._ffSign * this._isAvFacingCamera();\r\n if (this._isLHS_RHS) this._sign = - this._sign;\r\n this._isTurning = true;\r\n }\r\n a = this._sign;\r\n if (this._act._turnLeft) {\r\n if (this._act._walk) { }\r\n else if (this._act._walkback) a = -this._sign;\r\n else {\r\n anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft;\r\n }\r\n } else {\r\n if (this._act._walk) a = -this._sign;\r\n else if (this._act._walkback) { }\r\n else {\r\n a = -this._sign;\r\n anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight;\r\n }\r\n }\r\n } else {\r\n a = 1;\r\n if (this._act._turnLeft) {\r\n if (this._act._walkback) a = -1;\r\n if (!moving) anim = this._actionMap.turnLeft;\r\n } else {\r\n if (this._act._walk) a = -1;\r\n if (!moving) { a = -1; anim = this._actionMap.turnRight; }\r\n }\r\n if (this._hasCam)\r\n this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a;\r\n }\r\n\r\n this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a;\r\n }\r\n return anim;\r\n }\r\n\r\n private _endFreeFall(): void {\r\n this._movFallTime = 0;\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n\r\n //for how long has the av been falling while idle (not moving)\r\n private _idleFallTime: number = 0;\r\n private _doIdle(dt: number): ActionData {\r\n if (this._grounded) {\r\n return this._actionMap.idle;\r\n }\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n this._movFallTime = 0;\r\n let anim: ActionData = this._actionMap.idle;\r\n this._fallFrameCount = 0;\r\n\r\n\r\n if (dt === 0) {\r\n this._freeFallDist = 5;\r\n } else {\r\n const u: number = this._idleFallTime * this._gravity\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n this._idleFallTime = this._idleFallTime + dt;\r\n }\r\n //if displacement is less than 0.01(? need to verify further) then \r\n //moveWithDisplacement down against a surface seems to push the AV up by a small amount!!\r\n if (this._freeFallDist < 0.01) return anim;\r\n const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0);\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n this._avatar.moveWithCollisions(disp);\r\n if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n } else if (this._avatar.position.y < this._avStartPos.y) {\r\n //AV is going down. \r\n //AV is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than accebtable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n } else {\r\n this._unGroundIt();\r\n anim = this._actionMap.slideBack;\r\n }\r\n } else {\r\n anim = this._actionMap.fall;\r\n }\r\n }\r\n return anim;\r\n }\r\n\r\n private _groundFrameCount = 0;\r\n private _groundFrameMax = 10;\r\n /**\r\n * donot ground immediately\r\n * wait few more frames\r\n */\r\n private _groundIt(): void {\r\n this._groundFrameCount++;\r\n if (this._groundFrameCount > this._groundFrameMax) {\r\n this._grounded = true;\r\n this._idleFallTime = 0;\r\n }\r\n }\r\n private _unGroundIt() {\r\n this._grounded = false;\r\n this._groundFrameCount = 0;\r\n }\r\n\r\n private _savedCameraCollision: boolean = true;\r\n private _inFP = false;\r\n private _updateTargetValue() {\r\n if (!this._hasCam) return;\r\n //donot move camera if av is trying to clinb steps\r\n if (this._vMoveTot == 0)\r\n this._avatar.position.addToRef(this._cameraTarget, this._camera.target);\r\n\r\n if (this._camera.radius > this._camera.lowerRadiusLimit) { if (this._cameraElastic || this._makeInvisible) this._handleObstruction(); }\r\n\r\n //if user so desire, make the AV invisible if camera comes close to it\r\n if (this._camera.radius <= this._camera.lowerRadiusLimit) {\r\n if (!this._noFirstPerson && !this._inFP) {\r\n this._makeMeshInvisible(this._avatar);\r\n this._camera.checkCollisions = false;\r\n this._saveMode = this._mode;\r\n this._mode = 0;\r\n this._inFP = true;\r\n }\r\n } else {\r\n if (this._inFP) {\r\n this._inFP = false;\r\n this._mode = this._saveMode;\r\n this._restoreVisiblity(this._avatar);\r\n this._camera.checkCollisions = this._savedCameraCollision;\r\n }\r\n }\r\n }\r\n\r\n // make mesh and all its children invisible\r\n // store their current visibility state so that we can restore them later on\r\n private _makeMeshInvisible(mesh: Mesh) {\r\n\r\n this._visiblityMap.set(mesh, mesh.visibility);\r\n mesh.visibility = 0;\r\n\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) {\r\n this._visiblityMap.set(n, n.visibility);\r\n n.visibility = 0;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n private _visiblityMap: Map = new Map();\r\n\r\n //restore mesh visibility to previous state\r\n private _restoreVisiblity(mesh: Mesh) {\r\n mesh.visibility = this._visiblityMap.get(mesh);\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) n.visibility = this._visiblityMap.get(n);\r\n return false;\r\n });\r\n }\r\n\r\n private _ray: Ray = new Ray(Vector3.Zero(), Vector3.One(), 1);\r\n private _rayDir: Vector3 = Vector3.Zero();\r\n //camera seems to get stuck into things\r\n //should move camera away from things by a value of cameraSkin\r\n private _cameraSkin: number = 0.5;\r\n private _prevPickedMeshes: AbstractMesh[];\r\n private _pickedMeshes: AbstractMesh[] = new Array();;\r\n private _makeInvisible = false;\r\n private _elasticSteps = 50;\r\n private _alreadyInvisible: AbstractMesh[];\r\n\r\n /**\r\n * The following method handles the use case wherein some mesh\r\n * comes between the avatar and the camera thus obstructing the view\r\n * of the avatar.\r\n * Two ways this can be handled\r\n * a) make the obstructing mesh invisible\r\n * instead of invisible a better option would have been to make semi transparent.\r\n * Unfortunately, unlike mesh, mesh instances do not \"visibility\" setting)\r\n * Every alternate frame make mesh visible and invisible to give the impression of semi-transparent.\r\n * b) move the camera in front of the obstructing mesh\r\n */\r\n private _handleObstruction() {\r\n\r\n //get vector from av (camera.target) to camera\r\n this._camera.position.subtractToRef(this._camera.target, this._rayDir);\r\n //start ray from av to camera\r\n this._ray.origin = this._camera.target;\r\n this._ray.length = this._rayDir.length();\r\n this._ray.direction = this._rayDir.normalize();\r\n\r\n //TODO \r\n //handle case were pick is with a child of avatar, avatar atatchment. etc\r\n const pis: PickingInfo[] = this._scene.multiPickWithRay(this._ray, (mesh) => {\r\n if (mesh == this._avatar) return false;\r\n else return true;\r\n });\r\n\r\n\r\n if (this._makeInvisible) {\r\n this._prevPickedMeshes = this._pickedMeshes;\r\n if (pis.length > 0) {\r\n this._pickedMeshes = new Array();\r\n for (let pi of pis) {\r\n if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) {\r\n pi.pickedMesh.isVisible = false;\r\n this._pickedMeshes.push(pi.pickedMesh);\r\n }\r\n }\r\n for (let pm of this._prevPickedMeshes) {\r\n if (!this._pickedMeshes.includes(pm)) {\r\n pm.isVisible = true;\r\n }\r\n }\r\n } else {\r\n for (let pm of this._prevPickedMeshes) {\r\n pm.isVisible = true;\r\n }\r\n this._prevPickedMeshes.length = 0;\r\n }\r\n }\r\n\r\n if (this._cameraElastic) {\r\n if (pis.length > 0) {\r\n // postion the camera in front of the mesh that is obstructing camera\r\n\r\n //if only one obstruction and it is invisible then if it is not collidable or our camera is not collidable then do nothing\r\n if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) return;\r\n\r\n //if our camera is collidable then we donot want it to get stuck behind another collidable obsrtucting mesh\r\n let pp: Vector3 = null;\r\n\r\n //we will asume the order of picked meshes is from closest to avatar to furthest\r\n //we should get the first one which is visible or invisible and collidable\r\n for (let i = 0; i < pis.length; i++) {\r\n let pm = pis[i].pickedMesh;\r\n if (this._isSeeAble(pm)) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n } else if (pm.checkCollisions) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n }\r\n }\r\n if (pp == null) return;\r\n\r\n const c2p: Vector3 = this._camera.position.subtract(pp);\r\n //note that when camera is collidable, changing the orbital camera radius may not work.\r\n //changing the radius moves the camera forward (with collision?) and collision can interfere with movement\r\n //\r\n //in every cylce we are dividing the distance to tarvel by same number of steps.\r\n //as we get closer to destination the speed will thus slow down.\r\n //when just 1 unit distance left, lets snap to the final position.\r\n //when calculating final position make sure the camera does not get stuck at the pickposition especially\r\n //if collision is on\r\n\r\n const l: number = c2p.length();\r\n if (this._camera.checkCollisions) {\r\n let step: Vector3;\r\n if (l <= 1) {\r\n step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin));\r\n } else {\r\n step = c2p.normalize().scaleInPlace(l / this._elasticSteps);\r\n }\r\n this._camera.position = this._camera.position.subtract(step);\r\n } else {\r\n let step: number;\r\n if (l <= 1) step = l + this._cameraSkin; else step = l / this._elasticSteps;\r\n this._camera.radius = this._camera.radius - (step);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //how many ways can a mesh be invisible?\r\n private _isSeeAble(mesh: AbstractMesh): boolean {\r\n if (!mesh.isVisible) return false;\r\n if (mesh.visibility == 0) return false;\r\n if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) return false;\r\n return true;\r\n //what about vertex color? groan!\r\n }\r\n\r\n\r\n private _move: boolean = false;\r\n public anyMovement(): boolean {\r\n return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight);\r\n }\r\n\r\n private _onKeyDown(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n if (e.repeat) return;\r\n switch (e.key.toLowerCase()) {\r\n case this._actionMap.idleJump.key:\r\n this._act._jump = true;\r\n break;\r\n case \"capslock\":\r\n this._act._speedMod = !this._act._speedMod;\r\n break;\r\n case \"shift\":\r\n this._act._speedMod = true;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = true;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = true;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = true;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = true;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = true;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = true;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _onKeyUp(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n switch (e.key.toLowerCase()) {\r\n case \"shift\":\r\n this._act._speedMod = false;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = false;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = false;\r\n this._isTurning = false;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = false;\r\n this._isTurning = false;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = false;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = false;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = false;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _ekb: boolean = true;\r\n public isKeyBoardEnabled(): boolean {\r\n return this._ekb;\r\n }\r\n public enableKeyBoard(b: boolean) {\r\n this._ekb = b;\r\n if (b) {\r\n this._addkeylistener();\r\n } else {\r\n this._removekeylistener();\r\n }\r\n }\r\n\r\n private _addkeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.addEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.addEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n private _removekeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.removeEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.removeEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n // control movement by commands rather than keyboard.\r\n public walk(b: boolean) {\r\n this._act._walk = b;\r\n }\r\n public walkBack(b: boolean) {\r\n this._act._walkback = b;\r\n }\r\n public walkBackFast(b: boolean) {\r\n this._act._walkback = b;\r\n this._act._speedMod = b;\r\n }\r\n public run(b: boolean) {\r\n this._act._walk = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnLeft(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnLeftFast(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnRight(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnRightFast(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeLeft(b: boolean) {\r\n this._act._stepLeft = b;\r\n }\r\n public strafeLeftFast(b: boolean) {\r\n this._act._stepLeft = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeRight(b: boolean) {\r\n this._act._stepRight = b;\r\n }\r\n public strafeRightFast(b: boolean) {\r\n this._act._stepRight = b;\r\n this._act._speedMod = b;\r\n }\r\n public jump() {\r\n this._act._jump = true;\r\n }\r\n\r\n public fall() {\r\n this._grounded = false;\r\n }\r\n\r\n public idle() {\r\n this._act.reset();\r\n }\r\n\r\n private _act: _Action;\r\n private _renderer: () => void;\r\n private _handleKeyUp: (e) => void;\r\n private _handleKeyDown: (e) => void;\r\n private _isAG: boolean = false;\r\n public isAg() {\r\n return this._isAG;\r\n }\r\n\r\n\r\n\r\n\r\n private _findSkel(n: Node): Skeleton {\r\n let root = this._root(n);\r\n\r\n if (root instanceof Mesh && root.skeleton) return root.skeleton;\r\n\r\n //find all child meshes which have skeletons\r\n let ms = root.getChildMeshes(\r\n false,\r\n (cm) => {\r\n if (cm instanceof Mesh) {\r\n if (cm.skeleton) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n //return the skeleton of the first child mesh\r\n if (ms.length > 0) return ms[0].skeleton; else return null;\r\n\r\n }\r\n\r\n private _root(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._root(tn.parent);\r\n }\r\n\r\n public setAvatar(avatar: Mesh, faceForward: boolean = false): boolean {\r\n\r\n let rootNode = this._root(avatar);\r\n if (rootNode instanceof Mesh) {\r\n this._avatar = rootNode;\r\n } else {\r\n console.error(\"Cannot move this mesh. The root node of the mesh provided is not a mesh\");\r\n return false;\r\n }\r\n\r\n this._skeleton = this._findSkel(avatar);\r\n this._isAG = this._containsAG(avatar, this._scene.animationGroups, true);\r\n\r\n this._actionMap.reset();\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n\r\n this._setRHS(avatar);\r\n this.setFaceForward(faceForward);\r\n\r\n return true;\r\n }\r\n\r\n public getAvatar() {\r\n return this._avatar;\r\n }\r\n\r\n // force a skeleton to be the avatar skeleton\r\n // should not be calling this normally\r\n public setAvatarSkeleton(skeleton: Skeleton) {\r\n this._skeleton = skeleton;\r\n\r\n\r\n if (this._skeleton != null && this._skelDrivenByAG(skeleton)) this._isAG = true; else this._isAG = false;\r\n\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n }\r\n\r\n\r\n // this check if any of this skeleton animations is referenced by any targetedAnimation in any of the animationgroup in the scene.\r\n private _skelDrivenByAG(skeleton: Skeleton) {\r\n return skeleton.animations.some(sa => this._scene.animationGroups.some(ag => ag.children.some(ta => ta.animation == sa)));\r\n }\r\n\r\n public getSkeleton() {\r\n return this._skeleton;\r\n }\r\n\r\n // does this character have any animations ?\r\n // remember we can use meshes without anims as characters too\r\n private _hasAnims: boolean = false;\r\n private _hasCam: boolean = true;\r\n\r\n /**\r\n * The avatar/character can be made up of multiple meshes arranged in a hierarchy.\r\n * As such we will pick the root of the hierarchy as the avatar.\r\n * The root should be a mesh as otherwise we cannot move it with moveWithCollision() method.\r\n * \r\n * Mutiple meshes in the hierarchy may have skeletons (if two or more meshes have skeleton then\r\n * the skeleton will mostly likely be the same). \r\n * So we will pick as avatar skeleton, the skeleton of the first mesh in the hierachy which has\r\n * a skeleton \r\n * \r\n * @param avatar \r\n * @param camera \r\n * @param scene \r\n * @param actionMap/animationGroupMap \r\n * maps actions to animations and other data like speed,sound etc \r\n * or \r\n * for backward compatibility could be AnimationGroup Map\r\n * @param faceForward \r\n */\r\n constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward = false) {\r\n\r\n this._camera = camera;\r\n\r\n //if camera is null assume this would be used to control an NPC\r\n //we cannot use mode 0 as that is dependent on camera being present. so force mode 1\r\n if (this._camera == null) {\r\n this._hasCam = false;\r\n this.setMode(1);\r\n }\r\n this._scene = scene;\r\n\r\n let success = this.setAvatar(avatar, faceForward);\r\n if (!success) {\r\n console.error(\"unable to set avatar\");\r\n }\r\n\r\n\r\n let dataType: string = null;\r\n if (actionMap != null) {\r\n dataType = this.setActionMap(actionMap);\r\n }\r\n\r\n //try to use the existing avatar animations\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n //animation groups\r\n if (this._isAG) {\r\n //TODO\r\n }\r\n\r\n if (this._hasCam) this._savedCameraCollision = this._camera.checkCollisions;\r\n\r\n this._act = new _Action();\r\n\r\n this._renderer = () => { this._moveAVandCamera() };\r\n this._handleKeyUp = (e) => { this._onKeyUp(e) };\r\n this._handleKeyDown = (e) => { this._onKeyDown(e) };\r\n }\r\n}\r\n\r\n\r\n\r\nclass _Action {\r\n\r\n public _walk: boolean = false;\r\n public _walkback: boolean = false;\r\n public _turnRight: boolean = false;\r\n public _turnLeft: boolean = false;\r\n public _stepRight: boolean = false;\r\n public _stepLeft: boolean = false;\r\n public _jump: boolean = false;\r\n\r\n // speed modifier - changes speed of movement\r\n public _speedMod: boolean = false;\r\n\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset() {\r\n this._walk = false;\r\n this._walkback = false;\r\n this._turnRight = false;\r\n this._turnLeft = false;\r\n this._stepRight = false;\r\n this._stepLeft = false;\r\n this._jump = false;\r\n this._speedMod = false;\r\n }\r\n}\r\n\r\nexport class ActionData {\r\n public id: string;\r\n public speed: number;\r\n //_ds default speed. speed is set to this on reset\r\n public ds: number;\r\n public sound: Sound;\r\n public key: string;\r\n //_dk defailt key\r\n public dk: string;\r\n\r\n //animation data\r\n //if _ag is null then assuming animation range and use _name to play animationrange\r\n //instead of name maybe call it arName?\r\n public name: string = \"\";\r\n public ag: AnimationGroup;\r\n public loop: boolean = true;\r\n public rate: number = 1;\r\n\r\n public exist: boolean = false;\r\n\r\n public constructor(id?: string, speed = 1, key?: string) {\r\n this.id = id;\r\n this.speed = speed;\r\n this.ds = speed;\r\n this.key = key;\r\n this.dk = key;\r\n }\r\n\r\n public reset() {\r\n this.name = \"\";\r\n this.speed = this.ds;\r\n this.key = this.dk;\r\n this.loop = true;\r\n this.rate = 1;\r\n this.sound = null;\r\n this.exist = false;\r\n }\r\n\r\n}\r\n\r\n//not really a \"Map\"\r\nexport class ActionMap {\r\n public walk = new ActionData(\"walk\", 3, \"w\");\r\n public walkBack = new ActionData(\"walkBack\", 1.5, \"s\");\r\n public walkBackFast = new ActionData(\"walkBackFast\", 3, \"na\");\r\n public idle = new ActionData(\"idle\", 0, \"na\");\r\n public idleJump = new ActionData(\"idleJump\", 6, \" \");\r\n public run = new ActionData(\"run\", 6, \"na\");\r\n public runJump = new ActionData(\"runJump\", 6, \"na\");\r\n public fall = new ActionData(\"fall\", 0, \"na\");\r\n public turnLeft = new ActionData(\"turnLeft\", Math.PI / 8, \"a\");\r\n public turnLeftFast = new ActionData(\"turnLeftFast\", Math.PI / 4, \"na\");\r\n public turnRight = new ActionData(\"turnRight\", Math.PI / 8, \"d\");\r\n public turnRightFast = new ActionData(\"turnRightFast\", Math.PI / 4, \"na\");\r\n public strafeLeft = new ActionData(\"strafeLeft\", 1.5, \"q\");\r\n public strafeLeftFast = new ActionData(\"strafeLeftFast\", 3, \"na\");\r\n public strafeRight = new ActionData(\"strafeRight\", 1.5, \"e\");\r\n public strafeRightFast = new ActionData(\"strafeRightFast\", 3, \"na\");\r\n public slideBack = new ActionData(\"slideBack\", 0, \"na\");\r\n\r\n public reset() {\r\n let keys: string[] = Object.keys(this);\r\n for (let key of keys) {\r\n let act = this[key];\r\n if (!(act instanceof ActionData)) continue;\r\n act.reset()\r\n }\r\n }\r\n};\r\n\r\nexport class CCSettings {\r\n public faceForward: boolean;\r\n public gravity: number;\r\n public minSlopeLimit: number;\r\n public maxSlopeLimit: number;\r\n public stepOffset: number;\r\n public cameraElastic: boolean = true;\r\n public elasticSteps: number;\r\n public makeInvisble: boolean = true;\r\n public cameraTarget: Vector3 = Vector3.Zero();\r\n public noFirstPerson: boolean = false;\r\n public topDown: boolean = true;\r\n //turningOff takes effect only when topDown is false\r\n public turningOff: boolean = true;\r\n public keyboard: boolean = true;\r\n public sound: Sound;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/CharacterController.d.ts b/dist/CharacterController.d.ts index b68a760..e258e4a 100644 --- a/dist/CharacterController.d.ts +++ b/dist/CharacterController.d.ts @@ -172,6 +172,7 @@ export declare class CharacterController { strafeRight(b: boolean): void; strafeRightFast(b: boolean): void; jump(): void; + fall(): void; idle(): void; private _act; private _renderer; diff --git a/dist/CharacterController.js b/dist/CharacterController.js index 425bfd5..c37b0ef 100644 --- a/dist/CharacterController.js +++ b/dist/CharacterController.js @@ -1,2 +1,2 @@ -!function(t,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i(require("babylonjs"));else if("function"==typeof define&&define.amd)define(["babylonjs"],i);else{var s="object"==typeof exports?i(require("babylonjs")):i(t.BABYLON);for(var h in s)("object"==typeof exports?exports:t)[h]=s[h]}}(self,(t=>(()=>{"use strict";var i={247:i=>{i.exports=t}},s={};function h(t){var n=s[t];if(void 0!==n)return n.exports;var e=s[t]={exports:{}};return i[t](e,e.exports,h),e.exports}h.n=t=>{var i=t&&t.t?()=>t.default:()=>t;return h.d(i,{a:i}),i},h.d=(t,i)=>{for(var s in i)h.o(i,s)&&!h.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},h.o=(t,i)=>Object.prototype.hasOwnProperty.call(t,i),h.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"t",{value:!0})};var n={};return(()=>{h.r(n),h.d(n,{ActionData:()=>e,ActionMap:()=>r,CCSettings:()=>u,CharacterController:()=>i});var t=h(247),i=function(){function i(i,h,n,e,u){void 0===u&&(u=!1);var f=this;this.i=null,this.h=null,this.u=9.8,this.l=30,this.v=45,this.k=Math.PI*this.l/180,this.M=Math.PI*this.v/180,this.p=.25,this.j=0,this.O=t.Vector3.Zero(),this.g=new r,this.C=!0,this.F=t.Vector3.Zero(),this.A=!1,this.L=0,this.R=0,this.S=!1,this.q=-1,this.B=!1,this.I=!1,this.J=null,this._=t.Vector3.Zero(),this.D=!1,this.T=0,this.G=50,this.H=0,this.K=!1,this.N=!1,this.P=!1,this.U=700,this.V=null,this.W=0,this.X=0,this.Y=0,this.Z=1,this.$=!1,this.tt=!1,this.it=0,this.st=0,this.ht=10,this.nt=!0,this.et=!1,this.rt=new Map,this.ut=new t.Ray(t.Vector3.Zero(),t.Vector3.One(),1),this.ft=t.Vector3.Zero(),this.ot=.5,this.ct=new Array,this.lt=!1,this.vt=50,this.bt=!1,this.wt=!0,this.kt=!1,this.Mt=!1,this.dt=!0,this.jt=h,null==this.jt&&(this.dt=!1,this.setMode(1)),this.yt=n,this.setAvatar(i,u)||console.error("unable to set avatar");null!=e&&this.setActionMap(e),this.kt||null==this.h||this.Ot(this.h),this.kt,this.dt&&(this.nt=this.jt.checkCollisions),this.gt=new s,this.xt=function(){f.Ct()},this.Ft=function(t){f.At(t)},this.Lt=function(t){f.Rt(t)}}return i.prototype.getScene=function(){return this.yt},i.prototype.setSlopeLimit=function(t,i){this.l=t,this.v=i,this.k=Math.PI*this.l/180,this.M=Math.PI*this.v/180},i.prototype.setStepOffset=function(t){this.p=t},i.prototype.setWalkSpeed=function(t){this.g.walk.speed=t},i.prototype.setRunSpeed=function(t){this.g.run.speed=t},i.prototype.setBackSpeed=function(t){this.g.walkBack.speed=t},i.prototype.setBackFastSpeed=function(t){this.g.walkBackFast.speed=t},i.prototype.setJumpSpeed=function(t){this.g.idleJump.speed=t,this.g.runJump.speed=t},i.prototype.setLeftSpeed=function(t){this.g.strafeLeft.speed=t},i.prototype.setLeftFastSpeed=function(t){this.g.strafeLeftFast.speed=t},i.prototype.setRightSpeed=function(t){this.g.strafeRight.speed=t},i.prototype.setRightFastSpeed=function(t){this.g.strafeLeftFast.speed=t},i.prototype.setTurnSpeed=function(t){this.g.turnLeft.speed=t*Math.PI/180,this.g.turnRight.speed=t*Math.PI/180},i.prototype.setTurnFastSpeed=function(t){this.g.turnLeftFast.speed=t*Math.PI/180,this.g.turnRightFast.speed=t*Math.PI/180},i.prototype.setGravity=function(t){this.u=t},i.prototype.setAnimationGroups=function(t){null!=this.J&&this.J.exist&&this.J.ag.stop(),this.kt=!0,this.setActionMap(t)},i.prototype.setAnimationRanges=function(t){this.kt=!1,this.setActionMap(t)},i.prototype.setActionMap=function(i){for(var s,h=!1,n=0,r=Object.keys(this.g);n-1)return!0}return!1},i.prototype.Gt=function(t){return null==t.parent?t:this.Gt(t.parent)},i.prototype.start=function(){this.B||(this.B=!0,this.gt.reset(),this.Y=0,this.it=.001,this.D=!1,this.Ht(),this.wt&&this.Kt(),this.yt.registerBeforeRender(this.xt))},i.prototype.stop=function(){this.B&&(this.B=!1,this.yt.unregisterBeforeRender(this.xt),this.Nt(),this.J=null)},i.prototype.pauseAnim=function(){this.I=!0,null!=this.J&&this.J.exist&&(this.kt?this.J.ag.stop():this.yt.stopAnimation(this.h),null!=this.J.sound&&this.J.sound.stop(),clearInterval(this.V),this.yt.unregisterBeforeRender(this.xt))},i.prototype.resumeAnim=function(){this.I=!1,this.J=null,this.yt.registerBeforeRender(this.xt)},i.prototype.Pt=function(){return this.dt?t.Vector3.Dot(this.i.forward,this.i.position.subtract(this.jt.position))<0?1:-1:1},i.prototype.Ct=function(){this._.copyFrom(this.i.position);var t=null,i=this.yt.getEngine().getDeltaTime()/1e3;if(this.gt.Qt&&!this.K?(this.D=!1,this.it=0,t=this.Ut(i)):this.anyMovement()||this.K?(this.D=!1,this.it=0,t=this.Vt(i)):this.K||(t=this.Wt(i)),!this.I&&this.Mt&&null!=t&&this.J!==t){if(t.exist){var s=void 0,h=30;if(this.kt)null!=this.J&&this.J.exist&&this.J.ag.stop(),t.ag.start(t.loop,t.rate),h=t.ag.targetedAnimations[0].animation.framePerSecond,s=t.ag.to-t.ag.from;else h=this.h.beginAnimation(t.name,t.loop,t.rate).getAnimations()[0].animation.framePerSecond,s=this.h.getAnimationRange(t.name).to-this.h.getAnimationRange(t.name).from;null!=this.J&&null!=this.J.sound&&this.J.sound.stop(),clearInterval(this.V),null!=t.sound&&(t.sound.play(),this.V=setInterval((function(){t.sound.play()}),1e3*s/(h*Math.abs(t.rate)*2)))}this.J=t}this.Ht()},i.prototype.Ut=function(i){var s=null;s=this.g.runJump,0===this.X&&(this.W=this.i.position.y),this.X=this.X+i;var h,n=0,e=0;if(this.dt&&1!=this.L&&!this.tt&&(this.i.rotation.y=this.Tt-this.jt.alpha),this.P||this.N?(this.P?n=this.g.run.speed*i:this.N&&(n=this.g.walk.speed*i),(h=this.Xt.clone()).y=0,(h=h.normalize()).scaleToRef(n,h),e=this.Yt(this.g.runJump.speed,i),h.y=e):(e=this.Yt(this.g.idleJump.speed,i),h=new t.Vector3(0,e,0),s=this.g.idleJump),this.i.moveWithCollisions(h),e<0)if(this.i.position.y>this._.y||this.i.position.y===this._.y&&h.length()>.001)this.Zt();else if(this.i.position.y0?this.g.strafeLeftFast:this.g.strafeRightFast):h=-this.zt*n>0?this.g.strafeLeft:this.g.strafeRight,this.Xt=this.i.calcMovePOV(n*e,-this.T,0),s=!0;break;case this.gt.ei:n=-this.q*this.Pt(),e=this.g.strafeRight.speed*t,this.gt.ni?(e=this.g.strafeRightFast.speed*t,h=-this.zt*n>0?this.g.strafeLeftFast:this.g.strafeRightFast):h=-this.zt*n>0?this.g.strafeLeft:this.g.strafeRight,this.Xt=this.i.calcMovePOV(n*e,-this.T,0),s=!0;break;case this.gt.ri||this.tt&&0==this.L:this.gt.ni?(this.P=!0,e=this.g.run.speed*t,h=this.g.run):(this.N=!0,e=this.g.walk.speed*t,h=this.g.walk),this.Xt=this.i.calcMovePOV(0,-this.T,this.zt*e),s=!0;break;case this.gt.ui:e=this.g.walkBack.speed*t,this.gt.ni?(e=this.g.walkBackFast.speed*t,h=this.g.walkBackFast):h=this.g.walkBack,this.Xt=this.i.calcMovePOV(0,-this.T,-this.zt*e),s=!0}}if(s&&this.Xt.length()>.001)if(this.i.moveWithCollisions(this.Xt),this.i.position.y>this._.y){var r=this.i.position.subtract(this._),u=this.ti(r);u>=this.M?this.p>0?(0==this.j&&this.O.copyFrom(this._),this.j=this.j+(this.i.position.y-this._.y),this.j>this.p&&(this.j=0,this.i.position.copyFrom(this.O),this.fi())):(this.i.position.copyFrom(this._),this.fi()):(this.j=0,u>this.k?(this.H=0,this.K=!1):this.fi())}else if(this.i.position.ythis.G&&(h=this.g.fall)):this.ti(r)<=this.k?this.fi():(this.H=0,this.K=!1)}else this.fi();return h},i.prototype.ii=function(){if(this.dt&&1!=this.L){var t=this.dt?this.Tt-this.jt.alpha:0;if(this.tt)switch(!0){case this.gt.ri&&this.gt.ai:this.i.rotation.y=t+this.Dt*Math.PI/4;break;case this.gt.ri&&this.gt.oi:this.i.rotation.y=t-this.Dt*Math.PI/4;break;case this.gt.ui&&this.gt.ai:this.i.rotation.y=t+3*this.Dt*Math.PI/4;break;case this.gt.ui&&this.gt.oi:this.i.rotation.y=t-3*this.Dt*Math.PI/4;break;case this.gt.ri:this.i.rotation.y=t;break;case this.gt.ui:this.i.rotation.y=t+Math.PI;break;case this.gt.ai:this.i.rotation.y=t+this.Dt*Math.PI/2;break;case this.gt.oi:this.i.rotation.y=t-this.Dt*Math.PI/2}else this.dt&&(this.i.rotation.y=t)}},i.prototype.si=function(t,i,s){if((!this.tt||0!=this.L)&&!this.gt.hi&&!this.gt.ei&&(this.gt.oi||this.gt.ai)){var h=this.g.turnLeft.speed*s;this.gt.ni&&(h*=2);var n=void 0;1==this.L?(this.$||(this.Z=-this.zt*this.Pt(),this.S&&(this.Z=-this.Z),this.$=!0),n=this.Z,this.gt.oi?this.gt.ri||(this.gt.ui?n=-this.Z:t=this.Z>0?this.g.turnRight:this.g.turnLeft):this.gt.ri?n=-this.Z:this.gt.ui||(n=-this.Z,t=this.Z>0?this.g.turnLeft:this.g.turnRight)):(n=1,this.gt.oi?(this.gt.ui&&(n=-1),i||(t=this.g.turnLeft)):(this.gt.ri&&(n=-1),i||(n=-1,t=this.g.turnRight)),this.dt&&(this.jt.alpha=this.jt.alpha+this.Dt*h*n)),this.i.rotation.y=this.i.rotation.y+h*n}return t},i.prototype.fi=function(){this.Y=0,this.H=0,this.K=!1},i.prototype.Wt=function(i){if(this.D)return this.g.idle;this.N=!1,this.P=!1,this.Y=0;var s=this.g.idle;if(this.H=0,0===i)this.T=5;else{var h=this.it*this.u;this.T=h*i+this.u*i*i/2,this.it=this.it+i}if(this.T<.01)return s;var n=new t.Vector3(0,-this.T,0);if(this.dt&&1!=this.L&&!this.tt&&(this.i.rotation.y=this.Tt-this.jt.alpha),this.i.moveWithCollisions(n),this.i.position.y>this._.y||this.i.position.y===this._.y)this.ci();else if(this.i.position.ythis.ht&&(this.D=!0,this.it=0)},i.prototype.li=function(){this.D=!1,this.st=0},i.prototype.Ht=function(){this.dt&&(0==this.j&&this.i.position.addToRef(this.F,this.jt.target),this.jt.radius>this.jt.lowerRadiusLimit&&(this.C||this.lt)&&this.vi(),this.jt.radius<=this.jt.lowerRadiusLimit?this.A||this.et||(this.bi(this.i),this.jt.checkCollisions=!1,this.R=this.L,this.L=0,this.et=!0):this.et&&(this.et=!1,this.L=this.R,this.wi(this.i),this.jt.checkCollisions=this.nt))},i.prototype.bi=function(i){var s=this;this.rt.set(i,i.visibility),i.visibility=0,i.getChildMeshes(!1,(function(i){return i instanceof t.Mesh&&(s.rt.set(i,i.visibility),i.visibility=0),!1}))},i.prototype.wi=function(i){var s=this;i.visibility=this.rt.get(i),i.getChildMeshes(!1,(function(i){return i instanceof t.Mesh&&(i.visibility=s.rt.get(i)),!1}))},i.prototype.vi=function(){var t=this;this.jt.position.subtractToRef(this.jt.target,this.ft),this.ut.origin=this.jt.target,this.ut.length=this.ft.length(),this.ut.direction=this.ft.normalize();var i=this.yt.multiPickWithRay(this.ut,(function(i){return i!=t.i}));if(this.lt)if(this.ki=this.ct,i.length>0){this.ct=new Array;for(var s=0,h=i;s0){if(!(1!=i.length||this.Mi(i[0].pickedMesh)||i[0].pickedMesh.checkCollisions&&this.jt.checkCollisions))return;for(var o=null,c=0;c0?h[0].skeleton:null},i.prototype.pi=function(t){return null==t.parent?t:this.pi(t.parent)},i.prototype.setAvatar=function(i,s){void 0===s&&(s=!1);var h=this.pi(i);return h instanceof t.Mesh?(this.i=h,this.h=this.di(i),this.kt=this.Et(i,this.yt.animationGroups,!0),this.g.reset(),this.kt||null==this.h||this.Ot(this.h),this.Jt(i),this.setFaceForward(s),!0):(console.error("Cannot move this mesh. The root node of the mesh provided is not a mesh"),!1)},i.prototype.getAvatar=function(){return this.i},i.prototype.setAvatarSkeleton=function(t){this.h=t,null!=this.h&&this.ji(t)?this.kt=!0:this.kt=!1,this.kt||null==this.h||this.Ot(this.h)},i.prototype.ji=function(t){var i=this;return t.animations.some((function(t){return i.yt.animationGroups.some((function(i){return i.children.some((function(i){return i.animation==t}))}))}))},i.prototype.getSkeleton=function(){return this.h},i}(),s=function(){function t(){this.ri=!1,this.ui=!1,this.ai=!1,this.oi=!1,this.ei=!1,this.hi=!1,this.Qt=!1,this.ni=!1,this.reset()}return t.prototype.reset=function(){this.ri=!1,this.ui=!1,this.ai=!1,this.oi=!1,this.ei=!1,this.hi=!1,this.Qt=!1,this.ni=!1},t}(),e=function(){function t(t,i,s){void 0===i&&(i=1),this.name="",this.loop=!0,this.rate=1,this.exist=!1,this.id=t,this.speed=i,this.ds=i,this.key=s,this.dk=s}return t.prototype.reset=function(){this.name="",this.speed=this.ds,this.key=this.dk,this.loop=!0,this.rate=1,this.sound=null,this.exist=!1},t}(),r=function(){function t(){this.walk=new e("walk",3,"w"),this.walkBack=new e("walkBack",1.5,"s"),this.walkBackFast=new e("walkBackFast",3,"na"),this.idle=new e("idle",0,"na"),this.idleJump=new e("idleJump",6," "),this.run=new e("run",6,"na"),this.runJump=new e("runJump",6,"na"),this.fall=new e("fall",0,"na"),this.turnLeft=new e("turnLeft",Math.PI/8,"a"),this.turnLeftFast=new e("turnLeftFast",Math.PI/4,"na"),this.turnRight=new e("turnRight",Math.PI/8,"d"),this.turnRightFast=new e("turnRightFast",Math.PI/4,"na"),this.strafeLeft=new e("strafeLeft",1.5,"q"),this.strafeLeftFast=new e("strafeLeftFast",3,"na"),this.strafeRight=new e("strafeRight",1.5,"e"),this.strafeRightFast=new e("strafeRightFast",3,"na"),this.slideBack=new e("slideBack",0,"na")}return t.prototype.reset=function(){for(var t=0,i=Object.keys(this);t(()=>{"use strict";var i={247:i=>{i.exports=t}},s={};function h(t){var n=s[t];if(void 0!==n)return n.exports;var e=s[t]={exports:{}};return i[t](e,e.exports,h),e.exports}h.n=t=>{var i=t&&t.t?()=>t.default:()=>t;return h.d(i,{a:i}),i},h.d=(t,i)=>{for(var s in i)h.o(i,s)&&!h.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:i[s]})},h.o=(t,i)=>Object.prototype.hasOwnProperty.call(t,i),h.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"t",{value:!0})};var n={};return(()=>{h.r(n),h.d(n,{ActionData:()=>e,ActionMap:()=>r,CCSettings:()=>u,CharacterController:()=>i});var t=h(247),i=function(){function i(i,h,n,e,u){void 0===u&&(u=!1);var f=this;this.i=null,this.h=null,this.u=9.8,this.l=30,this.v=45,this.k=Math.PI*this.l/180,this.M=Math.PI*this.v/180,this.p=.25,this.j=0,this.O=t.Vector3.Zero(),this.g=new r,this.C=!0,this.F=t.Vector3.Zero(),this.A=!1,this.L=0,this.R=0,this.S=!1,this.q=-1,this.B=!1,this.I=!1,this.J=null,this._=t.Vector3.Zero(),this.D=!1,this.T=0,this.G=50,this.H=0,this.K=!1,this.N=!1,this.P=!1,this.U=700,this.V=null,this.W=0,this.X=0,this.Y=0,this.Z=1,this.$=!1,this.tt=!1,this.it=0,this.st=0,this.ht=10,this.nt=!0,this.et=!1,this.rt=new Map,this.ut=new t.Ray(t.Vector3.Zero(),t.Vector3.One(),1),this.ft=t.Vector3.Zero(),this.ot=.5,this.ct=new Array,this.lt=!1,this.vt=50,this.bt=!1,this.wt=!0,this.kt=!1,this.Mt=!1,this.dt=!0,this.jt=h,null==this.jt&&(this.dt=!1,this.setMode(1)),this.yt=n,this.setAvatar(i,u)||console.error("unable to set avatar");null!=e&&this.setActionMap(e),this.kt||null==this.h||this.Ot(this.h),this.kt,this.dt&&(this.nt=this.jt.checkCollisions),this.gt=new s,this.xt=function(){f.Ct()},this.Ft=function(t){f.At(t)},this.Lt=function(t){f.Rt(t)}}return i.prototype.getScene=function(){return this.yt},i.prototype.setSlopeLimit=function(t,i){this.l=t,this.v=i,this.k=Math.PI*this.l/180,this.M=Math.PI*this.v/180},i.prototype.setStepOffset=function(t){this.p=t},i.prototype.setWalkSpeed=function(t){this.g.walk.speed=t},i.prototype.setRunSpeed=function(t){this.g.run.speed=t},i.prototype.setBackSpeed=function(t){this.g.walkBack.speed=t},i.prototype.setBackFastSpeed=function(t){this.g.walkBackFast.speed=t},i.prototype.setJumpSpeed=function(t){this.g.idleJump.speed=t,this.g.runJump.speed=t},i.prototype.setLeftSpeed=function(t){this.g.strafeLeft.speed=t},i.prototype.setLeftFastSpeed=function(t){this.g.strafeLeftFast.speed=t},i.prototype.setRightSpeed=function(t){this.g.strafeRight.speed=t},i.prototype.setRightFastSpeed=function(t){this.g.strafeLeftFast.speed=t},i.prototype.setTurnSpeed=function(t){this.g.turnLeft.speed=t*Math.PI/180,this.g.turnRight.speed=t*Math.PI/180},i.prototype.setTurnFastSpeed=function(t){this.g.turnLeftFast.speed=t*Math.PI/180,this.g.turnRightFast.speed=t*Math.PI/180},i.prototype.setGravity=function(t){this.u=t},i.prototype.setAnimationGroups=function(t){null!=this.J&&this.J.exist&&this.J.ag.stop(),this.kt=!0,this.setActionMap(t)},i.prototype.setAnimationRanges=function(t){this.kt=!1,this.setActionMap(t)},i.prototype.setActionMap=function(i){for(var s,h=!1,n=0,r=Object.keys(this.g);n-1)return!0}return!1},i.prototype.Gt=function(t){return null==t.parent?t:this.Gt(t.parent)},i.prototype.start=function(){this.B||(this.B=!0,this.gt.reset(),this.Y=0,this.it=.001,this.D=!1,this.Ht(),this.wt&&this.Kt(),this.yt.registerBeforeRender(this.xt))},i.prototype.stop=function(){this.B&&(this.B=!1,this.yt.unregisterBeforeRender(this.xt),this.Nt(),this.J=null)},i.prototype.pauseAnim=function(){this.I=!0,null!=this.J&&this.J.exist&&(this.kt?this.J.ag.stop():this.yt.stopAnimation(this.h),null!=this.J.sound&&this.J.sound.stop(),clearInterval(this.V),this.yt.unregisterBeforeRender(this.xt))},i.prototype.resumeAnim=function(){this.I=!1,this.J=null,this.yt.registerBeforeRender(this.xt)},i.prototype.Pt=function(){return this.dt?t.Vector3.Dot(this.i.forward,this.i.position.subtract(this.jt.position))<0?1:-1:1},i.prototype.Ct=function(){this._.copyFrom(this.i.position);var t=null,i=this.yt.getEngine().getDeltaTime()/1e3;if(this.gt.Qt&&!this.K?(this.D=!1,this.it=0,t=this.Ut(i)):this.anyMovement()||this.K?(this.D=!1,this.it=0,t=this.Vt(i)):this.K||(t=this.Wt(i)),!this.I&&this.Mt&&null!=t&&this.J!==t){if(t.exist){var s=void 0,h=30;if(this.kt)null!=this.J&&this.J.exist&&this.J.ag.stop(),t.ag.start(t.loop,t.rate),h=t.ag.targetedAnimations[0].animation.framePerSecond,s=t.ag.to-t.ag.from;else h=this.h.beginAnimation(t.name,t.loop,t.rate).getAnimations()[0].animation.framePerSecond,s=this.h.getAnimationRange(t.name).to-this.h.getAnimationRange(t.name).from;null!=this.J&&null!=this.J.sound&&this.J.sound.stop(),clearInterval(this.V),null!=t.sound&&(t.sound.play(),this.V=setInterval((function(){t.sound.play()}),1e3*s/(h*Math.abs(t.rate)*2)))}this.J=t}this.Ht()},i.prototype.Ut=function(i){var s=null;s=this.g.runJump,0===this.X&&(this.W=this.i.position.y),this.X=this.X+i;var h,n=0,e=0;if(this.P||this.N?(this.P?n=this.g.run.speed*i:this.N&&(n=this.g.walk.speed*i),(h=this.Xt.clone()).y=0,(h=h.normalize()).scaleToRef(n,h),e=this.Yt(this.g.runJump.speed,i),h.y=e):(e=this.Yt(this.g.idleJump.speed,i),h=new t.Vector3(0,e,0),s=this.g.idleJump),this.i.moveWithCollisions(h),e<0)if(this.i.position.y>this._.y||this.i.position.y===this._.y&&h.length()>.001)this.Zt();else if(this.i.position.y0?this.g.strafeLeftFast:this.g.strafeRightFast):h=-this.zt*n>0?this.g.strafeLeft:this.g.strafeRight,this.Xt=this.i.calcMovePOV(n*e,-this.T,0),s=!0;break;case this.gt.ei:n=-this.q*this.Pt(),e=this.g.strafeRight.speed*t,this.gt.ni?(e=this.g.strafeRightFast.speed*t,h=-this.zt*n>0?this.g.strafeLeftFast:this.g.strafeRightFast):h=-this.zt*n>0?this.g.strafeLeft:this.g.strafeRight,this.Xt=this.i.calcMovePOV(n*e,-this.T,0),s=!0;break;case this.gt.ri||this.tt&&0==this.L:this.gt.ni?(this.P=!0,e=this.g.run.speed*t,h=this.g.run):(this.N=!0,e=this.g.walk.speed*t,h=this.g.walk),this.Xt=this.i.calcMovePOV(0,-this.T,this.zt*e),s=!0;break;case this.gt.ui:e=this.g.walkBack.speed*t,this.gt.ni?(e=this.g.walkBackFast.speed*t,h=this.g.walkBackFast):h=this.g.walkBack,this.Xt=this.i.calcMovePOV(0,-this.T,-this.zt*e),s=!0}}if(s&&this.Xt.length()>.001)if(this.i.moveWithCollisions(this.Xt),this.i.position.y>this._.y){var r=this.i.position.subtract(this._),u=this.ti(r);u>=this.M?this.p>0?(0==this.j&&this.O.copyFrom(this._),this.j=this.j+(this.i.position.y-this._.y),this.j>this.p&&(this.j=0,this.i.position.copyFrom(this.O),this.fi())):(this.i.position.copyFrom(this._),this.fi()):(this.j=0,u>this.k?(this.H=0,this.K=!1):this.fi())}else if(this.i.position.ythis.G&&(h=this.g.fall)):this.ti(r)<=this.k?this.fi():(this.H=0,this.K=!1)}else this.fi();return h},i.prototype.ii=function(){if(this.dt&&1!=this.L){var t=this.dt?this.Tt-this.jt.alpha:0;if(this.tt)switch(!0){case this.gt.ri&&this.gt.ai:this.i.rotation.y=t+this.Dt*Math.PI/4;break;case this.gt.ri&&this.gt.oi:this.i.rotation.y=t-this.Dt*Math.PI/4;break;case this.gt.ui&&this.gt.ai:this.i.rotation.y=t+3*this.Dt*Math.PI/4;break;case this.gt.ui&&this.gt.oi:this.i.rotation.y=t-3*this.Dt*Math.PI/4;break;case this.gt.ri:this.i.rotation.y=t;break;case this.gt.ui:this.i.rotation.y=t+Math.PI;break;case this.gt.ai:this.i.rotation.y=t+this.Dt*Math.PI/2;break;case this.gt.oi:this.i.rotation.y=t-this.Dt*Math.PI/2}else this.dt&&(this.i.rotation.y=t)}},i.prototype.si=function(t,i,s){if((!this.tt||0!=this.L)&&!this.gt.hi&&!this.gt.ei&&(this.gt.oi||this.gt.ai)){var h=this.g.turnLeft.speed*s;this.gt.ni&&(h*=2);var n=void 0;1==this.L?(this.$||(this.Z=-this.zt*this.Pt(),this.S&&(this.Z=-this.Z),this.$=!0),n=this.Z,this.gt.oi?this.gt.ri||(this.gt.ui?n=-this.Z:t=this.Z>0?this.g.turnRight:this.g.turnLeft):this.gt.ri?n=-this.Z:this.gt.ui||(n=-this.Z,t=this.Z>0?this.g.turnLeft:this.g.turnRight)):(n=1,this.gt.oi?(this.gt.ui&&(n=-1),i||(t=this.g.turnLeft)):(this.gt.ri&&(n=-1),i||(n=-1,t=this.g.turnRight)),this.dt&&(this.jt.alpha=this.jt.alpha+this.Dt*h*n)),this.i.rotation.y=this.i.rotation.y+h*n}return t},i.prototype.fi=function(){this.Y=0,this.H=0,this.K=!1},i.prototype.Wt=function(i){if(this.D)return this.g.idle;this.N=!1,this.P=!1,this.Y=0;var s=this.g.idle;if(this.H=0,0===i)this.T=5;else{var h=this.it*this.u;this.T=h*i+this.u*i*i/2,this.it=this.it+i}if(this.T<.01)return s;var n=new t.Vector3(0,-this.T,0);if(this.i.moveWithCollisions(n),this.i.position.y>this._.y||this.i.position.y===this._.y)this.ci();else if(this.i.position.ythis.ht&&(this.D=!0,this.it=0)},i.prototype.li=function(){this.D=!1,this.st=0},i.prototype.Ht=function(){this.dt&&(0==this.j&&this.i.position.addToRef(this.F,this.jt.target),this.jt.radius>this.jt.lowerRadiusLimit&&(this.C||this.lt)&&this.vi(),this.jt.radius<=this.jt.lowerRadiusLimit?this.A||this.et||(this.bi(this.i),this.jt.checkCollisions=!1,this.R=this.L,this.L=0,this.et=!0):this.et&&(this.et=!1,this.L=this.R,this.wi(this.i),this.jt.checkCollisions=this.nt))},i.prototype.bi=function(i){var s=this;this.rt.set(i,i.visibility),i.visibility=0,i.getChildMeshes(!1,(function(i){return i instanceof t.Mesh&&(s.rt.set(i,i.visibility),i.visibility=0),!1}))},i.prototype.wi=function(i){var s=this;i.visibility=this.rt.get(i),i.getChildMeshes(!1,(function(i){return i instanceof t.Mesh&&(i.visibility=s.rt.get(i)),!1}))},i.prototype.vi=function(){var t=this;this.jt.position.subtractToRef(this.jt.target,this.ft),this.ut.origin=this.jt.target,this.ut.length=this.ft.length(),this.ut.direction=this.ft.normalize();var i=this.yt.multiPickWithRay(this.ut,(function(i){return i!=t.i}));if(this.lt)if(this.ki=this.ct,i.length>0){this.ct=new Array;for(var s=0,h=i;s0){if(!(1!=i.length||this.Mi(i[0].pickedMesh)||i[0].pickedMesh.checkCollisions&&this.jt.checkCollisions))return;for(var o=null,c=0;c0?h[0].skeleton:null},i.prototype.pi=function(t){return null==t.parent?t:this.pi(t.parent)},i.prototype.setAvatar=function(i,s){void 0===s&&(s=!1);var h=this.pi(i);return h instanceof t.Mesh?(this.i=h,this.h=this.di(i),this.kt=this.Et(i,this.yt.animationGroups,!0),this.g.reset(),this.kt||null==this.h||this.Ot(this.h),this.Jt(i),this.setFaceForward(s),!0):(console.error("Cannot move this mesh. The root node of the mesh provided is not a mesh"),!1)},i.prototype.getAvatar=function(){return this.i},i.prototype.setAvatarSkeleton=function(t){this.h=t,null!=this.h&&this.ji(t)?this.kt=!0:this.kt=!1,this.kt||null==this.h||this.Ot(this.h)},i.prototype.ji=function(t){var i=this;return t.animations.some((function(t){return i.yt.animationGroups.some((function(i){return i.children.some((function(i){return i.animation==t}))}))}))},i.prototype.getSkeleton=function(){return this.h},i}(),s=function(){function t(){this.ri=!1,this.ui=!1,this.ai=!1,this.oi=!1,this.ei=!1,this.hi=!1,this.Qt=!1,this.ni=!1,this.reset()}return t.prototype.reset=function(){this.ri=!1,this.ui=!1,this.ai=!1,this.oi=!1,this.ei=!1,this.hi=!1,this.Qt=!1,this.ni=!1},t}(),e=function(){function t(t,i,s){void 0===i&&(i=1),this.name="",this.loop=!0,this.rate=1,this.exist=!1,this.id=t,this.speed=i,this.ds=i,this.key=s,this.dk=s}return t.prototype.reset=function(){this.name="",this.speed=this.ds,this.key=this.dk,this.loop=!0,this.rate=1,this.sound=null,this.exist=!1},t}(),r=function(){function t(){this.walk=new e("walk",3,"w"),this.walkBack=new e("walkBack",1.5,"s"),this.walkBackFast=new e("walkBackFast",3,"na"),this.idle=new e("idle",0,"na"),this.idleJump=new e("idleJump",6," "),this.run=new e("run",6,"na"),this.runJump=new e("runJump",6,"na"),this.fall=new e("fall",0,"na"),this.turnLeft=new e("turnLeft",Math.PI/8,"a"),this.turnLeftFast=new e("turnLeftFast",Math.PI/4,"na"),this.turnRight=new e("turnRight",Math.PI/8,"d"),this.turnRightFast=new e("turnRightFast",Math.PI/4,"na"),this.strafeLeft=new e("strafeLeft",1.5,"q"),this.strafeLeftFast=new e("strafeLeftFast",3,"na"),this.strafeRight=new e("strafeRight",1.5,"e"),this.strafeRightFast=new e("strafeRightFast",3,"na"),this.slideBack=new e("slideBack",0,"na")}return t.prototype.reset=function(){for(var t=0,i=Object.keys(this);t {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__247__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\r\n Skeleton,\r\n ArcRotateCamera,\r\n Vector3,\r\n Mesh,\r\n Node,\r\n Scene,\r\n Ray,\r\n PickingInfo,\r\n AnimationGroup,\r\n TransformNode,\r\n TargetedAnimation,\r\n Matrix,\r\n DeepImmutable,\r\n AbstractMesh,\r\n PlaySoundAction,\r\n InstancedMesh,\r\n Sound,\r\n AnimationRange,\r\n Animatable,\r\n AnimationEvent,\r\n int\r\n} from \"babylonjs\";\r\n\r\n\r\nexport class CharacterController {\r\n\r\n private _avatar: Mesh = null;;\r\n private _skeleton: Skeleton = null;\r\n private _camera: ArcRotateCamera;\r\n private _scene: Scene;\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n\r\n private _gravity: number = 9.8;\r\n //slopeLimit in degrees\r\n private _minSlopeLimit: number = 30;\r\n private _maxSlopeLimit: number = 45;\r\n //slopeLimit in radians\r\n private _sl1: number = Math.PI * this._minSlopeLimit / 180;\r\n private _sl2: number = Math.PI * this._maxSlopeLimit / 180;\r\n\r\n //The av will step up a stair only if it is closer to the ground than the indicated value.\r\n private _stepOffset: number = 0.25;\r\n //toal amount by which the av has moved up\r\n private _vMoveTot: number = 0;\r\n //position of av when it started moving up\r\n private _vMovStartPos: Vector3 = Vector3.Zero();\r\n\r\n\r\n private _actionMap: ActionMap = new ActionMap();\r\n\r\n private _cameraElastic: boolean = true;\r\n private _cameraTarget: Vector3 = Vector3.Zero();\r\n //should we go into first person view when camera is near avatar (radius is lowerradius limit)\r\n private _noFirstPerson: boolean = false;\r\n\r\n\r\n\r\n public setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number) {\r\n this._minSlopeLimit = minSlopeLimit;\r\n this._maxSlopeLimit = maxSlopeLimit;\r\n\r\n this._sl1 = Math.PI * this._minSlopeLimit / 180;\r\n this._sl2 = Math.PI * this._maxSlopeLimit / 180;\r\n }\r\n\r\n /**\r\n * The av will step up a stair only if it is closer to the ground than the indicated value.\r\n * Default value is 0.25 m\r\n */\r\n public setStepOffset(stepOffset: number) {\r\n this._stepOffset = stepOffset;\r\n }\r\n\r\n public setWalkSpeed(n: number) {\r\n this._actionMap.walk.speed = n;\r\n }\r\n public setRunSpeed(n: number) {\r\n this._actionMap.run.speed = n;\r\n }\r\n public setBackSpeed(n: number) {\r\n this._actionMap.walkBack.speed = n;\r\n }\r\n public setBackFastSpeed(n: number) {\r\n this._actionMap.walkBackFast.speed = n;\r\n }\r\n public setJumpSpeed(n: number) {\r\n this._actionMap.idleJump.speed = n;\r\n this._actionMap.runJump.speed = n;\r\n }\r\n public setLeftSpeed(n: number) {\r\n this._actionMap.strafeLeft.speed = n;\r\n }\r\n public setLeftFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n public setRightSpeed(n: number) {\r\n this._actionMap.strafeRight.speed = n;\r\n }\r\n public setRightFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n // get turnSpeed in degrees per second.\r\n // store in radians per second\r\n public setTurnSpeed(n: number) {\r\n this._actionMap.turnLeft.speed = n * Math.PI / 180;\r\n this._actionMap.turnRight.speed = n * Math.PI / 180;\r\n }\r\n public setTurnFastSpeed(n: number) {\r\n this._actionMap.turnLeftFast.speed = n * Math.PI / 180;\r\n this._actionMap.turnRightFast.speed = n * Math.PI / 180;\r\n }\r\n public setGravity(n: number) {\r\n this._gravity = n;\r\n }\r\n\r\n /**\r\n * Use this to provide animationGroups to the character controller.\r\n * Provide the AnimationGroups using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animationGroup.\r\n * Example:\r\n * let myWalkAnimationGroup:AnimationGroup = ...;\r\n * let agMap:{} = {\r\n * \"walk\":myWalkAnimationGroup,\r\n * \"run\" : {\"ag\":myRunAnimationGroup,\"rate\":1},\r\n * \"idle\" : {\"ag\":myIdleAnimationGroup,\"loop\":true,\"rate\":1},\r\n * ....\r\n * ....\r\n * }\r\n * \r\n * @param agMap a map of character controller animation name to animationGroup\r\n */\r\n public setAnimationGroups(agMap: {}) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n this._isAG = true;\r\n this.setActionMap(agMap);\r\n }\r\n\r\n /**\r\n * Use this to provide AnimationRanges to the character controller.\r\n * Provide the AnimationRanges using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animation range name or an object with animation range data.\r\n * example:\r\n * let arMap = {\r\n * \"walk\":\"myWalk\",\r\n * \"run\" : {\"name\":\"myRun\",\"rate\":1},\r\n * \"idle\" : {\"name\":\"myIdle\",\"loop\":true,\"rate\":1},\r\n * ....\r\n * }\r\n * \r\n * @param arMap a map of character controller animation name to animationRange data\r\n */\r\n\r\n public setAnimationRanges(arMap: {}) {\r\n this._isAG = false;\r\n this.setActionMap(arMap);\r\n }\r\n\r\n /**\r\n * updates action data in the cc actionMap\r\n * with action data from the provided/input actionMap \r\n * \r\n * \r\n * return \"ar\" or \"ag\" depending on if the data provided\r\n * was animation range or animation group data respt.\r\n * \r\n * TODO should validate provided data.\r\n * In other words if animation range provided make sure\r\n * the range exist in the skeleton\r\n * or if animation group provided make sure the animation group\r\n * can be played on this avataor\r\n * \r\n * @param inActMap \r\n * @returns \r\n */\r\n public setActionMap(inActMap: ActionMap): string {\r\n let agMap: boolean = false;\r\n let inActData: ActionData;\r\n\r\n\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.exist = false;\r\n\r\n inActData = inActMap[ccActData.id];\r\n //in previous version of cc the key value was AnimationGroup rather than ActionData\r\n //lets accomodate that for backward compatibility\r\n if (inActData != null) {\r\n if (inActData instanceof AnimationGroup) {\r\n ccActData.ag = inActData;\r\n ccActData.name = ccActData.ag.name;\r\n ccActData.exist = true;\r\n agMap = true;\r\n this._hasAnims = true;\r\n } else if (inActData.exist) {\r\n this._hasAnims = true;\r\n ccActData.exist = true;\r\n if (inActData instanceof Object) {\r\n if (inActData.ag) {\r\n ccActData.ag = inActData.ag;\r\n agMap = true;\r\n }\r\n if (inActData.name) {\r\n ccActData.name = inActData.name;\r\n }\r\n if (inActData.loop != null) ccActData.loop = inActData.loop;\r\n if (inActData.rate) ccActData.rate = inActData.rate;\r\n if (inActData.speed) ccActData.speed = inActData.speed;\r\n // if (actDataI.key) actDataO.key = actDataI.key;\r\n if (inActData.sound) ccActData.sound = inActData.sound;\r\n } else {\r\n ccActData.name = inActData;\r\n }\r\n }\r\n }\r\n }\r\n this._checkFastAnims();\r\n //force to play new anims\r\n this._prevActData = null;\r\n if (agMap) return \"ag\"; else return \"ar\";\r\n }\r\n\r\n public getActionMap(): ActionMap {\r\n let map: ActionMap = new ActionMap();\r\n\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let actDataI = this._actionMap[key];\r\n\r\n if (!(actDataI instanceof ActionData)) continue;\r\n if (!actDataI.exist) continue;\r\n\r\n let actDataO: ActionData = map[actDataI.id];\r\n actDataO.ag = actDataI.ag;\r\n actDataO.name = actDataI.name;\r\n actDataO.loop = actDataI.loop;\r\n actDataO.rate = actDataI.rate;\r\n actDataO.speed = actDataI.speed;\r\n actDataO.key = actDataI.key;\r\n actDataO.sound = actDataI.sound;\r\n actDataO.exist = actDataI.exist;\r\n }\r\n\r\n return map;\r\n }\r\n\r\n public getSettings(): CCSettings {\r\n let ccs: CCSettings = new CCSettings();\r\n ccs.faceForward = this.isFaceForward();\r\n ccs.topDown = this.getMode() == 1 ? true : false;\r\n ccs.turningOff = this.isTurningOff();\r\n ccs.cameraTarget = this._cameraTarget.clone();\r\n ccs.cameraElastic = this._cameraElastic;\r\n ccs.elasticSteps = this._elasticSteps;\r\n ccs.makeInvisble = this._makeInvisible;\r\n ccs.gravity = this._gravity;\r\n ccs.keyboard = this._ekb;\r\n ccs.maxSlopeLimit = this._maxSlopeLimit;\r\n ccs.minSlopeLimit = this._minSlopeLimit;\r\n ccs.noFirstPerson = this._noFirstPerson;\r\n ccs.stepOffset = this._stepOffset;\r\n ccs.sound = this._stepSound;\r\n\r\n return ccs;\r\n }\r\n\r\n public setSettings(ccs: CCSettings) {\r\n this.setFaceForward(ccs.faceForward);\r\n this.setMode(ccs.topDown ? 1 : 0);\r\n this.setTurningOff(ccs.turningOff);\r\n this.setCameraTarget(ccs.cameraTarget);\r\n this.setCameraElasticity(ccs.cameraElastic);\r\n this.setElasticiSteps(ccs.elasticSteps);\r\n this.makeObstructionInvisible(ccs.makeInvisble);\r\n this.setGravity(ccs.gravity);\r\n this.enableKeyBoard(ccs.keyboard);\r\n this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit);\r\n this.setNoFirstPerson(ccs.noFirstPerson);\r\n this.setStepOffset(ccs.stepOffset);\r\n this.setSound(ccs.sound);\r\n\r\n }\r\n\r\n private _setAnim(anim: ActionData, animName?: string | AnimationGroup, rate?: number, loop?: boolean) {\r\n\r\n //animation range need skeleton\r\n if (!this._isAG && this._skeleton == null) return;\r\n\r\n if (animName != null) {\r\n if (this._isAG) {\r\n if (!(animName instanceof AnimationGroup)) return;\r\n anim.ag = animName;\r\n anim.exist = true;\r\n } else {\r\n if (this._skeleton.getAnimationRange(anim.name) != null) {\r\n anim.name = animName;\r\n anim.exist = true;\r\n } else {\r\n anim.exist = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (loop != null) anim.loop = loop;\r\n if (rate != null) anim.rate = rate;\r\n }\r\n\r\n public enableBlending(n: number) {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let act = this._actionMap[key];\r\n if (!(act instanceof ActionData)) continue;\r\n if (act.exist) {\r\n let ar: AnimationGroup = act.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = true;\r\n ta.animation.blendingSpeed = n;\r\n }\r\n }\r\n }\r\n } else {\r\n if (this._skeleton !== null)\r\n this._skeleton.enableBlending(n);\r\n }\r\n }\r\n\r\n public disableBlending() {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (anim.exist) {\r\n let ar: AnimationGroup = anim.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //setters for animations\r\n public setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walk, rangeName, rate, loop);\r\n }\r\n public setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.run, rangeName, rate, loop);\r\n }\r\n public setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBack, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack);\r\n }\r\n public setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop);\r\n }\r\n public setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.slideBack, rangeName, rate, loop);\r\n }\r\n public setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idle, rangeName, rate, loop);\r\n }\r\n public setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n }\r\n public setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop);\r\n }\r\n public setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n }\r\n public setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop);\r\n }\r\n public setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n }\r\n public setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop);\r\n }\r\n public setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n public setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop);\r\n }\r\n public setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idleJump, rangeName, rate, loop);\r\n }\r\n public setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.runJump, rangeName, rate, loop);\r\n }\r\n public setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.fall, rangeName, rate, loop);\r\n }\r\n\r\n\r\n _stepSound: Sound;\r\n // setters for sound\r\n public setSound(sound: Sound) {\r\n if (sound == null) return;\r\n this._stepSound = sound;\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n sound.loop = false;\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.sound = sound;\r\n ccActData.sound.attachToMesh(this._avatar);\r\n }\r\n this._actionMap.idle.sound = null;\r\n this._actionMap.fall.sound = null;\r\n this._actionMap.slideBack.sound = null;\r\n }\r\n\r\n\r\n // setters for keys\r\n public setWalkKey(key: string) {\r\n this._actionMap.walk.key = key.toLowerCase();\r\n }\r\n public setWalkBackKey(key: string) {\r\n this._actionMap.walkBack.key = key.toLowerCase();\r\n }\r\n public setTurnLeftKey(key: string) {\r\n this._actionMap.turnLeft.key = key.toLowerCase();\r\n }\r\n public setTurnRightKey(key: string) {\r\n this._actionMap.turnRight.key = key.toLowerCase();\r\n }\r\n public setStrafeLeftKey(key: string) {\r\n this._actionMap.strafeLeft.key = key.toLowerCase();\r\n }\r\n public setStrafeRightKey(key: string) {\r\n this._actionMap.strafeRight.key = key.toLowerCase();\r\n }\r\n public setJumpKey(key: string) {\r\n this._actionMap.idleJump.key = key.toLowerCase();\r\n }\r\n\r\n public setCameraElasticity(b: boolean) {\r\n this._cameraElastic = b;\r\n }\r\n\r\n public setElasticiSteps(n: number) {\r\n this._elasticSteps = n;\r\n }\r\n\r\n public makeObstructionInvisible(b: boolean) {\r\n this._makeInvisible = b;\r\n }\r\n public setCameraTarget(v: Vector3) {\r\n this._cameraTarget.copyFrom(v);\r\n }\r\n\r\n\r\n /**\r\n * user should call this whenever the user changes the camera checkCollision \r\n * property\r\n * \r\n */\r\n public cameraCollisionChanged() {\r\n this._savedCameraCollision = this._camera.checkCollisions;\r\n }\r\n public setNoFirstPerson(b: boolean) {\r\n this._noFirstPerson = b;\r\n }\r\n\r\n /**\r\n * if av has the required anim (walk, run etc) then \r\n * mark that anim as existing\r\n * \r\n * @param skel \r\n */\r\n\r\n private _checkAnimRanges(skel: Skeleton) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (skel != null) {\r\n if (skel.getAnimationRange(anim.id) != null) {\r\n anim.name = anim.id;\r\n anim.exist = true;\r\n this._hasAnims = true;\r\n }\r\n } else {\r\n anim.exist = false;\r\n }\r\n }\r\n this._checkFastAnims();\r\n }\r\n\r\n /**\r\n * if fast anims do not exist then use their slow counterpart as them but double the rate at which they play\r\n */\r\n private _checkFastAnims() {\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack)\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n\r\n private _copySlowAnims(f: ActionData, s: ActionData) {\r\n if (f.exist) return;\r\n if (!s.exist) return;\r\n f.exist = true;\r\n f.ag = s.ag;\r\n f.name = s.name;\r\n f.rate = s.rate * 2;\r\n }\r\n\r\n /**\r\n * Use this to make the character controller suitable for a isometeric/top down games or fps/third person game.\r\n * 1 In isometric/top down games the camera direction has no bearing on avatar movement.\r\n * 0 In fps/third person game rotating the camera around the avatar , rotates the avatar too.\r\n * \r\n * cannot switch mode to 0 if no camera avaiable.\r\n */\r\n private _mode = 0;\r\n private _saveMode = 0;\r\n public setMode(n: number) {\r\n //cannot switch mode to 0 if no camera avaiable.\r\n if (this._hasCam) {\r\n this._mode = n;\r\n this._saveMode = n;\r\n } else {\r\n this._mode = 1;\r\n this._saveMode = 1;\r\n }\r\n }\r\n public getMode() {\r\n return this._mode;\r\n }\r\n /**\r\n * Use this to set turning off.\r\n * When turining is off \r\n * a) turn left or turn right keys result in avatar facing and moving left or right with respect to camera.\r\n * b) walkback/runback key results in avatar facing back and walking/running towards camera.\r\n * \r\n * This setting has no effect when mode is 1.\r\n * \r\n * @param b \r\n */\r\n public setTurningOff(b: boolean) {\r\n this._noRot = b;\r\n }\r\n public isTurningOff() {\r\n return this._noRot;\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * BABYLONJS GLB models are RHS and exhibit this behavior\r\n * \r\n */\r\n private _isLHS_RHS = false;\r\n private _signLHS_RHS = -1;\r\n private _setRHS(mesh: TransformNode) {\r\n const meshMatrix: Matrix = mesh.getWorldMatrix();\r\n const _localX = Vector3.FromArray(>meshMatrix.m, 0);\r\n const _localY = Vector3.FromArray(>meshMatrix.m, 4);\r\n const _localZ = Vector3.FromArray(>meshMatrix.m, 8);\r\n const actualZ = Vector3.Cross(_localX, _localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, _localZ) < 0) {\r\n this._isLHS_RHS = true;\r\n this._signLHS_RHS = 1;\r\n }\r\n else {\r\n this._isLHS_RHS = false;\r\n this._signLHS_RHS = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Use setFaceForward(true|false) to indicate that the avatar's face points forward (true) or backward (false).\r\n * The avatar's face points forward if its face is looking in positive local Z axis direction\r\n */\r\n private _ffSign: number;\r\n private _rhsSign: number;\r\n private _ff: boolean;\r\n //in mode 0, av2cam is used to align avatar with camera , with camera always facing avatar's back\r\n //note:camera alpha is measured anti-clockwise , avatar rotation is measured clockwise \r\n private _av2cam;\r\n public setFaceForward(b: boolean) {\r\n this._ff = b;\r\n\r\n this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1;\r\n\r\n if (!this._hasCam) {\r\n this._av2cam = 0;\r\n this._ffSign = 1;\r\n return;\r\n }\r\n\r\n if (this._isLHS_RHS) {\r\n this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2;\r\n this._ffSign = b ? 1 : -1;\r\n } else {\r\n this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2;\r\n this._ffSign = b ? -1 : 1;\r\n }\r\n\r\n }\r\n\r\n public isFaceForward() {\r\n return this._ff;\r\n }\r\n\r\n private checkAGs(agMap: {}) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (agMap[anim.name] != null) {\r\n anim.ag = agMap[anim.name];\r\n anim.exist = true;\r\n }\r\n }\r\n }\r\n\r\n // check if any of the mesh on the node tree is refrenced by any animation group\r\n private _containsAG(node: Node, ags: AnimationGroup[], fromRoot: boolean) {\r\n let r: Node;\r\n let ns: Node[];\r\n\r\n if (fromRoot) {\r\n r = this._getRoot(node);\r\n ns = r.getChildren((n) => { return (n instanceof TransformNode) }, false);\r\n } else {\r\n r = node;\r\n ns = [r];\r\n }\r\n\r\n for (let ag of ags) {\r\n let tas: TargetedAnimation[] = ag.targetedAnimations;\r\n for (let ta of tas) {\r\n if (ns.indexOf(ta.target) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //get the root of Node\r\n private _getRoot(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._getRoot(tn.parent);\r\n }\r\n\r\n private _started: boolean = false;\r\n public start() {\r\n if (this._started) return;\r\n this._started = true;\r\n this._act.reset();\r\n this._movFallTime = 0;\r\n //first time we enter render loop, delta time is zero\r\n this._idleFallTime = 0.001;\r\n this._grounded = false;\r\n this._updateTargetValue();\r\n if (this._ekb) this._addkeylistener();\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public stop() {\r\n if (!this._started) return;\r\n this._started = false;\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this._removekeylistener();\r\n this._prevActData = null;\r\n }\r\n\r\n /**\r\n * use pauseAnim to stop the charactere controller from playing\r\n * any animation on the character\r\n * use this when you want to play your animation instead\r\n * see also resumeAnim()\r\n */\r\n private _stopAnim: boolean = false;\r\n public pauseAnim() {\r\n this._stopAnim = true;\r\n\r\n if (this._prevActData != null && this._prevActData.exist) {\r\n //stop current animation\r\n if (this._isAG) {\r\n this._prevActData.ag.stop();\r\n } else {\r\n //this._scene.stopAnimation(this._skeleton, this._prevActData.name);\r\n this._scene.stopAnimation(this._skeleton);\r\n //this._scene.stopAllAnimations();\r\n }\r\n //stop current sound\r\n if (this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n }\r\n }\r\n\r\n /**\r\n * use resumeAnim to resume the character controller playing\r\n * animations on the character.\r\n * see also pauseAnim()\r\n */\r\n public resumeAnim() {\r\n this._stopAnim = false;\r\n this._prevActData = null;\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n private _prevActData: ActionData = null;\r\n private _avStartPos: Vector3 = Vector3.Zero();\r\n private _grounded: boolean = false;\r\n //distance by which AV would move down if in freefall\r\n private _freeFallDist: number = 0;\r\n\r\n //how many minimum contiguos frames should the AV have been in free fall\r\n //before we assume AV is in big freefall.\r\n //we will use this to remove animation flicker during move down a slope (fall, move, fall move etc)\r\n //TODO: base this on slope - large slope large count\r\n private _fallFrameCountMin: number = 50;\r\n private _fallFrameCount: number = 0;\r\n\r\n private _inFreeFall: boolean = false;\r\n private _wasWalking: boolean = false;\r\n private _wasRunning: boolean = false;\r\n private _moveVector: Vector3;\r\n\r\n //used only in mode 1\r\n //value 1 or -1 , -1 if avatar is facing camera\r\n //private _notFacingCamera = 1;\r\n\r\n private _isAvFacingCamera(): number {\r\n if (!this._hasCam) return 1;\r\n if (Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) return 1\r\n else return -1;\r\n }\r\n\r\n private _moveAVandCamera() {\r\n this._avStartPos.copyFrom(this._avatar.position);\r\n let actData: ActionData = null;\r\n const dt: number = this._scene.getEngine().getDeltaTime() / 1000;\r\n\r\n if (this._act._jump && !this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doJump(dt);\r\n } else if (this.anyMovement() || this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doMove(dt);\r\n } else if (!this._inFreeFall) {\r\n actData = this._doIdle(dt);\r\n }\r\n if (!this._stopAnim && this._hasAnims && actData != null) {\r\n if (this._prevActData !== actData) {\r\n if (actData.exist) {\r\n\r\n //animation frame counts\r\n let c: number;\r\n let fps: number = 30;\r\n\r\n if (this._isAG) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n actData.ag.start(actData.loop, actData.rate);\r\n fps = actData.ag.targetedAnimations[0].animation.framePerSecond;\r\n c = (actData.ag.to - actData.ag.from);\r\n } else {\r\n let a: Animatable = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate);\r\n fps = a.getAnimations()[0].animation.framePerSecond;\r\n c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from;\r\n }\r\n\r\n //SOUND\r\n //TODO do sound as animationevent.\r\n if (this._prevActData != null && this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n if (actData.sound != null) {\r\n actData.sound.play();\r\n //play sound twice during the animation\r\n this._sndId = setInterval(() => { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2));\r\n }\r\n }\r\n this._prevActData = actData;\r\n }\r\n }\r\n this._updateTargetValue();\r\n return;\r\n }\r\n\r\n private _soundLoopTime = 700;\r\n private _sndId = null;\r\n\r\n //verical position of AV when it is about to start a jump\r\n private _jumpStartPosY: number = 0;\r\n //for how long the AV has been in the jump\r\n private _jumpTime: number = 0;\r\n private _doJump(dt: number): ActionData {\r\n\r\n let actData: ActionData = null;\r\n actData = this._actionMap.runJump;\r\n if (this._jumpTime === 0) {\r\n this._jumpStartPosY = this._avatar.position.y;\r\n }\r\n\r\n this._jumpTime = this._jumpTime + dt;\r\n\r\n let forwardDist: number = 0;\r\n let jumpDist: number = 0;\r\n let disp: Vector3;\r\n\r\n if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n if (this._wasRunning || this._wasWalking) {\r\n if (this._wasRunning) {\r\n forwardDist = this._actionMap.run.speed * dt;\r\n } else if (this._wasWalking) {\r\n forwardDist = this._actionMap.walk.speed * dt;\r\n }\r\n //find out in which horizontal direction the AV was moving when it started the jump\r\n disp = this._moveVector.clone();\r\n disp.y = 0;\r\n disp = disp.normalize();\r\n disp.scaleToRef(forwardDist, disp);\r\n jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt);\r\n disp.y = jumpDist;\r\n } else {\r\n jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt);\r\n disp = new Vector3(0, jumpDist, 0);\r\n actData = this._actionMap.idleJump;\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y/2;\r\n }\r\n //moveWithCollision only seems to happen if length of displacment is atleast 0.001\r\n this._avatar.moveWithCollisions(disp);\r\n if (jumpDist < 0) {\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y;\r\n //check if going up a slope or back on flat ground \r\n if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) {\r\n this._endJump();\r\n } else if (this._avatar.position.y < this._jumpStartPosY) {\r\n //the avatar is below the point from where it started the jump\r\n //so it is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than acceptable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endJump();\r\n }\r\n } else {\r\n actData = this._actionMap.fall;\r\n }\r\n }\r\n }\r\n return actData;\r\n }\r\n\r\n private _calcJumpDist(speed: number, dt: number): number {\r\n //up velocity at the begining of the lastt frame (v=u+at)\r\n let js: number = speed - this._gravity * this._jumpTime;\r\n //distance travelled up since last frame to this frame (s=ut+1/2*at^2)\r\n let jumpDist: number = js * dt - 0.5 * this._gravity * dt * dt;\r\n return jumpDist;\r\n }\r\n\r\n /**\r\n * does cleanup at the end of a jump\r\n */\r\n private _endJump() {\r\n this._act._jump = false;\r\n this._jumpTime = 0;\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n }\r\n\r\n /**\r\n * checks if two vectors v1 and v2 are equal within a precision of p\r\n */\r\n private _areVectorsEqual(v1: Vector3, v2: Vector3, p: number) {\r\n return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p));\r\n }\r\n\r\n /*\r\n * returns the slope (in radians) of a vector in the vertical plane\r\n */\r\n private _verticalSlope(v: Vector3): number {\r\n return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z)));\r\n }\r\n\r\n //for how long has the av been falling while moving\r\n private _movFallTime: number = 0;\r\n private _sign = 1;\r\n private _isTurning = false;\r\n private _noRot = false;\r\n private _doMove(dt: number): ActionData {\r\n\r\n //initial down velocity\r\n const u: number = this._movFallTime * this._gravity\r\n //calculate the distance by which av should fall down since last frame\r\n //assuming it is in freefall\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n\r\n this._movFallTime = this._movFallTime + dt;\r\n\r\n let moving: boolean = false;\r\n let actdata: ActionData = null;\r\n\r\n if (this._inFreeFall) {\r\n this._moveVector.y = -this._freeFallDist;\r\n moving = true;\r\n }\r\n\r\n\r\n //rotate avatar with respect to camera direction. \r\n this._rotateAV2C();\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n actdata = this._rotateAVnC(actdata, moving, dt);\r\n\r\n //now that avatar is rotated properly, construct the vector to move the avatar \r\n //donot move the avatar if avatar is in freefall\r\n\r\n if (!this._inFreeFall) {\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n\r\n let sign: number;\r\n let horizDist: number = 0;\r\n switch (true) {\r\n case (this._act._stepLeft):\r\n sign = this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeLeftFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._stepRight):\r\n sign = -this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeRight.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeRightFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._walk || (this._noRot && this._mode == 0)):\r\n if (this._act._speedMod) {\r\n this._wasRunning = true;\r\n horizDist = this._actionMap.run.speed * dt;\r\n actdata = this._actionMap.run;\r\n } else {\r\n this._wasWalking = true;\r\n horizDist = this._actionMap.walk.speed * dt;\r\n actdata = this._actionMap.walk;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n case (this._act._walkback):\r\n horizDist = this._actionMap.walkBack.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.walkBackFast.speed * dt;\r\n actdata = this._actionMap.walkBackFast;\r\n } else {\r\n actdata = this._actionMap.walkBack;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n }\r\n }\r\n\r\n // move the avatar\r\n\r\n if (moving) {\r\n if (this._moveVector.length() > 0.001) {\r\n this._avatar.moveWithCollisions(this._moveVector);\r\n //walking up a slope\r\n if (this._avatar.position.y > this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n const _slp: number = this._verticalSlope(actDisp);\r\n if (_slp >= this._sl2) {\r\n //this._climbingSteps=true;\r\n //is av trying to go up steps\r\n if (this._stepOffset > 0) {\r\n if (this._vMoveTot == 0) {\r\n //if just started climbing note down the position\r\n this._vMovStartPos.copyFrom(this._avStartPos);\r\n }\r\n this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y);\r\n if (this._vMoveTot > this._stepOffset) {\r\n //move av back to its position at begining of steps\r\n this._vMoveTot = 0;\r\n this._avatar.position.copyFrom(this._vMovStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n //move av back to old position\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n this._vMoveTot = 0;\r\n if (_slp > this._sl1) {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n } else {\r\n //continue walking\r\n this._endFreeFall();\r\n }\r\n }\r\n } else if ((this._avatar.position.y) < this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or walk?\r\n //if slope is less steeper than acceptable then walk else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endFreeFall();\r\n } else {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n } else {\r\n this._inFreeFall = true;\r\n this._fallFrameCount++;\r\n //AV could be running down a slope which mean freefall,run,frefall run ...\r\n //to remove anim flicker, check if AV has been falling down continously for last few consecutive frames\r\n //before changing to free fall animation\r\n if (this._fallFrameCount > this._fallFrameCountMin) {\r\n actdata = this._actionMap.fall;\r\n }\r\n }\r\n } else {\r\n this._endFreeFall();\r\n }\r\n }\r\n }\r\n return actdata;\r\n }\r\n\r\n /**\r\n * rotate avatar with respect to camera direction. \r\n */\r\n private _rotateAV2C() {\r\n if (this._hasCam)\r\n if (this._mode != 1) {\r\n let ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0;\r\n if (this._noRot) {\r\n switch (true) {\r\n case (this._act._walk && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walk && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walk):\r\n this._avatar.rotation.y = ca;\r\n break;\r\n case (this._act._walkback):\r\n this._avatar.rotation.y = ca + Math.PI;\r\n break;\r\n case (this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2;\r\n break;\r\n case (this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2;\r\n break;\r\n }\r\n } else {\r\n if (this._hasCam)\r\n this._avatar.rotation.y = ca;\r\n }\r\n }\r\n }\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n private _rotateAVnC(anim: ActionData, moving: boolean, dt: number): ActionData {\r\n if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) {\r\n let turnAngle = this._actionMap.turnLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n turnAngle = 2 * turnAngle;\r\n }\r\n let a;\r\n if (this._mode == 1) {\r\n // while turining, the avatar could start facing away from camera and end up facing camera.\r\n // we should not switch turning direction during this transition\r\n if (!this._isTurning) {\r\n // if (this._act.name != this._act.prevName) {\r\n // this._act.prevName = this._act.name;\r\n this._sign = -this._ffSign * this._isAvFacingCamera();\r\n if (this._isLHS_RHS) this._sign = - this._sign;\r\n this._isTurning = true;\r\n }\r\n a = this._sign;\r\n if (this._act._turnLeft) {\r\n if (this._act._walk) { }\r\n else if (this._act._walkback) a = -this._sign;\r\n else {\r\n anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft;\r\n }\r\n } else {\r\n if (this._act._walk) a = -this._sign;\r\n else if (this._act._walkback) { }\r\n else {\r\n a = -this._sign;\r\n anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight;\r\n }\r\n }\r\n } else {\r\n a = 1;\r\n if (this._act._turnLeft) {\r\n if (this._act._walkback) a = -1;\r\n if (!moving) anim = this._actionMap.turnLeft;\r\n } else {\r\n if (this._act._walk) a = -1;\r\n if (!moving) { a = -1; anim = this._actionMap.turnRight; }\r\n }\r\n if (this._hasCam)\r\n this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a;\r\n }\r\n\r\n this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a;\r\n }\r\n return anim;\r\n }\r\n\r\n private _endFreeFall(): void {\r\n this._movFallTime = 0;\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n\r\n //for how long has the av been falling while idle (not moving)\r\n private _idleFallTime: number = 0;\r\n private _doIdle(dt: number): ActionData {\r\n if (this._grounded) {\r\n return this._actionMap.idle;\r\n }\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n this._movFallTime = 0;\r\n let anim: ActionData = this._actionMap.idle;\r\n this._fallFrameCount = 0;\r\n\r\n\r\n if (dt === 0) {\r\n this._freeFallDist = 5;\r\n } else {\r\n const u: number = this._idleFallTime * this._gravity\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n this._idleFallTime = this._idleFallTime + dt;\r\n }\r\n //if displacement is less than 0.01(? need to verify further) then \r\n //moveWithDisplacement down against a surface seems to push the AV up by a small amount!!\r\n if (this._freeFallDist < 0.01) return anim;\r\n const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0);\r\n if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n this._avatar.moveWithCollisions(disp);\r\n if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n } else if (this._avatar.position.y < this._avStartPos.y) {\r\n //AV is going down. \r\n //AV is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than accebtable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n } else {\r\n this._unGroundIt();\r\n anim = this._actionMap.slideBack;\r\n }\r\n }\r\n }\r\n return anim;\r\n }\r\n\r\n private _groundFrameCount = 0;\r\n private _groundFrameMax = 10;\r\n /**\r\n * donot ground immediately\r\n * wait few more frames\r\n */\r\n private _groundIt(): void {\r\n this._groundFrameCount++;\r\n if (this._groundFrameCount > this._groundFrameMax) {\r\n this._grounded = true;\r\n this._idleFallTime = 0;\r\n }\r\n }\r\n private _unGroundIt() {\r\n this._grounded = false;\r\n this._groundFrameCount = 0;\r\n }\r\n\r\n private _savedCameraCollision: boolean = true;\r\n private _inFP = false;\r\n private _updateTargetValue() {\r\n if (!this._hasCam) return;\r\n //donot move camera if av is trying to clinb steps\r\n if (this._vMoveTot == 0)\r\n this._avatar.position.addToRef(this._cameraTarget, this._camera.target);\r\n\r\n if (this._camera.radius > this._camera.lowerRadiusLimit) { if (this._cameraElastic || this._makeInvisible) this._handleObstruction(); }\r\n\r\n //if user so desire, make the AV invisible if camera comes close to it\r\n if (this._camera.radius <= this._camera.lowerRadiusLimit) {\r\n if (!this._noFirstPerson && !this._inFP) {\r\n this._makeMeshInvisible(this._avatar);\r\n this._camera.checkCollisions = false;\r\n this._saveMode = this._mode;\r\n this._mode = 0;\r\n this._inFP = true;\r\n }\r\n } else {\r\n if (this._inFP) {\r\n this._inFP = false;\r\n this._mode = this._saveMode;\r\n this._restoreVisiblity(this._avatar);\r\n this._camera.checkCollisions = this._savedCameraCollision;\r\n }\r\n }\r\n }\r\n\r\n // make mesh and all its children invisible\r\n // store their current visibility state so that we can restore them later on\r\n private _makeMeshInvisible(mesh: Mesh) {\r\n\r\n this._visiblityMap.set(mesh, mesh.visibility);\r\n mesh.visibility = 0;\r\n\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) {\r\n this._visiblityMap.set(n, n.visibility);\r\n n.visibility = 0;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n private _visiblityMap: Map = new Map();\r\n\r\n //restore mesh visibility to previous state\r\n private _restoreVisiblity(mesh: Mesh) {\r\n mesh.visibility = this._visiblityMap.get(mesh);\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) n.visibility = this._visiblityMap.get(n);\r\n return false;\r\n });\r\n }\r\n\r\n private _ray: Ray = new Ray(Vector3.Zero(), Vector3.One(), 1);\r\n private _rayDir: Vector3 = Vector3.Zero();\r\n //camera seems to get stuck into things\r\n //should move camera away from things by a value of cameraSkin\r\n private _cameraSkin: number = 0.5;\r\n private _prevPickedMeshes: AbstractMesh[];\r\n private _pickedMeshes: AbstractMesh[] = new Array();;\r\n private _makeInvisible = false;\r\n private _elasticSteps = 50;\r\n private _alreadyInvisible: AbstractMesh[];\r\n\r\n /**\r\n * The following method handles the use case wherein some mesh\r\n * comes between the avatar and the camera thus obstructing the view\r\n * of the avatar.\r\n * Two ways this can be handled\r\n * a) make the obstructing mesh invisible\r\n * instead of invisible a better option would have been to make semi transparent.\r\n * Unfortunately, unlike mesh, mesh instances do not \"visibility\" setting)\r\n * Every alternate frame make mesh visible and invisible to give the impression of semi-transparent.\r\n * b) move the camera in front of the obstructing mesh\r\n */\r\n private _handleObstruction() {\r\n\r\n //get vector from av (camera.target) to camera\r\n this._camera.position.subtractToRef(this._camera.target, this._rayDir);\r\n //start ray from av to camera\r\n this._ray.origin = this._camera.target;\r\n this._ray.length = this._rayDir.length();\r\n this._ray.direction = this._rayDir.normalize();\r\n\r\n //TODO \r\n //handle case were pick is with a child of avatar, avatar atatchment. etc\r\n const pis: PickingInfo[] = this._scene.multiPickWithRay(this._ray, (mesh) => {\r\n if (mesh == this._avatar) return false;\r\n else return true;\r\n });\r\n\r\n\r\n if (this._makeInvisible) {\r\n this._prevPickedMeshes = this._pickedMeshes;\r\n if (pis.length > 0) {\r\n this._pickedMeshes = new Array();\r\n for (let pi of pis) {\r\n if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) {\r\n pi.pickedMesh.isVisible = false;\r\n this._pickedMeshes.push(pi.pickedMesh);\r\n }\r\n }\r\n for (let pm of this._prevPickedMeshes) {\r\n if (!this._pickedMeshes.includes(pm)) {\r\n pm.isVisible = true;\r\n }\r\n }\r\n } else {\r\n for (let pm of this._prevPickedMeshes) {\r\n pm.isVisible = true;\r\n }\r\n this._prevPickedMeshes.length = 0;\r\n }\r\n }\r\n\r\n if (this._cameraElastic) {\r\n if (pis.length > 0) {\r\n // postion the camera in front of the mesh that is obstructing camera\r\n\r\n //if only one obstruction and it is invisible then if it is not collidable or our camera is not collidable then do nothing\r\n if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) return;\r\n\r\n //if our camera is collidable then we donot want it to get stuck behind another collidable obsrtucting mesh\r\n let pp: Vector3 = null;\r\n\r\n //we will asume the order of picked meshes is from closest to avatar to furthest\r\n //we should get the first one which is visible or invisible and collidable\r\n for (let i = 0; i < pis.length; i++) {\r\n let pm = pis[i].pickedMesh;\r\n if (this._isSeeAble(pm)) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n } else if (pm.checkCollisions) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n }\r\n }\r\n if (pp == null) return;\r\n\r\n const c2p: Vector3 = this._camera.position.subtract(pp);\r\n //note that when camera is collidable, changing the orbital camera radius may not work.\r\n //changing the radius moves the camera forward (with collision?) and collision can interfere with movement\r\n //\r\n //in every cylce we are dividing the distance to tarvel by same number of steps.\r\n //as we get closer to destination the speed will thus slow down.\r\n //when just 1 unit distance left, lets snap to the final position.\r\n //when calculating final position make sure the camera does not get stuck at the pickposition especially\r\n //if collision is on\r\n\r\n const l: number = c2p.length();\r\n if (this._camera.checkCollisions) {\r\n let step: Vector3;\r\n if (l <= 1) {\r\n step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin));\r\n } else {\r\n step = c2p.normalize().scaleInPlace(l / this._elasticSteps);\r\n }\r\n this._camera.position = this._camera.position.subtract(step);\r\n } else {\r\n let step: number;\r\n if (l <= 1) step = l + this._cameraSkin; else step = l / this._elasticSteps;\r\n this._camera.radius = this._camera.radius - (step);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //how many ways can a mesh be invisible?\r\n private _isSeeAble(mesh: AbstractMesh): boolean {\r\n if (!mesh.isVisible) return false;\r\n if (mesh.visibility == 0) return false;\r\n if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) return false;\r\n return true;\r\n //what about vertex color? groan!\r\n }\r\n\r\n\r\n private _move: boolean = false;\r\n public anyMovement(): boolean {\r\n return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight);\r\n }\r\n\r\n private _onKeyDown(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n if (e.repeat) return;\r\n switch (e.key.toLowerCase()) {\r\n case this._actionMap.idleJump.key:\r\n this._act._jump = true;\r\n break;\r\n case \"capslock\":\r\n this._act._speedMod = !this._act._speedMod;\r\n break;\r\n case \"shift\":\r\n this._act._speedMod = true;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = true;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = true;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = true;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = true;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = true;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = true;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _onKeyUp(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n switch (e.key.toLowerCase()) {\r\n case \"shift\":\r\n this._act._speedMod = false;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = false;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = false;\r\n this._isTurning = false;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = false;\r\n this._isTurning = false;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = false;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = false;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = false;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _ekb: boolean = true;\r\n public isKeyBoardEnabled(): boolean {\r\n return this._ekb;\r\n }\r\n public enableKeyBoard(b: boolean) {\r\n this._ekb = b;\r\n if (b) {\r\n this._addkeylistener();\r\n } else {\r\n this._removekeylistener();\r\n }\r\n }\r\n\r\n private _addkeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.addEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.addEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n private _removekeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.removeEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.removeEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n // control movement by commands rather than keyboard.\r\n public walk(b: boolean) {\r\n this._act._walk = b;\r\n }\r\n public walkBack(b: boolean) {\r\n this._act._walkback = b;\r\n }\r\n public walkBackFast(b: boolean) {\r\n this._act._walkback = b;\r\n this._act._speedMod = b;\r\n }\r\n public run(b: boolean) {\r\n this._act._walk = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnLeft(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnLeftFast(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnRight(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnRightFast(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeLeft(b: boolean) {\r\n this._act._stepLeft = b;\r\n }\r\n public strafeLeftFast(b: boolean) {\r\n this._act._stepLeft = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeRight(b: boolean) {\r\n this._act._stepRight = b;\r\n }\r\n public strafeRightFast(b: boolean) {\r\n this._act._stepRight = b;\r\n this._act._speedMod = b;\r\n }\r\n public jump() {\r\n this._act._jump = true;\r\n }\r\n public idle() {\r\n this._act.reset();\r\n }\r\n\r\n private _act: _Action;\r\n private _renderer: () => void;\r\n private _handleKeyUp: (e) => void;\r\n private _handleKeyDown: (e) => void;\r\n private _isAG: boolean = false;\r\n public isAg() {\r\n return this._isAG;\r\n }\r\n\r\n\r\n\r\n\r\n private _findSkel(n: Node): Skeleton {\r\n let root = this._root(n);\r\n\r\n if (root instanceof Mesh && root.skeleton) return root.skeleton;\r\n\r\n //find all child meshes which have skeletons\r\n let ms = root.getChildMeshes(\r\n false,\r\n (cm) => {\r\n if (cm instanceof Mesh) {\r\n if (cm.skeleton) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n //return the skeleton of the first child mesh\r\n if (ms.length > 0) return ms[0].skeleton; else return null;\r\n\r\n }\r\n\r\n private _root(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._root(tn.parent);\r\n }\r\n\r\n public setAvatar(avatar: Mesh, faceForward: boolean = false): boolean {\r\n\r\n let rootNode = this._root(avatar);\r\n if (rootNode instanceof Mesh) {\r\n this._avatar = rootNode;\r\n } else {\r\n console.error(\"Cannot move this mesh. The root node of the mesh provided is not a mesh\");\r\n return false;\r\n }\r\n\r\n this._skeleton = this._findSkel(avatar);\r\n this._isAG = this._containsAG(avatar, this._scene.animationGroups, true);\r\n\r\n this._actionMap.reset();\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n\r\n this._setRHS(avatar);\r\n this.setFaceForward(faceForward);\r\n\r\n return true;\r\n }\r\n\r\n public getAvatar() {\r\n return this._avatar;\r\n }\r\n\r\n // force a skeleton to be the avatar skeleton\r\n // should not be calling this normally\r\n public setAvatarSkeleton(skeleton: Skeleton) {\r\n this._skeleton = skeleton;\r\n\r\n\r\n if (this._skeleton != null && this._skelDrivenByAG(skeleton)) this._isAG = true; else this._isAG = false;\r\n\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n }\r\n\r\n\r\n // this check if any of this skeleton animations is referenced by any targetedAnimation in any of the animationgroup in the scene.\r\n private _skelDrivenByAG(skeleton: Skeleton) {\r\n return skeleton.animations.some(sa => this._scene.animationGroups.some(ag => ag.children.some(ta => ta.animation == sa)));\r\n }\r\n\r\n public getSkeleton() {\r\n return this._skeleton;\r\n }\r\n\r\n // does this character have any animations ?\r\n // remember we can use meshes without anims as characters too\r\n private _hasAnims: boolean = false;\r\n private _hasCam: boolean = true;\r\n\r\n /**\r\n * The avatar/character can be made up of multiple meshes arranged in a hierarchy.\r\n * As such we will pick the root of the hierarchy as the avatar.\r\n * The root should be a mesh as otherwise we cannot move it with moveWithCollision() method.\r\n * \r\n * Mutiple meshes in the hierarchy may have skeletons (if two or more meshes have skeleton then\r\n * the skeleton will mostly likely be the same). \r\n * So we will pick as avatar skeleton, the skeleton of the first mesh in the hierachy which has\r\n * a skeleton \r\n * \r\n * @param avatar \r\n * @param camera \r\n * @param scene \r\n * @param actionMap/animationGroupMap \r\n * maps actions to animations and other data like speed,sound etc \r\n * or \r\n * for backward compatibility could be AnimationGroup Map\r\n * @param faceForward \r\n */\r\n constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward = false) {\r\n\r\n this._camera = camera;\r\n\r\n //if camera is null assume this would be used to control an NPC\r\n //we cannot use mode 0 as that is dependent on camera being present. so force mode 1\r\n if (this._camera == null) {\r\n this._hasCam = false;\r\n this.setMode(1);\r\n }\r\n this._scene = scene;\r\n\r\n let success = this.setAvatar(avatar, faceForward);\r\n if (!success) {\r\n console.error(\"unable to set avatar\");\r\n }\r\n\r\n\r\n let dataType: string = null;\r\n if (actionMap != null) {\r\n dataType = this.setActionMap(actionMap);\r\n }\r\n\r\n //try to use the existing avatar animations\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n //animation groups\r\n if (this._isAG) {\r\n //TODO\r\n }\r\n\r\n if (this._hasCam) this._savedCameraCollision = this._camera.checkCollisions;\r\n\r\n this._act = new _Action();\r\n\r\n this._renderer = () => { this._moveAVandCamera() };\r\n this._handleKeyUp = (e) => { this._onKeyUp(e) };\r\n this._handleKeyDown = (e) => { this._onKeyDown(e) };\r\n }\r\n}\r\n\r\n\r\n\r\nclass _Action {\r\n\r\n public _walk: boolean = false;\r\n public _walkback: boolean = false;\r\n public _turnRight: boolean = false;\r\n public _turnLeft: boolean = false;\r\n public _stepRight: boolean = false;\r\n public _stepLeft: boolean = false;\r\n public _jump: boolean = false;\r\n\r\n // speed modifier - changes speed of movement\r\n public _speedMod: boolean = false;\r\n\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset() {\r\n this._walk = false;\r\n this._walkback = false;\r\n this._turnRight = false;\r\n this._turnLeft = false;\r\n this._stepRight = false;\r\n this._stepLeft = false;\r\n this._jump = false;\r\n this._speedMod = false;\r\n }\r\n}\r\n\r\nexport class ActionData {\r\n public id: string;\r\n public speed: number;\r\n //_ds default speed. speed is set to this on reset\r\n public ds: number;\r\n public sound: Sound;\r\n public key: string;\r\n //_dk defailt key\r\n public dk: string;\r\n\r\n //animation data\r\n //if _ag is null then assuming animation range and use _name to play animationrange\r\n //instead of name maybe call it arName?\r\n public name: string = \"\";\r\n public ag: AnimationGroup;\r\n public loop: boolean = true;\r\n public rate: number = 1;\r\n\r\n public exist: boolean = false;\r\n\r\n public constructor(id?: string, speed = 1, key?: string) {\r\n this.id = id;\r\n this.speed = speed;\r\n this.ds = speed;\r\n this.key = key;\r\n this.dk = key;\r\n }\r\n\r\n public reset() {\r\n this.name = \"\";\r\n this.speed = this.ds;\r\n this.key = this.dk;\r\n this.loop = true;\r\n this.rate = 1;\r\n this.sound = null;\r\n this.exist = false;\r\n }\r\n\r\n}\r\n\r\n//not really a \"Map\"\r\nexport class ActionMap {\r\n public walk = new ActionData(\"walk\", 3, \"w\");\r\n public walkBack = new ActionData(\"walkBack\", 1.5, \"s\");\r\n public walkBackFast = new ActionData(\"walkBackFast\", 3, \"na\");\r\n public idle = new ActionData(\"idle\", 0, \"na\");\r\n public idleJump = new ActionData(\"idleJump\", 6, \" \");\r\n public run = new ActionData(\"run\", 6, \"na\");\r\n public runJump = new ActionData(\"runJump\", 6, \"na\");\r\n public fall = new ActionData(\"fall\", 0, \"na\");\r\n public turnLeft = new ActionData(\"turnLeft\", Math.PI / 8, \"a\");\r\n public turnLeftFast = new ActionData(\"turnLeftFast\", Math.PI / 4, \"na\");\r\n public turnRight = new ActionData(\"turnRight\", Math.PI / 8, \"d\");\r\n public turnRightFast = new ActionData(\"turnRightFast\", Math.PI / 4, \"na\");\r\n public strafeLeft = new ActionData(\"strafeLeft\", 1.5, \"q\");\r\n public strafeLeftFast = new ActionData(\"strafeLeftFast\", 3, \"na\");\r\n public strafeRight = new ActionData(\"strafeRight\", 1.5, \"e\");\r\n public strafeRightFast = new ActionData(\"strafeRightFast\", 3, \"na\");\r\n public slideBack = new ActionData(\"slideBack\", 0, \"na\");\r\n\r\n public reset() {\r\n let keys: string[] = Object.keys(this);\r\n for (let key of keys) {\r\n let act = this[key];\r\n if (!(act instanceof ActionData)) continue;\r\n act.reset()\r\n }\r\n }\r\n};\r\n\r\nexport class CCSettings {\r\n public faceForward: boolean;\r\n public gravity: number;\r\n public minSlopeLimit: number;\r\n public maxSlopeLimit: number;\r\n public stepOffset: number;\r\n public cameraElastic: boolean = true;\r\n public elasticSteps: number;\r\n public makeInvisble: boolean = true;\r\n public cameraTarget: Vector3 = Vector3.Zero();\r\n public noFirstPerson: boolean = false;\r\n public topDown: boolean = true;\r\n //turningOff takes effect only when topDown is false\r\n public turningOff: boolean = true;\r\n public keyboard: boolean = true;\r\n public sound: Sound;\r\n}\r\n"],"names":["root","factory","exports","module","require","define","amd","a","i","self","__WEBPACK_EXTERNAL_MODULE__247__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","avatar","camera","scene","actionMap","faceForward","_avatar","_skeleton","_gravity","_minSlopeLimit","_maxSlopeLimit","_sl1","Math","PI","this","_sl2","_stepOffset","_vMoveTot","_vMovStartPos","Vector3","_actionMap","ActionMap","_cameraElastic","_cameraTarget","_noFirstPerson","_mode","_saveMode","_isLHS_RHS","_signLHS_RHS","_started","_stopAnim","_prevActData","_avStartPos","_grounded","_freeFallDist","_fallFrameCountMin","_fallFrameCount","_inFreeFall","_wasWalking","_wasRunning","_soundLoopTime","_sndId","_jumpStartPosY","_jumpTime","_movFallTime","_sign","_isTurning","_noRot","_idleFallTime","_groundFrameCount","_groundFrameMax","_savedCameraCollision","_inFP","_visiblityMap","Map","_ray","Ray","_rayDir","_cameraSkin","_pickedMeshes","Array","_makeInvisible","_elasticSteps","_move","_ekb","_isAG","_hasAnims","_hasCam","_camera","setMode","_scene","setAvatar","console","error","setActionMap","_checkAnimRanges","checkCollisions","_act","_Action","_renderer","_moveAVandCamera","_handleKeyUp","e","_onKeyUp","_handleKeyDown","_onKeyDown","getScene","setSlopeLimit","minSlopeLimit","maxSlopeLimit","setStepOffset","stepOffset","setWalkSpeed","walk","speed","setRunSpeed","run","setBackSpeed","walkBack","setBackFastSpeed","walkBackFast","setJumpSpeed","idleJump","runJump","setLeftSpeed","strafeLeft","setLeftFastSpeed","strafeLeftFast","setRightSpeed","strafeRight","setRightFastSpeed","setTurnSpeed","turnLeft","turnRight","setTurnFastSpeed","turnLeftFast","turnRightFast","setGravity","setAnimationGroups","agMap","exist","ag","stop","setAnimationRanges","arMap","inActMap","inActData","keys","ccActionName","ccActData","ActionData","id","AnimationGroup","name","loop","rate","sound","_checkFastAnims","getActionMap","map","actDataI","actDataO","getSettings","ccs","CCSettings","isFaceForward","topDown","getMode","turningOff","isTurningOff","cameraTarget","clone","cameraElastic","elasticSteps","makeInvisble","gravity","keyboard","noFirstPerson","_stepSound","setSettings","setFaceForward","setTurningOff","setCameraTarget","setCameraElasticity","setElasticiSteps","makeObstructionInvisible","enableKeyBoard","setNoFirstPerson","setSound","_setAnim","anim","animName","getAnimationRange","enableBlending","act","targetedAnimations","ta","animation","blendingSpeed","disableBlending","setWalkAnim","rangeName","setRunAnim","setWalkBackAnim","_copySlowAnims","setWalkBackFastAnim","setSlideBackAnim","slideBack","setIdleAnim","idle","setTurnRightAnim","setTurnRightFastAnim","setTurnLeftAnim","setTurnLeftFastAnim","setStrafeRightAnim","strafeRightFast","setStrafeRightFastAnim","setStrafeLeftAnim","setStrafeLeftFastAnim","setIdleJumpAnim","setRunJumpAnim","setFallAnim","fall","ccActionNames","attachToMesh","setWalkKey","toLowerCase","setWalkBackKey","setTurnLeftKey","setTurnRightKey","setStrafeLeftKey","setStrafeRightKey","setJumpKey","b","v","copyFrom","cameraCollisionChanged","skel","f","s","_setRHS","mesh","meshMatrix","getWorldMatrix","_localX","m","_localY","_localZ","actualZ","_ff","_rhsSign","useRightHandedSystem","_av2cam","_ffSign","checkAGs","_containsAG","node","ags","fromRoot","ns","_getRoot","getChildren","TransformNode","indexOf","target","tn","parent","start","reset","_updateTargetValue","_addkeylistener","registerBeforeRender","unregisterBeforeRender","_removekeylistener","pauseAnim","stopAnimation","clearInterval","resumeAnim","_isAvFacingCamera","forward","position","subtract","actData","dt","getEngine","getDeltaTime","_jump","_doJump","anyMovement","_doMove","_doIdle","c","fps","framePerSecond","to","from","beginAnimation","getAnimations","play","setInterval","abs","y","disp","forwardDist","jumpDist","rotation","alpha","_moveVector","normalize","scaleToRef","_calcJumpDist","moveWithCollisions","length","_endJump","actDisp","_areVectorsEqual","_verticalSlope","v1","v2","p","x","z","atan","sqrt","u","moving","actdata","_rotateAV2C","_rotateAVnC","sign","horizDist","_speedMod","calcMovePOV","_walk","_slp","_endFreeFall","ca","_turnRight","_turnLeft","_walkback","_stepLeft","_stepRight","turnAngle","_groundIt","_unGroundIt","addToRef","radius","lowerRadiusLimit","_handleObstruction","_makeMeshInvisible","_restoreVisiblity","set","visibility","getChildMeshes","Mesh","subtractToRef","origin","direction","pis","multiPickWithRay","_prevPickedMeshes","pi","pickedMesh","isVisible","includes","push","pm","_isSeeAble","pp","pickedPoint","c2p","l","step","addInPlace","normalizeToNew","scaleInPlace","material","alphaMode","repeat","isKeyBoardEnabled","canvas","getRenderingCanvas","addEventListener","removeEventListener","jump","isAg","_findSkel","_root","skeleton","ms","cm","rootNode","animationGroups","getAvatar","setAvatarSkeleton","_skelDrivenByAG","animations","some","sa","children","getSkeleton","ds","dk"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"CharacterController.js","mappings":"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","sources":["webpack://babylonjs-charactercontroller/webpack/universalModuleDefinition","webpack://babylonjs-charactercontroller/external umd {\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\",\"root\":\"BABYLON\"}","webpack://babylonjs-charactercontroller/webpack/bootstrap","webpack://babylonjs-charactercontroller/webpack/runtime/compat get default export","webpack://babylonjs-charactercontroller/webpack/runtime/define property getters","webpack://babylonjs-charactercontroller/webpack/runtime/hasOwnProperty shorthand","webpack://babylonjs-charactercontroller/webpack/runtime/make namespace object","webpack://babylonjs-charactercontroller/./src/CharacterController.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"babylonjs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"babylonjs\")) : factory(root[\"BABYLON\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, (__WEBPACK_EXTERNAL_MODULE__247__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__247__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\r\n Skeleton,\r\n ArcRotateCamera,\r\n Vector3,\r\n Mesh,\r\n Node,\r\n Scene,\r\n Ray,\r\n PickingInfo,\r\n AnimationGroup,\r\n TransformNode,\r\n TargetedAnimation,\r\n Matrix,\r\n DeepImmutable,\r\n AbstractMesh,\r\n PlaySoundAction,\r\n InstancedMesh,\r\n Sound,\r\n AnimationRange,\r\n Animatable,\r\n AnimationEvent,\r\n int\r\n} from \"babylonjs\";\r\n\r\n\r\nexport class CharacterController {\r\n\r\n private _avatar: Mesh = null;\r\n private _skeleton: Skeleton = null;\r\n private _camera: ArcRotateCamera;\r\n private _scene: Scene;\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n\r\n private _gravity: number = 9.8;\r\n //slopeLimit in degrees\r\n private _minSlopeLimit: number = 30;\r\n private _maxSlopeLimit: number = 45;\r\n //slopeLimit in radians\r\n private _sl1: number = Math.PI * this._minSlopeLimit / 180;\r\n private _sl2: number = Math.PI * this._maxSlopeLimit / 180;\r\n\r\n //The av will step up a stair only if it is closer to the ground than the indicated value.\r\n private _stepOffset: number = 0.25;\r\n //toal amount by which the av has moved up\r\n private _vMoveTot: number = 0;\r\n //position of av when it started moving up\r\n private _vMovStartPos: Vector3 = Vector3.Zero();\r\n\r\n\r\n private _actionMap: ActionMap = new ActionMap();\r\n\r\n private _cameraElastic: boolean = true;\r\n private _cameraTarget: Vector3 = Vector3.Zero();\r\n //should we go into first person view when camera is near avatar (radius is lowerradius limit)\r\n private _noFirstPerson: boolean = false;\r\n\r\n\r\n\r\n public setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number) {\r\n this._minSlopeLimit = minSlopeLimit;\r\n this._maxSlopeLimit = maxSlopeLimit;\r\n\r\n this._sl1 = Math.PI * this._minSlopeLimit / 180;\r\n this._sl2 = Math.PI * this._maxSlopeLimit / 180;\r\n }\r\n\r\n /**\r\n * The av will step up a stair only if it is closer to the ground than the indicated value.\r\n * Default value is 0.25 m\r\n */\r\n public setStepOffset(stepOffset: number) {\r\n this._stepOffset = stepOffset;\r\n }\r\n\r\n public setWalkSpeed(n: number) {\r\n this._actionMap.walk.speed = n;\r\n }\r\n public setRunSpeed(n: number) {\r\n this._actionMap.run.speed = n;\r\n }\r\n public setBackSpeed(n: number) {\r\n this._actionMap.walkBack.speed = n;\r\n }\r\n public setBackFastSpeed(n: number) {\r\n this._actionMap.walkBackFast.speed = n;\r\n }\r\n public setJumpSpeed(n: number) {\r\n this._actionMap.idleJump.speed = n;\r\n this._actionMap.runJump.speed = n;\r\n }\r\n public setLeftSpeed(n: number) {\r\n this._actionMap.strafeLeft.speed = n;\r\n }\r\n public setLeftFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n public setRightSpeed(n: number) {\r\n this._actionMap.strafeRight.speed = n;\r\n }\r\n public setRightFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n // get turnSpeed in degrees per second.\r\n // store in radians per second\r\n public setTurnSpeed(n: number) {\r\n this._actionMap.turnLeft.speed = n * Math.PI / 180;\r\n this._actionMap.turnRight.speed = n * Math.PI / 180;\r\n }\r\n public setTurnFastSpeed(n: number) {\r\n this._actionMap.turnLeftFast.speed = n * Math.PI / 180;\r\n this._actionMap.turnRightFast.speed = n * Math.PI / 180;\r\n }\r\n public setGravity(n: number) {\r\n this._gravity = n;\r\n }\r\n\r\n /**\r\n * Use this to provide animationGroups to the character controller.\r\n * Provide the AnimationGroups using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animationGroup.\r\n * Example:\r\n * let myWalkAnimationGroup:AnimationGroup = ...;\r\n * let agMap:{} = {\r\n * \"walk\":myWalkAnimationGroup,\r\n * \"run\" : {\"ag\":myRunAnimationGroup,\"rate\":1},\r\n * \"idle\" : {\"ag\":myIdleAnimationGroup,\"loop\":true,\"rate\":1},\r\n * ....\r\n * ....\r\n * }\r\n * \r\n * @param agMap a map of character controller animation name to animationGroup\r\n */\r\n public setAnimationGroups(agMap: {}) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n this._isAG = true;\r\n this.setActionMap(agMap);\r\n }\r\n\r\n /**\r\n * Use this to provide AnimationRanges to the character controller.\r\n * Provide the AnimationRanges using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animation range name or an object with animation range data.\r\n * example:\r\n * let arMap = {\r\n * \"walk\":\"myWalk\",\r\n * \"run\" : {\"name\":\"myRun\",\"rate\":1},\r\n * \"idle\" : {\"name\":\"myIdle\",\"loop\":true,\"rate\":1},\r\n * ....\r\n * }\r\n * \r\n * @param arMap a map of character controller animation name to animationRange data\r\n */\r\n\r\n public setAnimationRanges(arMap: {}) {\r\n this._isAG = false;\r\n this.setActionMap(arMap);\r\n }\r\n\r\n /**\r\n * updates action data in the cc actionMap\r\n * with action data from the provided/input actionMap \r\n * \r\n * \r\n * return \"ar\" or \"ag\" depending on if the data provided\r\n * was animation range or animation group data respt.\r\n * \r\n * TODO should validate provided data.\r\n * In other words if animation range provided make sure\r\n * the range exist in the skeleton\r\n * or if animation group provided make sure the animation group\r\n * can be played on this avataor\r\n * \r\n * @param inActMap \r\n * @returns \r\n */\r\n public setActionMap(inActMap: ActionMap): string {\r\n let agMap: boolean = false;\r\n let inActData: ActionData;\r\n\r\n\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.exist = false;\r\n\r\n inActData = inActMap[ccActData.id];\r\n //in previous version of cc the key value was AnimationGroup rather than ActionData\r\n //lets accomodate that for backward compatibility\r\n if (inActData != null) {\r\n if (inActData instanceof AnimationGroup) {\r\n ccActData.ag = inActData;\r\n ccActData.name = ccActData.ag.name;\r\n ccActData.exist = true;\r\n agMap = true;\r\n this._hasAnims = true;\r\n } else if (inActData.exist) {\r\n this._hasAnims = true;\r\n ccActData.exist = true;\r\n if (inActData instanceof Object) {\r\n if (inActData.ag) {\r\n ccActData.ag = inActData.ag;\r\n agMap = true;\r\n }\r\n if (inActData.name) {\r\n ccActData.name = inActData.name;\r\n }\r\n if (inActData.loop != null) ccActData.loop = inActData.loop;\r\n if (inActData.rate) ccActData.rate = inActData.rate;\r\n if (inActData.speed) ccActData.speed = inActData.speed;\r\n // if (actDataI.key) actDataO.key = actDataI.key;\r\n if (inActData.sound) ccActData.sound = inActData.sound;\r\n } else {\r\n ccActData.name = inActData;\r\n }\r\n }\r\n }\r\n }\r\n this._checkFastAnims();\r\n //force to play new anims\r\n this._prevActData = null;\r\n if (agMap) return \"ag\"; else return \"ar\";\r\n }\r\n\r\n public getActionMap(): ActionMap {\r\n let map: ActionMap = new ActionMap();\r\n\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let actDataI = this._actionMap[key];\r\n\r\n if (!(actDataI instanceof ActionData)) continue;\r\n if (!actDataI.exist) continue;\r\n\r\n let actDataO: ActionData = map[actDataI.id];\r\n actDataO.ag = actDataI.ag;\r\n actDataO.name = actDataI.name;\r\n actDataO.loop = actDataI.loop;\r\n actDataO.rate = actDataI.rate;\r\n actDataO.speed = actDataI.speed;\r\n actDataO.key = actDataI.key;\r\n actDataO.sound = actDataI.sound;\r\n actDataO.exist = actDataI.exist;\r\n }\r\n\r\n return map;\r\n }\r\n\r\n public getSettings(): CCSettings {\r\n let ccs: CCSettings = new CCSettings();\r\n ccs.faceForward = this.isFaceForward();\r\n ccs.topDown = this.getMode() == 1 ? true : false;\r\n ccs.turningOff = this.isTurningOff();\r\n ccs.cameraTarget = this._cameraTarget.clone();\r\n ccs.cameraElastic = this._cameraElastic;\r\n ccs.elasticSteps = this._elasticSteps;\r\n ccs.makeInvisble = this._makeInvisible;\r\n ccs.gravity = this._gravity;\r\n ccs.keyboard = this._ekb;\r\n ccs.maxSlopeLimit = this._maxSlopeLimit;\r\n ccs.minSlopeLimit = this._minSlopeLimit;\r\n ccs.noFirstPerson = this._noFirstPerson;\r\n ccs.stepOffset = this._stepOffset;\r\n ccs.sound = this._stepSound;\r\n\r\n return ccs;\r\n }\r\n\r\n public setSettings(ccs: CCSettings) {\r\n this.setFaceForward(ccs.faceForward);\r\n this.setMode(ccs.topDown ? 1 : 0);\r\n this.setTurningOff(ccs.turningOff);\r\n this.setCameraTarget(ccs.cameraTarget);\r\n this.setCameraElasticity(ccs.cameraElastic);\r\n this.setElasticiSteps(ccs.elasticSteps);\r\n this.makeObstructionInvisible(ccs.makeInvisble);\r\n this.setGravity(ccs.gravity);\r\n this.enableKeyBoard(ccs.keyboard);\r\n this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit);\r\n this.setNoFirstPerson(ccs.noFirstPerson);\r\n this.setStepOffset(ccs.stepOffset);\r\n this.setSound(ccs.sound);\r\n\r\n }\r\n\r\n private _setAnim(anim: ActionData, animName?: string | AnimationGroup, rate?: number, loop?: boolean) {\r\n\r\n //animation range need skeleton\r\n if (!this._isAG && this._skeleton == null) return;\r\n\r\n if (animName != null) {\r\n if (this._isAG) {\r\n if (!(animName instanceof AnimationGroup)) return;\r\n anim.ag = animName;\r\n anim.exist = true;\r\n } else {\r\n if (this._skeleton.getAnimationRange(anim.name) != null) {\r\n anim.name = animName;\r\n anim.exist = true;\r\n } else {\r\n anim.exist = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (loop != null) anim.loop = loop;\r\n if (rate != null) anim.rate = rate;\r\n }\r\n\r\n public enableBlending(n: number) {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let act = this._actionMap[key];\r\n if (!(act instanceof ActionData)) continue;\r\n if (act.exist) {\r\n let ar: AnimationGroup = act.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = true;\r\n ta.animation.blendingSpeed = n;\r\n }\r\n }\r\n }\r\n } else {\r\n if (this._skeleton !== null)\r\n this._skeleton.enableBlending(n);\r\n }\r\n }\r\n\r\n public disableBlending() {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (anim.exist) {\r\n let ar: AnimationGroup = anim.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //setters for animations\r\n public setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walk, rangeName, rate, loop);\r\n }\r\n public setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.run, rangeName, rate, loop);\r\n }\r\n public setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBack, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack);\r\n }\r\n public setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop);\r\n }\r\n public setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.slideBack, rangeName, rate, loop);\r\n }\r\n public setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idle, rangeName, rate, loop);\r\n }\r\n public setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n }\r\n public setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop);\r\n }\r\n public setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n }\r\n public setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop);\r\n }\r\n public setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n }\r\n public setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop);\r\n }\r\n public setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n public setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop);\r\n }\r\n public setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idleJump, rangeName, rate, loop);\r\n }\r\n public setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.runJump, rangeName, rate, loop);\r\n }\r\n public setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.fall, rangeName, rate, loop);\r\n }\r\n\r\n\r\n _stepSound: Sound;\r\n // setters for sound\r\n public setSound(sound: Sound) {\r\n if (sound == null) return;\r\n this._stepSound = sound;\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n sound.loop = false;\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.sound = sound;\r\n ccActData.sound.attachToMesh(this._avatar);\r\n }\r\n this._actionMap.idle.sound = null;\r\n this._actionMap.fall.sound = null;\r\n this._actionMap.slideBack.sound = null;\r\n }\r\n\r\n\r\n // setters for keys\r\n public setWalkKey(key: string) {\r\n this._actionMap.walk.key = key.toLowerCase();\r\n }\r\n public setWalkBackKey(key: string) {\r\n this._actionMap.walkBack.key = key.toLowerCase();\r\n }\r\n public setTurnLeftKey(key: string) {\r\n this._actionMap.turnLeft.key = key.toLowerCase();\r\n }\r\n public setTurnRightKey(key: string) {\r\n this._actionMap.turnRight.key = key.toLowerCase();\r\n }\r\n public setStrafeLeftKey(key: string) {\r\n this._actionMap.strafeLeft.key = key.toLowerCase();\r\n }\r\n public setStrafeRightKey(key: string) {\r\n this._actionMap.strafeRight.key = key.toLowerCase();\r\n }\r\n public setJumpKey(key: string) {\r\n this._actionMap.idleJump.key = key.toLowerCase();\r\n }\r\n\r\n public setCameraElasticity(b: boolean) {\r\n this._cameraElastic = b;\r\n }\r\n\r\n public setElasticiSteps(n: number) {\r\n this._elasticSteps = n;\r\n }\r\n\r\n public makeObstructionInvisible(b: boolean) {\r\n this._makeInvisible = b;\r\n }\r\n public setCameraTarget(v: Vector3) {\r\n this._cameraTarget.copyFrom(v);\r\n }\r\n\r\n\r\n /**\r\n * user should call this whenever the user changes the camera checkCollision \r\n * property\r\n * \r\n */\r\n public cameraCollisionChanged() {\r\n this._savedCameraCollision = this._camera.checkCollisions;\r\n }\r\n public setNoFirstPerson(b: boolean) {\r\n this._noFirstPerson = b;\r\n }\r\n\r\n /**\r\n * if av has the required anim (walk, run etc) then \r\n * mark that anim as existing\r\n * \r\n * @param skel \r\n */\r\n\r\n private _checkAnimRanges(skel: Skeleton) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (skel != null) {\r\n if (skel.getAnimationRange(anim.id) != null) {\r\n anim.name = anim.id;\r\n anim.exist = true;\r\n this._hasAnims = true;\r\n }\r\n } else {\r\n anim.exist = false;\r\n }\r\n }\r\n this._checkFastAnims();\r\n }\r\n\r\n /**\r\n * if fast anims do not exist then use their slow counterpart as them but double the rate at which they play\r\n */\r\n private _checkFastAnims() {\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack)\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n\r\n private _copySlowAnims(f: ActionData, s: ActionData) {\r\n if (f.exist) return;\r\n if (!s.exist) return;\r\n f.exist = true;\r\n f.ag = s.ag;\r\n f.name = s.name;\r\n f.rate = s.rate * 2;\r\n }\r\n\r\n /**\r\n * Use this to make the character controller suitable for a isometeric/top down games or fps/third person game.\r\n * 1 In isometric/top down games the camera direction has no bearing on avatar movement.\r\n * 0 In fps/third person game rotating the camera around the avatar , rotates the avatar too.\r\n * \r\n * cannot switch mode to 0 if no camera avaiable.\r\n */\r\n private _mode = 0;\r\n private _saveMode = 0;\r\n public setMode(n: number) {\r\n //cannot switch mode to 0 if no camera avaiable.\r\n if (this._hasCam) {\r\n this._mode = n;\r\n this._saveMode = n;\r\n } else {\r\n this._mode = 1;\r\n this._saveMode = 1;\r\n }\r\n }\r\n public getMode() {\r\n return this._mode;\r\n }\r\n /**\r\n * Use this to set turning off.\r\n * When turining is off \r\n * a) turn left or turn right keys result in avatar facing and moving left or right with respect to camera.\r\n * b) walkback/runback key results in avatar facing back and walking/running towards camera.\r\n * \r\n * This setting has no effect when mode is 1.\r\n * \r\n * @param b \r\n */\r\n public setTurningOff(b: boolean) {\r\n this._noRot = b;\r\n }\r\n public isTurningOff() {\r\n return this._noRot;\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * BABYLONJS GLB models are RHS and exhibit this behavior\r\n * \r\n */\r\n private _isLHS_RHS = false;\r\n private _signLHS_RHS = -1;\r\n private _setRHS(mesh: TransformNode) {\r\n const meshMatrix: Matrix = mesh.getWorldMatrix();\r\n const _localX = Vector3.FromArray(meshMatrix.m, 0);\r\n const _localY = Vector3.FromArray(meshMatrix.m, 4);\r\n const _localZ = Vector3.FromArray(meshMatrix.m, 8);\r\n const actualZ = Vector3.Cross(_localX, _localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, _localZ) < 0) {\r\n this._isLHS_RHS = true;\r\n this._signLHS_RHS = 1;\r\n }\r\n else {\r\n this._isLHS_RHS = false;\r\n this._signLHS_RHS = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Use setFaceForward(true|false) to indicate that the avatar's face points forward (true) or backward (false).\r\n * The avatar's face points forward if its face is looking in positive local Z axis direction\r\n */\r\n private _ffSign: number;\r\n private _rhsSign: number;\r\n private _ff: boolean;\r\n //in mode 0, av2cam is used to align avatar with camera , with camera always facing avatar's back\r\n //note:camera alpha is measured anti-clockwise , avatar rotation is measured clockwise \r\n private _av2cam;\r\n public setFaceForward(b: boolean) {\r\n this._ff = b;\r\n\r\n this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1;\r\n\r\n if (!this._hasCam) {\r\n this._av2cam = 0;\r\n this._ffSign = 1;\r\n return;\r\n }\r\n\r\n if (this._isLHS_RHS) {\r\n this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2;\r\n this._ffSign = b ? 1 : -1;\r\n } else {\r\n this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2;\r\n this._ffSign = b ? -1 : 1;\r\n }\r\n\r\n }\r\n\r\n public isFaceForward() {\r\n return this._ff;\r\n }\r\n\r\n private checkAGs(agMap: {}) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (agMap[anim.name] != null) {\r\n anim.ag = agMap[anim.name];\r\n anim.exist = true;\r\n }\r\n }\r\n }\r\n\r\n // check if any of the mesh on the node tree is refrenced by any animation group\r\n private _containsAG(node: Node, ags: AnimationGroup[], fromRoot: boolean) {\r\n let r: Node;\r\n let ns: Node[];\r\n\r\n if (fromRoot) {\r\n r = this._getRoot(node);\r\n ns = r.getChildren((n) => { return (n instanceof TransformNode) }, false);\r\n } else {\r\n r = node;\r\n ns = [r];\r\n }\r\n\r\n for (let ag of ags) {\r\n let tas: TargetedAnimation[] = ag.targetedAnimations;\r\n for (let ta of tas) {\r\n if (ns.indexOf(ta.target) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //get the root of Node\r\n private _getRoot(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._getRoot(tn.parent);\r\n }\r\n\r\n private _started: boolean = false;\r\n public start() {\r\n if (this._started) return;\r\n this._started = true;\r\n this._act.reset();\r\n this._movFallTime = 0;\r\n //first time we enter render loop, delta time is zero\r\n this._idleFallTime = 0.001;\r\n this._grounded = false;\r\n this._updateTargetValue();\r\n if (this._ekb) this._addkeylistener();\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public stop() {\r\n if (!this._started) return;\r\n this._started = false;\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this._removekeylistener();\r\n this._prevActData = null;\r\n }\r\n\r\n /**\r\n * use pauseAnim to stop the charactere controller from playing\r\n * any animation on the character\r\n * use this when you want to play your animation instead\r\n * see also resumeAnim()\r\n */\r\n private _stopAnim: boolean = false;\r\n public pauseAnim() {\r\n this._stopAnim = true;\r\n\r\n if (this._prevActData != null && this._prevActData.exist) {\r\n //stop current animation\r\n if (this._isAG) {\r\n this._prevActData.ag.stop();\r\n } else {\r\n //this._scene.stopAnimation(this._skeleton, this._prevActData.name);\r\n this._scene.stopAnimation(this._skeleton);\r\n //this._scene.stopAllAnimations();\r\n }\r\n //stop current sound\r\n if (this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n }\r\n }\r\n\r\n /**\r\n * use resumeAnim to resume the character controller playing\r\n * animations on the character.\r\n * see also pauseAnim()\r\n */\r\n public resumeAnim() {\r\n this._stopAnim = false;\r\n this._prevActData = null;\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n private _prevActData: ActionData = null;\r\n private _avStartPos: Vector3 = Vector3.Zero();\r\n private _grounded: boolean = false;\r\n //distance by which AV would move down if in freefall\r\n private _freeFallDist: number = 0;\r\n\r\n //how many minimum contiguos frames should the AV have been in free fall\r\n //before we assume AV is in big freefall.\r\n //we will use this to remove animation flicker during move down a slope (fall, move, fall move etc)\r\n //TODO: base this on slope - large slope large count\r\n private _fallFrameCountMin: number = 50;\r\n private _fallFrameCount: number = 0;\r\n\r\n private _inFreeFall: boolean = false;\r\n private _wasWalking: boolean = false;\r\n private _wasRunning: boolean = false;\r\n private _moveVector: Vector3;\r\n\r\n //used only in mode 1\r\n //value 1 or -1 , -1 if avatar is facing camera\r\n //private _notFacingCamera = 1;\r\n\r\n private _isAvFacingCamera(): number {\r\n if (!this._hasCam) return 1;\r\n if (Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) return 1\r\n else return -1;\r\n }\r\n\r\n private _moveAVandCamera() {\r\n this._avStartPos.copyFrom(this._avatar.position);\r\n let actData: ActionData = null;\r\n const dt: number = this._scene.getEngine().getDeltaTime() / 1000;\r\n\r\n if (this._act._jump && !this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doJump(dt);\r\n } else if (this.anyMovement() || this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doMove(dt);\r\n } else if (!this._inFreeFall) {\r\n actData = this._doIdle(dt);\r\n }\r\n if (!this._stopAnim && this._hasAnims && actData != null) {\r\n if (this._prevActData !== actData) {\r\n if (actData.exist) {\r\n\r\n //animation frame counts\r\n let c: number;\r\n let fps: number = 30;\r\n\r\n if (this._isAG) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n actData.ag.start(actData.loop, actData.rate);\r\n fps = actData.ag.targetedAnimations[0].animation.framePerSecond;\r\n c = (actData.ag.to - actData.ag.from);\r\n } else {\r\n let a: Animatable = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate);\r\n fps = a.getAnimations()[0].animation.framePerSecond;\r\n c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from;\r\n }\r\n\r\n //SOUND\r\n //TODO do sound as animationevent.\r\n if (this._prevActData != null && this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n if (actData.sound != null) {\r\n actData.sound.play();\r\n //play sound twice during the animation\r\n this._sndId = setInterval(() => { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2));\r\n }\r\n }\r\n this._prevActData = actData;\r\n }\r\n }\r\n this._updateTargetValue();\r\n return;\r\n }\r\n\r\n private _soundLoopTime = 700;\r\n private _sndId = null;\r\n\r\n //verical position of AV when it is about to start a jump\r\n private _jumpStartPosY: number = 0;\r\n //for how long the AV has been in the jump\r\n private _jumpTime: number = 0;\r\n private _doJump(dt: number): ActionData {\r\n\r\n let actData: ActionData = null;\r\n actData = this._actionMap.runJump;\r\n if (this._jumpTime === 0) {\r\n this._jumpStartPosY = this._avatar.position.y;\r\n }\r\n\r\n this._jumpTime = this._jumpTime + dt;\r\n\r\n let forwardDist: number = 0;\r\n let jumpDist: number = 0;\r\n let disp: Vector3;\r\n\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n if (this._wasRunning || this._wasWalking) {\r\n if (this._wasRunning) {\r\n forwardDist = this._actionMap.run.speed * dt;\r\n } else if (this._wasWalking) {\r\n forwardDist = this._actionMap.walk.speed * dt;\r\n }\r\n //find out in which horizontal direction the AV was moving when it started the jump\r\n disp = this._moveVector.clone();\r\n disp.y = 0;\r\n disp = disp.normalize();\r\n disp.scaleToRef(forwardDist, disp);\r\n jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt);\r\n disp.y = jumpDist;\r\n } else {\r\n jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt);\r\n disp = new Vector3(0, jumpDist, 0);\r\n actData = this._actionMap.idleJump;\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y/2;\r\n }\r\n //moveWithCollision only seems to happen if length of displacment is atleast 0.001\r\n this._avatar.moveWithCollisions(disp);\r\n if (jumpDist < 0) {\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y;\r\n //check if going up a slope or back on flat ground \r\n if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) {\r\n this._endJump();\r\n } else if (this._avatar.position.y < this._jumpStartPosY) {\r\n //the avatar is below the point from where it started the jump\r\n //so it is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than acceptable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endJump();\r\n }\r\n } else {\r\n actData = this._actionMap.fall;\r\n }\r\n }\r\n }\r\n return actData;\r\n }\r\n\r\n private _calcJumpDist(speed: number, dt: number): number {\r\n //up velocity at the begining of the lastt frame (v=u+at)\r\n let js: number = speed - this._gravity * this._jumpTime;\r\n //distance travelled up since last frame to this frame (s=ut+1/2*at^2)\r\n let jumpDist: number = js * dt - 0.5 * this._gravity * dt * dt;\r\n return jumpDist;\r\n }\r\n\r\n /**\r\n * does cleanup at the end of a jump\r\n */\r\n private _endJump() {\r\n this._act._jump = false;\r\n this._jumpTime = 0;\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n }\r\n\r\n /**\r\n * checks if two vectors v1 and v2 are equal within a precision of p\r\n */\r\n private _areVectorsEqual(v1: Vector3, v2: Vector3, p: number) {\r\n return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p));\r\n }\r\n\r\n /*\r\n * returns the slope (in radians) of a vector in the vertical plane\r\n */\r\n private _verticalSlope(v: Vector3): number {\r\n return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z)));\r\n }\r\n\r\n //for how long has the av been falling while moving\r\n private _movFallTime: number = 0;\r\n private _sign = 1;\r\n private _isTurning = false;\r\n private _noRot = false;\r\n private _doMove(dt: number): ActionData {\r\n\r\n //initial down velocity\r\n const u: number = this._movFallTime * this._gravity\r\n //calculate the distance by which av should fall down since last frame\r\n //assuming it is in freefall\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n\r\n this._movFallTime = this._movFallTime + dt;\r\n\r\n let moving: boolean = false;\r\n let actdata: ActionData = null;\r\n\r\n if (this._inFreeFall) {\r\n this._moveVector.y = -this._freeFallDist;\r\n moving = true;\r\n }\r\n\r\n\r\n //rotate avatar with respect to camera direction. \r\n this._rotateAV2C();\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n actdata = this._rotateAVnC(actdata, moving, dt);\r\n\r\n //now that avatar is rotated properly, construct the vector to move the avatar \r\n //donot move the avatar if avatar is in freefall\r\n\r\n if (!this._inFreeFall) {\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n\r\n let sign: number;\r\n let horizDist: number = 0;\r\n switch (true) {\r\n case (this._act._stepLeft):\r\n sign = this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeLeftFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._stepRight):\r\n sign = -this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeRight.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeRightFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._walk || (this._noRot && this._mode == 0)):\r\n if (this._act._speedMod) {\r\n this._wasRunning = true;\r\n horizDist = this._actionMap.run.speed * dt;\r\n actdata = this._actionMap.run;\r\n } else {\r\n this._wasWalking = true;\r\n horizDist = this._actionMap.walk.speed * dt;\r\n actdata = this._actionMap.walk;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n case (this._act._walkback):\r\n horizDist = this._actionMap.walkBack.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.walkBackFast.speed * dt;\r\n actdata = this._actionMap.walkBackFast;\r\n } else {\r\n actdata = this._actionMap.walkBack;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n }\r\n }\r\n\r\n // move the avatar\r\n\r\n if (moving) {\r\n if (this._moveVector.length() > 0.001) {\r\n this._avatar.moveWithCollisions(this._moveVector);\r\n //walking up a slope\r\n if (this._avatar.position.y > this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n const _slp: number = this._verticalSlope(actDisp);\r\n if (_slp >= this._sl2) {\r\n //this._climbingSteps=true;\r\n //is av trying to go up steps\r\n if (this._stepOffset > 0) {\r\n if (this._vMoveTot == 0) {\r\n //if just started climbing note down the position\r\n this._vMovStartPos.copyFrom(this._avStartPos);\r\n }\r\n this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y);\r\n if (this._vMoveTot > this._stepOffset) {\r\n //move av back to its position at begining of steps\r\n this._vMoveTot = 0;\r\n this._avatar.position.copyFrom(this._vMovStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n //move av back to old position\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n this._vMoveTot = 0;\r\n if (_slp > this._sl1) {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n } else {\r\n //continue walking\r\n this._endFreeFall();\r\n }\r\n }\r\n } else if ((this._avatar.position.y) < this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or walk?\r\n //if slope is less steeper than acceptable then walk else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endFreeFall();\r\n } else {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n } else {\r\n this._inFreeFall = true;\r\n this._fallFrameCount++;\r\n //AV could be running down a slope which mean freefall,run,frefall run ...\r\n //to remove anim flicker, check if AV has been falling down continously for last few consecutive frames\r\n //before changing to free fall animation\r\n if (this._fallFrameCount > this._fallFrameCountMin) {\r\n actdata = this._actionMap.fall;\r\n }\r\n }\r\n } else {\r\n this._endFreeFall();\r\n }\r\n }\r\n }\r\n return actdata;\r\n }\r\n\r\n /**\r\n * rotate avatar with respect to camera direction. \r\n */\r\n private _rotateAV2C() {\r\n if (this._hasCam)\r\n if (this._mode != 1) {\r\n let ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0;\r\n if (this._noRot) {\r\n switch (true) {\r\n case (this._act._walk && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walk && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walk):\r\n this._avatar.rotation.y = ca;\r\n break;\r\n case (this._act._walkback):\r\n this._avatar.rotation.y = ca + Math.PI;\r\n break;\r\n case (this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2;\r\n break;\r\n case (this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2;\r\n break;\r\n }\r\n } else {\r\n if (this._hasCam)\r\n this._avatar.rotation.y = ca;\r\n }\r\n }\r\n }\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n private _rotateAVnC(anim: ActionData, moving: boolean, dt: number): ActionData {\r\n if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) {\r\n let turnAngle = this._actionMap.turnLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n turnAngle = 2 * turnAngle;\r\n }\r\n let a;\r\n if (this._mode == 1) {\r\n // while turining, the avatar could start facing away from camera and end up facing camera.\r\n // we should not switch turning direction during this transition\r\n if (!this._isTurning) {\r\n // if (this._act.name != this._act.prevName) {\r\n // this._act.prevName = this._act.name;\r\n this._sign = -this._ffSign * this._isAvFacingCamera();\r\n if (this._isLHS_RHS) this._sign = - this._sign;\r\n this._isTurning = true;\r\n }\r\n a = this._sign;\r\n if (this._act._turnLeft) {\r\n if (this._act._walk) { }\r\n else if (this._act._walkback) a = -this._sign;\r\n else {\r\n anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft;\r\n }\r\n } else {\r\n if (this._act._walk) a = -this._sign;\r\n else if (this._act._walkback) { }\r\n else {\r\n a = -this._sign;\r\n anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight;\r\n }\r\n }\r\n } else {\r\n a = 1;\r\n if (this._act._turnLeft) {\r\n if (this._act._walkback) a = -1;\r\n if (!moving) anim = this._actionMap.turnLeft;\r\n } else {\r\n if (this._act._walk) a = -1;\r\n if (!moving) { a = -1; anim = this._actionMap.turnRight; }\r\n }\r\n if (this._hasCam)\r\n this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a;\r\n }\r\n\r\n this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a;\r\n }\r\n return anim;\r\n }\r\n\r\n private _endFreeFall(): void {\r\n this._movFallTime = 0;\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n\r\n //for how long has the av been falling while idle (not moving)\r\n private _idleFallTime: number = 0;\r\n private _doIdle(dt: number): ActionData {\r\n if (this._grounded) {\r\n return this._actionMap.idle;\r\n }\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n this._movFallTime = 0;\r\n let anim: ActionData = this._actionMap.idle;\r\n this._fallFrameCount = 0;\r\n\r\n\r\n if (dt === 0) {\r\n this._freeFallDist = 5;\r\n } else {\r\n const u: number = this._idleFallTime * this._gravity\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n this._idleFallTime = this._idleFallTime + dt;\r\n }\r\n //if displacement is less than 0.01(? need to verify further) then \r\n //moveWithDisplacement down against a surface seems to push the AV up by a small amount!!\r\n if (this._freeFallDist < 0.01) return anim;\r\n const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0);\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n this._avatar.moveWithCollisions(disp);\r\n if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n } else if (this._avatar.position.y < this._avStartPos.y) {\r\n //AV is going down. \r\n //AV is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than accebtable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n } else {\r\n this._unGroundIt();\r\n anim = this._actionMap.slideBack;\r\n }\r\n } else {\r\n anim = this._actionMap.fall;\r\n }\r\n }\r\n return anim;\r\n }\r\n\r\n private _groundFrameCount = 0;\r\n private _groundFrameMax = 10;\r\n /**\r\n * donot ground immediately\r\n * wait few more frames\r\n */\r\n private _groundIt(): void {\r\n this._groundFrameCount++;\r\n if (this._groundFrameCount > this._groundFrameMax) {\r\n this._grounded = true;\r\n this._idleFallTime = 0;\r\n }\r\n }\r\n private _unGroundIt() {\r\n this._grounded = false;\r\n this._groundFrameCount = 0;\r\n }\r\n\r\n private _savedCameraCollision: boolean = true;\r\n private _inFP = false;\r\n private _updateTargetValue() {\r\n if (!this._hasCam) return;\r\n //donot move camera if av is trying to clinb steps\r\n if (this._vMoveTot == 0)\r\n this._avatar.position.addToRef(this._cameraTarget, this._camera.target);\r\n\r\n if (this._camera.radius > this._camera.lowerRadiusLimit) { if (this._cameraElastic || this._makeInvisible) this._handleObstruction(); }\r\n\r\n //if user so desire, make the AV invisible if camera comes close to it\r\n if (this._camera.radius <= this._camera.lowerRadiusLimit) {\r\n if (!this._noFirstPerson && !this._inFP) {\r\n this._makeMeshInvisible(this._avatar);\r\n this._camera.checkCollisions = false;\r\n this._saveMode = this._mode;\r\n this._mode = 0;\r\n this._inFP = true;\r\n }\r\n } else {\r\n if (this._inFP) {\r\n this._inFP = false;\r\n this._mode = this._saveMode;\r\n this._restoreVisiblity(this._avatar);\r\n this._camera.checkCollisions = this._savedCameraCollision;\r\n }\r\n }\r\n }\r\n\r\n // make mesh and all its children invisible\r\n // store their current visibility state so that we can restore them later on\r\n private _makeMeshInvisible(mesh: Mesh) {\r\n\r\n this._visiblityMap.set(mesh, mesh.visibility);\r\n mesh.visibility = 0;\r\n\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) {\r\n this._visiblityMap.set(n, n.visibility);\r\n n.visibility = 0;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n private _visiblityMap: Map = new Map();\r\n\r\n //restore mesh visibility to previous state\r\n private _restoreVisiblity(mesh: Mesh) {\r\n mesh.visibility = this._visiblityMap.get(mesh);\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) n.visibility = this._visiblityMap.get(n);\r\n return false;\r\n });\r\n }\r\n\r\n private _ray: Ray = new Ray(Vector3.Zero(), Vector3.One(), 1);\r\n private _rayDir: Vector3 = Vector3.Zero();\r\n //camera seems to get stuck into things\r\n //should move camera away from things by a value of cameraSkin\r\n private _cameraSkin: number = 0.5;\r\n private _prevPickedMeshes: AbstractMesh[];\r\n private _pickedMeshes: AbstractMesh[] = new Array();;\r\n private _makeInvisible = false;\r\n private _elasticSteps = 50;\r\n private _alreadyInvisible: AbstractMesh[];\r\n\r\n /**\r\n * The following method handles the use case wherein some mesh\r\n * comes between the avatar and the camera thus obstructing the view\r\n * of the avatar.\r\n * Two ways this can be handled\r\n * a) make the obstructing mesh invisible\r\n * instead of invisible a better option would have been to make semi transparent.\r\n * Unfortunately, unlike mesh, mesh instances do not \"visibility\" setting)\r\n * Every alternate frame make mesh visible and invisible to give the impression of semi-transparent.\r\n * b) move the camera in front of the obstructing mesh\r\n */\r\n private _handleObstruction() {\r\n\r\n //get vector from av (camera.target) to camera\r\n this._camera.position.subtractToRef(this._camera.target, this._rayDir);\r\n //start ray from av to camera\r\n this._ray.origin = this._camera.target;\r\n this._ray.length = this._rayDir.length();\r\n this._ray.direction = this._rayDir.normalize();\r\n\r\n //TODO \r\n //handle case were pick is with a child of avatar, avatar atatchment. etc\r\n const pis: PickingInfo[] = this._scene.multiPickWithRay(this._ray, (mesh) => {\r\n if (mesh == this._avatar) return false;\r\n else return true;\r\n });\r\n\r\n\r\n if (this._makeInvisible) {\r\n this._prevPickedMeshes = this._pickedMeshes;\r\n if (pis.length > 0) {\r\n this._pickedMeshes = new Array();\r\n for (let pi of pis) {\r\n if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) {\r\n pi.pickedMesh.isVisible = false;\r\n this._pickedMeshes.push(pi.pickedMesh);\r\n }\r\n }\r\n for (let pm of this._prevPickedMeshes) {\r\n if (!this._pickedMeshes.includes(pm)) {\r\n pm.isVisible = true;\r\n }\r\n }\r\n } else {\r\n for (let pm of this._prevPickedMeshes) {\r\n pm.isVisible = true;\r\n }\r\n this._prevPickedMeshes.length = 0;\r\n }\r\n }\r\n\r\n if (this._cameraElastic) {\r\n if (pis.length > 0) {\r\n // postion the camera in front of the mesh that is obstructing camera\r\n\r\n //if only one obstruction and it is invisible then if it is not collidable or our camera is not collidable then do nothing\r\n if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) return;\r\n\r\n //if our camera is collidable then we donot want it to get stuck behind another collidable obsrtucting mesh\r\n let pp: Vector3 = null;\r\n\r\n //we will asume the order of picked meshes is from closest to avatar to furthest\r\n //we should get the first one which is visible or invisible and collidable\r\n for (let i = 0; i < pis.length; i++) {\r\n let pm = pis[i].pickedMesh;\r\n if (this._isSeeAble(pm)) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n } else if (pm.checkCollisions) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n }\r\n }\r\n if (pp == null) return;\r\n\r\n const c2p: Vector3 = this._camera.position.subtract(pp);\r\n //note that when camera is collidable, changing the orbital camera radius may not work.\r\n //changing the radius moves the camera forward (with collision?) and collision can interfere with movement\r\n //\r\n //in every cylce we are dividing the distance to tarvel by same number of steps.\r\n //as we get closer to destination the speed will thus slow down.\r\n //when just 1 unit distance left, lets snap to the final position.\r\n //when calculating final position make sure the camera does not get stuck at the pickposition especially\r\n //if collision is on\r\n\r\n const l: number = c2p.length();\r\n if (this._camera.checkCollisions) {\r\n let step: Vector3;\r\n if (l <= 1) {\r\n step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin));\r\n } else {\r\n step = c2p.normalize().scaleInPlace(l / this._elasticSteps);\r\n }\r\n this._camera.position = this._camera.position.subtract(step);\r\n } else {\r\n let step: number;\r\n if (l <= 1) step = l + this._cameraSkin; else step = l / this._elasticSteps;\r\n this._camera.radius = this._camera.radius - (step);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //how many ways can a mesh be invisible?\r\n private _isSeeAble(mesh: AbstractMesh): boolean {\r\n if (!mesh.isVisible) return false;\r\n if (mesh.visibility == 0) return false;\r\n if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) return false;\r\n return true;\r\n //what about vertex color? groan!\r\n }\r\n\r\n\r\n private _move: boolean = false;\r\n public anyMovement(): boolean {\r\n return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight);\r\n }\r\n\r\n private _onKeyDown(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n if (e.repeat) return;\r\n switch (e.key.toLowerCase()) {\r\n case this._actionMap.idleJump.key:\r\n this._act._jump = true;\r\n break;\r\n case \"capslock\":\r\n this._act._speedMod = !this._act._speedMod;\r\n break;\r\n case \"shift\":\r\n this._act._speedMod = true;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = true;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = true;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = true;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = true;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = true;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = true;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _onKeyUp(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n switch (e.key.toLowerCase()) {\r\n case \"shift\":\r\n this._act._speedMod = false;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = false;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = false;\r\n this._isTurning = false;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = false;\r\n this._isTurning = false;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = false;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = false;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = false;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _ekb: boolean = true;\r\n public isKeyBoardEnabled(): boolean {\r\n return this._ekb;\r\n }\r\n public enableKeyBoard(b: boolean) {\r\n this._ekb = b;\r\n if (b) {\r\n this._addkeylistener();\r\n } else {\r\n this._removekeylistener();\r\n }\r\n }\r\n\r\n private _addkeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.addEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.addEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n private _removekeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.removeEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.removeEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n // control movement by commands rather than keyboard.\r\n public walk(b: boolean) {\r\n this._act._walk = b;\r\n }\r\n public walkBack(b: boolean) {\r\n this._act._walkback = b;\r\n }\r\n public walkBackFast(b: boolean) {\r\n this._act._walkback = b;\r\n this._act._speedMod = b;\r\n }\r\n public run(b: boolean) {\r\n this._act._walk = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnLeft(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnLeftFast(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnRight(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnRightFast(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeLeft(b: boolean) {\r\n this._act._stepLeft = b;\r\n }\r\n public strafeLeftFast(b: boolean) {\r\n this._act._stepLeft = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeRight(b: boolean) {\r\n this._act._stepRight = b;\r\n }\r\n public strafeRightFast(b: boolean) {\r\n this._act._stepRight = b;\r\n this._act._speedMod = b;\r\n }\r\n public jump() {\r\n this._act._jump = true;\r\n }\r\n\r\n public fall() {\r\n this._grounded = false;\r\n }\r\n\r\n public idle() {\r\n this._act.reset();\r\n }\r\n\r\n private _act: _Action;\r\n private _renderer: () => void;\r\n private _handleKeyUp: (e) => void;\r\n private _handleKeyDown: (e) => void;\r\n private _isAG: boolean = false;\r\n public isAg() {\r\n return this._isAG;\r\n }\r\n\r\n\r\n\r\n\r\n private _findSkel(n: Node): Skeleton {\r\n let root = this._root(n);\r\n\r\n if (root instanceof Mesh && root.skeleton) return root.skeleton;\r\n\r\n //find all child meshes which have skeletons\r\n let ms = root.getChildMeshes(\r\n false,\r\n (cm) => {\r\n if (cm instanceof Mesh) {\r\n if (cm.skeleton) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n //return the skeleton of the first child mesh\r\n if (ms.length > 0) return ms[0].skeleton; else return null;\r\n\r\n }\r\n\r\n private _root(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._root(tn.parent);\r\n }\r\n\r\n public setAvatar(avatar: Mesh, faceForward: boolean = false): boolean {\r\n\r\n let rootNode = this._root(avatar);\r\n if (rootNode instanceof Mesh) {\r\n this._avatar = rootNode;\r\n } else {\r\n console.error(\"Cannot move this mesh. The root node of the mesh provided is not a mesh\");\r\n return false;\r\n }\r\n\r\n this._skeleton = this._findSkel(avatar);\r\n this._isAG = this._containsAG(avatar, this._scene.animationGroups, true);\r\n\r\n this._actionMap.reset();\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n\r\n this._setRHS(avatar);\r\n this.setFaceForward(faceForward);\r\n\r\n return true;\r\n }\r\n\r\n public getAvatar() {\r\n return this._avatar;\r\n }\r\n\r\n // force a skeleton to be the avatar skeleton\r\n // should not be calling this normally\r\n public setAvatarSkeleton(skeleton: Skeleton) {\r\n this._skeleton = skeleton;\r\n\r\n\r\n if (this._skeleton != null && this._skelDrivenByAG(skeleton)) this._isAG = true; else this._isAG = false;\r\n\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n }\r\n\r\n\r\n // this check if any of this skeleton animations is referenced by any targetedAnimation in any of the animationgroup in the scene.\r\n private _skelDrivenByAG(skeleton: Skeleton) {\r\n return skeleton.animations.some(sa => this._scene.animationGroups.some(ag => ag.children.some(ta => ta.animation == sa)));\r\n }\r\n\r\n public getSkeleton() {\r\n return this._skeleton;\r\n }\r\n\r\n // does this character have any animations ?\r\n // remember we can use meshes without anims as characters too\r\n private _hasAnims: boolean = false;\r\n private _hasCam: boolean = true;\r\n\r\n /**\r\n * The avatar/character can be made up of multiple meshes arranged in a hierarchy.\r\n * As such we will pick the root of the hierarchy as the avatar.\r\n * The root should be a mesh as otherwise we cannot move it with moveWithCollision() method.\r\n * \r\n * Mutiple meshes in the hierarchy may have skeletons (if two or more meshes have skeleton then\r\n * the skeleton will mostly likely be the same). \r\n * So we will pick as avatar skeleton, the skeleton of the first mesh in the hierachy which has\r\n * a skeleton \r\n * \r\n * @param avatar \r\n * @param camera \r\n * @param scene \r\n * @param actionMap/animationGroupMap \r\n * maps actions to animations and other data like speed,sound etc \r\n * or \r\n * for backward compatibility could be AnimationGroup Map\r\n * @param faceForward \r\n */\r\n constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward = false) {\r\n\r\n this._camera = camera;\r\n\r\n //if camera is null assume this would be used to control an NPC\r\n //we cannot use mode 0 as that is dependent on camera being present. so force mode 1\r\n if (this._camera == null) {\r\n this._hasCam = false;\r\n this.setMode(1);\r\n }\r\n this._scene = scene;\r\n\r\n let success = this.setAvatar(avatar, faceForward);\r\n if (!success) {\r\n console.error(\"unable to set avatar\");\r\n }\r\n\r\n\r\n let dataType: string = null;\r\n if (actionMap != null) {\r\n dataType = this.setActionMap(actionMap);\r\n }\r\n\r\n //try to use the existing avatar animations\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n //animation groups\r\n if (this._isAG) {\r\n //TODO\r\n }\r\n\r\n if (this._hasCam) this._savedCameraCollision = this._camera.checkCollisions;\r\n\r\n this._act = new _Action();\r\n\r\n this._renderer = () => { this._moveAVandCamera() };\r\n this._handleKeyUp = (e) => { this._onKeyUp(e) };\r\n this._handleKeyDown = (e) => { this._onKeyDown(e) };\r\n }\r\n}\r\n\r\n\r\n\r\nclass _Action {\r\n\r\n public _walk: boolean = false;\r\n public _walkback: boolean = false;\r\n public _turnRight: boolean = false;\r\n public _turnLeft: boolean = false;\r\n public _stepRight: boolean = false;\r\n public _stepLeft: boolean = false;\r\n public _jump: boolean = false;\r\n\r\n // speed modifier - changes speed of movement\r\n public _speedMod: boolean = false;\r\n\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset() {\r\n this._walk = false;\r\n this._walkback = false;\r\n this._turnRight = false;\r\n this._turnLeft = false;\r\n this._stepRight = false;\r\n this._stepLeft = false;\r\n this._jump = false;\r\n this._speedMod = false;\r\n }\r\n}\r\n\r\nexport class ActionData {\r\n public id: string;\r\n public speed: number;\r\n //_ds default speed. speed is set to this on reset\r\n public ds: number;\r\n public sound: Sound;\r\n public key: string;\r\n //_dk defailt key\r\n public dk: string;\r\n\r\n //animation data\r\n //if _ag is null then assuming animation range and use _name to play animationrange\r\n //instead of name maybe call it arName?\r\n public name: string = \"\";\r\n public ag: AnimationGroup;\r\n public loop: boolean = true;\r\n public rate: number = 1;\r\n\r\n public exist: boolean = false;\r\n\r\n public constructor(id?: string, speed = 1, key?: string) {\r\n this.id = id;\r\n this.speed = speed;\r\n this.ds = speed;\r\n this.key = key;\r\n this.dk = key;\r\n }\r\n\r\n public reset() {\r\n this.name = \"\";\r\n this.speed = this.ds;\r\n this.key = this.dk;\r\n this.loop = true;\r\n this.rate = 1;\r\n this.sound = null;\r\n this.exist = false;\r\n }\r\n\r\n}\r\n\r\n//not really a \"Map\"\r\nexport class ActionMap {\r\n public walk = new ActionData(\"walk\", 3, \"w\");\r\n public walkBack = new ActionData(\"walkBack\", 1.5, \"s\");\r\n public walkBackFast = new ActionData(\"walkBackFast\", 3, \"na\");\r\n public idle = new ActionData(\"idle\", 0, \"na\");\r\n public idleJump = new ActionData(\"idleJump\", 6, \" \");\r\n public run = new ActionData(\"run\", 6, \"na\");\r\n public runJump = new ActionData(\"runJump\", 6, \"na\");\r\n public fall = new ActionData(\"fall\", 0, \"na\");\r\n public turnLeft = new ActionData(\"turnLeft\", Math.PI / 8, \"a\");\r\n public turnLeftFast = new ActionData(\"turnLeftFast\", Math.PI / 4, \"na\");\r\n public turnRight = new ActionData(\"turnRight\", Math.PI / 8, \"d\");\r\n public turnRightFast = new ActionData(\"turnRightFast\", Math.PI / 4, \"na\");\r\n public strafeLeft = new ActionData(\"strafeLeft\", 1.5, \"q\");\r\n public strafeLeftFast = new ActionData(\"strafeLeftFast\", 3, \"na\");\r\n public strafeRight = new ActionData(\"strafeRight\", 1.5, \"e\");\r\n public strafeRightFast = new ActionData(\"strafeRightFast\", 3, \"na\");\r\n public slideBack = new ActionData(\"slideBack\", 0, \"na\");\r\n\r\n public reset() {\r\n let keys: string[] = Object.keys(this);\r\n for (let key of keys) {\r\n let act = this[key];\r\n if (!(act instanceof ActionData)) continue;\r\n act.reset()\r\n }\r\n }\r\n};\r\n\r\nexport class CCSettings {\r\n public faceForward: boolean;\r\n public gravity: number;\r\n public minSlopeLimit: number;\r\n public maxSlopeLimit: number;\r\n public stepOffset: number;\r\n public cameraElastic: boolean = true;\r\n public elasticSteps: number;\r\n public makeInvisble: boolean = true;\r\n public cameraTarget: Vector3 = Vector3.Zero();\r\n public noFirstPerson: boolean = false;\r\n public topDown: boolean = true;\r\n //turningOff takes effect only when topDown is false\r\n public turningOff: boolean = true;\r\n public keyboard: boolean = true;\r\n public sound: Sound;\r\n}\r\n"],"names":["root","factory","exports","module","require","define","amd","a","i","self","__WEBPACK_EXTERNAL_MODULE__247__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","avatar","camera","scene","actionMap","faceForward","_avatar","_skeleton","_gravity","_minSlopeLimit","_maxSlopeLimit","_sl1","Math","PI","this","_sl2","_stepOffset","_vMoveTot","_vMovStartPos","Vector3","_actionMap","ActionMap","_cameraElastic","_cameraTarget","_noFirstPerson","_mode","_saveMode","_isLHS_RHS","_signLHS_RHS","_started","_stopAnim","_prevActData","_avStartPos","_grounded","_freeFallDist","_fallFrameCountMin","_fallFrameCount","_inFreeFall","_wasWalking","_wasRunning","_soundLoopTime","_sndId","_jumpStartPosY","_jumpTime","_movFallTime","_sign","_isTurning","_noRot","_idleFallTime","_groundFrameCount","_groundFrameMax","_savedCameraCollision","_inFP","_visiblityMap","Map","_ray","Ray","_rayDir","_cameraSkin","_pickedMeshes","Array","_makeInvisible","_elasticSteps","_move","_ekb","_isAG","_hasAnims","_hasCam","_camera","setMode","_scene","setAvatar","console","error","setActionMap","_checkAnimRanges","checkCollisions","_act","_Action","_renderer","_moveAVandCamera","_handleKeyUp","e","_onKeyUp","_handleKeyDown","_onKeyDown","getScene","setSlopeLimit","minSlopeLimit","maxSlopeLimit","setStepOffset","stepOffset","setWalkSpeed","walk","speed","setRunSpeed","run","setBackSpeed","walkBack","setBackFastSpeed","walkBackFast","setJumpSpeed","idleJump","runJump","setLeftSpeed","strafeLeft","setLeftFastSpeed","strafeLeftFast","setRightSpeed","strafeRight","setRightFastSpeed","setTurnSpeed","turnLeft","turnRight","setTurnFastSpeed","turnLeftFast","turnRightFast","setGravity","setAnimationGroups","agMap","exist","ag","stop","setAnimationRanges","arMap","inActMap","inActData","keys","ccActionName","ccActData","ActionData","id","AnimationGroup","name","loop","rate","sound","_checkFastAnims","getActionMap","map","actDataI","actDataO","getSettings","ccs","CCSettings","isFaceForward","topDown","getMode","turningOff","isTurningOff","cameraTarget","clone","cameraElastic","elasticSteps","makeInvisble","gravity","keyboard","noFirstPerson","_stepSound","setSettings","setFaceForward","setTurningOff","setCameraTarget","setCameraElasticity","setElasticiSteps","makeObstructionInvisible","enableKeyBoard","setNoFirstPerson","setSound","_setAnim","anim","animName","getAnimationRange","enableBlending","act","targetedAnimations","ta","animation","blendingSpeed","disableBlending","setWalkAnim","rangeName","setRunAnim","setWalkBackAnim","_copySlowAnims","setWalkBackFastAnim","setSlideBackAnim","slideBack","setIdleAnim","idle","setTurnRightAnim","setTurnRightFastAnim","setTurnLeftAnim","setTurnLeftFastAnim","setStrafeRightAnim","strafeRightFast","setStrafeRightFastAnim","setStrafeLeftAnim","setStrafeLeftFastAnim","setIdleJumpAnim","setRunJumpAnim","setFallAnim","fall","ccActionNames","attachToMesh","setWalkKey","toLowerCase","setWalkBackKey","setTurnLeftKey","setTurnRightKey","setStrafeLeftKey","setStrafeRightKey","setJumpKey","b","v","copyFrom","cameraCollisionChanged","skel","f","s","_setRHS","mesh","meshMatrix","getWorldMatrix","_localX","m","_localY","_localZ","actualZ","_ff","_rhsSign","useRightHandedSystem","_av2cam","_ffSign","checkAGs","_containsAG","node","ags","fromRoot","ns","_getRoot","getChildren","TransformNode","indexOf","target","tn","parent","start","reset","_updateTargetValue","_addkeylistener","registerBeforeRender","unregisterBeforeRender","_removekeylistener","pauseAnim","stopAnimation","clearInterval","resumeAnim","_isAvFacingCamera","forward","position","subtract","actData","dt","getEngine","getDeltaTime","_jump","_doJump","anyMovement","_doMove","_doIdle","c","fps","framePerSecond","to","from","beginAnimation","getAnimations","play","setInterval","abs","y","disp","forwardDist","jumpDist","_moveVector","normalize","scaleToRef","_calcJumpDist","moveWithCollisions","length","_endJump","actDisp","_areVectorsEqual","_verticalSlope","v1","v2","p","x","z","atan","sqrt","u","moving","actdata","_rotateAV2C","_rotateAVnC","sign","horizDist","_speedMod","calcMovePOV","_walk","_slp","_endFreeFall","ca","alpha","_turnRight","rotation","_turnLeft","_walkback","_stepLeft","_stepRight","turnAngle","_groundIt","_unGroundIt","addToRef","radius","lowerRadiusLimit","_handleObstruction","_makeMeshInvisible","_restoreVisiblity","set","visibility","getChildMeshes","Mesh","subtractToRef","origin","direction","pis","multiPickWithRay","_prevPickedMeshes","pi","pickedMesh","isVisible","includes","push","pm","_isSeeAble","pp","pickedPoint","c2p","l","step","addInPlace","normalizeToNew","scaleInPlace","material","alphaMode","repeat","isKeyBoardEnabled","canvas","getRenderingCanvas","addEventListener","removeEventListener","jump","isAg","_findSkel","_root","skeleton","ms","cm","rootNode","animationGroups","getAvatar","setAvatarSkeleton","_skelDrivenByAG","animations","some","sa","children","getSkeleton","ds","dk"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/CharacterController.max.js b/dist/CharacterController.max.js index c882979..a4c7b08 100644 --- a/dist/CharacterController.max.js +++ b/dist/CharacterController.max.js @@ -189,7 +189,6 @@ var CharacterController = (function () { this._handleKeyUp = function (e) { _this._onKeyUp(e); }; this._handleKeyDown = function (e) { _this._onKeyDown(e); }; } - ; CharacterController.prototype.getScene = function () { return this._scene; }; @@ -779,8 +778,6 @@ var CharacterController = (function () { var forwardDist = 0; var jumpDist = 0; var disp; - if (this._hasCam && this._mode != 1 && !this._noRot) - this._avatar.rotation.y = this._av2cam - this._camera.alpha; if (this._wasRunning || this._wasWalking) { if (this._wasRunning) { forwardDist = this._actionMap.run.speed * dt; @@ -1087,8 +1084,6 @@ var CharacterController = (function () { if (this._freeFallDist < 0.01) return anim; var disp = new babylonjs__WEBPACK_IMPORTED_MODULE_0__.Vector3(0, -this._freeFallDist, 0); - if (this._hasCam && this._mode != 1 && !this._noRot) - this._avatar.rotation.y = this._av2cam - this._camera.alpha; this._avatar.moveWithCollisions(disp); if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) { this._groundIt(); @@ -1105,6 +1100,9 @@ var CharacterController = (function () { anim = this._actionMap.slideBack; } } + else { + anim = this._actionMap.fall; + } } return anim; }; @@ -1416,6 +1414,9 @@ var CharacterController = (function () { CharacterController.prototype.jump = function () { this._act._jump = true; }; + CharacterController.prototype.fall = function () { + this._grounded = false; + }; CharacterController.prototype.idle = function () { this._act.reset(); }; diff --git a/dist/CharacterController.max.js.map b/dist/CharacterController.max.js.map index 43180fa..899c19b 100644 --- a/dist/CharacterController.max.js.map +++ b/dist/CharacterController.max.js.map @@ -1 +1 @@ -{"version":3,"file":"CharacterController.max.js","mappings":"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","sources":["webpack://babylonjs-charactercontroller/webpack/universalModuleDefinition","webpack://babylonjs-charactercontroller/external umd {\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\",\"root\":\"BABYLON\"}","webpack://babylonjs-charactercontroller/webpack/bootstrap","webpack://babylonjs-charactercontroller/webpack/runtime/compat get default export","webpack://babylonjs-charactercontroller/webpack/runtime/define property getters","webpack://babylonjs-charactercontroller/webpack/runtime/hasOwnProperty shorthand","webpack://babylonjs-charactercontroller/webpack/runtime/make namespace object","webpack://babylonjs-charactercontroller/./src/CharacterController.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"babylonjs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"babylonjs\")) : factory(root[\"BABYLON\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, (__WEBPACK_EXTERNAL_MODULE_babylonjs__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\r\n Skeleton,\r\n ArcRotateCamera,\r\n Vector3,\r\n Mesh,\r\n Node,\r\n Scene,\r\n Ray,\r\n PickingInfo,\r\n AnimationGroup,\r\n TransformNode,\r\n TargetedAnimation,\r\n Matrix,\r\n DeepImmutable,\r\n AbstractMesh,\r\n PlaySoundAction,\r\n InstancedMesh,\r\n Sound,\r\n AnimationRange,\r\n Animatable,\r\n AnimationEvent,\r\n int\r\n} from \"babylonjs\";\r\n\r\n\r\nexport class CharacterController {\r\n\r\n private _avatar: Mesh = null;;\r\n private _skeleton: Skeleton = null;\r\n private _camera: ArcRotateCamera;\r\n private _scene: Scene;\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n\r\n private _gravity: number = 9.8;\r\n //slopeLimit in degrees\r\n private _minSlopeLimit: number = 30;\r\n private _maxSlopeLimit: number = 45;\r\n //slopeLimit in radians\r\n private _sl1: number = Math.PI * this._minSlopeLimit / 180;\r\n private _sl2: number = Math.PI * this._maxSlopeLimit / 180;\r\n\r\n //The av will step up a stair only if it is closer to the ground than the indicated value.\r\n private _stepOffset: number = 0.25;\r\n //toal amount by which the av has moved up\r\n private _vMoveTot: number = 0;\r\n //position of av when it started moving up\r\n private _vMovStartPos: Vector3 = Vector3.Zero();\r\n\r\n\r\n private _actionMap: ActionMap = new ActionMap();\r\n\r\n private _cameraElastic: boolean = true;\r\n private _cameraTarget: Vector3 = Vector3.Zero();\r\n //should we go into first person view when camera is near avatar (radius is lowerradius limit)\r\n private _noFirstPerson: boolean = false;\r\n\r\n\r\n\r\n public setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number) {\r\n this._minSlopeLimit = minSlopeLimit;\r\n this._maxSlopeLimit = maxSlopeLimit;\r\n\r\n this._sl1 = Math.PI * this._minSlopeLimit / 180;\r\n this._sl2 = Math.PI * this._maxSlopeLimit / 180;\r\n }\r\n\r\n /**\r\n * The av will step up a stair only if it is closer to the ground than the indicated value.\r\n * Default value is 0.25 m\r\n */\r\n public setStepOffset(stepOffset: number) {\r\n this._stepOffset = stepOffset;\r\n }\r\n\r\n public setWalkSpeed(n: number) {\r\n this._actionMap.walk.speed = n;\r\n }\r\n public setRunSpeed(n: number) {\r\n this._actionMap.run.speed = n;\r\n }\r\n public setBackSpeed(n: number) {\r\n this._actionMap.walkBack.speed = n;\r\n }\r\n public setBackFastSpeed(n: number) {\r\n this._actionMap.walkBackFast.speed = n;\r\n }\r\n public setJumpSpeed(n: number) {\r\n this._actionMap.idleJump.speed = n;\r\n this._actionMap.runJump.speed = n;\r\n }\r\n public setLeftSpeed(n: number) {\r\n this._actionMap.strafeLeft.speed = n;\r\n }\r\n public setLeftFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n public setRightSpeed(n: number) {\r\n this._actionMap.strafeRight.speed = n;\r\n }\r\n public setRightFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n // get turnSpeed in degrees per second.\r\n // store in radians per second\r\n public setTurnSpeed(n: number) {\r\n this._actionMap.turnLeft.speed = n * Math.PI / 180;\r\n this._actionMap.turnRight.speed = n * Math.PI / 180;\r\n }\r\n public setTurnFastSpeed(n: number) {\r\n this._actionMap.turnLeftFast.speed = n * Math.PI / 180;\r\n this._actionMap.turnRightFast.speed = n * Math.PI / 180;\r\n }\r\n public setGravity(n: number) {\r\n this._gravity = n;\r\n }\r\n\r\n /**\r\n * Use this to provide animationGroups to the character controller.\r\n * Provide the AnimationGroups using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animationGroup.\r\n * Example:\r\n * let myWalkAnimationGroup:AnimationGroup = ...;\r\n * let agMap:{} = {\r\n * \"walk\":myWalkAnimationGroup,\r\n * \"run\" : {\"ag\":myRunAnimationGroup,\"rate\":1},\r\n * \"idle\" : {\"ag\":myIdleAnimationGroup,\"loop\":true,\"rate\":1},\r\n * ....\r\n * ....\r\n * }\r\n * \r\n * @param agMap a map of character controller animation name to animationGroup\r\n */\r\n public setAnimationGroups(agMap: {}) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n this._isAG = true;\r\n this.setActionMap(agMap);\r\n }\r\n\r\n /**\r\n * Use this to provide AnimationRanges to the character controller.\r\n * Provide the AnimationRanges using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animation range name or an object with animation range data.\r\n * example:\r\n * let arMap = {\r\n * \"walk\":\"myWalk\",\r\n * \"run\" : {\"name\":\"myRun\",\"rate\":1},\r\n * \"idle\" : {\"name\":\"myIdle\",\"loop\":true,\"rate\":1},\r\n * ....\r\n * }\r\n * \r\n * @param arMap a map of character controller animation name to animationRange data\r\n */\r\n\r\n public setAnimationRanges(arMap: {}) {\r\n this._isAG = false;\r\n this.setActionMap(arMap);\r\n }\r\n\r\n /**\r\n * updates action data in the cc actionMap\r\n * with action data from the provided/input actionMap \r\n * \r\n * \r\n * return \"ar\" or \"ag\" depending on if the data provided\r\n * was animation range or animation group data respt.\r\n * \r\n * TODO should validate provided data.\r\n * In other words if animation range provided make sure\r\n * the range exist in the skeleton\r\n * or if animation group provided make sure the animation group\r\n * can be played on this avataor\r\n * \r\n * @param inActMap \r\n * @returns \r\n */\r\n public setActionMap(inActMap: ActionMap): string {\r\n let agMap: boolean = false;\r\n let inActData: ActionData;\r\n\r\n\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.exist = false;\r\n\r\n inActData = inActMap[ccActData.id];\r\n //in previous version of cc the key value was AnimationGroup rather than ActionData\r\n //lets accomodate that for backward compatibility\r\n if (inActData != null) {\r\n if (inActData instanceof AnimationGroup) {\r\n ccActData.ag = inActData;\r\n ccActData.name = ccActData.ag.name;\r\n ccActData.exist = true;\r\n agMap = true;\r\n this._hasAnims = true;\r\n } else if (inActData.exist) {\r\n this._hasAnims = true;\r\n ccActData.exist = true;\r\n if (inActData instanceof Object) {\r\n if (inActData.ag) {\r\n ccActData.ag = inActData.ag;\r\n agMap = true;\r\n }\r\n if (inActData.name) {\r\n ccActData.name = inActData.name;\r\n }\r\n if (inActData.loop != null) ccActData.loop = inActData.loop;\r\n if (inActData.rate) ccActData.rate = inActData.rate;\r\n if (inActData.speed) ccActData.speed = inActData.speed;\r\n // if (actDataI.key) actDataO.key = actDataI.key;\r\n if (inActData.sound) ccActData.sound = inActData.sound;\r\n } else {\r\n ccActData.name = inActData;\r\n }\r\n }\r\n }\r\n }\r\n this._checkFastAnims();\r\n //force to play new anims\r\n this._prevActData = null;\r\n if (agMap) return \"ag\"; else return \"ar\";\r\n }\r\n\r\n public getActionMap(): ActionMap {\r\n let map: ActionMap = new ActionMap();\r\n\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let actDataI = this._actionMap[key];\r\n\r\n if (!(actDataI instanceof ActionData)) continue;\r\n if (!actDataI.exist) continue;\r\n\r\n let actDataO: ActionData = map[actDataI.id];\r\n actDataO.ag = actDataI.ag;\r\n actDataO.name = actDataI.name;\r\n actDataO.loop = actDataI.loop;\r\n actDataO.rate = actDataI.rate;\r\n actDataO.speed = actDataI.speed;\r\n actDataO.key = actDataI.key;\r\n actDataO.sound = actDataI.sound;\r\n actDataO.exist = actDataI.exist;\r\n }\r\n\r\n return map;\r\n }\r\n\r\n public getSettings(): CCSettings {\r\n let ccs: CCSettings = new CCSettings();\r\n ccs.faceForward = this.isFaceForward();\r\n ccs.topDown = this.getMode() == 1 ? true : false;\r\n ccs.turningOff = this.isTurningOff();\r\n ccs.cameraTarget = this._cameraTarget.clone();\r\n ccs.cameraElastic = this._cameraElastic;\r\n ccs.elasticSteps = this._elasticSteps;\r\n ccs.makeInvisble = this._makeInvisible;\r\n ccs.gravity = this._gravity;\r\n ccs.keyboard = this._ekb;\r\n ccs.maxSlopeLimit = this._maxSlopeLimit;\r\n ccs.minSlopeLimit = this._minSlopeLimit;\r\n ccs.noFirstPerson = this._noFirstPerson;\r\n ccs.stepOffset = this._stepOffset;\r\n ccs.sound = this._stepSound;\r\n\r\n return ccs;\r\n }\r\n\r\n public setSettings(ccs: CCSettings) {\r\n this.setFaceForward(ccs.faceForward);\r\n this.setMode(ccs.topDown ? 1 : 0);\r\n this.setTurningOff(ccs.turningOff);\r\n this.setCameraTarget(ccs.cameraTarget);\r\n this.setCameraElasticity(ccs.cameraElastic);\r\n this.setElasticiSteps(ccs.elasticSteps);\r\n this.makeObstructionInvisible(ccs.makeInvisble);\r\n this.setGravity(ccs.gravity);\r\n this.enableKeyBoard(ccs.keyboard);\r\n this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit);\r\n this.setNoFirstPerson(ccs.noFirstPerson);\r\n this.setStepOffset(ccs.stepOffset);\r\n this.setSound(ccs.sound);\r\n\r\n }\r\n\r\n private _setAnim(anim: ActionData, animName?: string | AnimationGroup, rate?: number, loop?: boolean) {\r\n\r\n //animation range need skeleton\r\n if (!this._isAG && this._skeleton == null) return;\r\n\r\n if (animName != null) {\r\n if (this._isAG) {\r\n if (!(animName instanceof AnimationGroup)) return;\r\n anim.ag = animName;\r\n anim.exist = true;\r\n } else {\r\n if (this._skeleton.getAnimationRange(anim.name) != null) {\r\n anim.name = animName;\r\n anim.exist = true;\r\n } else {\r\n anim.exist = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (loop != null) anim.loop = loop;\r\n if (rate != null) anim.rate = rate;\r\n }\r\n\r\n public enableBlending(n: number) {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let act = this._actionMap[key];\r\n if (!(act instanceof ActionData)) continue;\r\n if (act.exist) {\r\n let ar: AnimationGroup = act.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = true;\r\n ta.animation.blendingSpeed = n;\r\n }\r\n }\r\n }\r\n } else {\r\n if (this._skeleton !== null)\r\n this._skeleton.enableBlending(n);\r\n }\r\n }\r\n\r\n public disableBlending() {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (anim.exist) {\r\n let ar: AnimationGroup = anim.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //setters for animations\r\n public setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walk, rangeName, rate, loop);\r\n }\r\n public setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.run, rangeName, rate, loop);\r\n }\r\n public setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBack, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack);\r\n }\r\n public setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop);\r\n }\r\n public setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.slideBack, rangeName, rate, loop);\r\n }\r\n public setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idle, rangeName, rate, loop);\r\n }\r\n public setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n }\r\n public setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop);\r\n }\r\n public setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n }\r\n public setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop);\r\n }\r\n public setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n }\r\n public setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop);\r\n }\r\n public setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n public setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop);\r\n }\r\n public setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idleJump, rangeName, rate, loop);\r\n }\r\n public setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.runJump, rangeName, rate, loop);\r\n }\r\n public setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.fall, rangeName, rate, loop);\r\n }\r\n\r\n\r\n _stepSound: Sound;\r\n // setters for sound\r\n public setSound(sound: Sound) {\r\n if (sound == null) return;\r\n this._stepSound = sound;\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n sound.loop = false;\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.sound = sound;\r\n ccActData.sound.attachToMesh(this._avatar);\r\n }\r\n this._actionMap.idle.sound = null;\r\n this._actionMap.fall.sound = null;\r\n this._actionMap.slideBack.sound = null;\r\n }\r\n\r\n\r\n // setters for keys\r\n public setWalkKey(key: string) {\r\n this._actionMap.walk.key = key.toLowerCase();\r\n }\r\n public setWalkBackKey(key: string) {\r\n this._actionMap.walkBack.key = key.toLowerCase();\r\n }\r\n public setTurnLeftKey(key: string) {\r\n this._actionMap.turnLeft.key = key.toLowerCase();\r\n }\r\n public setTurnRightKey(key: string) {\r\n this._actionMap.turnRight.key = key.toLowerCase();\r\n }\r\n public setStrafeLeftKey(key: string) {\r\n this._actionMap.strafeLeft.key = key.toLowerCase();\r\n }\r\n public setStrafeRightKey(key: string) {\r\n this._actionMap.strafeRight.key = key.toLowerCase();\r\n }\r\n public setJumpKey(key: string) {\r\n this._actionMap.idleJump.key = key.toLowerCase();\r\n }\r\n\r\n public setCameraElasticity(b: boolean) {\r\n this._cameraElastic = b;\r\n }\r\n\r\n public setElasticiSteps(n: number) {\r\n this._elasticSteps = n;\r\n }\r\n\r\n public makeObstructionInvisible(b: boolean) {\r\n this._makeInvisible = b;\r\n }\r\n public setCameraTarget(v: Vector3) {\r\n this._cameraTarget.copyFrom(v);\r\n }\r\n\r\n\r\n /**\r\n * user should call this whenever the user changes the camera checkCollision \r\n * property\r\n * \r\n */\r\n public cameraCollisionChanged() {\r\n this._savedCameraCollision = this._camera.checkCollisions;\r\n }\r\n public setNoFirstPerson(b: boolean) {\r\n this._noFirstPerson = b;\r\n }\r\n\r\n /**\r\n * if av has the required anim (walk, run etc) then \r\n * mark that anim as existing\r\n * \r\n * @param skel \r\n */\r\n\r\n private _checkAnimRanges(skel: Skeleton) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (skel != null) {\r\n if (skel.getAnimationRange(anim.id) != null) {\r\n anim.name = anim.id;\r\n anim.exist = true;\r\n this._hasAnims = true;\r\n }\r\n } else {\r\n anim.exist = false;\r\n }\r\n }\r\n this._checkFastAnims();\r\n }\r\n\r\n /**\r\n * if fast anims do not exist then use their slow counterpart as them but double the rate at which they play\r\n */\r\n private _checkFastAnims() {\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack)\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n\r\n private _copySlowAnims(f: ActionData, s: ActionData) {\r\n if (f.exist) return;\r\n if (!s.exist) return;\r\n f.exist = true;\r\n f.ag = s.ag;\r\n f.name = s.name;\r\n f.rate = s.rate * 2;\r\n }\r\n\r\n /**\r\n * Use this to make the character controller suitable for a isometeric/top down games or fps/third person game.\r\n * 1 In isometric/top down games the camera direction has no bearing on avatar movement.\r\n * 0 In fps/third person game rotating the camera around the avatar , rotates the avatar too.\r\n * \r\n * cannot switch mode to 0 if no camera avaiable.\r\n */\r\n private _mode = 0;\r\n private _saveMode = 0;\r\n public setMode(n: number) {\r\n //cannot switch mode to 0 if no camera avaiable.\r\n if (this._hasCam) {\r\n this._mode = n;\r\n this._saveMode = n;\r\n } else {\r\n this._mode = 1;\r\n this._saveMode = 1;\r\n }\r\n }\r\n public getMode() {\r\n return this._mode;\r\n }\r\n /**\r\n * Use this to set turning off.\r\n * When turining is off \r\n * a) turn left or turn right keys result in avatar facing and moving left or right with respect to camera.\r\n * b) walkback/runback key results in avatar facing back and walking/running towards camera.\r\n * \r\n * This setting has no effect when mode is 1.\r\n * \r\n * @param b \r\n */\r\n public setTurningOff(b: boolean) {\r\n this._noRot = b;\r\n }\r\n public isTurningOff() {\r\n return this._noRot;\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * BABYLONJS GLB models are RHS and exhibit this behavior\r\n * \r\n */\r\n private _isLHS_RHS = false;\r\n private _signLHS_RHS = -1;\r\n private _setRHS(mesh: TransformNode) {\r\n const meshMatrix: Matrix = mesh.getWorldMatrix();\r\n const _localX = Vector3.FromArray(>meshMatrix.m, 0);\r\n const _localY = Vector3.FromArray(>meshMatrix.m, 4);\r\n const _localZ = Vector3.FromArray(>meshMatrix.m, 8);\r\n const actualZ = Vector3.Cross(_localX, _localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, _localZ) < 0) {\r\n this._isLHS_RHS = true;\r\n this._signLHS_RHS = 1;\r\n }\r\n else {\r\n this._isLHS_RHS = false;\r\n this._signLHS_RHS = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Use setFaceForward(true|false) to indicate that the avatar's face points forward (true) or backward (false).\r\n * The avatar's face points forward if its face is looking in positive local Z axis direction\r\n */\r\n private _ffSign: number;\r\n private _rhsSign: number;\r\n private _ff: boolean;\r\n //in mode 0, av2cam is used to align avatar with camera , with camera always facing avatar's back\r\n //note:camera alpha is measured anti-clockwise , avatar rotation is measured clockwise \r\n private _av2cam;\r\n public setFaceForward(b: boolean) {\r\n this._ff = b;\r\n\r\n this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1;\r\n\r\n if (!this._hasCam) {\r\n this._av2cam = 0;\r\n this._ffSign = 1;\r\n return;\r\n }\r\n\r\n if (this._isLHS_RHS) {\r\n this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2;\r\n this._ffSign = b ? 1 : -1;\r\n } else {\r\n this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2;\r\n this._ffSign = b ? -1 : 1;\r\n }\r\n\r\n }\r\n\r\n public isFaceForward() {\r\n return this._ff;\r\n }\r\n\r\n private checkAGs(agMap: {}) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (agMap[anim.name] != null) {\r\n anim.ag = agMap[anim.name];\r\n anim.exist = true;\r\n }\r\n }\r\n }\r\n\r\n // check if any of the mesh on the node tree is refrenced by any animation group\r\n private _containsAG(node: Node, ags: AnimationGroup[], fromRoot: boolean) {\r\n let r: Node;\r\n let ns: Node[];\r\n\r\n if (fromRoot) {\r\n r = this._getRoot(node);\r\n ns = r.getChildren((n) => { return (n instanceof TransformNode) }, false);\r\n } else {\r\n r = node;\r\n ns = [r];\r\n }\r\n\r\n for (let ag of ags) {\r\n let tas: TargetedAnimation[] = ag.targetedAnimations;\r\n for (let ta of tas) {\r\n if (ns.indexOf(ta.target) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //get the root of Node\r\n private _getRoot(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._getRoot(tn.parent);\r\n }\r\n\r\n private _started: boolean = false;\r\n public start() {\r\n if (this._started) return;\r\n this._started = true;\r\n this._act.reset();\r\n this._movFallTime = 0;\r\n //first time we enter render loop, delta time is zero\r\n this._idleFallTime = 0.001;\r\n this._grounded = false;\r\n this._updateTargetValue();\r\n if (this._ekb) this._addkeylistener();\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public stop() {\r\n if (!this._started) return;\r\n this._started = false;\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this._removekeylistener();\r\n this._prevActData = null;\r\n }\r\n\r\n /**\r\n * use pauseAnim to stop the charactere controller from playing\r\n * any animation on the character\r\n * use this when you want to play your animation instead\r\n * see also resumeAnim()\r\n */\r\n private _stopAnim: boolean = false;\r\n public pauseAnim() {\r\n this._stopAnim = true;\r\n\r\n if (this._prevActData != null && this._prevActData.exist) {\r\n //stop current animation\r\n if (this._isAG) {\r\n this._prevActData.ag.stop();\r\n } else {\r\n //this._scene.stopAnimation(this._skeleton, this._prevActData.name);\r\n this._scene.stopAnimation(this._skeleton);\r\n //this._scene.stopAllAnimations();\r\n }\r\n //stop current sound\r\n if (this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n }\r\n }\r\n\r\n /**\r\n * use resumeAnim to resume the character controller playing\r\n * animations on the character.\r\n * see also pauseAnim()\r\n */\r\n public resumeAnim() {\r\n this._stopAnim = false;\r\n this._prevActData = null;\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n private _prevActData: ActionData = null;\r\n private _avStartPos: Vector3 = Vector3.Zero();\r\n private _grounded: boolean = false;\r\n //distance by which AV would move down if in freefall\r\n private _freeFallDist: number = 0;\r\n\r\n //how many minimum contiguos frames should the AV have been in free fall\r\n //before we assume AV is in big freefall.\r\n //we will use this to remove animation flicker during move down a slope (fall, move, fall move etc)\r\n //TODO: base this on slope - large slope large count\r\n private _fallFrameCountMin: number = 50;\r\n private _fallFrameCount: number = 0;\r\n\r\n private _inFreeFall: boolean = false;\r\n private _wasWalking: boolean = false;\r\n private _wasRunning: boolean = false;\r\n private _moveVector: Vector3;\r\n\r\n //used only in mode 1\r\n //value 1 or -1 , -1 if avatar is facing camera\r\n //private _notFacingCamera = 1;\r\n\r\n private _isAvFacingCamera(): number {\r\n if (!this._hasCam) return 1;\r\n if (Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) return 1\r\n else return -1;\r\n }\r\n\r\n private _moveAVandCamera() {\r\n this._avStartPos.copyFrom(this._avatar.position);\r\n let actData: ActionData = null;\r\n const dt: number = this._scene.getEngine().getDeltaTime() / 1000;\r\n\r\n if (this._act._jump && !this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doJump(dt);\r\n } else if (this.anyMovement() || this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doMove(dt);\r\n } else if (!this._inFreeFall) {\r\n actData = this._doIdle(dt);\r\n }\r\n if (!this._stopAnim && this._hasAnims && actData != null) {\r\n if (this._prevActData !== actData) {\r\n if (actData.exist) {\r\n\r\n //animation frame counts\r\n let c: number;\r\n let fps: number = 30;\r\n\r\n if (this._isAG) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n actData.ag.start(actData.loop, actData.rate);\r\n fps = actData.ag.targetedAnimations[0].animation.framePerSecond;\r\n c = (actData.ag.to - actData.ag.from);\r\n } else {\r\n let a: Animatable = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate);\r\n fps = a.getAnimations()[0].animation.framePerSecond;\r\n c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from;\r\n }\r\n\r\n //SOUND\r\n //TODO do sound as animationevent.\r\n if (this._prevActData != null && this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n if (actData.sound != null) {\r\n actData.sound.play();\r\n //play sound twice during the animation\r\n this._sndId = setInterval(() => { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2));\r\n }\r\n }\r\n this._prevActData = actData;\r\n }\r\n }\r\n this._updateTargetValue();\r\n return;\r\n }\r\n\r\n private _soundLoopTime = 700;\r\n private _sndId = null;\r\n\r\n //verical position of AV when it is about to start a jump\r\n private _jumpStartPosY: number = 0;\r\n //for how long the AV has been in the jump\r\n private _jumpTime: number = 0;\r\n private _doJump(dt: number): ActionData {\r\n\r\n let actData: ActionData = null;\r\n actData = this._actionMap.runJump;\r\n if (this._jumpTime === 0) {\r\n this._jumpStartPosY = this._avatar.position.y;\r\n }\r\n\r\n this._jumpTime = this._jumpTime + dt;\r\n\r\n let forwardDist: number = 0;\r\n let jumpDist: number = 0;\r\n let disp: Vector3;\r\n\r\n if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n if (this._wasRunning || this._wasWalking) {\r\n if (this._wasRunning) {\r\n forwardDist = this._actionMap.run.speed * dt;\r\n } else if (this._wasWalking) {\r\n forwardDist = this._actionMap.walk.speed * dt;\r\n }\r\n //find out in which horizontal direction the AV was moving when it started the jump\r\n disp = this._moveVector.clone();\r\n disp.y = 0;\r\n disp = disp.normalize();\r\n disp.scaleToRef(forwardDist, disp);\r\n jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt);\r\n disp.y = jumpDist;\r\n } else {\r\n jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt);\r\n disp = new Vector3(0, jumpDist, 0);\r\n actData = this._actionMap.idleJump;\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y/2;\r\n }\r\n //moveWithCollision only seems to happen if length of displacment is atleast 0.001\r\n this._avatar.moveWithCollisions(disp);\r\n if (jumpDist < 0) {\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y;\r\n //check if going up a slope or back on flat ground \r\n if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) {\r\n this._endJump();\r\n } else if (this._avatar.position.y < this._jumpStartPosY) {\r\n //the avatar is below the point from where it started the jump\r\n //so it is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than acceptable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endJump();\r\n }\r\n } else {\r\n actData = this._actionMap.fall;\r\n }\r\n }\r\n }\r\n return actData;\r\n }\r\n\r\n private _calcJumpDist(speed: number, dt: number): number {\r\n //up velocity at the begining of the lastt frame (v=u+at)\r\n let js: number = speed - this._gravity * this._jumpTime;\r\n //distance travelled up since last frame to this frame (s=ut+1/2*at^2)\r\n let jumpDist: number = js * dt - 0.5 * this._gravity * dt * dt;\r\n return jumpDist;\r\n }\r\n\r\n /**\r\n * does cleanup at the end of a jump\r\n */\r\n private _endJump() {\r\n this._act._jump = false;\r\n this._jumpTime = 0;\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n }\r\n\r\n /**\r\n * checks if two vectors v1 and v2 are equal within a precision of p\r\n */\r\n private _areVectorsEqual(v1: Vector3, v2: Vector3, p: number) {\r\n return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p));\r\n }\r\n\r\n /*\r\n * returns the slope (in radians) of a vector in the vertical plane\r\n */\r\n private _verticalSlope(v: Vector3): number {\r\n return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z)));\r\n }\r\n\r\n //for how long has the av been falling while moving\r\n private _movFallTime: number = 0;\r\n private _sign = 1;\r\n private _isTurning = false;\r\n private _noRot = false;\r\n private _doMove(dt: number): ActionData {\r\n\r\n //initial down velocity\r\n const u: number = this._movFallTime * this._gravity\r\n //calculate the distance by which av should fall down since last frame\r\n //assuming it is in freefall\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n\r\n this._movFallTime = this._movFallTime + dt;\r\n\r\n let moving: boolean = false;\r\n let actdata: ActionData = null;\r\n\r\n if (this._inFreeFall) {\r\n this._moveVector.y = -this._freeFallDist;\r\n moving = true;\r\n }\r\n\r\n\r\n //rotate avatar with respect to camera direction. \r\n this._rotateAV2C();\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n actdata = this._rotateAVnC(actdata, moving, dt);\r\n\r\n //now that avatar is rotated properly, construct the vector to move the avatar \r\n //donot move the avatar if avatar is in freefall\r\n\r\n if (!this._inFreeFall) {\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n\r\n let sign: number;\r\n let horizDist: number = 0;\r\n switch (true) {\r\n case (this._act._stepLeft):\r\n sign = this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeLeftFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._stepRight):\r\n sign = -this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeRight.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeRightFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._walk || (this._noRot && this._mode == 0)):\r\n if (this._act._speedMod) {\r\n this._wasRunning = true;\r\n horizDist = this._actionMap.run.speed * dt;\r\n actdata = this._actionMap.run;\r\n } else {\r\n this._wasWalking = true;\r\n horizDist = this._actionMap.walk.speed * dt;\r\n actdata = this._actionMap.walk;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n case (this._act._walkback):\r\n horizDist = this._actionMap.walkBack.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.walkBackFast.speed * dt;\r\n actdata = this._actionMap.walkBackFast;\r\n } else {\r\n actdata = this._actionMap.walkBack;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n }\r\n }\r\n\r\n // move the avatar\r\n\r\n if (moving) {\r\n if (this._moveVector.length() > 0.001) {\r\n this._avatar.moveWithCollisions(this._moveVector);\r\n //walking up a slope\r\n if (this._avatar.position.y > this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n const _slp: number = this._verticalSlope(actDisp);\r\n if (_slp >= this._sl2) {\r\n //this._climbingSteps=true;\r\n //is av trying to go up steps\r\n if (this._stepOffset > 0) {\r\n if (this._vMoveTot == 0) {\r\n //if just started climbing note down the position\r\n this._vMovStartPos.copyFrom(this._avStartPos);\r\n }\r\n this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y);\r\n if (this._vMoveTot > this._stepOffset) {\r\n //move av back to its position at begining of steps\r\n this._vMoveTot = 0;\r\n this._avatar.position.copyFrom(this._vMovStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n //move av back to old position\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n this._vMoveTot = 0;\r\n if (_slp > this._sl1) {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n } else {\r\n //continue walking\r\n this._endFreeFall();\r\n }\r\n }\r\n } else if ((this._avatar.position.y) < this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or walk?\r\n //if slope is less steeper than acceptable then walk else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endFreeFall();\r\n } else {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n } else {\r\n this._inFreeFall = true;\r\n this._fallFrameCount++;\r\n //AV could be running down a slope which mean freefall,run,frefall run ...\r\n //to remove anim flicker, check if AV has been falling down continously for last few consecutive frames\r\n //before changing to free fall animation\r\n if (this._fallFrameCount > this._fallFrameCountMin) {\r\n actdata = this._actionMap.fall;\r\n }\r\n }\r\n } else {\r\n this._endFreeFall();\r\n }\r\n }\r\n }\r\n return actdata;\r\n }\r\n\r\n /**\r\n * rotate avatar with respect to camera direction. \r\n */\r\n private _rotateAV2C() {\r\n if (this._hasCam)\r\n if (this._mode != 1) {\r\n let ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0;\r\n if (this._noRot) {\r\n switch (true) {\r\n case (this._act._walk && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walk && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walk):\r\n this._avatar.rotation.y = ca;\r\n break;\r\n case (this._act._walkback):\r\n this._avatar.rotation.y = ca + Math.PI;\r\n break;\r\n case (this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2;\r\n break;\r\n case (this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2;\r\n break;\r\n }\r\n } else {\r\n if (this._hasCam)\r\n this._avatar.rotation.y = ca;\r\n }\r\n }\r\n }\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n private _rotateAVnC(anim: ActionData, moving: boolean, dt: number): ActionData {\r\n if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) {\r\n let turnAngle = this._actionMap.turnLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n turnAngle = 2 * turnAngle;\r\n }\r\n let a;\r\n if (this._mode == 1) {\r\n // while turining, the avatar could start facing away from camera and end up facing camera.\r\n // we should not switch turning direction during this transition\r\n if (!this._isTurning) {\r\n // if (this._act.name != this._act.prevName) {\r\n // this._act.prevName = this._act.name;\r\n this._sign = -this._ffSign * this._isAvFacingCamera();\r\n if (this._isLHS_RHS) this._sign = - this._sign;\r\n this._isTurning = true;\r\n }\r\n a = this._sign;\r\n if (this._act._turnLeft) {\r\n if (this._act._walk) { }\r\n else if (this._act._walkback) a = -this._sign;\r\n else {\r\n anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft;\r\n }\r\n } else {\r\n if (this._act._walk) a = -this._sign;\r\n else if (this._act._walkback) { }\r\n else {\r\n a = -this._sign;\r\n anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight;\r\n }\r\n }\r\n } else {\r\n a = 1;\r\n if (this._act._turnLeft) {\r\n if (this._act._walkback) a = -1;\r\n if (!moving) anim = this._actionMap.turnLeft;\r\n } else {\r\n if (this._act._walk) a = -1;\r\n if (!moving) { a = -1; anim = this._actionMap.turnRight; }\r\n }\r\n if (this._hasCam)\r\n this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a;\r\n }\r\n\r\n this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a;\r\n }\r\n return anim;\r\n }\r\n\r\n private _endFreeFall(): void {\r\n this._movFallTime = 0;\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n\r\n //for how long has the av been falling while idle (not moving)\r\n private _idleFallTime: number = 0;\r\n private _doIdle(dt: number): ActionData {\r\n if (this._grounded) {\r\n return this._actionMap.idle;\r\n }\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n this._movFallTime = 0;\r\n let anim: ActionData = this._actionMap.idle;\r\n this._fallFrameCount = 0;\r\n\r\n\r\n if (dt === 0) {\r\n this._freeFallDist = 5;\r\n } else {\r\n const u: number = this._idleFallTime * this._gravity\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n this._idleFallTime = this._idleFallTime + dt;\r\n }\r\n //if displacement is less than 0.01(? need to verify further) then \r\n //moveWithDisplacement down against a surface seems to push the AV up by a small amount!!\r\n if (this._freeFallDist < 0.01) return anim;\r\n const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0);\r\n if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n this._avatar.moveWithCollisions(disp);\r\n if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n } else if (this._avatar.position.y < this._avStartPos.y) {\r\n //AV is going down. \r\n //AV is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than accebtable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n } else {\r\n this._unGroundIt();\r\n anim = this._actionMap.slideBack;\r\n }\r\n }\r\n }\r\n return anim;\r\n }\r\n\r\n private _groundFrameCount = 0;\r\n private _groundFrameMax = 10;\r\n /**\r\n * donot ground immediately\r\n * wait few more frames\r\n */\r\n private _groundIt(): void {\r\n this._groundFrameCount++;\r\n if (this._groundFrameCount > this._groundFrameMax) {\r\n this._grounded = true;\r\n this._idleFallTime = 0;\r\n }\r\n }\r\n private _unGroundIt() {\r\n this._grounded = false;\r\n this._groundFrameCount = 0;\r\n }\r\n\r\n private _savedCameraCollision: boolean = true;\r\n private _inFP = false;\r\n private _updateTargetValue() {\r\n if (!this._hasCam) return;\r\n //donot move camera if av is trying to clinb steps\r\n if (this._vMoveTot == 0)\r\n this._avatar.position.addToRef(this._cameraTarget, this._camera.target);\r\n\r\n if (this._camera.radius > this._camera.lowerRadiusLimit) { if (this._cameraElastic || this._makeInvisible) this._handleObstruction(); }\r\n\r\n //if user so desire, make the AV invisible if camera comes close to it\r\n if (this._camera.radius <= this._camera.lowerRadiusLimit) {\r\n if (!this._noFirstPerson && !this._inFP) {\r\n this._makeMeshInvisible(this._avatar);\r\n this._camera.checkCollisions = false;\r\n this._saveMode = this._mode;\r\n this._mode = 0;\r\n this._inFP = true;\r\n }\r\n } else {\r\n if (this._inFP) {\r\n this._inFP = false;\r\n this._mode = this._saveMode;\r\n this._restoreVisiblity(this._avatar);\r\n this._camera.checkCollisions = this._savedCameraCollision;\r\n }\r\n }\r\n }\r\n\r\n // make mesh and all its children invisible\r\n // store their current visibility state so that we can restore them later on\r\n private _makeMeshInvisible(mesh: Mesh) {\r\n\r\n this._visiblityMap.set(mesh, mesh.visibility);\r\n mesh.visibility = 0;\r\n\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) {\r\n this._visiblityMap.set(n, n.visibility);\r\n n.visibility = 0;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n private _visiblityMap: Map = new Map();\r\n\r\n //restore mesh visibility to previous state\r\n private _restoreVisiblity(mesh: Mesh) {\r\n mesh.visibility = this._visiblityMap.get(mesh);\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) n.visibility = this._visiblityMap.get(n);\r\n return false;\r\n });\r\n }\r\n\r\n private _ray: Ray = new Ray(Vector3.Zero(), Vector3.One(), 1);\r\n private _rayDir: Vector3 = Vector3.Zero();\r\n //camera seems to get stuck into things\r\n //should move camera away from things by a value of cameraSkin\r\n private _cameraSkin: number = 0.5;\r\n private _prevPickedMeshes: AbstractMesh[];\r\n private _pickedMeshes: AbstractMesh[] = new Array();;\r\n private _makeInvisible = false;\r\n private _elasticSteps = 50;\r\n private _alreadyInvisible: AbstractMesh[];\r\n\r\n /**\r\n * The following method handles the use case wherein some mesh\r\n * comes between the avatar and the camera thus obstructing the view\r\n * of the avatar.\r\n * Two ways this can be handled\r\n * a) make the obstructing mesh invisible\r\n * instead of invisible a better option would have been to make semi transparent.\r\n * Unfortunately, unlike mesh, mesh instances do not \"visibility\" setting)\r\n * Every alternate frame make mesh visible and invisible to give the impression of semi-transparent.\r\n * b) move the camera in front of the obstructing mesh\r\n */\r\n private _handleObstruction() {\r\n\r\n //get vector from av (camera.target) to camera\r\n this._camera.position.subtractToRef(this._camera.target, this._rayDir);\r\n //start ray from av to camera\r\n this._ray.origin = this._camera.target;\r\n this._ray.length = this._rayDir.length();\r\n this._ray.direction = this._rayDir.normalize();\r\n\r\n //TODO \r\n //handle case were pick is with a child of avatar, avatar atatchment. etc\r\n const pis: PickingInfo[] = this._scene.multiPickWithRay(this._ray, (mesh) => {\r\n if (mesh == this._avatar) return false;\r\n else return true;\r\n });\r\n\r\n\r\n if (this._makeInvisible) {\r\n this._prevPickedMeshes = this._pickedMeshes;\r\n if (pis.length > 0) {\r\n this._pickedMeshes = new Array();\r\n for (let pi of pis) {\r\n if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) {\r\n pi.pickedMesh.isVisible = false;\r\n this._pickedMeshes.push(pi.pickedMesh);\r\n }\r\n }\r\n for (let pm of this._prevPickedMeshes) {\r\n if (!this._pickedMeshes.includes(pm)) {\r\n pm.isVisible = true;\r\n }\r\n }\r\n } else {\r\n for (let pm of this._prevPickedMeshes) {\r\n pm.isVisible = true;\r\n }\r\n this._prevPickedMeshes.length = 0;\r\n }\r\n }\r\n\r\n if (this._cameraElastic) {\r\n if (pis.length > 0) {\r\n // postion the camera in front of the mesh that is obstructing camera\r\n\r\n //if only one obstruction and it is invisible then if it is not collidable or our camera is not collidable then do nothing\r\n if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) return;\r\n\r\n //if our camera is collidable then we donot want it to get stuck behind another collidable obsrtucting mesh\r\n let pp: Vector3 = null;\r\n\r\n //we will asume the order of picked meshes is from closest to avatar to furthest\r\n //we should get the first one which is visible or invisible and collidable\r\n for (let i = 0; i < pis.length; i++) {\r\n let pm = pis[i].pickedMesh;\r\n if (this._isSeeAble(pm)) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n } else if (pm.checkCollisions) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n }\r\n }\r\n if (pp == null) return;\r\n\r\n const c2p: Vector3 = this._camera.position.subtract(pp);\r\n //note that when camera is collidable, changing the orbital camera radius may not work.\r\n //changing the radius moves the camera forward (with collision?) and collision can interfere with movement\r\n //\r\n //in every cylce we are dividing the distance to tarvel by same number of steps.\r\n //as we get closer to destination the speed will thus slow down.\r\n //when just 1 unit distance left, lets snap to the final position.\r\n //when calculating final position make sure the camera does not get stuck at the pickposition especially\r\n //if collision is on\r\n\r\n const l: number = c2p.length();\r\n if (this._camera.checkCollisions) {\r\n let step: Vector3;\r\n if (l <= 1) {\r\n step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin));\r\n } else {\r\n step = c2p.normalize().scaleInPlace(l / this._elasticSteps);\r\n }\r\n this._camera.position = this._camera.position.subtract(step);\r\n } else {\r\n let step: number;\r\n if (l <= 1) step = l + this._cameraSkin; else step = l / this._elasticSteps;\r\n this._camera.radius = this._camera.radius - (step);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //how many ways can a mesh be invisible?\r\n private _isSeeAble(mesh: AbstractMesh): boolean {\r\n if (!mesh.isVisible) return false;\r\n if (mesh.visibility == 0) return false;\r\n if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) return false;\r\n return true;\r\n //what about vertex color? groan!\r\n }\r\n\r\n\r\n private _move: boolean = false;\r\n public anyMovement(): boolean {\r\n return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight);\r\n }\r\n\r\n private _onKeyDown(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n if (e.repeat) return;\r\n switch (e.key.toLowerCase()) {\r\n case this._actionMap.idleJump.key:\r\n this._act._jump = true;\r\n break;\r\n case \"capslock\":\r\n this._act._speedMod = !this._act._speedMod;\r\n break;\r\n case \"shift\":\r\n this._act._speedMod = true;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = true;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = true;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = true;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = true;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = true;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = true;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _onKeyUp(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n switch (e.key.toLowerCase()) {\r\n case \"shift\":\r\n this._act._speedMod = false;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = false;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = false;\r\n this._isTurning = false;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = false;\r\n this._isTurning = false;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = false;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = false;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = false;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _ekb: boolean = true;\r\n public isKeyBoardEnabled(): boolean {\r\n return this._ekb;\r\n }\r\n public enableKeyBoard(b: boolean) {\r\n this._ekb = b;\r\n if (b) {\r\n this._addkeylistener();\r\n } else {\r\n this._removekeylistener();\r\n }\r\n }\r\n\r\n private _addkeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.addEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.addEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n private _removekeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.removeEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.removeEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n // control movement by commands rather than keyboard.\r\n public walk(b: boolean) {\r\n this._act._walk = b;\r\n }\r\n public walkBack(b: boolean) {\r\n this._act._walkback = b;\r\n }\r\n public walkBackFast(b: boolean) {\r\n this._act._walkback = b;\r\n this._act._speedMod = b;\r\n }\r\n public run(b: boolean) {\r\n this._act._walk = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnLeft(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnLeftFast(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnRight(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnRightFast(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeLeft(b: boolean) {\r\n this._act._stepLeft = b;\r\n }\r\n public strafeLeftFast(b: boolean) {\r\n this._act._stepLeft = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeRight(b: boolean) {\r\n this._act._stepRight = b;\r\n }\r\n public strafeRightFast(b: boolean) {\r\n this._act._stepRight = b;\r\n this._act._speedMod = b;\r\n }\r\n public jump() {\r\n this._act._jump = true;\r\n }\r\n public idle() {\r\n this._act.reset();\r\n }\r\n\r\n private _act: _Action;\r\n private _renderer: () => void;\r\n private _handleKeyUp: (e) => void;\r\n private _handleKeyDown: (e) => void;\r\n private _isAG: boolean = false;\r\n public isAg() {\r\n return this._isAG;\r\n }\r\n\r\n\r\n\r\n\r\n private _findSkel(n: Node): Skeleton {\r\n let root = this._root(n);\r\n\r\n if (root instanceof Mesh && root.skeleton) return root.skeleton;\r\n\r\n //find all child meshes which have skeletons\r\n let ms = root.getChildMeshes(\r\n false,\r\n (cm) => {\r\n if (cm instanceof Mesh) {\r\n if (cm.skeleton) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n //return the skeleton of the first child mesh\r\n if (ms.length > 0) return ms[0].skeleton; else return null;\r\n\r\n }\r\n\r\n private _root(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._root(tn.parent);\r\n }\r\n\r\n public setAvatar(avatar: Mesh, faceForward: boolean = false): boolean {\r\n\r\n let rootNode = this._root(avatar);\r\n if (rootNode instanceof Mesh) {\r\n this._avatar = rootNode;\r\n } else {\r\n console.error(\"Cannot move this mesh. The root node of the mesh provided is not a mesh\");\r\n return false;\r\n }\r\n\r\n this._skeleton = this._findSkel(avatar);\r\n this._isAG = this._containsAG(avatar, this._scene.animationGroups, true);\r\n\r\n this._actionMap.reset();\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n\r\n this._setRHS(avatar);\r\n this.setFaceForward(faceForward);\r\n\r\n return true;\r\n }\r\n\r\n public getAvatar() {\r\n return this._avatar;\r\n }\r\n\r\n // force a skeleton to be the avatar skeleton\r\n // should not be calling this normally\r\n public setAvatarSkeleton(skeleton: Skeleton) {\r\n this._skeleton = skeleton;\r\n\r\n\r\n if (this._skeleton != null && this._skelDrivenByAG(skeleton)) this._isAG = true; else this._isAG = false;\r\n\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n }\r\n\r\n\r\n // this check if any of this skeleton animations is referenced by any targetedAnimation in any of the animationgroup in the scene.\r\n private _skelDrivenByAG(skeleton: Skeleton) {\r\n return skeleton.animations.some(sa => this._scene.animationGroups.some(ag => ag.children.some(ta => ta.animation == sa)));\r\n }\r\n\r\n public getSkeleton() {\r\n return this._skeleton;\r\n }\r\n\r\n // does this character have any animations ?\r\n // remember we can use meshes without anims as characters too\r\n private _hasAnims: boolean = false;\r\n private _hasCam: boolean = true;\r\n\r\n /**\r\n * The avatar/character can be made up of multiple meshes arranged in a hierarchy.\r\n * As such we will pick the root of the hierarchy as the avatar.\r\n * The root should be a mesh as otherwise we cannot move it with moveWithCollision() method.\r\n * \r\n * Mutiple meshes in the hierarchy may have skeletons (if two or more meshes have skeleton then\r\n * the skeleton will mostly likely be the same). \r\n * So we will pick as avatar skeleton, the skeleton of the first mesh in the hierachy which has\r\n * a skeleton \r\n * \r\n * @param avatar \r\n * @param camera \r\n * @param scene \r\n * @param actionMap/animationGroupMap \r\n * maps actions to animations and other data like speed,sound etc \r\n * or \r\n * for backward compatibility could be AnimationGroup Map\r\n * @param faceForward \r\n */\r\n constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward = false) {\r\n\r\n this._camera = camera;\r\n\r\n //if camera is null assume this would be used to control an NPC\r\n //we cannot use mode 0 as that is dependent on camera being present. so force mode 1\r\n if (this._camera == null) {\r\n this._hasCam = false;\r\n this.setMode(1);\r\n }\r\n this._scene = scene;\r\n\r\n let success = this.setAvatar(avatar, faceForward);\r\n if (!success) {\r\n console.error(\"unable to set avatar\");\r\n }\r\n\r\n\r\n let dataType: string = null;\r\n if (actionMap != null) {\r\n dataType = this.setActionMap(actionMap);\r\n }\r\n\r\n //try to use the existing avatar animations\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n //animation groups\r\n if (this._isAG) {\r\n //TODO\r\n }\r\n\r\n if (this._hasCam) this._savedCameraCollision = this._camera.checkCollisions;\r\n\r\n this._act = new _Action();\r\n\r\n this._renderer = () => { this._moveAVandCamera() };\r\n this._handleKeyUp = (e) => { this._onKeyUp(e) };\r\n this._handleKeyDown = (e) => { this._onKeyDown(e) };\r\n }\r\n}\r\n\r\n\r\n\r\nclass _Action {\r\n\r\n public _walk: boolean = false;\r\n public _walkback: boolean = false;\r\n public _turnRight: boolean = false;\r\n public _turnLeft: boolean = false;\r\n public _stepRight: boolean = false;\r\n public _stepLeft: boolean = false;\r\n public _jump: boolean = false;\r\n\r\n // speed modifier - changes speed of movement\r\n public _speedMod: boolean = false;\r\n\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset() {\r\n this._walk = false;\r\n this._walkback = false;\r\n this._turnRight = false;\r\n this._turnLeft = false;\r\n this._stepRight = false;\r\n this._stepLeft = false;\r\n this._jump = false;\r\n this._speedMod = false;\r\n }\r\n}\r\n\r\nexport class ActionData {\r\n public id: string;\r\n public speed: number;\r\n //_ds default speed. speed is set to this on reset\r\n public ds: number;\r\n public sound: Sound;\r\n public key: string;\r\n //_dk defailt key\r\n public dk: string;\r\n\r\n //animation data\r\n //if _ag is null then assuming animation range and use _name to play animationrange\r\n //instead of name maybe call it arName?\r\n public name: string = \"\";\r\n public ag: AnimationGroup;\r\n public loop: boolean = true;\r\n public rate: number = 1;\r\n\r\n public exist: boolean = false;\r\n\r\n public constructor(id?: string, speed = 1, key?: string) {\r\n this.id = id;\r\n this.speed = speed;\r\n this.ds = speed;\r\n this.key = key;\r\n this.dk = key;\r\n }\r\n\r\n public reset() {\r\n this.name = \"\";\r\n this.speed = this.ds;\r\n this.key = this.dk;\r\n this.loop = true;\r\n this.rate = 1;\r\n this.sound = null;\r\n this.exist = false;\r\n }\r\n\r\n}\r\n\r\n//not really a \"Map\"\r\nexport class ActionMap {\r\n public walk = new ActionData(\"walk\", 3, \"w\");\r\n public walkBack = new ActionData(\"walkBack\", 1.5, \"s\");\r\n public walkBackFast = new ActionData(\"walkBackFast\", 3, \"na\");\r\n public idle = new ActionData(\"idle\", 0, \"na\");\r\n public idleJump = new ActionData(\"idleJump\", 6, \" \");\r\n public run = new ActionData(\"run\", 6, \"na\");\r\n public runJump = new ActionData(\"runJump\", 6, \"na\");\r\n public fall = new ActionData(\"fall\", 0, \"na\");\r\n public turnLeft = new ActionData(\"turnLeft\", Math.PI / 8, \"a\");\r\n public turnLeftFast = new ActionData(\"turnLeftFast\", Math.PI / 4, \"na\");\r\n public turnRight = new ActionData(\"turnRight\", Math.PI / 8, \"d\");\r\n public turnRightFast = new ActionData(\"turnRightFast\", Math.PI / 4, \"na\");\r\n public strafeLeft = new ActionData(\"strafeLeft\", 1.5, \"q\");\r\n public strafeLeftFast = new ActionData(\"strafeLeftFast\", 3, \"na\");\r\n public strafeRight = new ActionData(\"strafeRight\", 1.5, \"e\");\r\n public strafeRightFast = new ActionData(\"strafeRightFast\", 3, \"na\");\r\n public slideBack = new ActionData(\"slideBack\", 0, \"na\");\r\n\r\n public reset() {\r\n let keys: string[] = Object.keys(this);\r\n for (let key of keys) {\r\n let act = this[key];\r\n if (!(act instanceof ActionData)) continue;\r\n act.reset()\r\n }\r\n }\r\n};\r\n\r\nexport class CCSettings {\r\n public faceForward: boolean;\r\n public gravity: number;\r\n public minSlopeLimit: number;\r\n public maxSlopeLimit: number;\r\n public stepOffset: number;\r\n public cameraElastic: boolean = true;\r\n public elasticSteps: number;\r\n public makeInvisble: boolean = true;\r\n public cameraTarget: Vector3 = Vector3.Zero();\r\n public noFirstPerson: boolean = false;\r\n public topDown: boolean = true;\r\n //turningOff takes effect only when topDown is false\r\n public turningOff: boolean = true;\r\n public keyboard: boolean = true;\r\n public sound: Sound;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"CharacterController.max.js","mappings":"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","sources":["webpack://babylonjs-charactercontroller/webpack/universalModuleDefinition","webpack://babylonjs-charactercontroller/external umd {\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\",\"root\":\"BABYLON\"}","webpack://babylonjs-charactercontroller/webpack/bootstrap","webpack://babylonjs-charactercontroller/webpack/runtime/compat get default export","webpack://babylonjs-charactercontroller/webpack/runtime/define property getters","webpack://babylonjs-charactercontroller/webpack/runtime/hasOwnProperty shorthand","webpack://babylonjs-charactercontroller/webpack/runtime/make namespace object","webpack://babylonjs-charactercontroller/./src/CharacterController.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"babylonjs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"babylonjs\")) : factory(root[\"BABYLON\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, (__WEBPACK_EXTERNAL_MODULE_babylonjs__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import {\r\n Skeleton,\r\n ArcRotateCamera,\r\n Vector3,\r\n Mesh,\r\n Node,\r\n Scene,\r\n Ray,\r\n PickingInfo,\r\n AnimationGroup,\r\n TransformNode,\r\n TargetedAnimation,\r\n Matrix,\r\n DeepImmutable,\r\n AbstractMesh,\r\n PlaySoundAction,\r\n InstancedMesh,\r\n Sound,\r\n AnimationRange,\r\n Animatable,\r\n AnimationEvent,\r\n int\r\n} from \"babylonjs\";\r\n\r\n\r\nexport class CharacterController {\r\n\r\n private _avatar: Mesh = null;\r\n private _skeleton: Skeleton = null;\r\n private _camera: ArcRotateCamera;\r\n private _scene: Scene;\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n\r\n private _gravity: number = 9.8;\r\n //slopeLimit in degrees\r\n private _minSlopeLimit: number = 30;\r\n private _maxSlopeLimit: number = 45;\r\n //slopeLimit in radians\r\n private _sl1: number = Math.PI * this._minSlopeLimit / 180;\r\n private _sl2: number = Math.PI * this._maxSlopeLimit / 180;\r\n\r\n //The av will step up a stair only if it is closer to the ground than the indicated value.\r\n private _stepOffset: number = 0.25;\r\n //toal amount by which the av has moved up\r\n private _vMoveTot: number = 0;\r\n //position of av when it started moving up\r\n private _vMovStartPos: Vector3 = Vector3.Zero();\r\n\r\n\r\n private _actionMap: ActionMap = new ActionMap();\r\n\r\n private _cameraElastic: boolean = true;\r\n private _cameraTarget: Vector3 = Vector3.Zero();\r\n //should we go into first person view when camera is near avatar (radius is lowerradius limit)\r\n private _noFirstPerson: boolean = false;\r\n\r\n\r\n\r\n public setSlopeLimit(minSlopeLimit: number, maxSlopeLimit: number) {\r\n this._minSlopeLimit = minSlopeLimit;\r\n this._maxSlopeLimit = maxSlopeLimit;\r\n\r\n this._sl1 = Math.PI * this._minSlopeLimit / 180;\r\n this._sl2 = Math.PI * this._maxSlopeLimit / 180;\r\n }\r\n\r\n /**\r\n * The av will step up a stair only if it is closer to the ground than the indicated value.\r\n * Default value is 0.25 m\r\n */\r\n public setStepOffset(stepOffset: number) {\r\n this._stepOffset = stepOffset;\r\n }\r\n\r\n public setWalkSpeed(n: number) {\r\n this._actionMap.walk.speed = n;\r\n }\r\n public setRunSpeed(n: number) {\r\n this._actionMap.run.speed = n;\r\n }\r\n public setBackSpeed(n: number) {\r\n this._actionMap.walkBack.speed = n;\r\n }\r\n public setBackFastSpeed(n: number) {\r\n this._actionMap.walkBackFast.speed = n;\r\n }\r\n public setJumpSpeed(n: number) {\r\n this._actionMap.idleJump.speed = n;\r\n this._actionMap.runJump.speed = n;\r\n }\r\n public setLeftSpeed(n: number) {\r\n this._actionMap.strafeLeft.speed = n;\r\n }\r\n public setLeftFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n public setRightSpeed(n: number) {\r\n this._actionMap.strafeRight.speed = n;\r\n }\r\n public setRightFastSpeed(n: number) {\r\n this._actionMap.strafeLeftFast.speed = n;\r\n }\r\n // get turnSpeed in degrees per second.\r\n // store in radians per second\r\n public setTurnSpeed(n: number) {\r\n this._actionMap.turnLeft.speed = n * Math.PI / 180;\r\n this._actionMap.turnRight.speed = n * Math.PI / 180;\r\n }\r\n public setTurnFastSpeed(n: number) {\r\n this._actionMap.turnLeftFast.speed = n * Math.PI / 180;\r\n this._actionMap.turnRightFast.speed = n * Math.PI / 180;\r\n }\r\n public setGravity(n: number) {\r\n this._gravity = n;\r\n }\r\n\r\n /**\r\n * Use this to provide animationGroups to the character controller.\r\n * Provide the AnimationGroups using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animationGroup.\r\n * Example:\r\n * let myWalkAnimationGroup:AnimationGroup = ...;\r\n * let agMap:{} = {\r\n * \"walk\":myWalkAnimationGroup,\r\n * \"run\" : {\"ag\":myRunAnimationGroup,\"rate\":1},\r\n * \"idle\" : {\"ag\":myIdleAnimationGroup,\"loop\":true,\"rate\":1},\r\n * ....\r\n * ....\r\n * }\r\n * \r\n * @param agMap a map of character controller animation name to animationGroup\r\n */\r\n public setAnimationGroups(agMap: {}) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n this._isAG = true;\r\n this.setActionMap(agMap);\r\n }\r\n\r\n /**\r\n * Use this to provide AnimationRanges to the character controller.\r\n * Provide the AnimationRanges using a Map\r\n * In this Map the key would be the character controller animation name and\r\n * the key value would be the animation range name or an object with animation range data.\r\n * example:\r\n * let arMap = {\r\n * \"walk\":\"myWalk\",\r\n * \"run\" : {\"name\":\"myRun\",\"rate\":1},\r\n * \"idle\" : {\"name\":\"myIdle\",\"loop\":true,\"rate\":1},\r\n * ....\r\n * }\r\n * \r\n * @param arMap a map of character controller animation name to animationRange data\r\n */\r\n\r\n public setAnimationRanges(arMap: {}) {\r\n this._isAG = false;\r\n this.setActionMap(arMap);\r\n }\r\n\r\n /**\r\n * updates action data in the cc actionMap\r\n * with action data from the provided/input actionMap \r\n * \r\n * \r\n * return \"ar\" or \"ag\" depending on if the data provided\r\n * was animation range or animation group data respt.\r\n * \r\n * TODO should validate provided data.\r\n * In other words if animation range provided make sure\r\n * the range exist in the skeleton\r\n * or if animation group provided make sure the animation group\r\n * can be played on this avataor\r\n * \r\n * @param inActMap \r\n * @returns \r\n */\r\n public setActionMap(inActMap: ActionMap): string {\r\n let agMap: boolean = false;\r\n let inActData: ActionData;\r\n\r\n\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.exist = false;\r\n\r\n inActData = inActMap[ccActData.id];\r\n //in previous version of cc the key value was AnimationGroup rather than ActionData\r\n //lets accomodate that for backward compatibility\r\n if (inActData != null) {\r\n if (inActData instanceof AnimationGroup) {\r\n ccActData.ag = inActData;\r\n ccActData.name = ccActData.ag.name;\r\n ccActData.exist = true;\r\n agMap = true;\r\n this._hasAnims = true;\r\n } else if (inActData.exist) {\r\n this._hasAnims = true;\r\n ccActData.exist = true;\r\n if (inActData instanceof Object) {\r\n if (inActData.ag) {\r\n ccActData.ag = inActData.ag;\r\n agMap = true;\r\n }\r\n if (inActData.name) {\r\n ccActData.name = inActData.name;\r\n }\r\n if (inActData.loop != null) ccActData.loop = inActData.loop;\r\n if (inActData.rate) ccActData.rate = inActData.rate;\r\n if (inActData.speed) ccActData.speed = inActData.speed;\r\n // if (actDataI.key) actDataO.key = actDataI.key;\r\n if (inActData.sound) ccActData.sound = inActData.sound;\r\n } else {\r\n ccActData.name = inActData;\r\n }\r\n }\r\n }\r\n }\r\n this._checkFastAnims();\r\n //force to play new anims\r\n this._prevActData = null;\r\n if (agMap) return \"ag\"; else return \"ar\";\r\n }\r\n\r\n public getActionMap(): ActionMap {\r\n let map: ActionMap = new ActionMap();\r\n\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let actDataI = this._actionMap[key];\r\n\r\n if (!(actDataI instanceof ActionData)) continue;\r\n if (!actDataI.exist) continue;\r\n\r\n let actDataO: ActionData = map[actDataI.id];\r\n actDataO.ag = actDataI.ag;\r\n actDataO.name = actDataI.name;\r\n actDataO.loop = actDataI.loop;\r\n actDataO.rate = actDataI.rate;\r\n actDataO.speed = actDataI.speed;\r\n actDataO.key = actDataI.key;\r\n actDataO.sound = actDataI.sound;\r\n actDataO.exist = actDataI.exist;\r\n }\r\n\r\n return map;\r\n }\r\n\r\n public getSettings(): CCSettings {\r\n let ccs: CCSettings = new CCSettings();\r\n ccs.faceForward = this.isFaceForward();\r\n ccs.topDown = this.getMode() == 1 ? true : false;\r\n ccs.turningOff = this.isTurningOff();\r\n ccs.cameraTarget = this._cameraTarget.clone();\r\n ccs.cameraElastic = this._cameraElastic;\r\n ccs.elasticSteps = this._elasticSteps;\r\n ccs.makeInvisble = this._makeInvisible;\r\n ccs.gravity = this._gravity;\r\n ccs.keyboard = this._ekb;\r\n ccs.maxSlopeLimit = this._maxSlopeLimit;\r\n ccs.minSlopeLimit = this._minSlopeLimit;\r\n ccs.noFirstPerson = this._noFirstPerson;\r\n ccs.stepOffset = this._stepOffset;\r\n ccs.sound = this._stepSound;\r\n\r\n return ccs;\r\n }\r\n\r\n public setSettings(ccs: CCSettings) {\r\n this.setFaceForward(ccs.faceForward);\r\n this.setMode(ccs.topDown ? 1 : 0);\r\n this.setTurningOff(ccs.turningOff);\r\n this.setCameraTarget(ccs.cameraTarget);\r\n this.setCameraElasticity(ccs.cameraElastic);\r\n this.setElasticiSteps(ccs.elasticSteps);\r\n this.makeObstructionInvisible(ccs.makeInvisble);\r\n this.setGravity(ccs.gravity);\r\n this.enableKeyBoard(ccs.keyboard);\r\n this.setSlopeLimit(ccs.minSlopeLimit, ccs.maxSlopeLimit);\r\n this.setNoFirstPerson(ccs.noFirstPerson);\r\n this.setStepOffset(ccs.stepOffset);\r\n this.setSound(ccs.sound);\r\n\r\n }\r\n\r\n private _setAnim(anim: ActionData, animName?: string | AnimationGroup, rate?: number, loop?: boolean) {\r\n\r\n //animation range need skeleton\r\n if (!this._isAG && this._skeleton == null) return;\r\n\r\n if (animName != null) {\r\n if (this._isAG) {\r\n if (!(animName instanceof AnimationGroup)) return;\r\n anim.ag = animName;\r\n anim.exist = true;\r\n } else {\r\n if (this._skeleton.getAnimationRange(anim.name) != null) {\r\n anim.name = animName;\r\n anim.exist = true;\r\n } else {\r\n anim.exist = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (loop != null) anim.loop = loop;\r\n if (rate != null) anim.rate = rate;\r\n }\r\n\r\n public enableBlending(n: number) {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let act = this._actionMap[key];\r\n if (!(act instanceof ActionData)) continue;\r\n if (act.exist) {\r\n let ar: AnimationGroup = act.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = true;\r\n ta.animation.blendingSpeed = n;\r\n }\r\n }\r\n }\r\n } else {\r\n if (this._skeleton !== null)\r\n this._skeleton.enableBlending(n);\r\n }\r\n }\r\n\r\n public disableBlending() {\r\n if (this._isAG) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (anim.exist) {\r\n let ar: AnimationGroup = anim.ag;\r\n for (let ta of ar.targetedAnimations) {\r\n ta.animation.enableBlending = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //setters for animations\r\n public setWalkAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walk, rangeName, rate, loop);\r\n }\r\n public setRunAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.run, rangeName, rate, loop);\r\n }\r\n public setWalkBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBack, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack);\r\n }\r\n public setWalkBackFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.walkBackFast, rangeName, rate, loop);\r\n }\r\n public setSlideBackAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.slideBack, rangeName, rate, loop);\r\n }\r\n public setIdleAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idle, rangeName, rate, loop);\r\n }\r\n public setTurnRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n }\r\n public setTurnRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnRightFast, rangeName, rate, loop);\r\n }\r\n public setTurnLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n }\r\n public setTurnLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.turnLeftFast, rangeName, rate, loop);\r\n }\r\n public setStrafeRightAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRight, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n }\r\n public setStrafeRightFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeRightFast, rangeName, rate, loop);\r\n }\r\n public setStrafeLeftAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeft, rangeName, rate, loop);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n public setStrafeLeftFastAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.strafeLeftFast, rangeName, rate, loop);\r\n }\r\n public setIdleJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.idleJump, rangeName, rate, loop);\r\n }\r\n public setRunJumpAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.runJump, rangeName, rate, loop);\r\n }\r\n public setFallAnim(rangeName: string | AnimationGroup, rate: number, loop: boolean) {\r\n this._setAnim(this._actionMap.fall, rangeName, rate, loop);\r\n }\r\n\r\n\r\n _stepSound: Sound;\r\n // setters for sound\r\n public setSound(sound: Sound) {\r\n if (sound == null) return;\r\n this._stepSound = sound;\r\n let ccActionNames: string[] = Object.keys(this._actionMap);\r\n sound.loop = false;\r\n for (let ccActionName of ccActionNames) {\r\n let ccActData = this._actionMap[ccActionName];\r\n //some keys could map to functions (like reset())\r\n if (!(ccActData instanceof ActionData)) continue;\r\n ccActData.sound = sound;\r\n ccActData.sound.attachToMesh(this._avatar);\r\n }\r\n this._actionMap.idle.sound = null;\r\n this._actionMap.fall.sound = null;\r\n this._actionMap.slideBack.sound = null;\r\n }\r\n\r\n\r\n // setters for keys\r\n public setWalkKey(key: string) {\r\n this._actionMap.walk.key = key.toLowerCase();\r\n }\r\n public setWalkBackKey(key: string) {\r\n this._actionMap.walkBack.key = key.toLowerCase();\r\n }\r\n public setTurnLeftKey(key: string) {\r\n this._actionMap.turnLeft.key = key.toLowerCase();\r\n }\r\n public setTurnRightKey(key: string) {\r\n this._actionMap.turnRight.key = key.toLowerCase();\r\n }\r\n public setStrafeLeftKey(key: string) {\r\n this._actionMap.strafeLeft.key = key.toLowerCase();\r\n }\r\n public setStrafeRightKey(key: string) {\r\n this._actionMap.strafeRight.key = key.toLowerCase();\r\n }\r\n public setJumpKey(key: string) {\r\n this._actionMap.idleJump.key = key.toLowerCase();\r\n }\r\n\r\n public setCameraElasticity(b: boolean) {\r\n this._cameraElastic = b;\r\n }\r\n\r\n public setElasticiSteps(n: number) {\r\n this._elasticSteps = n;\r\n }\r\n\r\n public makeObstructionInvisible(b: boolean) {\r\n this._makeInvisible = b;\r\n }\r\n public setCameraTarget(v: Vector3) {\r\n this._cameraTarget.copyFrom(v);\r\n }\r\n\r\n\r\n /**\r\n * user should call this whenever the user changes the camera checkCollision \r\n * property\r\n * \r\n */\r\n public cameraCollisionChanged() {\r\n this._savedCameraCollision = this._camera.checkCollisions;\r\n }\r\n public setNoFirstPerson(b: boolean) {\r\n this._noFirstPerson = b;\r\n }\r\n\r\n /**\r\n * if av has the required anim (walk, run etc) then \r\n * mark that anim as existing\r\n * \r\n * @param skel \r\n */\r\n\r\n private _checkAnimRanges(skel: Skeleton) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (skel != null) {\r\n if (skel.getAnimationRange(anim.id) != null) {\r\n anim.name = anim.id;\r\n anim.exist = true;\r\n this._hasAnims = true;\r\n }\r\n } else {\r\n anim.exist = false;\r\n }\r\n }\r\n this._checkFastAnims();\r\n }\r\n\r\n /**\r\n * if fast anims do not exist then use their slow counterpart as them but double the rate at which they play\r\n */\r\n private _checkFastAnims() {\r\n this._copySlowAnims(this._actionMap.walkBackFast, this._actionMap.walkBack)\r\n this._copySlowAnims(this._actionMap.turnRightFast, this._actionMap.turnRight);\r\n this._copySlowAnims(this._actionMap.turnLeftFast, this._actionMap.turnLeft);\r\n this._copySlowAnims(this._actionMap.strafeRightFast, this._actionMap.strafeRight);\r\n this._copySlowAnims(this._actionMap.strafeLeftFast, this._actionMap.strafeLeft);\r\n }\r\n\r\n private _copySlowAnims(f: ActionData, s: ActionData) {\r\n if (f.exist) return;\r\n if (!s.exist) return;\r\n f.exist = true;\r\n f.ag = s.ag;\r\n f.name = s.name;\r\n f.rate = s.rate * 2;\r\n }\r\n\r\n /**\r\n * Use this to make the character controller suitable for a isometeric/top down games or fps/third person game.\r\n * 1 In isometric/top down games the camera direction has no bearing on avatar movement.\r\n * 0 In fps/third person game rotating the camera around the avatar , rotates the avatar too.\r\n * \r\n * cannot switch mode to 0 if no camera avaiable.\r\n */\r\n private _mode = 0;\r\n private _saveMode = 0;\r\n public setMode(n: number) {\r\n //cannot switch mode to 0 if no camera avaiable.\r\n if (this._hasCam) {\r\n this._mode = n;\r\n this._saveMode = n;\r\n } else {\r\n this._mode = 1;\r\n this._saveMode = 1;\r\n }\r\n }\r\n public getMode() {\r\n return this._mode;\r\n }\r\n /**\r\n * Use this to set turning off.\r\n * When turining is off \r\n * a) turn left or turn right keys result in avatar facing and moving left or right with respect to camera.\r\n * b) walkback/runback key results in avatar facing back and walking/running towards camera.\r\n * \r\n * This setting has no effect when mode is 1.\r\n * \r\n * @param b \r\n */\r\n public setTurningOff(b: boolean) {\r\n this._noRot = b;\r\n }\r\n public isTurningOff() {\r\n return this._noRot;\r\n }\r\n\r\n /**\r\n * checks if a have left hand , right hand issue.\r\n * In other words if a mesh is a LHS mesh in RHS system or \r\n * a RHS mesh in LHS system\r\n * The X axis will be reversed in such cases.\r\n * thus Cross product of X and Y should be inverse of Z.\r\n * BABYLONJS GLB models are RHS and exhibit this behavior\r\n * \r\n */\r\n private _isLHS_RHS = false;\r\n private _signLHS_RHS = -1;\r\n private _setRHS(mesh: TransformNode) {\r\n const meshMatrix: Matrix = mesh.getWorldMatrix();\r\n const _localX = Vector3.FromArray(meshMatrix.m, 0);\r\n const _localY = Vector3.FromArray(meshMatrix.m, 4);\r\n const _localZ = Vector3.FromArray(meshMatrix.m, 8);\r\n const actualZ = Vector3.Cross(_localX, _localY);\r\n //same direction or opposite direction of Z\r\n if (Vector3.Dot(actualZ, _localZ) < 0) {\r\n this._isLHS_RHS = true;\r\n this._signLHS_RHS = 1;\r\n }\r\n else {\r\n this._isLHS_RHS = false;\r\n this._signLHS_RHS = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Use setFaceForward(true|false) to indicate that the avatar's face points forward (true) or backward (false).\r\n * The avatar's face points forward if its face is looking in positive local Z axis direction\r\n */\r\n private _ffSign: number;\r\n private _rhsSign: number;\r\n private _ff: boolean;\r\n //in mode 0, av2cam is used to align avatar with camera , with camera always facing avatar's back\r\n //note:camera alpha is measured anti-clockwise , avatar rotation is measured clockwise \r\n private _av2cam;\r\n public setFaceForward(b: boolean) {\r\n this._ff = b;\r\n\r\n this._rhsSign = this._scene.useRightHandedSystem ? -1 : 1;\r\n\r\n if (!this._hasCam) {\r\n this._av2cam = 0;\r\n this._ffSign = 1;\r\n return;\r\n }\r\n\r\n if (this._isLHS_RHS) {\r\n this._av2cam = b ? Math.PI / 2 : 3 * Math.PI / 2;\r\n this._ffSign = b ? 1 : -1;\r\n } else {\r\n this._av2cam = b ? 3 * Math.PI / 2 : Math.PI / 2;\r\n this._ffSign = b ? -1 : 1;\r\n }\r\n\r\n }\r\n\r\n public isFaceForward() {\r\n return this._ff;\r\n }\r\n\r\n private checkAGs(agMap: {}) {\r\n let keys: string[] = Object.keys(this._actionMap);\r\n for (let key of keys) {\r\n let anim = this._actionMap[key];\r\n if (!(anim instanceof ActionData)) continue;\r\n if (agMap[anim.name] != null) {\r\n anim.ag = agMap[anim.name];\r\n anim.exist = true;\r\n }\r\n }\r\n }\r\n\r\n // check if any of the mesh on the node tree is refrenced by any animation group\r\n private _containsAG(node: Node, ags: AnimationGroup[], fromRoot: boolean) {\r\n let r: Node;\r\n let ns: Node[];\r\n\r\n if (fromRoot) {\r\n r = this._getRoot(node);\r\n ns = r.getChildren((n) => { return (n instanceof TransformNode) }, false);\r\n } else {\r\n r = node;\r\n ns = [r];\r\n }\r\n\r\n for (let ag of ags) {\r\n let tas: TargetedAnimation[] = ag.targetedAnimations;\r\n for (let ta of tas) {\r\n if (ns.indexOf(ta.target) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n //get the root of Node\r\n private _getRoot(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._getRoot(tn.parent);\r\n }\r\n\r\n private _started: boolean = false;\r\n public start() {\r\n if (this._started) return;\r\n this._started = true;\r\n this._act.reset();\r\n this._movFallTime = 0;\r\n //first time we enter render loop, delta time is zero\r\n this._idleFallTime = 0.001;\r\n this._grounded = false;\r\n this._updateTargetValue();\r\n if (this._ekb) this._addkeylistener();\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n public stop() {\r\n if (!this._started) return;\r\n this._started = false;\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n this._removekeylistener();\r\n this._prevActData = null;\r\n }\r\n\r\n /**\r\n * use pauseAnim to stop the charactere controller from playing\r\n * any animation on the character\r\n * use this when you want to play your animation instead\r\n * see also resumeAnim()\r\n */\r\n private _stopAnim: boolean = false;\r\n public pauseAnim() {\r\n this._stopAnim = true;\r\n\r\n if (this._prevActData != null && this._prevActData.exist) {\r\n //stop current animation\r\n if (this._isAG) {\r\n this._prevActData.ag.stop();\r\n } else {\r\n //this._scene.stopAnimation(this._skeleton, this._prevActData.name);\r\n this._scene.stopAnimation(this._skeleton);\r\n //this._scene.stopAllAnimations();\r\n }\r\n //stop current sound\r\n if (this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n\r\n this._scene.unregisterBeforeRender(this._renderer);\r\n }\r\n }\r\n\r\n /**\r\n * use resumeAnim to resume the character controller playing\r\n * animations on the character.\r\n * see also pauseAnim()\r\n */\r\n public resumeAnim() {\r\n this._stopAnim = false;\r\n this._prevActData = null;\r\n this._scene.registerBeforeRender(this._renderer);\r\n }\r\n\r\n private _prevActData: ActionData = null;\r\n private _avStartPos: Vector3 = Vector3.Zero();\r\n private _grounded: boolean = false;\r\n //distance by which AV would move down if in freefall\r\n private _freeFallDist: number = 0;\r\n\r\n //how many minimum contiguos frames should the AV have been in free fall\r\n //before we assume AV is in big freefall.\r\n //we will use this to remove animation flicker during move down a slope (fall, move, fall move etc)\r\n //TODO: base this on slope - large slope large count\r\n private _fallFrameCountMin: number = 50;\r\n private _fallFrameCount: number = 0;\r\n\r\n private _inFreeFall: boolean = false;\r\n private _wasWalking: boolean = false;\r\n private _wasRunning: boolean = false;\r\n private _moveVector: Vector3;\r\n\r\n //used only in mode 1\r\n //value 1 or -1 , -1 if avatar is facing camera\r\n //private _notFacingCamera = 1;\r\n\r\n private _isAvFacingCamera(): number {\r\n if (!this._hasCam) return 1;\r\n if (Vector3.Dot(this._avatar.forward, this._avatar.position.subtract(this._camera.position)) < 0) return 1\r\n else return -1;\r\n }\r\n\r\n private _moveAVandCamera() {\r\n this._avStartPos.copyFrom(this._avatar.position);\r\n let actData: ActionData = null;\r\n const dt: number = this._scene.getEngine().getDeltaTime() / 1000;\r\n\r\n if (this._act._jump && !this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doJump(dt);\r\n } else if (this.anyMovement() || this._inFreeFall) {\r\n this._grounded = false;\r\n this._idleFallTime = 0;\r\n actData = this._doMove(dt);\r\n } else if (!this._inFreeFall) {\r\n actData = this._doIdle(dt);\r\n }\r\n if (!this._stopAnim && this._hasAnims && actData != null) {\r\n if (this._prevActData !== actData) {\r\n if (actData.exist) {\r\n\r\n //animation frame counts\r\n let c: number;\r\n let fps: number = 30;\r\n\r\n if (this._isAG) {\r\n if (this._prevActData != null && this._prevActData.exist) this._prevActData.ag.stop();\r\n actData.ag.start(actData.loop, actData.rate);\r\n fps = actData.ag.targetedAnimations[0].animation.framePerSecond;\r\n c = (actData.ag.to - actData.ag.from);\r\n } else {\r\n let a: Animatable = this._skeleton.beginAnimation(actData.name, actData.loop, actData.rate);\r\n fps = a.getAnimations()[0].animation.framePerSecond;\r\n c = this._skeleton.getAnimationRange(actData.name).to - this._skeleton.getAnimationRange(actData.name).from;\r\n }\r\n\r\n //SOUND\r\n //TODO do sound as animationevent.\r\n if (this._prevActData != null && this._prevActData.sound != null) {\r\n this._prevActData.sound.stop();\r\n }\r\n clearInterval(this._sndId);\r\n if (actData.sound != null) {\r\n actData.sound.play();\r\n //play sound twice during the animation\r\n this._sndId = setInterval(() => { actData.sound.play(); }, c * 1000 / (fps * Math.abs(actData.rate) * 2));\r\n }\r\n }\r\n this._prevActData = actData;\r\n }\r\n }\r\n this._updateTargetValue();\r\n return;\r\n }\r\n\r\n private _soundLoopTime = 700;\r\n private _sndId = null;\r\n\r\n //verical position of AV when it is about to start a jump\r\n private _jumpStartPosY: number = 0;\r\n //for how long the AV has been in the jump\r\n private _jumpTime: number = 0;\r\n private _doJump(dt: number): ActionData {\r\n\r\n let actData: ActionData = null;\r\n actData = this._actionMap.runJump;\r\n if (this._jumpTime === 0) {\r\n this._jumpStartPosY = this._avatar.position.y;\r\n }\r\n\r\n this._jumpTime = this._jumpTime + dt;\r\n\r\n let forwardDist: number = 0;\r\n let jumpDist: number = 0;\r\n let disp: Vector3;\r\n\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n if (this._wasRunning || this._wasWalking) {\r\n if (this._wasRunning) {\r\n forwardDist = this._actionMap.run.speed * dt;\r\n } else if (this._wasWalking) {\r\n forwardDist = this._actionMap.walk.speed * dt;\r\n }\r\n //find out in which horizontal direction the AV was moving when it started the jump\r\n disp = this._moveVector.clone();\r\n disp.y = 0;\r\n disp = disp.normalize();\r\n disp.scaleToRef(forwardDist, disp);\r\n jumpDist = this._calcJumpDist(this._actionMap.runJump.speed, dt);\r\n disp.y = jumpDist;\r\n } else {\r\n jumpDist = this._calcJumpDist(this._actionMap.idleJump.speed, dt);\r\n disp = new Vector3(0, jumpDist, 0);\r\n actData = this._actionMap.idleJump;\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y/2;\r\n }\r\n //moveWithCollision only seems to happen if length of displacment is atleast 0.001\r\n this._avatar.moveWithCollisions(disp);\r\n if (jumpDist < 0) {\r\n //this.avatar.ellipsoid.y=this._ellipsoid.y;\r\n //check if going up a slope or back on flat ground \r\n if ((this._avatar.position.y > this._avStartPos.y) || ((this._avatar.position.y === this._avStartPos.y) && (disp.length() > 0.001))) {\r\n this._endJump();\r\n } else if (this._avatar.position.y < this._jumpStartPosY) {\r\n //the avatar is below the point from where it started the jump\r\n //so it is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than acceptable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endJump();\r\n }\r\n } else {\r\n actData = this._actionMap.fall;\r\n }\r\n }\r\n }\r\n return actData;\r\n }\r\n\r\n private _calcJumpDist(speed: number, dt: number): number {\r\n //up velocity at the begining of the lastt frame (v=u+at)\r\n let js: number = speed - this._gravity * this._jumpTime;\r\n //distance travelled up since last frame to this frame (s=ut+1/2*at^2)\r\n let jumpDist: number = js * dt - 0.5 * this._gravity * dt * dt;\r\n return jumpDist;\r\n }\r\n\r\n /**\r\n * does cleanup at the end of a jump\r\n */\r\n private _endJump() {\r\n this._act._jump = false;\r\n this._jumpTime = 0;\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n }\r\n\r\n /**\r\n * checks if two vectors v1 and v2 are equal within a precision of p\r\n */\r\n private _areVectorsEqual(v1: Vector3, v2: Vector3, p: number) {\r\n return ((Math.abs(v1.x - v2.x) < p) && (Math.abs(v1.y - v2.y) < p) && (Math.abs(v1.z - v2.z) < p));\r\n }\r\n\r\n /*\r\n * returns the slope (in radians) of a vector in the vertical plane\r\n */\r\n private _verticalSlope(v: Vector3): number {\r\n return Math.atan(Math.abs(v.y / Math.sqrt(v.x * v.x + v.z * v.z)));\r\n }\r\n\r\n //for how long has the av been falling while moving\r\n private _movFallTime: number = 0;\r\n private _sign = 1;\r\n private _isTurning = false;\r\n private _noRot = false;\r\n private _doMove(dt: number): ActionData {\r\n\r\n //initial down velocity\r\n const u: number = this._movFallTime * this._gravity\r\n //calculate the distance by which av should fall down since last frame\r\n //assuming it is in freefall\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n\r\n this._movFallTime = this._movFallTime + dt;\r\n\r\n let moving: boolean = false;\r\n let actdata: ActionData = null;\r\n\r\n if (this._inFreeFall) {\r\n this._moveVector.y = -this._freeFallDist;\r\n moving = true;\r\n }\r\n\r\n\r\n //rotate avatar with respect to camera direction. \r\n this._rotateAV2C();\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n actdata = this._rotateAVnC(actdata, moving, dt);\r\n\r\n //now that avatar is rotated properly, construct the vector to move the avatar \r\n //donot move the avatar if avatar is in freefall\r\n\r\n if (!this._inFreeFall) {\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n\r\n let sign: number;\r\n let horizDist: number = 0;\r\n switch (true) {\r\n case (this._act._stepLeft):\r\n sign = this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeLeftFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._stepRight):\r\n sign = -this._signLHS_RHS * this._isAvFacingCamera();\r\n horizDist = this._actionMap.strafeRight.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.strafeRightFast.speed * dt;\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeftFast : this._actionMap.strafeRightFast;\r\n } else {\r\n actdata = (-this._ffSign * sign > 0) ? this._actionMap.strafeLeft : this._actionMap.strafeRight;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(sign * horizDist, -this._freeFallDist, 0);\r\n moving = true;\r\n break;\r\n case (this._act._walk || (this._noRot && this._mode == 0)):\r\n if (this._act._speedMod) {\r\n this._wasRunning = true;\r\n horizDist = this._actionMap.run.speed * dt;\r\n actdata = this._actionMap.run;\r\n } else {\r\n this._wasWalking = true;\r\n horizDist = this._actionMap.walk.speed * dt;\r\n actdata = this._actionMap.walk;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n case (this._act._walkback):\r\n horizDist = this._actionMap.walkBack.speed * dt;\r\n if (this._act._speedMod) {\r\n horizDist = this._actionMap.walkBackFast.speed * dt;\r\n actdata = this._actionMap.walkBackFast;\r\n } else {\r\n actdata = this._actionMap.walkBack;\r\n }\r\n this._moveVector = this._avatar.calcMovePOV(0, -this._freeFallDist, -this._ffSign * horizDist);\r\n moving = true;\r\n break;\r\n }\r\n }\r\n\r\n // move the avatar\r\n\r\n if (moving) {\r\n if (this._moveVector.length() > 0.001) {\r\n this._avatar.moveWithCollisions(this._moveVector);\r\n //walking up a slope\r\n if (this._avatar.position.y > this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n const _slp: number = this._verticalSlope(actDisp);\r\n if (_slp >= this._sl2) {\r\n //this._climbingSteps=true;\r\n //is av trying to go up steps\r\n if (this._stepOffset > 0) {\r\n if (this._vMoveTot == 0) {\r\n //if just started climbing note down the position\r\n this._vMovStartPos.copyFrom(this._avStartPos);\r\n }\r\n this._vMoveTot = this._vMoveTot + (this._avatar.position.y - this._avStartPos.y);\r\n if (this._vMoveTot > this._stepOffset) {\r\n //move av back to its position at begining of steps\r\n this._vMoveTot = 0;\r\n this._avatar.position.copyFrom(this._vMovStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n //move av back to old position\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n this._endFreeFall();\r\n }\r\n } else {\r\n this._vMoveTot = 0;\r\n if (_slp > this._sl1) {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n } else {\r\n //continue walking\r\n this._endFreeFall();\r\n }\r\n }\r\n } else if ((this._avatar.position.y) < this._avStartPos.y) {\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, this._moveVector, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or walk?\r\n //if slope is less steeper than acceptable then walk else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n this._endFreeFall();\r\n } else {\r\n //av is on a steep slope , continue increasing the moveFallTIme to deaccelerate it\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n } else {\r\n this._inFreeFall = true;\r\n this._fallFrameCount++;\r\n //AV could be running down a slope which mean freefall,run,frefall run ...\r\n //to remove anim flicker, check if AV has been falling down continously for last few consecutive frames\r\n //before changing to free fall animation\r\n if (this._fallFrameCount > this._fallFrameCountMin) {\r\n actdata = this._actionMap.fall;\r\n }\r\n }\r\n } else {\r\n this._endFreeFall();\r\n }\r\n }\r\n }\r\n return actdata;\r\n }\r\n\r\n /**\r\n * rotate avatar with respect to camera direction. \r\n */\r\n private _rotateAV2C() {\r\n if (this._hasCam)\r\n if (this._mode != 1) {\r\n let ca = (this._hasCam) ? (this._av2cam - this._camera.alpha) : 0;\r\n if (this._noRot) {\r\n switch (true) {\r\n case (this._act._walk && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walk && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walkback && this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * 3 * Math.PI / 4;\r\n break;\r\n case (this._act._walk):\r\n this._avatar.rotation.y = ca;\r\n break;\r\n case (this._act._walkback):\r\n this._avatar.rotation.y = ca + Math.PI;\r\n break;\r\n case (this._act._turnRight):\r\n this._avatar.rotation.y = ca + this._rhsSign * Math.PI / 2;\r\n break;\r\n case (this._act._turnLeft):\r\n this._avatar.rotation.y = ca - this._rhsSign * Math.PI / 2;\r\n break;\r\n }\r\n } else {\r\n if (this._hasCam)\r\n this._avatar.rotation.y = ca;\r\n }\r\n }\r\n }\r\n\r\n //rotate the avatar in case player is trying to rotate the avatar. rotate the camera too if camera turning is on\r\n private _rotateAVnC(anim: ActionData, moving: boolean, dt: number): ActionData {\r\n if (!(this._noRot && this._mode == 0) && (!this._act._stepLeft && !this._act._stepRight) && (this._act._turnLeft || this._act._turnRight)) {\r\n let turnAngle = this._actionMap.turnLeft.speed * dt;\r\n if (this._act._speedMod) {\r\n turnAngle = 2 * turnAngle;\r\n }\r\n let a;\r\n if (this._mode == 1) {\r\n // while turining, the avatar could start facing away from camera and end up facing camera.\r\n // we should not switch turning direction during this transition\r\n if (!this._isTurning) {\r\n // if (this._act.name != this._act.prevName) {\r\n // this._act.prevName = this._act.name;\r\n this._sign = -this._ffSign * this._isAvFacingCamera();\r\n if (this._isLHS_RHS) this._sign = - this._sign;\r\n this._isTurning = true;\r\n }\r\n a = this._sign;\r\n if (this._act._turnLeft) {\r\n if (this._act._walk) { }\r\n else if (this._act._walkback) a = -this._sign;\r\n else {\r\n anim = (this._sign > 0) ? this._actionMap.turnRight : this._actionMap.turnLeft;\r\n }\r\n } else {\r\n if (this._act._walk) a = -this._sign;\r\n else if (this._act._walkback) { }\r\n else {\r\n a = -this._sign;\r\n anim = (this._sign > 0) ? this._actionMap.turnLeft : this._actionMap.turnRight;\r\n }\r\n }\r\n } else {\r\n a = 1;\r\n if (this._act._turnLeft) {\r\n if (this._act._walkback) a = -1;\r\n if (!moving) anim = this._actionMap.turnLeft;\r\n } else {\r\n if (this._act._walk) a = -1;\r\n if (!moving) { a = -1; anim = this._actionMap.turnRight; }\r\n }\r\n if (this._hasCam)\r\n this._camera.alpha = this._camera.alpha + this._rhsSign * turnAngle * a;\r\n }\r\n\r\n this._avatar.rotation.y = this._avatar.rotation.y + turnAngle * a;\r\n }\r\n return anim;\r\n }\r\n\r\n private _endFreeFall(): void {\r\n this._movFallTime = 0;\r\n this._fallFrameCount = 0;\r\n this._inFreeFall = false;\r\n }\r\n\r\n //for how long has the av been falling while idle (not moving)\r\n private _idleFallTime: number = 0;\r\n private _doIdle(dt: number): ActionData {\r\n if (this._grounded) {\r\n return this._actionMap.idle;\r\n }\r\n this._wasWalking = false;\r\n this._wasRunning = false;\r\n this._movFallTime = 0;\r\n let anim: ActionData = this._actionMap.idle;\r\n this._fallFrameCount = 0;\r\n\r\n\r\n if (dt === 0) {\r\n this._freeFallDist = 5;\r\n } else {\r\n const u: number = this._idleFallTime * this._gravity\r\n this._freeFallDist = u * dt + this._gravity * dt * dt / 2;\r\n this._idleFallTime = this._idleFallTime + dt;\r\n }\r\n //if displacement is less than 0.01(? need to verify further) then \r\n //moveWithDisplacement down against a surface seems to push the AV up by a small amount!!\r\n if (this._freeFallDist < 0.01) return anim;\r\n const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0);\r\n // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha;\r\n this._avatar.moveWithCollisions(disp);\r\n if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n } else if (this._avatar.position.y < this._avStartPos.y) {\r\n //AV is going down. \r\n //AV is either in free fall or is sliding along a downward slope\r\n //\r\n //if the actual displacemnt is same as the desired displacement then AV is in freefall\r\n //else it is on a slope\r\n const actDisp: Vector3 = this._avatar.position.subtract(this._avStartPos);\r\n if (!(this._areVectorsEqual(actDisp, disp, 0.001))) {\r\n //AV is on slope\r\n //Should AV continue to slide or stop?\r\n //if slope is less steeper than accebtable then stop else slide\r\n if (this._verticalSlope(actDisp) <= this._sl1) {\r\n // this.grounded = true;\r\n // this.idleFallTime = 0;\r\n this._groundIt();\r\n this._avatar.position.copyFrom(this._avStartPos);\r\n } else {\r\n this._unGroundIt();\r\n anim = this._actionMap.slideBack;\r\n }\r\n } else {\r\n anim = this._actionMap.fall;\r\n }\r\n }\r\n return anim;\r\n }\r\n\r\n private _groundFrameCount = 0;\r\n private _groundFrameMax = 10;\r\n /**\r\n * donot ground immediately\r\n * wait few more frames\r\n */\r\n private _groundIt(): void {\r\n this._groundFrameCount++;\r\n if (this._groundFrameCount > this._groundFrameMax) {\r\n this._grounded = true;\r\n this._idleFallTime = 0;\r\n }\r\n }\r\n private _unGroundIt() {\r\n this._grounded = false;\r\n this._groundFrameCount = 0;\r\n }\r\n\r\n private _savedCameraCollision: boolean = true;\r\n private _inFP = false;\r\n private _updateTargetValue() {\r\n if (!this._hasCam) return;\r\n //donot move camera if av is trying to clinb steps\r\n if (this._vMoveTot == 0)\r\n this._avatar.position.addToRef(this._cameraTarget, this._camera.target);\r\n\r\n if (this._camera.radius > this._camera.lowerRadiusLimit) { if (this._cameraElastic || this._makeInvisible) this._handleObstruction(); }\r\n\r\n //if user so desire, make the AV invisible if camera comes close to it\r\n if (this._camera.radius <= this._camera.lowerRadiusLimit) {\r\n if (!this._noFirstPerson && !this._inFP) {\r\n this._makeMeshInvisible(this._avatar);\r\n this._camera.checkCollisions = false;\r\n this._saveMode = this._mode;\r\n this._mode = 0;\r\n this._inFP = true;\r\n }\r\n } else {\r\n if (this._inFP) {\r\n this._inFP = false;\r\n this._mode = this._saveMode;\r\n this._restoreVisiblity(this._avatar);\r\n this._camera.checkCollisions = this._savedCameraCollision;\r\n }\r\n }\r\n }\r\n\r\n // make mesh and all its children invisible\r\n // store their current visibility state so that we can restore them later on\r\n private _makeMeshInvisible(mesh: Mesh) {\r\n\r\n this._visiblityMap.set(mesh, mesh.visibility);\r\n mesh.visibility = 0;\r\n\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) {\r\n this._visiblityMap.set(n, n.visibility);\r\n n.visibility = 0;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n private _visiblityMap: Map = new Map();\r\n\r\n //restore mesh visibility to previous state\r\n private _restoreVisiblity(mesh: Mesh) {\r\n mesh.visibility = this._visiblityMap.get(mesh);\r\n mesh.getChildMeshes(false, (n) => {\r\n if (n instanceof Mesh) n.visibility = this._visiblityMap.get(n);\r\n return false;\r\n });\r\n }\r\n\r\n private _ray: Ray = new Ray(Vector3.Zero(), Vector3.One(), 1);\r\n private _rayDir: Vector3 = Vector3.Zero();\r\n //camera seems to get stuck into things\r\n //should move camera away from things by a value of cameraSkin\r\n private _cameraSkin: number = 0.5;\r\n private _prevPickedMeshes: AbstractMesh[];\r\n private _pickedMeshes: AbstractMesh[] = new Array();;\r\n private _makeInvisible = false;\r\n private _elasticSteps = 50;\r\n private _alreadyInvisible: AbstractMesh[];\r\n\r\n /**\r\n * The following method handles the use case wherein some mesh\r\n * comes between the avatar and the camera thus obstructing the view\r\n * of the avatar.\r\n * Two ways this can be handled\r\n * a) make the obstructing mesh invisible\r\n * instead of invisible a better option would have been to make semi transparent.\r\n * Unfortunately, unlike mesh, mesh instances do not \"visibility\" setting)\r\n * Every alternate frame make mesh visible and invisible to give the impression of semi-transparent.\r\n * b) move the camera in front of the obstructing mesh\r\n */\r\n private _handleObstruction() {\r\n\r\n //get vector from av (camera.target) to camera\r\n this._camera.position.subtractToRef(this._camera.target, this._rayDir);\r\n //start ray from av to camera\r\n this._ray.origin = this._camera.target;\r\n this._ray.length = this._rayDir.length();\r\n this._ray.direction = this._rayDir.normalize();\r\n\r\n //TODO \r\n //handle case were pick is with a child of avatar, avatar atatchment. etc\r\n const pis: PickingInfo[] = this._scene.multiPickWithRay(this._ray, (mesh) => {\r\n if (mesh == this._avatar) return false;\r\n else return true;\r\n });\r\n\r\n\r\n if (this._makeInvisible) {\r\n this._prevPickedMeshes = this._pickedMeshes;\r\n if (pis.length > 0) {\r\n this._pickedMeshes = new Array();\r\n for (let pi of pis) {\r\n if (pi.pickedMesh.isVisible || this._prevPickedMeshes.includes(pi.pickedMesh)) {\r\n pi.pickedMesh.isVisible = false;\r\n this._pickedMeshes.push(pi.pickedMesh);\r\n }\r\n }\r\n for (let pm of this._prevPickedMeshes) {\r\n if (!this._pickedMeshes.includes(pm)) {\r\n pm.isVisible = true;\r\n }\r\n }\r\n } else {\r\n for (let pm of this._prevPickedMeshes) {\r\n pm.isVisible = true;\r\n }\r\n this._prevPickedMeshes.length = 0;\r\n }\r\n }\r\n\r\n if (this._cameraElastic) {\r\n if (pis.length > 0) {\r\n // postion the camera in front of the mesh that is obstructing camera\r\n\r\n //if only one obstruction and it is invisible then if it is not collidable or our camera is not collidable then do nothing\r\n if ((pis.length == 1 && !this._isSeeAble(pis[0].pickedMesh)) && (!pis[0].pickedMesh.checkCollisions || !this._camera.checkCollisions)) return;\r\n\r\n //if our camera is collidable then we donot want it to get stuck behind another collidable obsrtucting mesh\r\n let pp: Vector3 = null;\r\n\r\n //we will asume the order of picked meshes is from closest to avatar to furthest\r\n //we should get the first one which is visible or invisible and collidable\r\n for (let i = 0; i < pis.length; i++) {\r\n let pm = pis[i].pickedMesh;\r\n if (this._isSeeAble(pm)) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n } else if (pm.checkCollisions) {\r\n pp = pis[i].pickedPoint;\r\n break;\r\n }\r\n }\r\n if (pp == null) return;\r\n\r\n const c2p: Vector3 = this._camera.position.subtract(pp);\r\n //note that when camera is collidable, changing the orbital camera radius may not work.\r\n //changing the radius moves the camera forward (with collision?) and collision can interfere with movement\r\n //\r\n //in every cylce we are dividing the distance to tarvel by same number of steps.\r\n //as we get closer to destination the speed will thus slow down.\r\n //when just 1 unit distance left, lets snap to the final position.\r\n //when calculating final position make sure the camera does not get stuck at the pickposition especially\r\n //if collision is on\r\n\r\n const l: number = c2p.length();\r\n if (this._camera.checkCollisions) {\r\n let step: Vector3;\r\n if (l <= 1) {\r\n step = c2p.addInPlace(c2p.normalizeToNew().scaleInPlace(this._cameraSkin));\r\n } else {\r\n step = c2p.normalize().scaleInPlace(l / this._elasticSteps);\r\n }\r\n this._camera.position = this._camera.position.subtract(step);\r\n } else {\r\n let step: number;\r\n if (l <= 1) step = l + this._cameraSkin; else step = l / this._elasticSteps;\r\n this._camera.radius = this._camera.radius - (step);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //how many ways can a mesh be invisible?\r\n private _isSeeAble(mesh: AbstractMesh): boolean {\r\n if (!mesh.isVisible) return false;\r\n if (mesh.visibility == 0) return false;\r\n if (mesh.material != null && mesh.material.alphaMode != 0 && mesh.material.alpha == 0) return false;\r\n return true;\r\n //what about vertex color? groan!\r\n }\r\n\r\n\r\n private _move: boolean = false;\r\n public anyMovement(): boolean {\r\n return (this._act._walk || this._act._walkback || this._act._turnLeft || this._act._turnRight || this._act._stepLeft || this._act._stepRight);\r\n }\r\n\r\n private _onKeyDown(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n if (e.repeat) return;\r\n switch (e.key.toLowerCase()) {\r\n case this._actionMap.idleJump.key:\r\n this._act._jump = true;\r\n break;\r\n case \"capslock\":\r\n this._act._speedMod = !this._act._speedMod;\r\n break;\r\n case \"shift\":\r\n this._act._speedMod = true;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = true;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = true;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = true;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = true;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = true;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = true;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _onKeyUp(e: KeyboardEvent) {\r\n if (!e.key) return;\r\n switch (e.key.toLowerCase()) {\r\n case \"shift\":\r\n this._act._speedMod = false;\r\n break;\r\n case \"up\":\r\n case \"arrowup\":\r\n case this._actionMap.walk.key:\r\n this._act._walk = false;\r\n break;\r\n case \"left\":\r\n case \"arrowleft\":\r\n case this._actionMap.turnLeft.key:\r\n this._act._turnLeft = false;\r\n this._isTurning = false;\r\n break;\r\n case \"right\":\r\n case \"arrowright\":\r\n case this._actionMap.turnRight.key:\r\n this._act._turnRight = false;\r\n this._isTurning = false;\r\n break;\r\n case \"down\":\r\n case \"arrowdown\":\r\n case this._actionMap.walkBack.key:\r\n this._act._walkback = false;\r\n break;\r\n case this._actionMap.strafeLeft.key:\r\n this._act._stepLeft = false;\r\n break;\r\n case this._actionMap.strafeRight.key:\r\n this._act._stepRight = false;\r\n break;\r\n }\r\n this._move = this.anyMovement();\r\n }\r\n\r\n private _ekb: boolean = true;\r\n public isKeyBoardEnabled(): boolean {\r\n return this._ekb;\r\n }\r\n public enableKeyBoard(b: boolean) {\r\n this._ekb = b;\r\n if (b) {\r\n this._addkeylistener();\r\n } else {\r\n this._removekeylistener();\r\n }\r\n }\r\n\r\n private _addkeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.addEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.addEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n private _removekeylistener() {\r\n let canvas: HTMLCanvasElement = this._scene.getEngine().getRenderingCanvas();\r\n canvas.removeEventListener(\"keyup\", this._handleKeyUp, false);\r\n canvas.removeEventListener(\"keydown\", this._handleKeyDown, false);\r\n }\r\n\r\n // control movement by commands rather than keyboard.\r\n public walk(b: boolean) {\r\n this._act._walk = b;\r\n }\r\n public walkBack(b: boolean) {\r\n this._act._walkback = b;\r\n }\r\n public walkBackFast(b: boolean) {\r\n this._act._walkback = b;\r\n this._act._speedMod = b;\r\n }\r\n public run(b: boolean) {\r\n this._act._walk = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnLeft(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnLeftFast(b: boolean) {\r\n this._act._turnLeft = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public turnRight(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n }\r\n public turnRightFast(b: boolean) {\r\n this._act._turnRight = b;\r\n if (!b) this._isTurning = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeLeft(b: boolean) {\r\n this._act._stepLeft = b;\r\n }\r\n public strafeLeftFast(b: boolean) {\r\n this._act._stepLeft = b;\r\n this._act._speedMod = b;\r\n }\r\n public strafeRight(b: boolean) {\r\n this._act._stepRight = b;\r\n }\r\n public strafeRightFast(b: boolean) {\r\n this._act._stepRight = b;\r\n this._act._speedMod = b;\r\n }\r\n public jump() {\r\n this._act._jump = true;\r\n }\r\n\r\n public fall() {\r\n this._grounded = false;\r\n }\r\n\r\n public idle() {\r\n this._act.reset();\r\n }\r\n\r\n private _act: _Action;\r\n private _renderer: () => void;\r\n private _handleKeyUp: (e) => void;\r\n private _handleKeyDown: (e) => void;\r\n private _isAG: boolean = false;\r\n public isAg() {\r\n return this._isAG;\r\n }\r\n\r\n\r\n\r\n\r\n private _findSkel(n: Node): Skeleton {\r\n let root = this._root(n);\r\n\r\n if (root instanceof Mesh && root.skeleton) return root.skeleton;\r\n\r\n //find all child meshes which have skeletons\r\n let ms = root.getChildMeshes(\r\n false,\r\n (cm) => {\r\n if (cm instanceof Mesh) {\r\n if (cm.skeleton) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n //return the skeleton of the first child mesh\r\n if (ms.length > 0) return ms[0].skeleton; else return null;\r\n\r\n }\r\n\r\n private _root(tn: Node): Node {\r\n if (tn.parent == null) return tn;\r\n return this._root(tn.parent);\r\n }\r\n\r\n public setAvatar(avatar: Mesh, faceForward: boolean = false): boolean {\r\n\r\n let rootNode = this._root(avatar);\r\n if (rootNode instanceof Mesh) {\r\n this._avatar = rootNode;\r\n } else {\r\n console.error(\"Cannot move this mesh. The root node of the mesh provided is not a mesh\");\r\n return false;\r\n }\r\n\r\n this._skeleton = this._findSkel(avatar);\r\n this._isAG = this._containsAG(avatar, this._scene.animationGroups, true);\r\n\r\n this._actionMap.reset();\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n\r\n this._setRHS(avatar);\r\n this.setFaceForward(faceForward);\r\n\r\n return true;\r\n }\r\n\r\n public getAvatar() {\r\n return this._avatar;\r\n }\r\n\r\n // force a skeleton to be the avatar skeleton\r\n // should not be calling this normally\r\n public setAvatarSkeleton(skeleton: Skeleton) {\r\n this._skeleton = skeleton;\r\n\r\n\r\n if (this._skeleton != null && this._skelDrivenByAG(skeleton)) this._isAG = true; else this._isAG = false;\r\n\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n }\r\n\r\n\r\n // this check if any of this skeleton animations is referenced by any targetedAnimation in any of the animationgroup in the scene.\r\n private _skelDrivenByAG(skeleton: Skeleton) {\r\n return skeleton.animations.some(sa => this._scene.animationGroups.some(ag => ag.children.some(ta => ta.animation == sa)));\r\n }\r\n\r\n public getSkeleton() {\r\n return this._skeleton;\r\n }\r\n\r\n // does this character have any animations ?\r\n // remember we can use meshes without anims as characters too\r\n private _hasAnims: boolean = false;\r\n private _hasCam: boolean = true;\r\n\r\n /**\r\n * The avatar/character can be made up of multiple meshes arranged in a hierarchy.\r\n * As such we will pick the root of the hierarchy as the avatar.\r\n * The root should be a mesh as otherwise we cannot move it with moveWithCollision() method.\r\n * \r\n * Mutiple meshes in the hierarchy may have skeletons (if two or more meshes have skeleton then\r\n * the skeleton will mostly likely be the same). \r\n * So we will pick as avatar skeleton, the skeleton of the first mesh in the hierachy which has\r\n * a skeleton \r\n * \r\n * @param avatar \r\n * @param camera \r\n * @param scene \r\n * @param actionMap/animationGroupMap \r\n * maps actions to animations and other data like speed,sound etc \r\n * or \r\n * for backward compatibility could be AnimationGroup Map\r\n * @param faceForward \r\n */\r\n constructor(avatar: Mesh, camera: ArcRotateCamera, scene: Scene, actionMap?: {}, faceForward = false) {\r\n\r\n this._camera = camera;\r\n\r\n //if camera is null assume this would be used to control an NPC\r\n //we cannot use mode 0 as that is dependent on camera being present. so force mode 1\r\n if (this._camera == null) {\r\n this._hasCam = false;\r\n this.setMode(1);\r\n }\r\n this._scene = scene;\r\n\r\n let success = this.setAvatar(avatar, faceForward);\r\n if (!success) {\r\n console.error(\"unable to set avatar\");\r\n }\r\n\r\n\r\n let dataType: string = null;\r\n if (actionMap != null) {\r\n dataType = this.setActionMap(actionMap);\r\n }\r\n\r\n //try to use the existing avatar animations\r\n\r\n //animation ranges\r\n if (!this._isAG && this._skeleton != null) this._checkAnimRanges(this._skeleton);\r\n //animation groups\r\n if (this._isAG) {\r\n //TODO\r\n }\r\n\r\n if (this._hasCam) this._savedCameraCollision = this._camera.checkCollisions;\r\n\r\n this._act = new _Action();\r\n\r\n this._renderer = () => { this._moveAVandCamera() };\r\n this._handleKeyUp = (e) => { this._onKeyUp(e) };\r\n this._handleKeyDown = (e) => { this._onKeyDown(e) };\r\n }\r\n}\r\n\r\n\r\n\r\nclass _Action {\r\n\r\n public _walk: boolean = false;\r\n public _walkback: boolean = false;\r\n public _turnRight: boolean = false;\r\n public _turnLeft: boolean = false;\r\n public _stepRight: boolean = false;\r\n public _stepLeft: boolean = false;\r\n public _jump: boolean = false;\r\n\r\n // speed modifier - changes speed of movement\r\n public _speedMod: boolean = false;\r\n\r\n\r\n constructor() {\r\n this.reset();\r\n }\r\n\r\n reset() {\r\n this._walk = false;\r\n this._walkback = false;\r\n this._turnRight = false;\r\n this._turnLeft = false;\r\n this._stepRight = false;\r\n this._stepLeft = false;\r\n this._jump = false;\r\n this._speedMod = false;\r\n }\r\n}\r\n\r\nexport class ActionData {\r\n public id: string;\r\n public speed: number;\r\n //_ds default speed. speed is set to this on reset\r\n public ds: number;\r\n public sound: Sound;\r\n public key: string;\r\n //_dk defailt key\r\n public dk: string;\r\n\r\n //animation data\r\n //if _ag is null then assuming animation range and use _name to play animationrange\r\n //instead of name maybe call it arName?\r\n public name: string = \"\";\r\n public ag: AnimationGroup;\r\n public loop: boolean = true;\r\n public rate: number = 1;\r\n\r\n public exist: boolean = false;\r\n\r\n public constructor(id?: string, speed = 1, key?: string) {\r\n this.id = id;\r\n this.speed = speed;\r\n this.ds = speed;\r\n this.key = key;\r\n this.dk = key;\r\n }\r\n\r\n public reset() {\r\n this.name = \"\";\r\n this.speed = this.ds;\r\n this.key = this.dk;\r\n this.loop = true;\r\n this.rate = 1;\r\n this.sound = null;\r\n this.exist = false;\r\n }\r\n\r\n}\r\n\r\n//not really a \"Map\"\r\nexport class ActionMap {\r\n public walk = new ActionData(\"walk\", 3, \"w\");\r\n public walkBack = new ActionData(\"walkBack\", 1.5, \"s\");\r\n public walkBackFast = new ActionData(\"walkBackFast\", 3, \"na\");\r\n public idle = new ActionData(\"idle\", 0, \"na\");\r\n public idleJump = new ActionData(\"idleJump\", 6, \" \");\r\n public run = new ActionData(\"run\", 6, \"na\");\r\n public runJump = new ActionData(\"runJump\", 6, \"na\");\r\n public fall = new ActionData(\"fall\", 0, \"na\");\r\n public turnLeft = new ActionData(\"turnLeft\", Math.PI / 8, \"a\");\r\n public turnLeftFast = new ActionData(\"turnLeftFast\", Math.PI / 4, \"na\");\r\n public turnRight = new ActionData(\"turnRight\", Math.PI / 8, \"d\");\r\n public turnRightFast = new ActionData(\"turnRightFast\", Math.PI / 4, \"na\");\r\n public strafeLeft = new ActionData(\"strafeLeft\", 1.5, \"q\");\r\n public strafeLeftFast = new ActionData(\"strafeLeftFast\", 3, \"na\");\r\n public strafeRight = new ActionData(\"strafeRight\", 1.5, \"e\");\r\n public strafeRightFast = new ActionData(\"strafeRightFast\", 3, \"na\");\r\n public slideBack = new ActionData(\"slideBack\", 0, \"na\");\r\n\r\n public reset() {\r\n let keys: string[] = Object.keys(this);\r\n for (let key of keys) {\r\n let act = this[key];\r\n if (!(act instanceof ActionData)) continue;\r\n act.reset()\r\n }\r\n }\r\n};\r\n\r\nexport class CCSettings {\r\n public faceForward: boolean;\r\n public gravity: number;\r\n public minSlopeLimit: number;\r\n public maxSlopeLimit: number;\r\n public stepOffset: number;\r\n public cameraElastic: boolean = true;\r\n public elasticSteps: number;\r\n public makeInvisble: boolean = true;\r\n public cameraTarget: Vector3 = Vector3.Zero();\r\n public noFirstPerson: boolean = false;\r\n public topDown: boolean = true;\r\n //turningOff takes effect only when topDown is false\r\n public turningOff: boolean = true;\r\n public keyboard: boolean = true;\r\n public sound: Sound;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 15fbec9..1d30cd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "babylonjs-charactercontroller", - "version": "0.4.4-alpha.4", + "version": "0.4.4-alpha.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "babylonjs-charactercontroller", - "version": "0.4.4-alpha.4", + "version": "0.4.4-alpha.7", "license": "Apache-2.0", "devDependencies": { - "babylonjs": "^5.37.0", - "babylonjs-inspector": "^5.37.0", - "babylonjs-loaders": "^5.37.0", + "babylonjs": "7.0.0", + "babylonjs-inspector": "^7.0.0", + "babylonjs-loaders": "^7.0.0", "terser-webpack-plugin": "^5.3.6", "ts-loader": "^9.4.2", "typescript": "^4.9.4", @@ -609,80 +609,122 @@ "dev": true }, "node_modules/babylonjs": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-5.37.0.tgz", - "integrity": "sha512-V0fAFxI+pd6Tbm+Q5YF2HOMbDElDD38e4dkXRK830LBqdkuwjDgn6GJA0A0MnQQez3mugleMulrKAJBFWx11yg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.0.0.tgz", + "integrity": "sha512-tK4qHeuw/Ea161BSwQo4Ni1jE/sr/C2wkuoEEqwv+AdQvnZaATr2QBorj9CtBBY1YssoZRXa+2nNTt2Y8dKApw==", "dev": true, "hasInstallScript": true }, "node_modules/babylonjs-gltf2interface": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.37.0.tgz", - "integrity": "sha512-EjFclIN03h14jeditZHGl4Pyqw4lfHZThJhgVG9xBPOsvbkffuDB1aApsSamhG1Iob0Qv562nrkTnyEq29LgMQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-7.16.0.tgz", + "integrity": "sha512-yo77NZjnNTQkCWMcZDUT8xw0fwh5cjLgsUpoo5ncghut+oAV2YV3FUCXf3BDAsU2yWePtgt8idehWN/dNm2kjA==", "dev": true }, "node_modules/babylonjs-gui": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-5.37.0.tgz", - "integrity": "sha512-4F6OnYido1jjY9tIkdVXOomRDd8FMWsKlVbJyV6+4p9rFMnWpZlEX4W0Ujv3qVyKpB2+OfD/QmxAYchIzu6dKg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-7.16.0.tgz", + "integrity": "sha512-qcVZiQia3B1q/IkQOzAAHO6GpU81uYPb19RMZLyonaa0v1cT31I3xCm6Yswkh1yu7dhLx/FrnjSZPc7xAdCb7g==", "dev": true, "dependencies": { - "babylonjs": "^5.37.0" + "babylonjs": "^7.16.0" } }, "node_modules/babylonjs-gui-editor": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-gui-editor/-/babylonjs-gui-editor-5.37.0.tgz", - "integrity": "sha512-ojIGElfI14GCj5qqMq4EG67UpV0Ndq1baWrsyxQ0bVKN95PoeuNZ8ww/suym/SoKwDaY8TBk/K8I0MNrkgR2Qw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-gui-editor/-/babylonjs-gui-editor-7.16.0.tgz", + "integrity": "sha512-DAGlTNLOY+hTwc7TOvKWmQ2cQZdwt92YZQ33dBprtpZ8d2l9TqRYqhuK2t7Jzgzg+44ijvp+t0DAcDIfoJVDmA==", "dev": true, "dependencies": { - "babylonjs": "^5.37.0", - "babylonjs-gui": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gui": "^7.16.0" } }, + "node_modules/babylonjs-gui-editor/node_modules/babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true, + "hasInstallScript": true + }, + "node_modules/babylonjs-gui/node_modules/babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true, + "hasInstallScript": true + }, "node_modules/babylonjs-inspector": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-inspector/-/babylonjs-inspector-5.37.0.tgz", - "integrity": "sha512-7jSsqDGZb+Dods4y1inFbs5WxVDWsAYzn5twToz3rDtwqWTwaVtQRccdXYAaoCt014TOAOYe3+g5eUpUDsAtdw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-inspector/-/babylonjs-inspector-7.16.0.tgz", + "integrity": "sha512-dFiPwZ/hgB5YS/f1fiAtcpWgSx9Z+IF9jo++3Kz8uEA4uwEK3awKaifBqlOsl6P/xwN7X2NL+V2HMafPmv9jTw==", "dev": true, "dependencies": { - "babylonjs": "^5.37.0", - "babylonjs-gui": "^5.37.0", - "babylonjs-gui-editor": "^5.37.0", - "babylonjs-loaders": "^5.37.0", - "babylonjs-materials": "^5.37.0", - "babylonjs-serializers": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gui": "^7.16.0", + "babylonjs-gui-editor": "^7.16.0", + "babylonjs-loaders": "^7.16.0", + "babylonjs-materials": "^7.16.0", + "babylonjs-serializers": "^7.16.0" } }, + "node_modules/babylonjs-inspector/node_modules/babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true, + "hasInstallScript": true + }, "node_modules/babylonjs-loaders": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-5.37.0.tgz", - "integrity": "sha512-PiSZWan8dYYR6TJGoNz1xi/9MAegg0wnfXgY8Yld1tcmQqoOa143QaQjQ68z9Q20jgBg0LynRbvG+bI/ZXA50g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-7.16.0.tgz", + "integrity": "sha512-fNC2R1BYWd2Lhg3hrvw5KrDnDTdk/xwd/fwUzfPcn6HhMK5qV5H7nREZVjBW35QdxWlMRRy+YPDTZCv9Caa5Iw==", "dev": true, "dependencies": { - "babylonjs": "^5.37.0", - "babylonjs-gltf2interface": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gltf2interface": "^7.16.0" } }, + "node_modules/babylonjs-loaders/node_modules/babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true, + "hasInstallScript": true + }, "node_modules/babylonjs-materials": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-5.37.0.tgz", - "integrity": "sha512-EG4MiRoIiCxa3Y0cJU6j+kVpJdSUvrtXFRHCBaCW8GlSlKbsnNQUPQmm/70ff8hudwXeUR2l632c8bVVxeq8TA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-7.16.0.tgz", + "integrity": "sha512-VJx8eI2JIk1z5FMQW2pajt1AUN5Fw3zSrA+z+m2b7ePH4epKwbvyjEDvNIArngnQa2DZcHJX9PdQfqvV11o5aA==", "dev": true, "dependencies": { - "babylonjs": "^5.37.0" + "babylonjs": "^7.16.0" } }, + "node_modules/babylonjs-materials/node_modules/babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true, + "hasInstallScript": true + }, "node_modules/babylonjs-serializers": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-serializers/-/babylonjs-serializers-5.37.0.tgz", - "integrity": "sha512-K/DitxuYpk68OlahDEQG7xWwBLTIIZ9U6A5Sq53PkrhIuoy3LE0/p+Y8ITotH4Thd8R5x8vYqQ/3hQfvrLOs3Q==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-serializers/-/babylonjs-serializers-7.16.0.tgz", + "integrity": "sha512-mMA5m2c1/MQvgEuU8HlikIEkBIpd81/E3ddvc2MczASCc3o+jybBJT6h+GUR7H/i+pSWiDU2ByT0u+jKnnxbFA==", "dev": true, "dependencies": { - "babylonjs": "^5.37.0", - "babylonjs-gltf2interface": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gltf2interface": "^7.16.0" } }, + "node_modules/babylonjs-serializers/node_modules/babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true, + "hasInstallScript": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4126,77 +4168,125 @@ "dev": true }, "babylonjs": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-5.37.0.tgz", - "integrity": "sha512-V0fAFxI+pd6Tbm+Q5YF2HOMbDElDD38e4dkXRK830LBqdkuwjDgn6GJA0A0MnQQez3mugleMulrKAJBFWx11yg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.0.0.tgz", + "integrity": "sha512-tK4qHeuw/Ea161BSwQo4Ni1jE/sr/C2wkuoEEqwv+AdQvnZaATr2QBorj9CtBBY1YssoZRXa+2nNTt2Y8dKApw==", "dev": true }, "babylonjs-gltf2interface": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-5.37.0.tgz", - "integrity": "sha512-EjFclIN03h14jeditZHGl4Pyqw4lfHZThJhgVG9xBPOsvbkffuDB1aApsSamhG1Iob0Qv562nrkTnyEq29LgMQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-7.16.0.tgz", + "integrity": "sha512-yo77NZjnNTQkCWMcZDUT8xw0fwh5cjLgsUpoo5ncghut+oAV2YV3FUCXf3BDAsU2yWePtgt8idehWN/dNm2kjA==", "dev": true }, "babylonjs-gui": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-5.37.0.tgz", - "integrity": "sha512-4F6OnYido1jjY9tIkdVXOomRDd8FMWsKlVbJyV6+4p9rFMnWpZlEX4W0Ujv3qVyKpB2+OfD/QmxAYchIzu6dKg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-gui/-/babylonjs-gui-7.16.0.tgz", + "integrity": "sha512-qcVZiQia3B1q/IkQOzAAHO6GpU81uYPb19RMZLyonaa0v1cT31I3xCm6Yswkh1yu7dhLx/FrnjSZPc7xAdCb7g==", "dev": true, "requires": { - "babylonjs": "^5.37.0" + "babylonjs": "^7.16.0" + }, + "dependencies": { + "babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true + } } }, "babylonjs-gui-editor": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-gui-editor/-/babylonjs-gui-editor-5.37.0.tgz", - "integrity": "sha512-ojIGElfI14GCj5qqMq4EG67UpV0Ndq1baWrsyxQ0bVKN95PoeuNZ8ww/suym/SoKwDaY8TBk/K8I0MNrkgR2Qw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-gui-editor/-/babylonjs-gui-editor-7.16.0.tgz", + "integrity": "sha512-DAGlTNLOY+hTwc7TOvKWmQ2cQZdwt92YZQ33dBprtpZ8d2l9TqRYqhuK2t7Jzgzg+44ijvp+t0DAcDIfoJVDmA==", "dev": true, "requires": { - "babylonjs": "^5.37.0", - "babylonjs-gui": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gui": "^7.16.0" + }, + "dependencies": { + "babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true + } } }, "babylonjs-inspector": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-inspector/-/babylonjs-inspector-5.37.0.tgz", - "integrity": "sha512-7jSsqDGZb+Dods4y1inFbs5WxVDWsAYzn5twToz3rDtwqWTwaVtQRccdXYAaoCt014TOAOYe3+g5eUpUDsAtdw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-inspector/-/babylonjs-inspector-7.16.0.tgz", + "integrity": "sha512-dFiPwZ/hgB5YS/f1fiAtcpWgSx9Z+IF9jo++3Kz8uEA4uwEK3awKaifBqlOsl6P/xwN7X2NL+V2HMafPmv9jTw==", "dev": true, "requires": { - "babylonjs": "^5.37.0", - "babylonjs-gui": "^5.37.0", - "babylonjs-gui-editor": "^5.37.0", - "babylonjs-loaders": "^5.37.0", - "babylonjs-materials": "^5.37.0", - "babylonjs-serializers": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gui": "^7.16.0", + "babylonjs-gui-editor": "^7.16.0", + "babylonjs-loaders": "^7.16.0", + "babylonjs-materials": "^7.16.0", + "babylonjs-serializers": "^7.16.0" + }, + "dependencies": { + "babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true + } } }, "babylonjs-loaders": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-5.37.0.tgz", - "integrity": "sha512-PiSZWan8dYYR6TJGoNz1xi/9MAegg0wnfXgY8Yld1tcmQqoOa143QaQjQ68z9Q20jgBg0LynRbvG+bI/ZXA50g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-loaders/-/babylonjs-loaders-7.16.0.tgz", + "integrity": "sha512-fNC2R1BYWd2Lhg3hrvw5KrDnDTdk/xwd/fwUzfPcn6HhMK5qV5H7nREZVjBW35QdxWlMRRy+YPDTZCv9Caa5Iw==", "dev": true, "requires": { - "babylonjs": "^5.37.0", - "babylonjs-gltf2interface": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gltf2interface": "^7.16.0" + }, + "dependencies": { + "babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true + } } }, "babylonjs-materials": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-5.37.0.tgz", - "integrity": "sha512-EG4MiRoIiCxa3Y0cJU6j+kVpJdSUvrtXFRHCBaCW8GlSlKbsnNQUPQmm/70ff8hudwXeUR2l632c8bVVxeq8TA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-materials/-/babylonjs-materials-7.16.0.tgz", + "integrity": "sha512-VJx8eI2JIk1z5FMQW2pajt1AUN5Fw3zSrA+z+m2b7ePH4epKwbvyjEDvNIArngnQa2DZcHJX9PdQfqvV11o5aA==", "dev": true, "requires": { - "babylonjs": "^5.37.0" + "babylonjs": "^7.16.0" + }, + "dependencies": { + "babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true + } } }, "babylonjs-serializers": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/babylonjs-serializers/-/babylonjs-serializers-5.37.0.tgz", - "integrity": "sha512-K/DitxuYpk68OlahDEQG7xWwBLTIIZ9U6A5Sq53PkrhIuoy3LE0/p+Y8ITotH4Thd8R5x8vYqQ/3hQfvrLOs3Q==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs-serializers/-/babylonjs-serializers-7.16.0.tgz", + "integrity": "sha512-mMA5m2c1/MQvgEuU8HlikIEkBIpd81/E3ddvc2MczASCc3o+jybBJT6h+GUR7H/i+pSWiDU2ByT0u+jKnnxbFA==", "dev": true, "requires": { - "babylonjs": "^5.37.0", - "babylonjs-gltf2interface": "^5.37.0" + "babylonjs": "^7.16.0", + "babylonjs-gltf2interface": "^7.16.0" + }, + "dependencies": { + "babylonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/babylonjs/-/babylonjs-7.16.0.tgz", + "integrity": "sha512-6OtvuDHcNUtcLIuA6enjZBay3DCsF04WrvTScua9cP1zPqHpn4pWlEjjYSnL3JXIcR8/Qtktj+R+IIy/oSL5Rw==", + "dev": true + } } }, "balanced-match": { diff --git a/package.json b/package.json index 7820624..7b9df6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-charactercontroller", - "version": "0.4.4-alpha.7", + "version": "0.4.4", "description": "A CharacterController for BabylonJS", "repository": { "type": "git", @@ -16,9 +16,9 @@ "main": "dist/CharacterController.js", "types": "dist/CharacterController.d.ts", "devDependencies": { - "babylonjs": "^5.37.0", - "babylonjs-inspector": "^5.37.0", - "babylonjs-loaders": "^5.37.0", + "babylonjs": "7.0.0", + "babylonjs-inspector": "^7.0.0", + "babylonjs-loaders": "^7.0.0", "terser-webpack-plugin": "^5.3.6", "ts-loader": "^9.4.2", "typescript": "^4.9.4", diff --git a/src/CharacterController.ts b/src/CharacterController.ts index 3a4d66a..9df09ff 100644 --- a/src/CharacterController.ts +++ b/src/CharacterController.ts @@ -577,9 +577,9 @@ export class CharacterController { private _signLHS_RHS = -1; private _setRHS(mesh: TransformNode) { const meshMatrix: Matrix = mesh.getWorldMatrix(); - const _localX = Vector3.FromArray(>meshMatrix.m, 0); - const _localY = Vector3.FromArray(>meshMatrix.m, 4); - const _localZ = Vector3.FromArray(>meshMatrix.m, 8); + const _localX = Vector3.FromArray(meshMatrix.m, 0); + const _localY = Vector3.FromArray(meshMatrix.m, 4); + const _localZ = Vector3.FromArray(meshMatrix.m, 8); const actualZ = Vector3.Cross(_localX, _localY); //same direction or opposite direction of Z if (Vector3.Dot(actualZ, _localZ) < 0) { @@ -834,7 +834,7 @@ export class CharacterController { let jumpDist: number = 0; let disp: Vector3; - if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha; + // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha; if (this._wasRunning || this._wasWalking) { if (this._wasRunning) { forwardDist = this._actionMap.run.speed * dt; @@ -1199,7 +1199,7 @@ export class CharacterController { //moveWithDisplacement down against a surface seems to push the AV up by a small amount!! if (this._freeFallDist < 0.01) return anim; const disp: Vector3 = new Vector3(0, -this._freeFallDist, 0); - if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha; + // if (this._hasCam && this._mode != 1 && !this._noRot) this._avatar.rotation.y = this._av2cam - this._camera.alpha; this._avatar.moveWithCollisions(disp); if ((this._avatar.position.y > this._avStartPos.y) || (this._avatar.position.y === this._avStartPos.y)) { // this.grounded = true; @@ -1225,6 +1225,8 @@ export class CharacterController { this._unGroundIt(); anim = this._actionMap.slideBack; } + } else { + anim = this._actionMap.fall; } } return anim; @@ -1589,6 +1591,11 @@ export class CharacterController { public jump() { this._act._jump = true; } + + public fall() { + this._grounded = false; + } + public idle() { this._act.reset(); }